Kendi initrd'imi oluştururken / dev dizinini nasıl doldururum?


9

İnitrd hakkında bir şeyler öğrenmeye çalışıyorum. Ben takip ettim bu öğretici sıfırdan kendi initrd'i inşa etmek, ve bunu üzerine busybox yüklü. Sonra isolinux ile bir .iso yaptım, böylece sanal kutuda test edebilirim. Harika çalışıyor!

Meşgul kutusundan temel komutları var, bu yüzden bir dosya sistemi bağlamak istedim. Ancak öğreticiyi izlerken oluşturduğum bazı dosyalar dışında / dev dizini neredeyse boş (sda yok). Udev'i öğrendim ve bence ihtiyacım olan şey bu. Ancak bunu nasıl yapacağımdan emin değilim.

Sadece udev en son kaynak kodunu almak, derlemek ve benim initrd eklemek gerekir? Ve sonra init betiğimde / bin / udev ya da buna benzer bir şey mi çağırıyorsunuz? Veya / dev dizinini doldurmanın başka bir / daha iyi yolu var mı?

Düzenleme: Bazı ek bilgiler ve yaptığım şeylerle ilgili güncellemeler.

  • Sanal kutuda her şeyi test ediyorum. Sanal kutuya ubuntu minimal yükledim, initrd'imden bir .iso yaptım ve sonra sanal kutudaki iso'dan önyükleme yaptım.
  • Vmlinuz'u kullandım ve /lib/modulesbir debian-businesscard.iso'da mevcuttum ve bunları daha önce bağladığım öğreticiyi izleyerek oluşturduğum initrd'e kopyaladım.
  • Çekirdek CONFIG_DEVTMPFS=y
  • Bazı cihazlar /devtty0-tty63 ve diğerleri gibi görünür, ancak sda / hda yoktur.
  • Ran lspci -kbenim şu anda çalışan OS ve sanal bir kutuda, kullanılmakta olan modülleri kontrol etmek. modül olarak SATA Controllerkullandığını söylüyor ahci.
  • Ben yürüttüğümde modprobe -v ahci"bilinmeyen sembolü: ata_some_stuff" hakkında çok şikayet, ama bundan sonra SCSI Subsystem initialized, ATA-6: VBOX HARDDISKve gibi bir şey döndürür Direct-Access ATA VBOX HARDDISK. Ancak, içinde hala sabit disk aygıtı bulunamadı /dev.

Mevcut /init/betiğim şöyledir:

#!/bin/ash
mount -t devtmpfs none /dev
mount -t proc /proc /proc
mount -t sysfs none /sys
modprobe -v ahci
echo "Hello world"
exec /bin/ash --login

Ne yaptığımı ve bunun yerine ne yapmam gerektiğini bilen var mı?

Yanıtlar:


12

Gilles'ın cevabı doğru olsa da, eski okul :-). Başka bir not öğesi (terminoloji üzerinde her şeyden çok nitpick), bağlandığınız kılavuzun bir initrd değil, bir initramfs nasıl oluşturulacağı ile ilgili talimatlardır. İkisi benzerdir ve aynı amaca hizmet eder, ancak görüntünün nasıl saklandığı ve yüklendiği konusunda farklıdır.

Her neyse, sorunuzun cevabı aslında gerçekten çok basit.

  1. devtmpfsÇekirdekte etkinleştir ( CONFIG_DEVTMPFS=y)
  2. Senaryonuzdaki mount -t devtmpfs none /devilk şey olarak çalıştırın init.

Bu kadar. Devtmpfs /devtıpkı udev gibi doldurulur . Hatta Önceden doldurmak gerekmez /devgibi temelleri ile (initramfs görüntüde) null, zeroya da console.


Yorumun için teşekkürler. Komutunu çalıştırdım ve şimdi daha fazla cihazım var, ancak hala monte edilecek sda veya hda yok. Yapmayı unuttuğum bir şey var mı? Debians live sisteminden aldığım vmlinuz çekirdeğini kullanıyorum, gerçekten kendi derlemem gerekir mi?
Carlito

@Carlito Bu çekirdekte devtmpfs etkin mi (yapılandırma dosyasını kontrol edin)? Debian sadece son zamanlarda devtmpfs'ye geçti.
Gilles 'SO- kötü olmayı kes'

@Gilles Sağlanan bir yapılandırma dosyası yok, ancak debian'dan aldığım çekirdeği yükledim, config dosyası dedi CONFIG_DEVTMPFS=y, ancak hala herhangi bir sda cihazı alamıyorum. Ben bunun çünkü herhangi bir modül (lsmod hiçbir şey döndürür) yüklü değil çünkü düşünüyorum. Dosya sistemi aygıtlarını almak için hangi modülleri yüklemeliyim? Yoksa unuttuğum başka bir şey var mı?
Carlito

@Carlito evet, başka /devsürücüler varsa, sadece sürücüler değil, o zaman devtmpfs çalışıyor ve muhtemelen (denetlediğiniz gibi) disk denetleyici modülünü kaçırıyorsunuz. Ne yazık ki hangi sürücüye / modüle ihtiyacınız olduğunu bilmenin tek yolu ya çekirdek yapılandırmasında her biri için bilgileri okumak ya da lspci -kçalışan bir linux sisteminde çalıştırmaktır (bu, sisteminizin çeşitli bileşenlerinin hangi çekirdek sürücüsünü kullandığını gösterecektir) .
Patrick

1
@ CiroSantilli709 in 抓捕 六四 事件 法轮功CONFIG_DEVTMPFS_MOUNT=yinitramfs üzerinde herhangi bir etkisi yoktur. Çekirdek yardım metninden: "Bu seçenek, initramfs tabanlı önyüklemeyi etkilemez, burada devtmpfs dosya sisteminin rootfs takıldıktan sonra her zaman manuel olarak bağlanması gerekir"
Patrick

4

Udev /devçekirdeğe yüklenen sürücüleri ve bu sürücülerin algıladığı aygıtları temel alarak otomatik olarak doldurur . Cihazların adları ve izinleri, yöneticilerin ince ayar yapabileceği bir dizi kurala dayanır. Çoğu Linux sistemi udev kullanmalıdır; istisna, sistem kurulduğu sırada donanım yapılandırmasının bilindiği ve daha sonra değişmeyeceği sistemler (genellikle gömülü).

Genellikle udevbaşlangıç ​​dizininizde oldukça erken ararsınız. Daha önce yapmanız gereken (yapmanız gerekenler) birkaç şeyden biri de mount /procve /sys. udevadm trigger --action=add; udevadm settleArka plan programını başlattıktan sonra, udev'in çekirdekteki tüm olayları ( trigger) işlemesini sağlamak için arayın ve devam etmeden ( settle) devam etmeden önce olayların işlenmesini bekleyin . Daha sonra kök dosya sistemini içeren cihazı bulmaya devam edebilirsiniz.

udevdİkili dosya dışında, udevinitrd'inizin diğer kısımlarına da ihtiyacınız olacak . Bu yapılandırma dosyaları içerir /etc/udev, baz konfigürasyonu /lib/udevgibi hem de yardımcı ikilileri scsi_idaynı zamanda /lib/udev. İnitrd'ye eklediğiniz udev kurallarından çağrılan tüm programlara ihtiyacınız vardır.

İnitrd'nin sonunda, kontrolü gerçek kök bölümüne aktarmadan önce, initrd'deki udevddiğer tüm programlar gibi durmanız gerekir. Bu, hiçbir cihazı cihazdan kaldırmaz /dev. mount --move /dev /root/devTakılı olanı /devgerçek köke taşımak için kullanın .

Gentoo bir initramfs kılavuzuna ve udev'den bahseden bir initramfs wiki sayfasına sahiptir. Initramfs, bir dosya sistemi görüntüsü yerine bir cpio arşivi kullanarak ve farklı bir işlem arayüzü ile initrd'in modern halefidir (bir initrd'de çıkmalı, /linuxrcbir initramfs'de gerçek kökten init /initgerekir exec); sistemlerin çoğu bu güne geçmiştir (dosya hala initrd olarak adlandırılmış olsa bile).


Cevabınız için teşekkürler. Aslında initrd yerine initramfs yaptığım sonucuna vardım. Ama debians canlı sistemden aldığım vmlinuz çekirdeğini kullanıyorum, aslında bunun için kendi çekirdeğimi derlemeliyim (yani sabit diskleri yüklemek için hangi modüllerin olduğunu biliyorum) veya temel modüller ile kullanabileceğim bir tür minimum sürüm var mı ? Muhtemelen en son udev'i indirip derlemeye ve çalıştırmaya çalışacağım.
Carlito

@Carlito İlk önce Debian çekirdeği ile denemenizi tavsiye ederim, çünkü gerekli bir sürücüyü unutmak kendi çekirdeğinizi derlerken yaygın bir hatadır.
Gilles 'SO- kötü olmayı bırak'

Ama nasıl alabilirim? Debian-businesscard.iso'da bulduğum vmlinuz'u kopyaladım (muhtemelen en iyi fikir değil). Ubuntu veya debian'dan aldığım standart çekirdeği ve tüm / lib / modules dizinini kopyalamalı mıyım?
Carlito

@Carlito Donanımınız için en azından gerekli olan tüm modüllere ihtiyacınız olacak. Listeye göz atarak ihtiyacınız olan her şeyi bulmak zor olabilir. İhtiyacınız olanı bulmanın en iyi yolu lsmodçalışan bir sistemde çalıştırmaktır . Bu yüzden hepsiyle başlayın, sonra yerden tasarruf etmeniz gerekiyorsa akıllıca budama yapın.
Gilles 'SO- kötü olmayı kes
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.