Unix/Arch Linux

Arch Linux - / 파티션을 btrfs로

ForceCore 2010. 10. 23. 15:53

이거 좀 까다롭다. -_-;;
btrfs 자체가 실험적인 것이라 / 파티션으론 잘 안 씀.
필자는 왜 쓰기로 했는고 하니...
1. 빠르니까 (ext4보다 빠르다고 주장)
2. ssd용 optimization이 있으니까 (!! 필자는 최근 SSD를 질렀음 -ㅠ-;;)
자료가 많지는 않지만 조합해보면.

https://bbs.archlinux.org/viewtopic.php?pid=776868
https://bbs.archlinux.org/viewtopic.php?pid=775204

처음부터 설치할 때에는 위저드를 따라가면 되는데, 위저드의 파티션 단계에서 조금 더 손작업이 들어간다.
btrfs volume을 만들긴 해야 되는데...
subvolume을 만들어야 함. __active라는 subvolume이 필요하다. __active 라는건 아마 arch linux specific한거라서... 라기 보다는, AUR의 mkinitcpio-btrfs 에 미리 정의된 값이라 그럴 것이다?


어쨌거나, 파티션/파일시스템 준비과정을 이런식으로 바꾼다.

# mkfs.ext4 /dev/sda1             /boot 파티션용
# mkfs.btrfs /dev/sda2
# mount /dev/sda1 /mnt
# btrfs subvol create /mnt/__active          / 파티션용
# btrfs subvol create /mnt/home               /home 파티션용

# umount /mnt

mount -o subvol=__active /dev/sda2 /mnt
mount -o subvol=home /dev/sda2 /mnt/home
mount /dev/sda1 /mnt/boot


이렇게 손으로 마운트를 한 다음 나머지 패키지 설치 단계를 밟는다. genfstab 조차도 잘 된다. (subvol 옵션까지 잘 붙어서!)

부트 파티션은 100mb짜리로서 ext4다. -ㅠ-;; 아직 btrfs를 바로 부팅하는건 잘 안 된다고 하네? 물론 yaourt에 보면 grub2-btrfs 라는게 존재하긴 한다만, 검증해보진 않았다. 그리고 2016년 현재도 /boot 가지고 모험하고 싶진 않기도 하고, 어차피 필자는 원래 /boot를 100MB정도 나머지 파티션과 따로 만들어 두는 스타일이라서 검증 안 함.

2016-03-25: 요새는 mkinitcpio에 btrfs 지원이 그냥 들어가 있다고 하니 아래의 처리는 안 해도 된다.
https://wiki.archlinux.org/index.php/Btrfs
그냥 역사적으로 이랬던 적이 있다고 남겨놓겠다.

가 아니구나. hook은 설치해야.
arch-chroot 상태로, 재부팅이 안 된 상태로, btrfs-progs 를 시스템에 설치한다. 그래야지 btrfs hook을 initcpio에서 사용할 수 있게 된다. ㄷㄷㄷ 역시나 btrfs를 루트 파티션으로 쓰는 것은 아직도 비주류다.

$ mkinitcpio -L
을 하면 btrfs 가 사용가능한 hook 목록에 있어야 한다.

# vi /etc/mkinitcpio.conf

안에 보면 HOOKS="..." 이런게 있는데 필자는 맨 끝에 btrfs를 추가했다.

# mkinitcpio -p linux
로 부트 이미지 생성을 다시 해야 함. 이렇게 하니 되긴 한다...


https://forums.opensuse.org/showthread.php/513403-BTRFS-error-message-%28supposedly-harmless%29
BTRFS error (device sda2): could not find root 8
이런 에러 메시지가 나오기는 하는데 systemctl의 에러지 부팅시 문제가 있는건 아니다.



설치가 끝나면 설치가 끝난 시스템으로 재시작 하라고 할텐데... 그러면 안 된다 -_-;; 부팅도 안 됨.
앞으로 밑에 제시된 설명을 따라하다가, 부팅에 실패하면, 재설치는 안 해도 되니깐, 일단 설치환경에서 root로 로그인 해서 복구를 시작하면 됨.

일단은 네트워크가 되게 해서 패키지를 인터넷으로 받을 수 있도록 조치해둔다. 필자는 dhcpcd를 실핸시키면 되었음 -_-;; cp /etc/resolv.conf /mnt/etc/resolv.conf 로 DNS 서버 정보도, 아래에서 할 chroot 환경에 줘야지 됨.


그 다음 새로 설치된 환경으로 chroot해서 작업해야 된다. 위에서처럼 파티션 마운트는 다 했다 치고. 추가적으로

mount -t proc proc /mnt/proc
mount -o bind /dev /mnt/dev
mount -o bind /sys /mnt/sys
chroot /mnt
을 하라. 그러면 새 설치환경으로 부트된 것과 마찬가지로 pacman을 이용해 여러가지 패키지를 설치할 수 있다.
이하는 chroot환경에서 작업한다고 가정한다.

yaourt까지 설치하고 (ㄷㄷㄷ)
mkinitcpio-btrfs 를 설치한다. 설치하면 나오는 메시지 중 /etc/mkinitcpio.conf 였나 거기에다 HOOK에다 btrfs-advanced 를 추가하란 말도 있을 것임. 시키는 대로 한다.

grub2도 설치해야 한다. grub은 잘 안 되는 것 같음.
사실 grub2도 잘 되진 않는다.
grub-mkconfig 가 잘 안 되는데..:
/sbin/grub-probe: error: cannot find a device for / (is /dev mounted?).
이런 메시지가 나오면서 안 될 것이다. 저거 감지하는 부분이 좀 버그가 있어서 btrfs와 궁합이 나쁨.
/sbin/grub-mkconfig 를 야매로 조금 손봐줘야지 됨... 필자는 /dev/sda2가 root subvolume이 있는데니까는,
/sbin/grub-mkconfig 를 수정해서
GRUB_DEVICE="`${grub_probe} --target=device /`"
이런 부분이 있을텐데
#GRUB_DEVICE="`${grub_probe} --target=device /`"
GRUB_DEVICE="/dev/sda2"
라고 바꾼다. 어디까지나 임시방편적이지만 일단 되기는 할 것이다 (...)

grub-mkconfig -o /boot/grub/grub.cfg

로 설정을 대충 만들었으면... 아직 부팅이 안 될 것이다. 왜냐면. subvol에다 설치했으니까.
linux /vmlinuz26 root=/dev/sda2 ro quiet

이런게 있을텐데 죄다
linux /vmlinuz26 root=/dev/sda2 rootflags=subvol=__active ro quiet
로 고쳐서 커널에게, subvolume이 루트파티션이라는 점을 인식시켜줘야 한다.