답변:
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를 커널 모듈로 추가하십시오. 세 가지 다른 기사 덕분에 다음 과 같이 설정했습니다.
sudo apt install btrfs-tools initramfs-tools
echo 'btrfs' | sudo tee -a /etc/initramfs-tools/modules
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가 지적했듯이 커널을 업그레이드 하면 시스템이 손상됩니다. 이 문제를 해결하기 위해 커널 설치 후크 스크립트를 사용했습니다 .
INITRD=Yes
/etc/kernel/postinst.d/initramfs-tools
chmod +x
하십시오.이 시점에서 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 카드를 다시 마운트 해제).
mkfs.btrfs /dev/mmcblk0p2
sudo partprobe; sudo mount /dev/mmcblk0p2 /mnt; cd /mnt; tar -xzvf ~/rpi-rootfs-backup.tgz
sudo nano /mnt/etc/fstab
이와 비슷한 행이 있어야합니다.
/dev/mmcblk0p2 / ext4 foo,bar,baz 0 1
이것을 다음과 같이 변경하십시오 (새로운 FS 유형은 btrfs이며 기본 옵션을 사용합니다).
/dev/mmcblk0p2 / btrfs defaults 0 1
sudo umount /mnt
새 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
sudo nano /mnt/cmdline.txt
이 두 매개 변수를 찾으십시오
root=PARTUUID=1234-5678 rootfstype=ext4
그리고
root=UUID=cafebeef-0000-1234-aaaa-12346589 rootfstype=btrfs
UUID는 따옴표없이 앞서 복사 한 것입니다.
sudo umount /mnt
RPi에서 실제로 btrfs 루트 마운트에서 실행 중인지 확인하십시오. mount
/ dev / mmcblk0p2 on / type btrfs (rw, space_cache, subvol = /)
vo! 포인트 앤 클릭이 아니라 거인의 어깨에 서서 작동시킬 수있었습니다. ( 이것도 레포로 만들었 습니다.)
sudo apt upgrade
커널도 커널을 업그레이드하면 새 커널이 실패 할 이전 initramfs를로드하려고 시도하고 커널이 btrfs 드라이버를로드 할 수 없으므로 부팅시이 설정이 크게 실패합니다. 그리고 적어도 chroot
armhf 시스템 에서는이를 고치는 쉬운 방법이 아닙니다 .
apt upgrade
새 커널을 부팅하기 전에 항상 눈으로 모니터링 하고 필요한 경우 수동으로 initramfs를 생성해야합니다. 실패는 극적이기 때문에 초보자에게는 불가능한 일입니다. Raspberry Pi 부팅시 init 램 디스크 (initramfs)
4.14.98+
및) 4.14.98-v7+
. 커널 업데이트로 update-initramfs가 트리거되면 각 모델마다 하나씩 두 개의 initrd.img *가 생성됩니다. 이것은 /boot
파티션 에 맞지 않으며 (오류-공간 부족) 생성이 완료되지 않습니다.
MODULES=list
.