raspbian의 btrfs 루트 파일 시스템


11

btrfs를 루트 파티션으로 사용하여 전원 차단 중에 파일 손상을 처리하는 방법을 알 수 있다고 생각했습니다. 하지만 부팅 할 수 없습니다.

제가 한:

  1. 전환하기 전에 PI에서 :

    apt-get install btrfs-tools 2. Linux 컴퓨터에서 :

    btrfs-convert / dev / sda2

  2. 에서 /etc/fstab변화 ext4btrfs

  3. 에서 /cmdline.txt변화 ext4btrfs

부팅을 시도하면 커널 패닉이 발생합니다. 다른 작업을해야합니까?

답변:


7

btrfs가 커널 모듈로 컴파일 된 경우 부팅시 모듈을로드하기 위해 initramfs를 작성해야합니다. Raspian (및 다른 데비안 파생물) update-initramfs에서 가장 쉬운 방법입니다.

경우 initramfs-tools설치 후 언제든지 apt-get새로운 커널을 설치, 그것은 트리거해야 update-initramfs자동으로.

sudo apt-get update
sudo apt-get install initramfs-tools

그러나 rpi-update새 커널을 설치하는 데 사용하는 경우 새 커널 update-initramfs로 재부팅하기 전에 수동으로 실행 해야합니다.

sudo update-initramfs -u -k <kernel-version>

이것은 initramfs를 만들거나 업데이트합니다 /boot/initrd.img-<kernel-version>.

마지막 단계는 부트 구성에 추가하는 것입니다. 다음 행을 다음에 추가하십시오 /boot/config.txt.

initramfs initrd.img-<kernel-version> followkernel

initrd-<kernel-version>의 파일 이름과 정확히 일치해야합니다 /boot.

를 실행할 때마다이 단계를 반복해야합니다 rpi-update.


2

필자의 빠른 테스트에 따르면 btrfs 지원은 커널에 직접 연결되지 않고 raspbian의 외부 모듈로 구축되었습니다.

즉, 커널은 루트 파일 시스템을 마운트하는 방법을 알기 전에 루트 파일 시스템에 저장된 해당 모듈을로드 할 수 있어야합니다. 분명히, 이것은 작동하지 않습니다.

접근법 1 :

자신의 커널을 빌드하고 btrfs를 사전 링크하도록 빌드 구성을 조정하십시오. 자신의 커널을 빌드하고로드하는 방법을 알아 낸 경우 구성을 쉽게 조정할 수 있습니다.

접근법 2 :

커널과 모듈이 ext4 파일 시스템에 있고 압축하려는 데이터가 btrfs 파티션에 있도록 항목을 다시 조정하십시오.

접근법 2A :

루트 파티션을 ext4로 남겨두고 btrfs 기반의 새 파티션을 작성하되 OS 설치를 줄이는 데 도움이되지는 않습니다 (목표 인 경우).

접근법 2B :

작은 부트 파티션을 만들고 커널과 모듈을 유지하면서 다른 모든 것은 btrfs에 남겨 둡니다. Pi의 부트 로더에 대해이 작업을 수행하는 방법 또는 그 주위의 제한 사항을 모르겠습니다.


btrfs 모듈을 부트 파티션에 복사하고 미리로드하는 것은 어떻습니까?
GuySoft

3
initrd.img로 시작할 수 없습니까?
Anders

예, 그리고 initrd.img는 그것을 해결하는 가장 쉬운 방법처럼 보입니다! 나는 그것을 사용한 적이 없다. "mkinitrd"에서 문서를 찾으십시오.
DonGar

Hmm은 최신 Raspbian에서 CONFIG_BLK_DEV_INITRD가 활성화되지 않은 것 같습니다. 즉, initd 지원을 활성화하려면 커널을 다시 컴파일해야합니다.
GuySoft

1
paxswill.com/blog/2013/11/04/encrypted-raspberry-pi를 참조하십시오. initramfs는 암호화 된 루트를 허용하는 데 사용됩니다. 마찬가지로 루트를 사용하려면 cryptsetup (여기서는 btrfs)에 대한 지원이 필요합니다.
Rbjz

1

외부 BTRFS 루트 파티션을 찾으려면 부트 파티션에서 루트 파티션의 UUID 를 명시 적으로 지정해야했습니다 cmdline.txt. 예를 들면 다음과 같습니다.

dwc_otg.lpm_enable = 0 console = tty1 root = PARTUUID = 123e4567-e89b-12d3-a456-426655440000 rootfstype = btrfs elevator = 마감 대기 시간 rootwait quiet splash

을 사용하여 BTRFS 파티션의 UUID를 확인할 수 있습니다 lsblk -f.


1

Raspbian 커널은 btrfs기본적으로 지원 을 포함하지 않습니다 . 초기 부팅 단계 는 정상적으로 실행되지만 커널이로드되면 마운트 할 수있는 파일 시스템과 패닉이 표시되지 않습니다. 해결책은 다음과 같습니다. initramfs에서 btrfs를 커널 모듈로 추가하십시오. 세 가지 다른 기사 덕분에 다음 같이 설정했습니다.

  • 필요한 패키지 (커널 모듈 및 initramfs를 업데이트하는 도구)를 설치하십시오. sudo apt install btrfs-tools initramfs-tools
  • initramfs에 btrfs 모듈을로드하도록 지시하십시오 (어떤 이유로 든 자동으로 발생해야하며 RPi1에서 작동하지 않았습니다). "btrfs"가있는 행을 필요한 모듈 목록에 추가하십시오. echo 'btrfs' | sudo tee -a /etc/initramfs-tools/modules
  • btrfs에 대한 initramfs 훅 (이미지 구축 용)과 스크립트 (부팅 용)를 생성합니다. 기본값은 제공되지만 테스트에서는 자동으로 사용되지 않았으며, / etc에 복사해야했습니다. sudo mkdir -p /etc/initramfs-tools/hooks ; sudo mkdir -p /etc/initramfs-tools/scripts/local-premount ; sudo cp /usr/share/initramfs-tools/hooks/btrfs /etc/initramfs-tools/hooks ; sudo cp /usr/share/initramfs-tools/scripts/local-premount/btrfs /etc/initramfs-tools/scripts/local-premount; sudo chmod +x /etc/initramfs-tools/hooks/btrfs /etc/initramfs-tools/scripts/local-premount/btrfs
  • -c현재 커널 버전 (uname -r)에 대해 새 initramfs를 작성 ( )하십시오. 기존 버전을 업데이트하는 경우 -u대신 update ( ) 를 사용해야 합니다. 그러면 /boot/initrd.img-*와 같은 파일이 생성됩니다. 여기서 *는 현재 커널 버전입니다. 생성 된 이름 (스크립트에서 출력)을 확인한 후 다음 단계에서 사용합니다.update-initramfs -c -k $(uname -r)
  • /boot/config.txt이 initramfs를 사용하도록 편집 하여 initramfs initrd.img-3.11.0+ followkernel파일 이름에 경로가 없으며 이전 단계에서 생성 된 이름입니다. "followkernel"은 메모리의 위치를 ​​제어합니다 ( config.txt 문서 ).
  • 이것은 현재 커널을 해결하지만 @Ingo가 지적했듯이 커널을 업그레이드 하면 시스템이 손상됩니다. 이 문제를 해결하기 위해 커널 설치 후크 스크립트를 사용했습니다 .

    • / etc / default / raspberrypi-kernel 편집 및 주석 해제 INITRD=Yes
    • 지우다 /etc/kernel/postinst.d/initramfs-tools
    • rpi-initramfs-tools 를 /etc/kernel/postinst.d/에 추가 chmod +x하십시오.
    • 선택적으로, initramfs의보다 간단한 수동 업데이트를 위해 update-rpi-initramfs를 다운로드하십시오.
  • 이 시점에서 btrfs를 루트 장치로 사용할 있는 시스템 있습니다. 재부팅하여 테스트하십시오 : 시스템은 여전히 ​​ext4 파티션 (또는 /boot/cmdline.txt에있는 것 )으로 부팅 되지만 dmesg | grep -i btrfs"Btrfs loaded"를 포함하는 행을 표시해야합니다. 이제 실제로 btrfs 파티션을 만들고 사용해야합니다.

  • // dev / mmcblk0p2라고 가정 하고 (ext4) 파티션 의 백업을 만듭니다. 일반적으로 : RPi를 종료하고 SD 카드를 꺼내어 다른 곳 (이 예 sudo mount /dev/mmcblk0p2 /mnt에서는 Linux 컴퓨터)에 마운트 하고 내용을 보관합니다. tar와 같은 소유권 및 권한을 유지하는 도구를 사용해야합니다 cd /mnt; sudo tar -czvf ~/rpi-rootfs-backup.tgz *( 예 : tar : SD 카드를 다시 마운트 해제).

  • btrfs 파티션을 어딘가에 만듭니다-SD 카드를 재사용하여 ext4 파티션 (/ dev / mmcblk0p2)을 교체했습니다. btrfs-raid 배열을 만들려면 지금이 시간 입니다 (이 답변의 범위를 벗어난 mkfs.btrfs의 인수 중 하나입니다 ).mkfs.btrfs /dev/mmcblk0p2
  • btrfs 파티션을 마운트하고 백업을 복원하십시오. sudo partprobe; sudo mount /dev/mmcblk0p2 /mnt; cd /mnt; tar -xzvf ~/rpi-rootfs-backup.tgz
  • btrfs 파티션에서 fstab 편집하십시오 .sudo nano /mnt/etc/fstab

이와 비슷한 행이 있어야합니다.

/dev/mmcblk0p2  / ext4 foo,bar,baz 0 1

이것을 다음과 같이 변경하십시오 (새로운 FS 유형은 btrfs이며 기본 옵션을 사용합니다).

/dev/mmcblk0p2  / btrfs defaults 0 1
  • 파티션을 마운트 해제했지만 아직 SD 카드를 제거하지 마십시오! sudo umount /mnt
  • RPi에 btrfs로 부팅 할 것이라고 알려야합니다.
  • 새 btrfs를 파티션의 UUID를 찾습니다! -는 / dev / mmcblk0p2으로 라인을 발견하고 UUID = 부분은 (하지 UUID_SUB하지 PARTUUID로 복사 즉 부트 로더의 버그를 발생하게하고, 커널은 부팅되지 것 .) :sudo blkid

    / dev / mmcblk0p2 : UUID = "cafebeef-0000-1234-aaaa-12346589" UUID_SUB = "ababccdd-2345-cafe-beee-587989991110"TYPE = "btrfs"PARTUUID = "beef0bee-02"

  • 부팅 (FAT32) 파티션을 마운트하십시오. sudo mount /dev/mmcblk0p1 /mnt

  • cmdline.txt를 편집하십시오. sudo nano /mnt/cmdline.txt

이 두 매개 변수를 찾으십시오

 root=PARTUUID=1234-5678 rootfstype=ext4

그리고

 root=UUID=cafebeef-0000-1234-aaaa-12346589 rootfstype=btrfs

UUID는 따옴표없이 앞서 복사 한 것입니다.

  • RPi 부팅 파티션을 마운트 해제하십시오 : sudo umount /mnt
  • SD 카드를 RPi로 교체하고 부팅하십시오.
  • RPi에서 실제로 btrfs 루트 마운트에서 실행 중인지 확인하십시오. mount

    / dev / mmcblk0p2 on / type btrfs (rw, space_cache, subvol = /)

  • vo! 포인트 앤 클릭이 아니라 거인의 어깨에 서서 작동시킬 수있었습니다. ( 이것도 레포로 만들었 습니다.)


1
첫 번째 sudo apt upgrade커널도 커널을 업그레이드하면 새 커널이 실패 할 이전 initramfs를로드하려고 시도하고 커널이 btrfs 드라이버를로드 할 수 없으므로 부팅시이 설정이 크게 실패합니다. 그리고 적어도 chrootarmhf 시스템 에서는이를 고치는 쉬운 방법이 아닙니다 .
Ingo 2019

커널 업그레이드시 update-initramfs가 호출되지 않습니까?
Piskvor

1
아니요, 기본 Raspbian은 새 initramfs를 생성하지 못합니다. 이를 위해 구성되지 않았습니다. apt upgrade새 커널을 부팅하기 전에 항상 눈으로 모니터링 하고 필요한 경우 수동으로 initramfs를 생성해야합니다. 실패는 극적이기 때문에 초보자에게는 불가능한 일입니다. Raspberry Pi 부팅시 init 램 디스크 (initramfs)
Ingo

1
내가 찾은 작은 버그가 있지만 지금까지 수정되지 않았습니다. 커널은 두 가지 모델을 지원합니다 (예 : 4.14.98+및) 4.14.98-v7+. 커널 업데이트로 update-initramfs가 트리거되면 각 모델마다 하나씩 두 개의 initrd.img *가 생성됩니다. 이것은 /boot파티션 에 맞지 않으며 (오류-공간 부족) 생성이 완료되지 않습니다.
Ingo

1
사용을 고려합니다 MODULES=list.
Ingo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.