Saya pikir saya mungkin experement dengan btrfs sebagai partisi root untuk melihat bagaimana menangani file korupsi selama pemadaman listrik. Tapi saya tidak bisa mendapatkannya untuk boot.
Apa yang saya lakukan:
pada PI sebelum beralih:
apt-get install btrfs-tools 2. Dari komputer linux:
btrfs-convert / dev / sda2
Di
/etc/fstab
ubahext4
menjadibtrfs
- Di
/cmdline.txt
ubahext4
menjadibtrfs
Saya mendapatkan kepanikan kernel jika saya mencoba melakukan boot. Haruskah saya melakukan hal lain?
Untuk mendapatkannya untuk menemukan partisi root BTRFS eksternal saya, saya perlu secara eksplisit menentukan UUID partisi root di partisi boot
cmdline.txt
. Sebagai contoh:Anda dapat menentukan UUID partisi BTRFS menggunakan
lsblk -f
.sumber
Kernel Raspbian tidak menyertakan dukungan
btrfs
secara default; tahap boot awal berjalan secara normal, tetapi ketika kernel dimuat, ia tidak akan melihat sistem file mana pun yang bisa dipasang - dan panik. Ada solusi: tambahkan btrfs sebagai modul kernel, di initramfs. Sebagian besar berkat tiga artikel berbeda , saya telah mengaturnya sebagai berikut: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
) initramfs baru untuk versi kernel saat ini (uname -r) - jika Anda memperbarui yang sudah ada, Anda harus menggunakan pembaruan (-u
). Ini akan membuat file dengan nama /boot/initrd.img-*, di mana * adalah versi kernel saat ini. Perhatikan nama yang dihasilkan (skrip akan menampilkannya), kami akan menggunakannya pada langkah berikutnya.update-initramfs -c -k $(uname -r)
/boot/config.txt
untuk menggunakan initramfs ini, menambahkaninitramfs initrd.img-3.11.0+ followkernel
Nama file tanpa path, itu adalah yang dihasilkan pada langkah sebelumnya; "followkernel" mengontrol lokasi dalam memori ( dokumentasi config.txt ).Itu memecahkan kernel saat ini, tetapi seperti yang ditunjukkan @Ingo, memutakhirkan kernel akan merusak sistem. Untuk memperbaikinya, saya menggunakan skrip kait-instal kernel-nya :
INITRD=Yes
/etc/kernel/postinst.d/initramfs-tools
chmod +x
ituPada titik ini, kami memiliki sistem yang dapat menggunakan btrfs sebagai perangkat root. Tes dengan mem-boot ulang: sistem masih akan mem-boot dari partisi ext4 (atau apa pun yang ada di /boot/cmdline.txt Anda ), tetapi
dmesg | grep -i btrfs
sekarang harus memperlihatkan baris yang berisi "Btrfs dimuat". Sekarang kita harus benar-benar membuat dan menggunakan partisi btrfs.Buat cadangan
/
partisi (ext4) - dengan asumsi ini adalah / dev / mmcblk0p2 - biasanya: matikan RPi, keluarkan kartu SD, pasang kartu itu di tempat lain (dalam contoh inisudo mount /dev/mmcblk0p2 /mnt
di komputer Linux) dan arsipkan isinya; perhatikan bahwa Anda perlu menggunakan alat yang mempertahankan kepemilikan dan izin, misalnya tar:cd /mnt; sudo tar -czvf ~/rpi-rootfs-backup.tgz *
(dan kemudian lepaskan kartu SD lagi)mkfs.btrfs /dev/mmcblk0p2
sudo partprobe; sudo mount /dev/mmcblk0p2 /mnt; cd /mnt; tar -xzvf ~/rpi-rootfs-backup.tgz
sudo nano /mnt/etc/fstab
Seharusnya ada baris yang mirip dengan ini:
Ubah ke ini (tipe FS baru adalah btrfs, dan menggunakan opsi default):
sudo umount /mnt
Temukan UUID dari partisi btrfs baru Anda - temukan baris dengan / dev / mmcblk0p2, dan salin bagian UUID =, dengan (bukan UUID_SUB, bukan PARTUUID! Itu akan memicu bug di bootloader, dan kernel tidak mau boot .):
sudo blkid
/ dev / mmcblk0p2: UUID = "cafebeef-0000-1234-aaaa-12346589" UUID_SUB = "ababccdd-2345-cafe-beee-587989991110" TYPE = "btrfs" PARTUUID = "beef0bee-02"
Pasang partisi boot (FAT32):
sudo mount /dev/mmcblk0p1 /mnt
sudo nano /mnt/cmdline.txt
Temukan dua parameter ini
Dan ganti dengan
Perhatikan bahwa UUID adalah yang kami salin sebelumnya, hanya tanpa tanda kutip.
sudo umount /mnt
Pada RPi, lihat bahwa Anda memang menjalankan dari mount root btrfs:
mount
/ dev / mmcblk0p2 on / ketik btrfs (rw, space_cache, subvol = /)
Dan lagi! Bukan titik-dan-klik, tetapi dengan berdiri di atas bahu raksasa, saya bisa membuatnya bekerja. (Membuat ini menjadi repo juga.)
sumber
sudo apt upgrade
jika itu juga meningkatkan kernel, pengaturan ini akan gagal secara dramatis saat boot karena kernel baru mencoba memuat initramf lama yang akan gagal dan kernel tidak dapat memuat driver btrfs. Dan itu bukan cara mudah untuk memperbaikinya, setidaknya denganchroot
sistem armhf.apt upgrade
sedang dilakukan dan harus menghasilkan initramfs dengan tangan jika diperlukan - sebelum mem-boot kernel baru. Bukan tugas yang bisa dilakukan untuk pemula karena gagal itu dramatis. Anda mungkin telah melihat Bagaimana saya bisa menggunakan init ramdisk (initramfs) saat boot Raspberry Pi?4.14.98+
dan4.14.98-v7+
. Jika pembaruan-initramfs dipicu oleh pembaruan kernel, ia akan menghasilkan dua initrd.img *, satu untuk setiap model. Ini tidak cocok pada/boot
partisi (kesalahan - keluar dari ruang) dan generasi tidak selesai.MODULES=list
.