btrfs를 루트 파티션으로 사용하여 전원 차단 중에 파일 손상을 처리하는 방법을 알 수 있다고 생각했습니다. 하지만 부팅 할 수 없습니다.
제가 한:
-
전환하기 전에 PI에서 :
apt-get install btrfs-tools 2. Linux 컴퓨터에서 :
btrfs-convert / dev / sda2
-
에서
/etc/fstab
변화ext4
에btrfs
- 에서
/cmdline.txt
변화ext4
에btrfs
부팅을 시도하면 커널 패닉이 발생합니다. 다른 작업을해야합니까?
답변
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를 다운로드하십시오.
- / etc / default / raspberrypi-kernel 편집 및 주석 해제
-
이 시점에서 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! 포인트 앤 클릭이 아니라 거인의 어깨에 서서 작동시킬 수있었습니다. ( 이것도 레포로 만들었 습니다.)