Neden initramflere ihtiyacım var?


17

Ben seçersem öğrendim jffsya sddosya sistemi olarak (ve initramfs), çekirdek boyutu (ile karşılaştırıldığında 1.4 MB olarak çok küçük olacaktır initramfshangi 3.4MB olduğunu). Bu initramfs, oldukça geniş alan kapladığı anlamına gelir . Bu yüzden eğer yapabilirsem, onu tamamen kaldırırdım ve böylece çok küçük bir çekirdeğe sahip olurum, istediğim bu.

Aklımdaki temel soru şudur: Neden ihtiyacım var initramfs? Başlangıçta herhangi bir dosya sistemine sahip olmadan bir Linux çekirdek önyüklemesi yapılamaz mı?

Son uygulamam sadece hesaplama ve iletişim yapacak - hiç depolama yok. Bu yüzden dosya sistemi olmayan bir işletim sistemi mantıklı - en azından benim uygulamam için.


2
Initramfs olmadan yapamazsınız. Ek initramfs dosyası olmadan yapmak mümkündür, ancak ne yaparsanız yapın, çekirdek kendi boş veya boş içerir. Bu yüzden sorunuzu anlamıyorum - hangi dağıtımdan bahsediyorsunuz? Çekirdeğinizi nasıl inşa ediyorsunuz? Çekirdek .config dosyasını sağlayabilir misiniz? Bunlar çok önemli. Dağıtımınızın initramf'lerini doğrudan çekirdeğe derlediğinden ve bu nedenle içerdiği boş initramf'leri doldurduğundan şüpheleniyorum - ancak verdiğiniz bilgilere dayanarak bilemiyorum.
14'te mikeserv

2
@mikeserv, tabii ki yerleşik ama boş / kullanılmayan initramfs sayılmaz.
psusi

Peki, @psusi çekirdek belgelerine katılmıyor. Ve ben sadece bu konuda çok kararlıyım çünkü herhangi bir gizem olmasına gerek yok - bu sadece /root- bu kadar. Farklı yaptığı tek şeyswitch_root ancak belirli yüklü çekirdek modülleri ile uygun önlemler alınması şartıyla, herhangi bir zamanda yapılabilir. Initramfs bir disk imgesinden başka bir şey değildir - kenar boşuna veya hayır, oradadır. Ve asla onsuz değilsin - sonuçta senin kökün. Sadece bir gizem olmamalı, bence bu ve onu çevreleyen tüm gereksiz karışıklıkları sevmiyorum.
14'te mikeserv

2
@mikeserv, no, / root root kullanıcısının ana dizinidir. Kökler /, daha sonra gerçek kökü üzerine monte edilir. Sadece anlambilimi savunuyorsun. Bu tartışmanın amaçları doğrultusunda, bir initramfs olmaması, önyükleme yükleyicinizin diskte bir dosyaya sahip olması ve çekirdeğe geçmesi gerektiği anlamına gelir.
psusi

Bu doğrudur, sadece netlik uğruna / kök kullandım, ama bunu sana vereceğim. Ama hayır, semantik değiller, linux çekirdeğinizin temel mekaniği. Bunlar temel şeyler. Onları düzeltmeye çalışalım.
mikeserv

Yanıtlar:


12

Bir initramfs'ye sahip olmanın boyut artışı, ramfs sürücüsünden (sadece birkaç kB'dir ve yine de başka şeyler için gereklidir) değil, initramfs'ın kendisinden kaynaklanmaktadır. İnitramfs, gerçek kök dosya sistemini monte etmek ve monte etmek için gerekli programları içerir.

Initramfs /, sistemi önyüklemeyi çok daha kolay ve bazı durumlarda (örn. Şifreli ) kolaylaştırır . Çok sayıda çalışırken takılabilir çevre birimine sahip PC tarzı bir donanımda tutulması önemle tavsiye edilir. Öte yandan, herhangi bir initramf olmadan gömülü bir cihazı önyüklemek çok mantıklıdır, sadece inşa edildiği belirli donanım yapılandırmasını destekleyen bir çekirdeğe sahiptir.

Çekirdek elbette bir dosya sistemine önyükleme yapmalıdır: çalıştırmak istediğiniz herhangi bir uygulamayı yüklemesi için bir yol olmalıdır. Hiçbir şey yapmayacaksanız, makineyi kapalı da tutabilirsiniz.

Bir initramfs kullanmak istemiyorsanız, bootloader'ınıza bir tane geçmemesini söyleyin. Ayrıca, çekirdek yapı çıktısında birini içermeyen tabii ki - tüm Mimarlık ve bootloader bağımlı olan en eğer bu durum nasıl: örneğin, vmlinuxve bzImage(initramfs dahil onlar sırasıyla ham ve sıkıştırılmış çekirdek konum yok ), ancak uImage(U-Boot için) varsa çekirdeği ve initramf'leri paketler.

(Teknik olarak, mikeserv'in belirttiği gibi, her zaman bir initramfs vardır - ancak varsayılan olarak boş, 134 baytlık bir arşivdir. Gördüğünüz ve kurtulmak istediğiniz şey, tarafından oluşturulan “gerçek”, boş olmayan bir initramfs oluşturma işleminiz ve daha sonra kök dosya sistemini bağlamak için kullanılan araçlar içerir.)

Unutmayın, bir initramfs, kalıcı verileri olmayan tek bir uygulama sistemi oluşturmanın makul bir yolu olabilir: tüm uygulamanızı initramfs'ye koyun, önyükleyin ve saklayın. Bu, kalıcı depolama veya önyükleme görüntünüzü düzenlemenizi kolaylaştırır (tek ihtiyacınız olan, paketlenebilen çekirdek ve initramfs'dir). Ancak bu yaklaşımın dezavantajları vardır: initramfs'deki tüm veriler RAM'de kalıcı olarak saklanır ve önyükleme görüntüsündeki dosyaları kolayca değiştiremezsiniz, arşivi yeniden oluşturmanız gerekir.


2.6 veya daha yeni bir linux çekirdeği kullanıyorsanız initramf'leriniz var. Alışılmış olduğu gibi ikincil bir initramfs görüntüsü kullanıp kullanmayacağınız başka bir konudur, ancak initramfs isteğe bağlı değildir.
mikeserv

2
@mikeserv Bir tane var, evet. Ancak boş bir initramf yer fıstığıdır. Bu olmak zorunda değildir kullanılan (tipik gömülü sistemde ihmal edilemez bir şekilde boyutunu artırır gerçek kök, monte etmek yeterli programlarını içerdiğini gerektiren).
Gilles 'SO- kötü olmayı bırak

Zaten zorunlu fıstık. Ve başka türlü söylediğimde bilmiyorum! Asker, onu bir dosya sistemi olarak nasıl kaldıracağına dair bilgi istiyordu - ki bu mümkün değil.
14'te mikeserv

Ve evet, kullanılması gerekiyor - initramfs olmadan kök yok. Hiç.
14'te mikeserv

8

Gönderen LFS :

Bir initramfın tek amacı kök dosya sistemini monte etmektir. İnitramfs normal bir kök dosya sisteminde bulacağınız eksiksiz bir dizinler dizisidir. Tek bir cpio arşivinde paketlenir ve birkaç sıkıştırma algoritmasından biriyle sıkıştırılır.

...

LFS ortamında bir initramf bulundurmanın yalnızca dört ana nedeni vardır: kökleri bir ağdan yüklemek, bir LVM mantıksal biriminden yüklemek, bir parolanın gerekli olduğu yerde şifrelenmiş bir rootf'ye sahip olmak veya rootfs'yi bir ETİKET veya UUID. Başka bir şey genellikle çekirdeğin düzgün yapılandırılmadığı anlamına gelir.

...

Çoğu dağıtım için, çekirdek modülleri initramflere sahip olmanın en büyük nedenidir. Genel bir dağıtımda, dosya sistemi türleri ve disk düzenleri gibi birçok bilinmeyen vardır. Bir bakıma bu, sistem yeteneklerinin ve düzeninin bilindiği ve normalde özel bir çekirdeğin oluşturulduğu LFS'nin tam tersidir. Bu durumda, bir initramf'e nadiren ihtiyaç duyulur.

Başka bir kaynak www.kernel.org

Bunun yanında initramfs kullanmayan yönlendiriciler gibi birçok Linux sistemi var.


1

Ağ önyüklemesi veya lvm veya raid gibi daha karmaşık kurulumlar için bir initramf'e ihtiyacınız vardır, çünkü bunlar kök f'lere erişimi yapılandırmak için bazı kullanıcı modu yardımcı programlarına gereksinim duyarlar. Bir diskteki basit, geleneksel bir bölüm için, disk sürücülerini çekirdeğe yerleştirdiğiniz ve kök bağımsız değişkeni UUID yerine aygıt yolu ile belirttiğiniz sürece, initramfs olmadan yapabilirsiniz. Tabii ki, bağladığınız tak ve çalıştır (yani usb) cihazlara veya hatta rastgele zamanlama sapmalarına bağlı olarak cihaz yolu değişebilir, bu yüzden herkesin güvenilirliği için neredeyse uuids ve initramfs kullanmasıdır.


Bu da yanlış.
14'te mikeserv

6
@mikeserv, yorumunuz işe yaramaz. Bunu iddia edecekseniz, nedenini açıklamanız gerekir.
psusi

Cevabımın% 99'unu oluşturan çekirdek belgelerini yaptım ya da daha doğrusu yaptım.
14'te mikeserv

@mikeserv, doğru. Gentoo linux'u yıllardır initramfs olmadan çalıştırıyorum.
Tim

1

Bu eski bir soru ama yine de kabul edilmiş bir cevabı yok gibi görünüyor, bu yüzden bunu oraya atacağım (burada uzman değilim, bunu kendim anlamaya çalışıyorum.)

Gönderen https://www.kernel.org/doc/Documentation/early-userspace/README (o 2004 yılından beri güncelleştirilmiş değil diyor altta tüm yol)

Çekirdeğin şu anda kök dosya sistemini bağlamanın 3 yolu vardır:

a) Gerekli tüm aygıt ve dosya sistemi sürücüleri çekirdeğe derlenmiş, initrd değil. init / main.c: init (), root = seçeneğine ve isteğe bağlı init = temel olarak init / main.c: init öğesinin sonunda listelenenden başka bir init ikili dosyası çalıştırmak için ready_namespace () öğesini çağırır. ().

b) modül olarak oluşturulan ve bir initrd'de depolanan bazı aygıt ve dosya sistemi sürücüleri. İnitrd, bu sürücü modüllerini yüklemesi gereken ikili bir '/ linuxrc' içermelidir. Son kök dosya sistemini linuxrc aracılığıyla monte etmek ve pivot_root sistem çağrısını kullanmak da mümkündür. İnitrd, ready_namespace () yoluyla monte edilir ve yürütülür.

c) initramfs kullanmak. Prepar_namespace () çağrısı atlanmalıdır. Bu bir ikili tüm işi yapmak zorunda olduğu anlamına gelir. Bahsedilen ikili dosya, usr / gen_init_cpio.c değiştirilerek ya da bir cpio arşivi olan yeni initrd formatı ile initramf'larda saklanabilir. Buna "/ init" adı verilmelidir. Bu ikili, prepar_namespace () 'in yapacağı her şeyi yapmaktan sorumludur.

Geriye dönük uyumluluğu korumak için, / init ikili dosyası yalnızca bir initramfs cpio arşivi üzerinden gelirse çalışır. Aksi takdirde, init / main.c: init (), son kökü takmak ve önceden tanımlanmış başlatma ikili dosyalarından birini yürütmek için prepar_namespace () komutunu çalıştırır.

Değer için, Raspberry Pi, vb. Gibi cihazların / dağıtımların initramfs kullanmadığına inanıyorum; bazı durumlarda çekirdek kök bölümünde bulunur (gerekli fs modüllerine sahip önyükleyici tarafından monte edilir.) Çekirdeğin örneğin bir/boot bölümde , aynı bölümdeki initramflere kökleri diğerleri gibi monte etmeden önce doğrudan erişilebilir belirtmiştir.

Bazı durumlarda initramfs olabilir çekirdek ile aynı dosya içine inşa edilecek ancak bu her zaman böyle değildir. (a) bazı durumlarda initramflerin gerekli olmadığını açıkça belirtmektedir.


0

Aşağıdaki açıklamayı daha net buluyorum ,

initramfsçekirdek içine gömülü ve önyükleme işleminin erken bir aşamasında yüklenen bir kök dosya sistemidir. Bu initrd'in halefidir. Çekirdeğin önyükleme işlemi sırasında kolayca yapamayacağı şeyleri yapabilen erken kullanıcı alanı sağlar.

İnitramfs kullanmak isteğe bağlıdır. Varsayılan olarak, çekirdek yerleşik sürücüleri kullanarak donanımı başlatır, belirtilen kök bölümünü bağlar, kurulu Linux dağıtımının başlatma sistemini yükler. Init sistemi daha sonra ek modüller yükler ve sonunda oturum açmanıza izin verene kadar hizmetleri başlatır. Bu iyi bir varsayılan davranıştır ve birçok kullanıcı için yeterlidir. initramfs gelişmiş gereksinimleri olan kullanıcılar içindir; Kök bölüm monte edilmeden önce bile işleri mümkün olduğunca erken yapması gereken kullanıcılar için.

İnitramfs ile neler yapabileceğinize dair bazı örnekler:

  • Kök bölümü monte edin (şifreli, mantıksal ve diğer özel bölümler için);
  • Minimalist bir kurtarma kabuğu sağlayın (bir şeyler ters giderse);
  • Önyükleme işlemini özelleştirin (örneğin, bir hoş geldiniz iletisi, önyükleme sıçraması vb. Yazdırın);
  • Yük modülleri (örn. Üçüncü taraf sürücüler);
  • Çekirdeğin yapamadığı herhangi bir şey (kullanıcı alanında yapabildiğiniz sürece, örneğin komutları yürüterek). Gelişmiş gereksinimleriniz yoksa, initramf'lere ihtiyacınız yoktur.

-1

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 rootfsve yok sayar. Boş bir ramfs örneğinin kapladığı alan çok azdır .

Eğer * CONFIG_TMPFS * etkinleştirildiğinde, rootfskullanacağı tmpfsyerine ramfsvarsayı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.rootfsrootfs"init"initrootfsinitcpio/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.


1
Initramfs olmadan önyükleme yapabilirsiniz. Cevabınız initramf'ların esası hakkında ortaya çıkıyor, ancak bu tipik gömülü sistemler için ve hatta bir initramfın tavsiye edildiği masaüstlerinde veya sunucularda geçerli değildir, zorunlu değildir.
Gilles 'SO- kötü olmayı bırak

@Gilles - hayır yapamazsın. Ne yaparsanız yapın, initramflarınız var. Çekirdeğe derlendi - şu anda çekirdeğiniz, çekirdeğim, tüm çekirdeklerimiz. Çekirdek belgelerini okuyun - tüm yazım bir kopyala yapıştırdı. Yanlışsın. Resmi belgelere nasıl itiraz edebilirsiniz?
14'te mikeserv

1
Resmi belgelere itiraz etmiyorum, bundan çıkardığınız sonuçlara itiraz ediyorum. Bir initramfs'nin nasıl kullanılacağını açıklayan belgeleri okuyorsunuz. Hiçbir yerde initramflerin kullanılması gerektiği belirtilmez.
Gilles 'SO- kötü olmayı bırak

@Gilles Bu yeterince iyi değilse: "2.6 çekirdek derleme işlemi her zaman gzip ile sıkıştırılmış bir cpio formatı initramfs arşivi oluşturur ve bunu sonuçtaki çekirdek ikilisine bağlar. Varsayılan olarak, bu arşiv boştur (x86'da 134 bayt tüketerek) .... " Daha iyisini yapabilirim. Yukarıdaki 2 veya 3 dakikalık bir web aramasıydı.
mikeserv

3
Belgeleri okudum. Bunu yaşamak için yapıyorum. Bu bir fikir meselesi değil. Her zaman bir initramf vardır, ancak önyükleme için mutlaka kullanılmaz. Bu durum için çekirdek yapısının iyi bir açıklamasını bulamıyorum, muhtemelen açıklamayı gerektirmediği düşünülen klasik durum. Ana mantık do_mounts.c- özellikle prepare_namespace, komut satırı argümanıyla saved_root_namedoldurulur root=.
Gilles 'SO- kötü olmayı bırak
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.