대부분의 리눅스 배포판의 파일시스템 ext4가 나쁜 것은 아니지만,
btrfs은 ext4가 가지지 못한 여러 현대적인 장점을 갖고 있습니다.
리눅스를 처음 접하신 분들은 btrfs을 좀 배워서 사용하는 것이
앞으로 훨씬 이득이 되실 것으로 보입니다.
루트 파티션을 옮기고 나면, 부트로더가 잘 올라오지 않을 수 있는데,
가능한 가상 기계에서 충분히 테스트하시고 실제 시스템에 적용하시기 바랍니다.
그리고 ext4 서브 볼륨을 지우지 않으면, 언제든지 되돌아 가실 수 있습니다.
아래 내용은 그냥 가져온 것이라 가독성이 떨어질 수 있고, 내용 업데이트가 되지 않을 것입니다.
원문: https://dawoum.ddns.net/wiki/Btrfs
Prerequisites
먼저, / 파티션이 60% 이상 사용되고 있는지 확인을 하십시오
- df
만약 그렇다면, 파티션을 늘리든지, 불필요한 파일들을 지우십시오.
그런-다음 관련된 툴을 설치하십시오:
- sudo apt install btrfs-progs
Convert Ext File Systems to Btrfs
먼저, 루트 파일 시스템이 아닌 특정 위치에 마운트되어 있는 ext4 파일 시스템을 btrfs으로 옮겨보고자 합니다. 해당 파티션은 /dev/nvme0n1p1입니다.
- 해당 파티션을 접근하는 모든 프로세서를 종료합니다.
- sudo umount /dev/nvme0n1p1
- sudo fsck.ext4 -fyv /dev/nvme0n1p1
- 최적화 과정을 거칩니다.
- sudo fsck.ext4 -fyv /dev/nvme0n1p1
- 아무런 작업을 하지 않는지 확인을 합니다.
- sudo btrfs-convert /dev/nvme0n1p1
해당 파티션은 256G, pci3.0, nvme 타입의 SSD로써, 복원을 위한 ext2_saved 이미지를 생성하기 위해 생각보다 시간이 꽤 걸립니다.
- blkid /dev/nvme0n1p1
- sudo vi /etc/fstab
UUID=xxxx mount_point btrfs compress=zstd:1 0 2
무슨 설정을 추가해야 할까요? 가상 기계를 종료할 때 꽤 오래 기다려야 합니다.
Some tweak
해당 파티션의 조각 모음을 수행할 수 있습니다. SSD는 안하는 것을 추천합니다. 수명이 짧아집니다.
- sudo btrfs filesystem defragment -v -r -f mount_point
QEMU/KVM 이미지 디렉토리는 “no copy-on-write” 속성을 설정할 수 있습니다:
- sudo chattr +C image_directory
Roll back
복원이 가능하려면, 조각-모음(defragmentation), 균형-조정(balancing) 또는 ext2_saved 삭제 중 어떤 것도 수행되어서는 안된다고 합니다. 그러나, 위에서 보듯이 조각 모음을 수행했음에도 불구하고, 복원은 정상적으로 이루어진 것으로 보입니다. 이 파티션은 가상 기계의 이미지만 존재합니다. |
위에서 만든 복원 이미지를 지우지 않았다면, 다음과 같이 복원할 수 있습니다:
- sudo umount /dev/nvme0n1p1
- sudo btrfs-convert -r /dev/nvme0n1p1
- sudo vi /etc/fstab
이전에 주석처리해 둔 줄에서 주석해제를 하고, 새롭게 만든 btrfs 줄을 주석처리합니다.
- sudo mount /dev/nvme0n1p1
Convert root filesystem ext4 to btrfs
가상 기계로 테스트를 진행합니다.
먼저, 가상 시디롬에 우분투 20.04 설치 이미지를 마운트하고 그것으로 부팅합니다.
부팅 후에 Try Ubuntu를 누릅니다.
터미널을 실행합니다.
- sudo su
- lsblk
- fsck.ext4 -fyv /dev/vda3
- btrfs-convert /dev/vda3
- mount /dev/vda3 /mnt
- for fs in proc sys dev dev/pts; do mount --bind /$fs /mnt/$fs; done
- chroot /mnt
- blkid /dev/vda3
- vi /etc/fstab
-
UUID=..... / btrfs noatime,compress=zstd:1 0 1
- grub-install /dev/vda
- update-grub
- exit
- shutdown -h now
- 만자로
- /boot 파티션이 별도로 존재하지 않아서, 부팅에 문제가 발생합니다. 우분투는 /boot/efi를 vfat로 나누었고, 페도라는 /boot 파티션을 ext4로 만들었습니다.
이것을 위해, Manjaro_Linux#Resize_root_partition를 진행하고, 파일 시스템 전환을 했으나, 마운트 중에 superblock 관련 오류(?)가 발생해서 마운트가 되지 않습니다. 그래서 우분투 라이브시디로 부팅한 후에, 다음을 진행했습니다:
- sudo e2fsck -f /dev/vda1
- 이 과정을 거쳐도 오류가 발생합니다.
디스크를 19G 중 11G를 사용하고 있어서, 줄여서 9.6G로 만들고, 최근 우분투 nightly iso를 사용해서 해결되었습니다. 그러나, 여전히 unkenown filesystem 오류가 발생합니다.
- 만자로 해결책
- 위의 과정에서 chroot 한 후에, /etc/default/grub 파일을 수정합니다:
GRUB_DEFAULT=0 #GRUB_SAVEDEFAULT=true
그런-다음
- mkinitcpio -P
- rm /boot/grub/grubenv
- grub-editenv /boot/grub/grubenv create
- grub-install /dev/vda
- update-grub
이 과정으로 부팅이 되면, 롤백에서도 UUID를 찾지 못하는 문제가 발생합니다. 별도의 /boot 파티션의 정보를 변경함으로써 발생한 것으로 추정되어, 해결책의 과정을 다시 수행함으로써 정상 부팅됩니다.
Roll back
똑같이 시디롬으로 부팅 후에,
- sudo su
- btrfs-convert -r /dev/vda3
- mount /dev/vda3 /mnt
- for fs in proc sys dev dev/pts; do mount --bind /$fs /mnt/$fs; done
- chroot /mnt
- grub-install /dev/vda
- update-grub
- exit
- shutdown -h now
Make sub volume
하나의 ext4 루트 파티션을 root, home 2개의 서브 파티션으로 나누는 과정입니다.
- sudo su
- lsblk
- fsck.ext4 -fyv /dev/vda3
- btrfs-convert /dev/vda3
- mount /dev/vda3 /mnt
- btrfs subvolume list /mnt
- cd /mnt
- btrfs subvolume snapshot ./ ./root2
- btrfs subvolume create home2
- cp -a home/* home2/
- /mnt 아래에 root2, home2 및 ext2_saved를 제외한 모든 디렉토리와 파일을 제거
- mv root2 root
- rm -rf root/home/*
- mv home2 home
- cd
- umount /mnt
- mount -o subvol=root /dev/vda3 /mnt
- mount -o subvol=home /dev/vda3 /mnt/home
- mount -t vfat /dev/vda2 /mnt/boot/efi
- for fs in proc sys dev dev/pts; do mount --bind /$fs /mnt/$fs; done
- chroot /mnt /bin/bash
- blkid /dev/vda3
- nano /etc/fstab
-
UUID=..... / btrfs noatime,subvol=root,compress=zstd:1 0 1 UUID=..... /home btrfs noatime,subvol=home,compress=zstd:1 0 1 #/swapfile none swap sw 0 0
- 이때 swapfile이 있으면, 주석 처리합니다.
- nano /etc/default/grub
-
GRUB_CMDLINE_LINUX_DEFAULT="rootflags=subvol=root"
- grub-mkconfig -o /boot/efi/EFI/ubuntu/grub.cfg
- update-initramfs -u
- grub-install /dev/vda
- update-grub
- 확인
- cat /boot/efi/EFI/ubuntu/grub.cfg
- 만자로
- 모든 파일이 하나의 파티션, vda1에 있는 만자로에서 테스트했을 때, 리부팅 후에, btrfs을 지원하지 않는다는 메시지가 나왔습니다. 롤백해서 원상태로 복귀시켰습니다. 부트로더 관련된 내용이 수정되어야 할 것으로 보입니다.
- 우분투
- vda2 /boot/efi 별도로 존재, vda3 루트 파피션 하나로 사용됩니다. 위의 과정으로 아무런 이상없이 파일 시스템 전환이 되었습니다.
- 우분투 부팅
- 만약 update-initramfs 중에 /sbin/fsck.btrfs을 찾지 못한다는 메시지가 나오면, iso 이미지에 있는 파일을 복사해서 진행할 수 있습니다. 이를려면, umount 후에, 복사하고 다시 mount 하는 과정이 필요합니다.
swapfile
우분투 라이브시디로 부팅해서, 터미널을 열고
- sudo su
- mount /dev/vda3 /mnt
- btrfs subvolume create /mnt/swap
- mount -o subvol=swap /dev/vda3 /mnt/swap
- touch /mnt/swap/swapfile
- chmod 600 /mnt/swap/swapfile
- chattr +C /mnt/swap/swapfile
- dd if=/dev/zero of=/mnt/swap/swapfile bs=1M count=2084
- 스왑으로 2G의 swapfile을 만듭니다. (count=... 숫자로 조절하십시오)
- sudo mkswap /mnt/swap/swapfile
- nano /etc/fstab
-
UUID=..... /swap btrfs subvol=swap 0 1 /swap/swapfile none swap sw 0 0
- 이때, UUID는 vda3의 UUID를 계속 사용해야 합니다. 다 같은 디바이스를 공유합니다.