ext4 파일 시스템 btrfs으로 전환하기.

by 유리 posted Nov 26, 2021
?

단축키

Prev이전 문서

Next다음 문서

ESC닫기

크게 작게 위로 아래로 댓글로 가기 인쇄

대부분의 리눅스 배포판의 파일시스템 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를 계속 사용해야 합니다. 다 같은 디바이스를 공유합니다.

Articles

1 2 3 4 5 6 7 8 9 10