Перенос 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.
    • p4 — всё остальное для btrfs.
  • Создадим файловые системы:
    • p1 (EFI):
      1mkfs.vfat -F32 -n EFI /dev/sdc1
      
    • p2 (/boot):
      1mkfs.ext4 -L boot /dev/sdc2
      
    • p3 (swap в случае отдельной партиции):
      1mkswap -L swap /dev/sdc3
      
    • p4 (btrfs)
      1mkfs.btrfs /dev/sdc4
      

2.2 Все разделы на файловой системе btrfs

  • Разобьём на партиции:
  • Разобьём диск:
    1sgdisk -n 0:0:+1024M -t 0:ef00 -c 0:EFI /dev/sdc
    2sgdisk -n 0:0:0 -t 0:8300 -c 0:gentoo /dev/sdc
    
  • Создадим файловые системы:

3 Подготовка раздела с btrfs

  • Подмонтируем раздел с btrfs:
    1mkdir /mnt/to
    2mount -tbtrfs -orelatime,discard=async,autodefrag,compress=zstd:9 /dev/sdc2 /mnt/to/
    
  • Создадим подтома на btrfs (см. Подтома btrfs):
     1cd /mnt/to/
     2btrfs subvol create @
     3btrfs subvol create @var
     4btrfs subvol create @var@tmp
     5btrfs subvol create @var@log
     6btrfs subvol create @vm
     7btrfs subvol create @home
     8btrfs subvol create @root
     9btrfs subvol create @boot
    10btrfs subvol create @libvirt
    
  • Подтома для Gentoo Linux.
  • Используется, если portage размещается локально:
    1cd /mnt/to/
    2btrfs subvol create @portage
    3btrfs subvol create @portage@local
    4btrfs subvol create @portage@com
    
  • Если используется файл подкачки на файловой системе, то создадим для него подтом:
    1cd /mnt/to/
    2btrfs subvol create @swap
    

4 Копирование существующих файловых систем

4.1 Система на LVM

  • Создадим точку монтирования:
    1mkdir /mnt/from
    
  • Подмонтируем и скопируем root-партицию:
    1mount /dev/vgs/root /mnt/from/
    2rsync -av -HS --delete /mnt/from/ /mnt/to/@
    3umount /mnt/from/
    
  • Подмонтируем и скопируем /var:
    1mount /dev/vgs/var /mnt/from/
    2rsync -av -HS --delete /mnt/from/ /mnt/to/@var
    3umount /mnt/from/
    
  • Подмонтируем и скопируем /boot:
    1mkdir /mnt/to/
    2mount /dev/sdc2 /mnt/to
    3mount /dev/sdb2 /mnt/from/
    4rsync -av -HS --delete /mnt/from/ /mnt/to/
    5umount /mnt/to
    6umount /mnt/from
    
  • Подмонтируем и скопируем portage:
    1mount /dev/vgs/portage /mnt/from/
    2rsync -av -HS --delete /mnt/from/ /mnt/to/@portage
    3umount /mnt/from/
    
  • Подмонтируем и скопируем portage_local:
    1mount /dev/vgs/portage_local /mnt/from/
    2rsync -av -HS --delete /mnt/from/ /mnt/to/@portage_local
    3umount /mnt/from/
    

4.2 Система на btrfs

4.2.1 Подготовка к копированию

  • Создадим точки монтирования:
    1mkdir -p /mnt/from
    
  • Подмонтируем исходную файловую систему btrfs:
    1mount /dev/sda4 /mnt/from/
    

4.2.2 Копирование основных файловых систем

  • Скопируем root-партицию:
    1rsync -av -HS -AX --delete /mnt/from/@/* /mnt/to/@
    
  • Скопируем /var:
    1rsync -av -HS -AX --delete /mnt/from/@var/* /mnt/to/@var
    
  • Подмонтируем и скопируем /boot:
    1mkdir /mnt/boot
    2mount /dev/sda2 /mnt/boot
    3rsync -av -HS --delete /mnt/boot/* /mnt/to/@boot
    4umount /mnt/boot
    

4.2.3 Копируем portage

  • Если portage размещён локально, то его тоже надо скопировать.
  • Скопируем @portage:
1rsync -av -HS --delete /mnt/from/@portage/* /mnt/to/@portage
  • Скопируем @portage@local:
1rsync -av -HS --delete /mnt/from/@portage@local/* /mnt/to/@portage@local

4.2.4 Копируем системы с отключением CoW

  • Для файловых систем с образами виртуальных машин следует отключить CoW (copy-on-write) (см. Подтома btrfs).
  • Так же стоит отключить CoW для часто изменяемых файлов (например, журналов).
  • Подмонтируем файловую систему btrfs:
    1mkdir -p /mnt/gentoo
    2mount -tbtrfs -orelatime,discard=async,autodefrag,compress=zstd:9,subvol=@ /dev/sdc2 /mnt/gentoo/
    3mount -tbtrfs -orelatime,discard=async,autodefrag,compress=zstd:9,subvol=@var /dev/sdc2 /mnt/gentoo/var
    4mount -tbtrfs -orelatime,discard=async,autodefrag,compress=zstd:9,subvol=@var@tmp /dev/sdc2 /mnt/gentoo/var/tmp
    5mount -tbtrfs -orelatime,discard=async,autodefrag,compress=zstd:9,subvol=@vm /dev/sdc2 /mnt/gentoo/var/vm
    6mount -tbtrfs -orelatime,discard=async,autodefrag,compress=zstd:9,subvol=@libvirt /dev/sdc2 /mnt/gentoo/var/lib/libvirt/images
    7mount -tbtrfs -orelatime,discard=async,autodefrag,compress=zstd:9,subvol=@var@log /dev/sdc2 /mnt/gentoo/var/log
    
  1. Копирование /var/vm

    • Отключим для этого подтома CoW:
      1cd /mnt/gentoo/var/
      2chattr +C vm
      
    • Скопируем /var/vm:
      1rsync -av -HS -AX --delete /mnt/from/@vm/* /mnt/to/@vm
      
  1. Копирование /var/lib/libvirt/images

    • Отключим для подтома /var/lib/libvirt/images CoW:
      1cd /mnt/gentoo/var/lib/libvirt/
      2chattr +C images
      
    • Скопируем /var/lib/libvirt/images:
      1rsync -av -HS -AX --delete /mnt/from/@libvirt/* /mnt/to/@libvirt
      
  1. Копирование /var/log

    • Для /var/log
    • Отключим для подтома /var/log CoW:
      1cd /mnt/gentoo/var/
      2chattr +C log
      
    • Скопируем /var/log:
      1rsync -av -HS -AX --delete /mnt/from/@var@log/* /mnt/to/@var@log
      
  1. Настройки /var/tmp

    • Для /var/tmp
      1cd /mnt/gentoo/var/
      2chattr +C tmp
      
    • Посмотреть результат можно командой:
      1lsattr -a /mnt/gentoo/var/
      2lsattr -a /mnt/gentoo/var/lib/libvirt/
      

5 Установка загрузчика

  • Перемонтируем файловую систему btrfs:
    1mkdir -p /mnt/gentoo
    2mount -tbtrfs -orelatime,discard=async,autodefrag,compress=zstd:9,subvol=@ /dev/sdc2 /mnt/gentoo/
    3mount -tbtrfs -orelatime,discard=async,autodefrag,compress=zstd:9,subvol=@var /dev/sdc2 /mnt/gentoo/var
    4mount -tbtrfs -orelatime,discard=async,autodefrag,compress=zstd:9,subvol=@var@tmp /dev/sdc2 /mnt/gentoo/var/tmp
    5mount -tbtrfs -orelatime,discard=async,autodefrag,compress=zstd:9,subvol=@boot /dev/sdc2 /mnt/gentoo/boot
    6mount /dev/sdc1 /mnt/gentoo/boot/efi
    
  • Подмонтируем псевдо-файловые системы:
    1mount -o bind /dev /mnt/gentoo/dev/
    2mount -o bind /proc /mnt/gentoo/proc/
    3mount -o bind /sys /mnt/gentoo/sys/
    4mount -o bind /run /mnt/gentoo/run/
    5mount -t efivarfs efivarfs /mnt/gentoo/sys/firmware/efi/efivars
    
  • Установим загрузчик:
    1cd /mnt/gentoo/
    2chroot /mnt/gentoo/ /bin/bash
    3grub-install /boot
    4grub-mkconfig -o /boot/grub/grub.cfg
    

6 Файл монтирования fstab

  • Создадим файл монтирования fstab.
  • Узнаем идентификатор партиции с файловой системой btrfs:
    1blkid /dev/sdc2
    
  • Получим строчку:
    1UUID="<uuid_number>"
    
  • Создадим файл /mnt/to/etc/fstab:
     1LABEL="boot"					/boot		ext4	relatime,discard=async					1 1
     2LABEL="EFI"						/boot/efi	vfat	defaults,discard=async,flush,tz=UTC				0 0
     3LABEL="swap"					none		swap	sw							0 0
     4UUID="<uuid_number>"	/		btrfs	relatime,discard=async,autodefrag,compress=zstd:9,subvol=@	0 0
     5UUID="<uuid_number>"	/var		btrfs	relatime,discard=async,autodefrag,compress=zstd:9,subvol=@var	0 0
     6UUID="<uuid_number>"	/var/tmp	btrfs	relatime,discard=async,autodefrag,compress=zstd:9,subvol=@var_tmp	0 0
     7UUID="<uuid_number>"	/var/vm		btrfs	relatime,discard=async,autodefrag,compress=zstd:9,subvol=@vm		0 0
     8UUID="<uuid_number>"	/home		btrfs	relatime,discard=async,autodefrag,compress=zstd:9,subvol=@home	0 0
     9UUID="<uuid_number>"	/usr/portage	btrfs	relatime,discard=async,autodefrag,compress=zstd:9,subvol=@portage	0 0
    10UUID="<uuid_number>"	/usr/local/share/portage	btrfs	relatime,discard=async,autodefrag,compress=zstd:9,subvol=@portage_local	0 0
    11UUID="<uuid_number>"	/com/lib/portage	btrfs	relatime,discard=async,autodefrag,compress=zstd:9,subvol=@portage_com	0 0
    
  • Если используется файл подкачки, то вместо отдельной партиции следует подключить этот файл в /mnt/to/etc/fstab:
    1UUID="<uuid_number>"	/swap		btrfs	relatime,discard=async,autodefrag,compress=zstd:9,subvol=@swap	0 0
    2/swap/swapfile		none		swap    sw								0 0
    

7 Файл подкачки на файловой системе btrfs

7.1 Подготовка к созданию файла подкачки

  • Для раздела файла подкачки следует отключить CoW (copy-on-write).
  • Подмонтируем файловую систему btrfs:
    1mkdir -p /mnt/gentoo/
    2mount -tbtrfs -orelatime,discard,autodefrag,compress=zstd:9,subvol=@ /dev/sdc2 /mnt/gentoo/
    
  • Создадим точку монтирования:
    1mkdir /mnt/gentoo/swap
    
  • Подмонтируем подтом @swap:
    1mount -tbtrfs -orelatime,discard,autodefrag,compress=zstd:9,subvol=@swap /dev/sdc2 /mnt/gentoo/swap
    
  • Отключим для этого подтома CoW:
    1chattr +C /mnt/gentoo/swap
    

7.2 Создание файла подкачки

7.2.1 Старый подход

  • Создадим файл подкачки:
    1truncate -s 0 /mnt/gentoo/swap/swapfile
    
  • Установим права доступа 600 к файлу подкачки:
    1chmod 600 /mnt/gentoo/swap/swapfile
    
  • Установим размер файла подкачки исходя из размера оперативной памяти:
    1fallocate -l $(free -h --si | awk 'NR == 2 {print $2}') /mnt/gentoo/swap/swapfile
    
  • Отформатируем файл подкачки:
    1mkswap /mnt/gentoo/swap/swapfile
    

7.2.2 Новый подход

  • Работает начиная с версии утилит 6.1.
  • Создадим файл подкачки размером 8ГБ:
    1btrfs filesystem mkswapfile --size 4g --uuid clear /mnt/gentooswap/swapfile
    
  • Создадим файл подкачки исходя из размера оперативной памяти:
    1btrfs filesystem mkswapfile --size $(free -h --si | awk 'NR == 2 {print $2}') --uuid clear /mnt/gentoo/swap/swapfile
    

7.3 Активация файла подкачки

  • Активируем файл подкачки:
    1swapon /mnt/gentoo/swap/swapfile
    

Дмитрий Сергеевич Кулябов
Дмитрий Сергеевич Кулябов
Профессор кафедры теории вероятностей и кибербезопасности

Мои научные интересы включают физику, администрирование Unix и сетей.

Похожие