Btrfs ("better F S", "butter F S", "b-tree F S"으로 발음하거나, 단순히 철자로 발음함)은 함께 개발된 논리적 볼륨 관리자 (리눅스의 LVM과 혼동하지 말 것)를 갖는 copy-on-write (COW) 원리를 기반으로 하는 파일 시스템을 결합하는 컴퓨터 저장 형식입니다. 그것은 2007년 Oracle Corporation에서 리눅스에서 사용하기 위해 처음 설계되었고, 2013년 11월부터, 파일 시스템의 온-디스크 형식이 리눅스 커널에서 안정적이라고 선언되었습니다. Oracle에 따르면, Btrfs는 "진정한 약어가 아닙니다".
Btrfs는 리눅스 파일 시스템에서 풀링, 스냅샷, 체크섬 및 통합 다중-장치 스패닝의 부족을 해결하기 의도되었습니다. Btrfs의 주요 개발자, Chris Mason은 "[리눅스]가 사용 가능한 저장 장치에 맞게 확장할 수 있도록 하는 것. 확장은 저장 장치 문제를 해결하는 것뿐만 아니라 사람들이 무엇을 사용하고 있는지 볼 수 있고 그것을 보다 안정적으로 만드는 깨끗한 인터페이스와 함께 관리하고 유지-보수할 수 있음을 의미하는 것"을 목표로 합니다.
Distro default filesystem btrfs
openSUSE /boot 파티션은 별도로 존재하지 않습니다.
- vda1: 8M BIOS boot,
- vda2: btrfs / 파티션,
- vda3: swap
Fedora /boot 파티션 존재, zram으로 스왑 대체
- vda1: /boot 파티션
- vda2: btrfs / 파티션
부트로더
오픈수저에서 아래에 소개된 그럽 메뉴 만드는 명령을 수행해야 한다고 명시적으로 /etc/default/grub에 쓰여 있습니다: rootflags는 요구하지 않습니다!!
- grub2-mkconfig -o /boot/grub2/grub.cfg
우분투 20.04
- grub-mkconfig -o /boot/grub/grub.cfg
우분투 22.04
- grub-mkconfig -o /boot/efi/EFI/ubuntu/grub.cfg
Swapflie
커널 버전 5.0 이전에는 btrfs에서 swapfile을 지원하지 않습니다.
Partitionless
Manjaro, EndeavourOS 등은 BIOS boot, /boot 파티션이 별도로 존재하지 않고, 모든 파일들이 하나의 파티션 아래에 놓이도록 설치됩니다. 이때, 파티션을 그대로 유지하려면, grub을 설치하는데 약간의 수고가 필요합니다:
그렇지 않으면, Manjaro#Resize_root_partition를 통해, /boot 파티션을 나누는 것도 고려해 볼 수 있습니다.
Prerequisites
먼저, / 파티션이 60% 이상 사용되고 있는지 확인을 하십시오. 파일시스템 전환에서 롤백을 위해 ext2_saved 서브 볼륨을 만들어야 하기 때문에, 여유 공간이 필요합니다.
- 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가 설치되어 있습니다.
먼저, 가상 시디롬에 우분투 20.04 설치 이미지를 마운트하고 그것으로 부팅합니다.
부팅 후에 Try Ubuntu를 누릅니다.
터미널을 실행합니다.
- sudo su
- lsblk
/dev/vda1 /boot/efi, /dev/vda5 /
- fsck.ext4 -fyv /dev/vda5
- btrfs-convert /dev/vda5
- mount /dev/vda5 /mnt
- mount -t vfat /dev/vda1 /mnt/boot/efi
- for fs in proc sys dev dev/pts; do mount --bind /$fs /mnt/$fs; done
- chroot /mnt
- blkid /dev/vda5
- vi /etc/fstab
UUID=..... / btrfs noatime,compress=zstd:1 0 1
- grub-mkconfig -o /boot/grub/grub.cfg
- update-initramfs -u
- grub-install /dev/vda
- update-grub
- exit
맨자로우
/boot 파티션이 별도로 존재하지 않아서, 부팅에 문제가 발생할 수 있습니다. 우분투는 /boot/efi를 vfat로 나누었고, 페도라는 /boot 파티션을 ext4로 만들었습니다. 이것을 위해, Manjaro_Linux#Resize_root_partition를 진행하고, 파일 시스템 전환을 했습니다. 위의 과정에서 chroot 한 후에, /etc/default/grub 파일을 수정합니다:
GRUB_DEFAULT=0
#GRUB_SAVEDEFAULT=true
그런-다음
- grub2-mkconfig -o /boot/grub2/grub.cfg
- mkinitcpio -P
- grub-install /dev/vda
- update-grub
Roll back
우분투-계열 배포판 /dev/vda5 /, /dev/vda1 /boot/efi로 파티션 되어 있으면, 똑같이 시디롬으로 부팅 후에,
- sudo su
- btrfs-convert -r /dev/vda5
- mount /dev/vda5 /mnt
- mount /dev/vda1 /mnt/boot/efi
- for fs in proc sys dev dev/pts; do mount --bind /$fs /mnt/$fs; done
- chroot /mnt
- grub-mkconfig -o /boot/grub/grub.cfg
- update-initramfs -u
- grub-install /dev/vda
- update-grub
- exit
아치-계열 배포판 /dev/vda1 /, /dev/vda2 /boot로 파티션 되어 있으면, 똑같이 시디롬으로 부팅 후에,
- sudo su
- btrfs-convert -r /dev/vda1
- mount /dev/vda1 /mnt
- mount /dev/vda2 /mnt/boot
- for fs in proc sys dev dev/pts; do mount --bind /$fs /mnt/$fs; done
- chroot /mnt
- grub-mkconfig -o /boot/grub/grub.cfg
- mkinitcpio -P
- grub-install /dev/vda
- update-grub
- exit
Make sub volume
간혹, 부팅이 되지 않는 경우가 있는데, grub이 바뀌는 과정이 끝나기 전에 가상 기계를 강제 부팅해서 그런 것으로 판단됩니다. 따라서, 마지막 update-grub을 수행한 후에, grub.cfg에서 UUID가 새로운 것으로 바뀌었는지 확인을 하시기 바랍니다. 아니면, 라이브시디로 부팅한 것을 정상적으로 종료하고, 하드디스크로 부팅을 시도해 보시기 바랍니다!!
가상 기계에 설치된 우분투 22.04에서, 하나의 ext4 / 파티션을 /, /home 2개의 서브 파티션으로 나누는 과정입니다.
- sudo su
- lsblk
/dev/vda2 /boot/efi vfat, /dev/vda3 / ext4
- 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
- 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
swapfile
SSD를 가진 분들은 스왑보다는 zram을 고려해 보시기 바랍니다.
우분투 라이브시디로 부팅해서, 터미널을 열고
- 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를 계속 사용해야 합니다. 다 같은 디바이스를 공유합니다.
Rename subvolume
페도라는 /root, /home과 같은 형식으로 서브 볼륨을 만들 수 있고, 롤백이 작동합니다.
반면에, 우분투는 /root, /home과 같은 형식으로 서브 볼륨을 만들 수 있지만, 롤백이 동작하지 않습니다.
그래서, /root를 @로, /home @home로 바꾸고, 롤백이 동작하는지 확인하려 합니다.
그러기 위해, 기존의 서브 볼륨, /root, /home을 각각 @, @home으로 바꾸어야 합니다.
이 작업은 단순히 mv 명령을 사용해서 이루어지지만, 문제는 Fedora_(operating_system)#Manage btrfs을 적용해 두었으므로, /dev/vda3를 마운트해도 서브 볼륨이 나타나지 않게 됩니다.
따라서, 이전 과정을 되돌리는 과정이 필요합니다.
원래 시스템, 우분투 22.04로 부팅한 후에, (위에서 id를 확인하십시오):
- sudo btrfs subvolume set-default 5 /
- sudo btrfs subvolume get-default /
그런-다음 라이브시디로 부팅을 합니다:
- mount /dev/vda3 /mnt
- btrfs subvolume list /mnt
- cd /mnt
- mv root @
- mv home @home
- mv snapshots @snapshots
- cd
- umount /mnt
- mount -o subvol=@ /dev/vda3 /mnt
- mount -o subvol=@home /dev/vda3 /mnt/home
- mount -t vfat /dev/vda2 /mnt/boot/efi
- mount -o subvol=@snapshots /dev/vda3 /mnt/.snapshots
- 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=@,compress=zstd:1 0 0
UUID=..... /home btrfs noatime,subvol=@home,compress=zstd:1 0 0
UUID=..... /.snapshots btrfs noatime,subvol=@snapshots,compress=zstd:1 0 0
- grub-mkconfig -o /boot/efi/EFI/ubuntu/grub.cfg
- update-initramfs -u
- grub-install /dev/vda
- update-grub
이제 정상적으로 부팅이 되었으니, 다시 256번 서브 볼륨을 /로 보이도록 조작하고, 부트로더를 수정해야 합니다. 그런-다음 롤백이 동작하는지 확인할 수 있습니다.
Troubleshootings
apt 설치 오류
ERROR: Could not statfs: No such file or directory
/etc/apt/apt.conf.d/80-btrfs-snapshot 파일을 제거하고, 리부팅하십시오.
롤백이 되지 않음 : 부트로더 rootflags=subvol=@을 제거해야 합니다. grub-customizer을 설치해서 작업할 수 있으며, 이때, 이미지의 절대 경로는 수정해서는 안됩니다.
See also
- APFS – a copy-on-write file system for macOS, iPadOS, iOS, tvOS and watchOS
- Bcachefs
- Comparison of file systems
- HAMMER – DragonFly BSD's file system that uses B-trees, paired with checksums as a countermeasure for data corruption
- List of file systems
- ReFS – a copy-on-write file system for Windows Server 2012
- ZFS
External links
- Official website
- I Can't Believe This is Butter! A tour of btrfs on YouTube – a conference presentation by Avi Miller, an Oracle engineer
- Btrfs: Working with multiple devices – LWN.net, December 2013, by Jonathan Corbet
- Marc's Linux Btrfs posts – detailed insights into various Btrfs features
- Btrfs overview, LinuxCon 2014, by Marc Merlin
- File System Evangelist and Thought Leader: An Interview with Valerie Aurora, Linux Magazine, 14 July 2009, by Jeffrey B. Layton
- 페도라 매거진 기사