Ne yaparsan yap, sahipsin initramfs
. Onsuz yapamazsınız - size uygulanan tek dosya sistemi budur. Gönderen kernel.org :
Rootfs nedir?
Rootfs
Özel bir örnek olan ramfs
(ya da tmpfs
, olduğu en etkin ise),
her zaman 2.6 sistemlerinde var. Sen bağlantısını kesme olamazrootfs
sen init süreci öldüremem yaklaşık aynı nedenle; boş bir listeyi denetlemek ve işlemek için özel bir kod kullanmak yerine, çekirdeğin belirli listelerin boş olamayacağından emin olması daha küçük ve basittir.
Çoğu sistem başka bir dosya sistemini bağlar rootfs
ve yok sayar. Boş bir ramfs örneğinin kapladığı alan çok azdır .
Eğer * CONFIG_TMPFS * etkinleştirildiğinde, rootfs
kullanacağı tmpfs
yerine ramfs
varsayılan olarak. Kuvvet için ramfs
, eklemek "rootfstype=ramfs"
çekirdek komut satırına.
Initramfs nedir?
Tüm 2.6 Linux çekirdeği , çekirdek açıldığında çıkarılan gzip"cpio"
biçiminde bir arşiviçerir . Ayıkladıktan sonra eğer çekirdek denetlerbir dosyayı içeren , gibi bunu yürütür öyleyse PID 1. Eğer bulundu, busüreç bulma ve gerçek kök cihazı montaj, sistemi yolu yukarı geri kalanını getiren dahil sorumludur ( varsa). Eğerbir içermiyorgömülü sonra programıarşivi içine ayıklanır, çekirdek bulmak ve bir kök bölüm bağlama, ardından bir varyasyonunu exec yaşlı koduna yoluyla düşecekBunun out.rootfs
rootfs
"init"
init
rootfs
init
cpio
/sbin/init
Bütün bunlar eski başlangıçtan birkaç şekilde farklıdır:
Eski initrd her zaman ayrı bir dosyayken, initramfs arşivi linux çekirdek görüntüsüne bağlanır. (Linux - * / usr dizini derleme sırasında bu arşivi oluşturmaya ayrılmıştır.)
Eski initrd dosyası gzip edilmiş bir dosya sistemi görüntüsüdür (çekirdeğe yerleştirilmiş bir sürücüye ihtiyaç duyan ext2 gibi bazı dosya formatlarında), yeni initramfs arşivi ise gzip edilmiş bir cpio arşivi (tar sadece daha basit gibi, bkz. Cpio (1) ve Dokümantasyon / erken kullanıcı alanı / buffer-format.txt). Çekirdeğin cpio çıkarma kodu sadece çok küçük değil, aynı zamanda önyükleme işlemi sırasında atılabilecek metin ve verilerdir.
Eski initrd tarafından çalıştırılan program (/ initrd, / init olarak adlandırılır) bazı kurulumlar yaptıktan sonra çekirdeğe geri dönerken, initramfs'den gelen initram programının çekirdeğe dönmesi beklenmez. (/ İnit'in kontrolü elden bırakması gerekiyorsa, yeni bir kök aygıtı ile / cihazını aşabilir ve başka bir başlangıç programı yürütebilir. Aşağıdaki switch_root yardımcı programına bakın.)
Başka bir kök aygıtı değiştirirken, initrd pivot_root ve ardından ramdisk'i takar. Ancak initramfs rootfs'dir: ne pivot_root rootf'lerini ne de bağlantısını kesemezsiniz. Bunun yerine alanı boşaltmak için rootfs'den her şeyi silin (find -xdev / -exec rm '{}' ';'), rootfs'yi yeni kökle (cd / newmount; mount --move. /; Chroot.), stdin / stdout / stderr öğesini yeni / dev / konsola ekleyin ve yeni init'i çalıştırın.
Bu, dikkat çekici derecede kalıcı bir süreç olduğundan ve komutları çalıştırmadan önce silinmeyi içerdiğinden, klibc paketi tüm bunları sizin için yapmak için bir yardımcı program (utils / run_init.c) başlattı. Diğer paketlerin çoğu (meşgul kutusu gibi) bu komutu "switch_root" olarak adlandırmıştır.
Initramfs doldurma:
2.6 çekirdek oluşturma işlemi her zaman gzip ile sıkıştırılmış bir cpio formatı initramfs arşivi oluşturur ve onu sonuçtaki çekirdek ikilisine bağlar. Varsayılan olarak, bu arşiv boştur (x86'da 134 bayt tüketir).
CONFIG_INITRAMFS_SOURCE (menüconfig içindeki Genel Kurulum'da ve usr / Kconfig içinde yaşayan) yapılandırma seçeneği, initramfs arşivi için otomatik olarak ortaya çıkan ikili dosyaya dahil edilecek bir kaynak belirtmek için kullanılabilir. Bu seçenek, mevcut bir gzip ile sıkıştırılmış cpio arşivini, arşivlenecek dosyaları içeren bir dizini veya aşağıdaki örnek gibi bir metin dosyası belirtimini işaret edebilir:
dir /dev 755 0 0
nod /dev/console 644 0 0 c 5 1
nod /dev/loop0 644 0 0 b 7 0
dir /bin 755 1000 1000
slink /bin/sh busybox 777 0 0
file /bin/busybox initramfs/busybox 755 0 0
dir /proc 755 0 0
dir /sys 755 0 0
dir /mnt 755 0 0
file /init initramfs/init.sh 755 0 0
Yukarıdaki dosya biçimini belgeleyen bir kullanım iletisi almak için "çekirdek / gen_init_cpio" komutunu (çekirdek derlemesinden sonra) çalıştırın.
Yapılandırma dosyasının bir avantajı, izinleri ayarlamak veya yeni arşivde aygıt düğümleri oluşturmak için kök erişiminin gerekli olmamasıdır. (Bu iki örnek "dosya" girdisinin linux-2.6. * Dizini altındaki "initramfs" adlı bir dizinde "init.sh" ve "busybox" adlı dosyaları bulmayı beklediğini unutmayın. daha fazla detay.)
Çekirdek harici cpio araçlarına bağlı değildir. Bir yapılandırma dosyası yerine bir dizin belirtirseniz, çekirdeğin derleme altyapısı bu dizinden bir yapılandırma dosyası oluşturur (usr / Makefile komut dosyaları / gen_initramfs_list.sh) ve bu dizini yapılandırma dosyasını kullanarak paketlemeye devam eder ( usr / gen_init_cpio.c adresinden oluşturulan usr / gen_init_cpio). Çekirdeğin inşa süresi cpio oluşturma kodu tamamen bağımsızdır ve çekirdeğin önyükleme zamanı çıkarıcısı da (belli ki) bağımsızdır.