Перенос Linux на btrfs
Перенос Gentoo Linux с одного диска на другой. На новом диске делается система btrfs.
Содержание
1 Исходное состояние системы
- Переносил несколько вариантов исходных систем.
1.1 Система на LVM
- Исходно система установлена на LVM:
/dev/sda1
:/boot/EFI
;/dev/sda2
:/boot
;/dev/vgs/root
:/
;/dev/vgs/var
:/var
;/dev/vgs/var_tmp
:/var/tmp
;/dev/vgs/vm
:/var/vm
;/dev/vgs/portage
:/usr/portage
;/dev/vgs/portage_local
:/usr/local/share/portage
;/dev/vgs/portage_com
:/com/lib/portage
;/dev/vgs/home
:/home
.
1.2 Система на btrfs
- Система на btrfs:
/dev/sda1
:/boot/EFI
;/dev/sda2
:/boot
;/dev/sda3
:swap
;/dev/sda4
: партиция с файловой системой btrfs.
2 Разбиение диска
- Установим тип разбиения в GPT.
2.1 Выделенная boot-партиция
- Разобьём на партиции:
- p1 — 512M, для
EFI
. - p2 — 500–1024M, для
/boot
. - p3 — двойная оперативная память, для
swap
.- Также можно разместить файл подкачки на
btrfs
(см. Файл подкачки на btrfs).
- Также можно разместить файл подкачки на
- p4 — всё остальное для
btrfs
.
- p1 — 512M, для
- Создадим файловые системы:
- p1 (
EFI
):mkfs.vfat -F32 -n EFI /dev/sdc1
- p2 (
/boot
):mkfs.ext4 -L boot /dev/sdc2
- p3 (
swap
в случае отдельной партиции):mkswap -L swap /dev/sdc3
- p4 (
btrfs
)mkfs.btrfs /dev/sdc4
- p1 (
2.2 Все разделы на файловой системе btrfs
- Разобьём на партиции:
- p1 — 1024M, для
EFI
. - Файл подкачки на
btrfs
(см. Файл подкачки на btrfs). - p4 — всё остальное для
btrfs
.
- p1 — 1024M, для
- Разобьём диск:
sgdisk -n 0:0:+1024M -t 0:ef00 -c 0:EFI /dev/sdc sgdisk -n 0:0:0 -t 0:8300 -c 0:gentoo /dev/sdc
- Создадим файловые системы:
- p1 (
EFI
):mkfs.vfat -F32 -n EFI /dev/sdc1
- p2 (
btrfs
) (см. btrfs. Контрольные суммы):mkfs.btrfs --checksum blake2 -L gentoo /dev/sdc2
- p1 (
3 Подготовка раздела с btrfs
- Подмонтируем раздел с btrfs:
mkdir /mnt/to mount -tbtrfs -orelatime,discard=async,autodefrag,compress=zstd:9 /dev/sdc2 /mnt/to/
- Создадим подтома на btrfs (см. Подтома btrfs):
cd /mnt/to/ btrfs subvol create @ btrfs subvol create @var btrfs subvol create @var@tmp btrfs subvol create @var@log btrfs subvol create @vm btrfs subvol create @home btrfs subvol create @root btrfs subvol create @boot btrfs subvol create @libvirt
- Подтома для Gentoo Linux.
- Используется, если portage размещается локально:
cd /mnt/to/ btrfs subvol create @portage btrfs subvol create @portage@local btrfs subvol create @portage@com
- Если используется файл подкачки на файловой системе, то создадим для него подтом:
cd /mnt/to/ btrfs subvol create @swap
4 Копирование существующих файловых систем
4.1 Система на LVM
- Создадим точку монтирования:
mkdir /mnt/from
- Подмонтируем и скопируем root-партицию:
mount /dev/vgs/root /mnt/from/ rsync -av -HS --delete /mnt/from/ /mnt/to/@ umount /mnt/from/
- Подмонтируем и скопируем
/var
:mount /dev/vgs/var /mnt/from/ rsync -av -HS --delete /mnt/from/ /mnt/to/@var umount /mnt/from/
- Подмонтируем и скопируем
/boot
:mkdir /mnt/to/ mount /dev/sdc2 /mnt/to mount /dev/sdb2 /mnt/from/ rsync -av -HS --delete /mnt/from/ /mnt/to/ umount /mnt/to umount /mnt/from
- Подмонтируем и скопируем
portage
:mount /dev/vgs/portage /mnt/from/ rsync -av -HS --delete /mnt/from/ /mnt/to/@portage umount /mnt/from/
- Подмонтируем и скопируем
portage_local
:mount /dev/vgs/portage_local /mnt/from/ rsync -av -HS --delete /mnt/from/ /mnt/to/@portage_local umount /mnt/from/
4.2 Система на btrfs
4.2.1 Подготовка к копированию
- Создадим точки монтирования:
mkdir -p /mnt/from
- Подмонтируем исходную файловую систему btrfs:
mount /dev/sda4 /mnt/from/
4.2.2 Копирование основных файловых систем
- Скопируем root-партицию:
rsync -av -HS -AX --delete /mnt/from/@/* /mnt/to/@
- Скопируем
/var
:rsync -av -HS -AX --delete /mnt/from/@var/* /mnt/to/@var
- Подмонтируем и скопируем
/boot
:mkdir /mnt/boot mount /dev/sda2 /mnt/boot rsync -av -HS --delete /mnt/boot/* /mnt/to/@boot umount /mnt/boot
4.2.3 Копируем portage
- Если
portage
размещён локально, то его тоже надо скопировать. - Скопируем
@portage
:
rsync -av -HS --delete /mnt/from/@portage/* /mnt/to/@portage
- Скопируем
@portage@local
:
rsync -av -HS --delete /mnt/from/@portage@local/* /mnt/to/@portage@local
4.2.4 Копируем системы с отключением CoW
- Для файловых систем с образами виртуальных машин следует отключить CoW (copy-on-write) (см. Подтома btrfs).
- Так же стоит отключить CoW для часто изменяемых файлов (например, журналов).
- Подмонтируем файловую систему
btrfs
:mkdir -p /mnt/gentoo mount -tbtrfs -orelatime,discard=async,autodefrag,compress=zstd:9,subvol=@ /dev/sdc2 /mnt/gentoo/ mount -tbtrfs -orelatime,discard=async,autodefrag,compress=zstd:9,subvol=@var /dev/sdc2 /mnt/gentoo/var mount -tbtrfs -orelatime,discard=async,autodefrag,compress=zstd:9,subvol=@var@tmp /dev/sdc2 /mnt/gentoo/var/tmp mount -tbtrfs -orelatime,discard=async,autodefrag,compress=zstd:9,subvol=@vm /dev/sdc2 /mnt/gentoo/var/vm mount -tbtrfs -orelatime,discard=async,autodefrag,compress=zstd:9,subvol=@libvirt /dev/sdc2 /mnt/gentoo/var/lib/libvirt/images mount -tbtrfs -orelatime,discard=async,autodefrag,compress=zstd:9,subvol=@var@log /dev/sdc2 /mnt/gentoo/var/log
Копирование
/var/vm
- Отключим для этого подтома CoW:
cd /mnt/gentoo/var/ chattr +C vm
- Скопируем
/var/vm
:rsync -av -HS -AX --delete /mnt/from/@vm/* /mnt/to/@vm
- Отключим для этого подтома CoW:
Копирование
/var/lib/libvirt/images
- Отключим для подтома
/var/lib/libvirt/images
CoW:cd /mnt/gentoo/var/lib/libvirt/ chattr +C images
- Скопируем
/var/lib/libvirt/images
:rsync -av -HS -AX --delete /mnt/from/@libvirt/* /mnt/to/@libvirt
- Отключим для подтома
Копирование
/var/log
- Для
/var/log
- Отключим для подтома
/var/log
CoW:cd /mnt/gentoo/var/ chattr +C log
- Скопируем
/var/log
:rsync -av -HS -AX --delete /mnt/from/@var@log/* /mnt/to/@var@log
- Для
Настройки
/var/tmp
- Для
/var/tmp
cd /mnt/gentoo/var/ chattr +C tmp
- Посмотреть результат можно командой:
lsattr -a /mnt/gentoo/var/ lsattr -a /mnt/gentoo/var/lib/libvirt/
- Для
5 Установка загрузчика
- Перемонтируем файловую систему
btrfs
:mkdir -p /mnt/gentoo mount -tbtrfs -orelatime,discard=async,autodefrag,compress=zstd:9,subvol=@ /dev/sdc2 /mnt/gentoo/ mount -tbtrfs -orelatime,discard=async,autodefrag,compress=zstd:9,subvol=@var /dev/sdc2 /mnt/gentoo/var mount -tbtrfs -orelatime,discard=async,autodefrag,compress=zstd:9,subvol=@var@tmp /dev/sdc2 /mnt/gentoo/var/tmp mount -tbtrfs -orelatime,discard=async,autodefrag,compress=zstd:9,subvol=@boot /dev/sdc2 /mnt/gentoo/boot mount /dev/sdc1 /mnt/gentoo/boot/efi
- Подмонтируем псевдо-файловые системы:
mount -o bind /dev /mnt/gentoo/dev/ mount -o bind /proc /mnt/gentoo/proc/ mount -o bind /sys /mnt/gentoo/sys/ mount -o bind /run /mnt/gentoo/run/ mount -t efivarfs efivarfs /mnt/gentoo/sys/firmware/efi/efivars
- Установим загрузчик:
cd /mnt/gentoo/ chroot /mnt/gentoo/ /bin/bash grub-install /boot grub-mkconfig -o /boot/grub/grub.cfg
6 Файл монтирования fstab
- Создадим файл монтирования fstab.
- Узнаем идентификатор партиции с файловой системой btrfs:
blkid /dev/sdc2
- Получим строчку:
UUID="<uuid_number>"
- Создадим файл
/mnt/to/etc/fstab
:LABEL="boot" /boot ext4 relatime,discard=async 1 1 LABEL="EFI" /boot/efi vfat defaults,discard=async,flush,tz=UTC 0 0 LABEL="swap" none swap sw 0 0 UUID="<uuid_number>" / btrfs relatime,discard=async,autodefrag,compress=zstd:9,subvol=@ 0 0 UUID="<uuid_number>" /var btrfs relatime,discard=async,autodefrag,compress=zstd:9,subvol=@var 0 0 UUID="<uuid_number>" /var/tmp btrfs relatime,discard=async,autodefrag,compress=zstd:9,subvol=@var_tmp 0 0 UUID="<uuid_number>" /var/vm btrfs relatime,discard=async,autodefrag,compress=zstd:9,subvol=@vm 0 0 UUID="<uuid_number>" /home btrfs relatime,discard=async,autodefrag,compress=zstd:9,subvol=@home 0 0 UUID="<uuid_number>" /usr/portage btrfs relatime,discard=async,autodefrag,compress=zstd:9,subvol=@portage 0 0 UUID="<uuid_number>" /usr/local/share/portage btrfs relatime,discard=async,autodefrag,compress=zstd:9,subvol=@portage_local 0 0 UUID="<uuid_number>" /com/lib/portage btrfs relatime,discard=async,autodefrag,compress=zstd:9,subvol=@portage_com 0 0
- Если используется файл подкачки, то вместо отдельной партиции следует подключить этот файл в
/mnt/to/etc/fstab
:UUID="<uuid_number>" /swap btrfs relatime,discard=async,autodefrag,compress=zstd:9,subvol=@swap 0 0 /swap/swapfile none swap sw 0 0
7 Файл подкачки на файловой системе btrfs
7.1 Подготовка к созданию файла подкачки
- Для раздела файла подкачки следует отключить CoW (copy-on-write).
- Подмонтируем файловую систему
btrfs
:mkdir -p /mnt/gentoo/ mount -tbtrfs -orelatime,discard,autodefrag,compress=zstd:9,subvol=@ /dev/sdc2 /mnt/gentoo/
- Создадим точку монтирования:
mkdir /mnt/gentoo/swap
- Подмонтируем подтом
@swap
:mount -tbtrfs -orelatime,discard,autodefrag,compress=zstd:9,subvol=@swap /dev/sdc2 /mnt/gentoo/swap
- Отключим для этого подтома CoW:
chattr +C /mnt/gentoo/swap
7.2 Создание файла подкачки
7.2.1 Старый подход
- Создадим файл подкачки:
truncate -s 0 /mnt/gentoo/swap/swapfile
- Установим права доступа
600
к файлу подкачки:chmod 600 /mnt/gentoo/swap/swapfile
- Установим размер файла подкачки исходя из размера оперативной памяти:
fallocate -l $(free -h --si | awk 'NR == 2 {print $2}') /mnt/gentoo/swap/swapfile
- Отформатируем файл подкачки:
mkswap /mnt/gentoo/swap/swapfile
7.2.2 Новый подход
- Работает начиная с версии утилит 6.1.
- Создадим файл подкачки размером 8ГБ:
btrfs filesystem mkswapfile --size 4g --uuid clear /mnt/gentooswap/swapfile
- Создадим файл подкачки исходя из размера оперативной памяти:
btrfs filesystem mkswapfile --size $(free -h --si | awk 'NR == 2 {print $2}') --uuid clear /mnt/gentoo/swap/swapfile
7.3 Активация файла подкачки
- Активируем файл подкачки:
swapon /mnt/gentoo/swap/swapfile