태그 보관물: btrfs

btrfs

raspbian의 btrfs 루트 파일 시스템 수 있다고 생각했습니다. 하지만 부팅 할 수

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

제가 한:

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

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

    btrfs-convert / dev / sda2

  2. 에서 /etc/fstab변화 ext4btrfs

  3. 에서 /cmdline.txt변화 ext4btrfs

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



답변

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.


답변

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

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

접근법 1 :

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

접근법 2 :

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

접근법 2A :

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

접근법 2B :

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


답변

외부 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.


답변

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! 포인트 앤 클릭이 아니라 거인의 어깨에 서서 작동시킬 수있었습니다. ( 이것도 레포로 만들었 습니다.)


답변