Raspbian btrfs root dosya sistemi


11

Güç kesintileri sırasında dosya bozulmasını nasıl ele aldığını görmek için kök bölüm olarak btrfs ile deney yapabileceğimi düşündüm. Ama önyükleme yapamıyorum.

Ben ne yaptım:

  1. değiştirmeden önce PI'da:

    apt-get install btrfs-tools 2. Linux bilgisayardan:

    btrfs-convert / dev / sda2

  2. In /etc/fstabdeğişikliği ext4içinbtrfs

  3. In /cmdline.txtdeğişikliği ext4içinbtrfs

Önyükleme yapmaya çalışırsam bir çekirdek paniği olur. Başka bir şey yapmalı mıyım?

Yanıtlar:


7

Btrfs bir çekirdek modülü olarak derlenmişse, modülü önyükleme sırasında yüklemek için bir initramfs oluşturmanız gerekir. Raspian (ve diğer debian türevleri) update-initramfsüzerinde bunu yapmanın en kolay yolu.

Yüklü initramfs-toolsise, apt-getyeni bir çekirdek yüklediğinde update-initramfsotomatik olarak tetiklenmelidir .

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

Ancak, rpi-updateyeni bir çekirdek yüklemek için kullanırsanız , yeni çekirdeğe update-initramfsyeniden başlatmadan önce el ile çalıştırmanız gerekir:

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

Bu, initramfs dosyasını oluşturur veya günceller /boot/initrd.img-<kernel-version>.

Son adım, önyükleme yapılandırmanıza eklemektir: şu satırı ekleyin /boot/config.txt:

initramfs initrd.img-<kernel-version> followkernel

initrd-<kernel-version>içindeki dosyanın adıyla tam olarak eşleşmelidir /boot.

Her koşuşunuzda bu adımları tekrarlamanız gerekecektir rpi-update.


2

Hızlı testim btrfs desteğinin raspbian'da doğrudan çekirdeğe bağlı olmayan harici bir modül olarak oluşturulduğunu gösteriyor.

Bu, çekirdeğin, kök dosya sisteminin nasıl monte edileceğini bilmeden önce (kök dosya sisteminde depolanan) modülü yükleyebileceği anlamına gelir. Açıkçası, bu işe yaramıyor.

Yaklaşım 1:

Kendi çekirdeğinizi oluşturun ve btrfs ön bağlantısı için build config ayarını yapın. Kendi çekirdeğinizi nasıl oluşturacağınızı ve yükleyeceğinizi anladıysanız, yapılandırmayı değiştirmek kolaydır.

Yaklaşım 2:

Çekirdek ve modüllerin ext4 dosya sisteminde olması ve sıkıştırmak istediğiniz verilerin bir btrfs bölümünde olması için işleri yeniden ayarlayın.

Yaklaşım 2A:

Kök bölümü ext4 olarak bırakın ve btrfs tabanlı yeni bir bölüm oluşturun, ancak bu OS kurulumunun küçülmesine yardımcı olmaz (hedefiniz bu ise).

Yaklaşım 2B:

Küçük olan ve çekirdek ve modülleri tutan bir önyükleme bölümü oluşturun. Pi'nin önyükleyicisi için bunun nasıl yapılacağı veya bununla ilgili sınırlamaların ne olduğu hakkında hiçbir fikrim yok.


Btrfs modüllerini önyükleme bölümüne kopyalayıp önceden oradan yüklemeye ne dersiniz?
GuySoft

3
Bir initrd.img ile başlamak da mümkün değil mi?
Anders

Evet, ve initrd.img çözmenin en kolay yolu gibi görünüyor! Hiç kullanmadım. "Mkinitrd" ile ilgili dokümanları arayın.
DonGar

Hmm, en son Raspbian'da CONFIG_BLK_DEV_INITRD etkin değil gibi görünüyor. Bu, initd desteğini etkinleştirmek için çekirdeği yeniden derlemeniz gerektiği anlamına gelir.
GuySoft

1
Bkz. Paxswill.com/blog/2013/11/04/encrypted-raspberry-pi - Şifrelenmiş köke izin vermek için initramfs kullanılır. Benzer şekilde, root mevcut olmadan önce kripto kurulumu (burada btrfs) desteği gereklidir.
Rbjz

1

Dış BTRFS kök bölümümü bulabilmek için , önyükleme bölümündeki kök bölümün UUID'sini açıkça belirtmem gerekiyordu cmdline.txt. Örneğin:

dwc_otg.lpm_enable = 0 konsol = tty1 kökü = PARTUUID = 123e4567-e89b-12d3-a456-426655440000 rootfstype = btrfs asansör = son tarih rootwait sessiz sıçrama

Kullanarak BTRFS bölümünün UUID'sini belirleyebilirsiniz lsblk -f.


1

Raspbian çekirdeği btrfsvarsayılan olarak destek içermez ; ilk önyükleme aşamaları normal çalışır, ancak çekirdek yüklendiğinde, bağlayabileceği herhangi bir dosya sistemi ve panik görmez. Bir çözüm var: initramfs içinde çekirdek modülü olarak btrfs ekleyin. Büyük ölçüde üç farklı makale sayesinde , bunu ayarladım:

  • Gerekli paketleri - çekirdek modülünü ve initramf'ları onunla güncelleme araçlarını yükleyin: sudo apt install btrfs-tools initramfs-tools
  • İnitramfs'a btrfs modülünü yüklemesini söyleyin (bir sebepten dolayı RPi1 üzerinde çalışmadı, otomatik olarak gerçekleşmelidir) - gerekli modüller listesine "btrfs" içeren bir satır ekleyin: echo 'btrfs' | sudo tee -a /etc/initramfs-tools/modules
  • Btrfs için bir initramfs kancası (görüntü oluşturmak için) ve komut dosyası (önyükleme için) oluşturun - varsayılanlar sağlanır, ancak testlerimde otomatik olarak kullanılmadılar, / etc'ye kopyalamak zorunda kaldılar. 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
  • -cGeçerli çekirdek sürümü (uname -r) için yeni initramfs oluşturun ( ) - varolan bir sürümü güncelliyorsanız, -ubunun yerine update ( ) kullanmanız gerekir . Bu, /boot/initrd.img-* gibi bir dosya oluşturur; burada *, geçerli çekirdek sürümüdür. Oluşturulan adı not edin (komut dosyası çıktı verir), bir sonraki adımda kullanacağız.update-initramfs -c -k $(uname -r)
  • Düzen /boot/config.txtekleyerek, bu initramfs kullanmaya initramfs initrd.img-3.11.0+ followkernelönceki adımda oluşturulan biri, dosya adı yolun olmadan; "followkernel" bellekteki konumu kontrol eder ( config.txt belgeleri ).
  • Bu, mevcut çekirdeği çözer, ancak @Ingo'nun işaret ettiği gibi , çekirdeğin yükseltilmesi sistemi bozar . Bunu düzeltmek için, onun çekirdek yükleme kanca komut dosyalarını kullandım :

    • / Etc / default / raspberrypi-kernel ve uncomment öğelerini düzenle INITRD=Yes
    • silmek /etc/kernel/postinst.d/initramfs-tools
    • eklemek rpi-initramfs-araçları /etc/kernel/postinst.d/ ve chmod +xo
    • isteğe bağlı olarak, initramf'lerin daha basit manuel güncellemeleri için update-rpi-initramfs dosyasını indirin.
  • Bu noktada, bir sistemimiz var olabilir kök aygıtı olarak Btrfs kullanın. Yeniden başlatarak test edin: sistem yine de ext4 bölümünden (veya /boot/cmdline.txt dosyasında ne varsa ) önyükleme yapar , ancak dmesg | grep -i btrfsşimdi "Btrfs yüklendi" içeren bir satır göstermelidir. Şimdi aslında bir btrfs bölümü oluşturmalı ve kullanmalıyız.

  • /(Ext4) bölümünün bir yedeğini alın - bunun / dev / mmcblk0p2 olduğunu varsayarak - genellikle: RPi'yi kapatın, SD kartı çıkarın, başka bir yere takın (bu örnekte sudo mount /dev/mmcblk0p2 /mntbir Linux bilgisayarda) ve içeriği arşivleyin; sahiplik ve izinleri koruyan bir araç kullanmanız gerektiğini unutmayın, örneğin tar: cd /mnt; sudo tar -czvf ~/rpi-rootfs-backup.tgz *(ve sonra SD kartı tekrar çıkarın)

  • Bir yerde bir btrfs bölümü oluşturma - ext4 bölümünü (/ dev / mmcblk0p2) değiştirerek SD kartı yeniden kullandım; Eğer bir btrfs-raid dizisi oluşturmak istiyorsanız, bunu yapmanın tam zamanı (bu cevabın kapsamı dışında mkfs.btrfs argümanlarından biri ):mkfs.btrfs /dev/mmcblk0p2
  • Btrfs bölümünü kurun ve yedeği geri yükleyin: sudo partprobe; sudo mount /dev/mmcblk0p2 /mnt; cd /mnt; tar -xzvf ~/rpi-rootfs-backup.tgz
  • Btrfs bölümünde fstab dosyasını düzenleyin :sudo nano /mnt/etc/fstab

Buna benzer bir satır olmalıdır:

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

Bunu şu şekilde değiştirin (yeni FS türü btrfs'dir ve varsayılan seçenekleri kullanır):

/dev/mmcblk0p2  / btrfs defaults 0 1
  • Bölümü çıkarın, ancak henüz SD kartı çıkarmayın! sudo umount /mnt
  • RPi'ye btrfs'den önyükleme yapacağını söylemeliyiz
  • Yeni btrfs bölümünün UUID bulun! - / dev / mmcblk0p2 ile satırı bulun ve UUID = parçası (değil UUID_SUB değil PARTUUID ile, kopya O bootloader bir hata tetikler ve kernel olmaz .):sudo blkid

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

  • Önyükleme (FAT32) bölümünü takın: sudo mount /dev/mmcblk0p1 /mnt

  • Cmdline.txt dosyasını düzenleyin: sudo nano /mnt/cmdline.txt

Bu iki parametreyi bulun

 root=PARTUUID=1234-5678 rootfstype=ext4

Ve yerine

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

UUID'nin daha önce kopyaladığımız, yalnızca tırnak işaretleri olmadan kullandığımız olduğunu unutmayın.

  • RPi önyükleme bölümünü ayırın: sudo umount /mnt
  • SD kartı RPi'ye değiştirin ve önyükleyin.
  • RPi'de gerçekten bir btrfs root mount'dan çalıştığınızı görün: mount

    / dev / mmcblk0p2 açık / tür btrfs (rw, space_cache, subvol = /)

  • Et voilà! Tam olarak tıkla ve tıkla değil, ama devlerin omuzlarında durarak, çalışmasını sağlayabilirim. (Bunu da bir repo yaptı .)


1
Birincisi sudo apt upgradeçekirdeği de yükseltirse, bu kurulum önyüklemede önemli ölçüde başarısız olur çünkü yeni çekirdek başarısız olacak eski initramfs yüklemeye çalışır ve çekirdek btrfs sürücülerini yükleyemez. Ve bunu düzeltmenin kolay bir yolu değil, en azından chrootbir armhf sisteminde.
Ingo

Çekirdek yükseltme sırasında update-initramfs çağrılmaz mı?
Piskvor binadan ayrıldı

1
Hayır, varsayılan Raspbian yeni bir initramf üretemez. Bunun için yapılandırılmamış. apt upgradeYeni çekirdeği açmadan önce her zaman ne yaptığını gözlerinizle izlemelisiniz ve gerekirse el ile bir initramf üretmelisiniz. Yeni başlayanlar için yapılamaz bir görev değil çünkü başarısız olması dramatik. Sen bir göz olabilir ben Ahududu Pi kadar açılışta bir init Ramdisk'i (initramfs) nasıl kullanabilirim?
Ingo

1
Buldum ama şimdiye kadar sabit değil küçük bir hata var. Çekirdek iki modeli destekler, örn. 4.14.98+Ve 4.14.98-v7+. Update-initramfs bir çekirdek güncellemesi tarafından tetiklenirse, her model için bir tane olmak üzere iki initrd.img * oluşturur. Bu /bootbölüme (alan hatası) uymuyor ve oluşturma işlemi bitmiyor.
Ingo

1
Ben kullanmayı düşünüyorum MODULES=list.
Ingo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.