Bagaimana cara mengisi direktori / dev ketika membangun initrd saya sendiri?

9

Saya mencoba mempelajari hal-hal tentang initrd. Saya telah mengikuti tutorial ini untuk membangun initrd saya sendiri dari awal, dan saya menginstal busybox di atasnya. Lalu saya membuat iso dari itu dengan isolinux, jadi saya bisa mengujinya di virtualbox. Ini sangat bagus!

Saya memiliki perintah dasar dari busybox, jadi saya ingin me-mount sistem file. Tetapi direktori / dev hampir kosong (tidak ada sda), kecuali untuk beberapa file yang saya buat saat mengikuti tutorial. Saya belajar tentang udev dan saya pikir inilah yang saya butuhkan. Namun saya tidak yakin bagaimana melanjutkan ini.

Haruskah saya mengambil kode sumber terbaru dari udev, kompilasi dan tambahkan ke initrd saya? Dan kemudian memanggil / bin / udev atau sesuatu seperti itu di skrip init saya? Atau adakah cara lain yang lebih baik untuk mengisi direktori / dev?

Sunting: Beberapa info tambahan dan pembaruan tentang apa yang telah saya lakukan.

  • Saya menguji semuanya dalam kotak virtual. Saya baru saja menginstal minimal ubuntu di kotak virtual, membuat iso dari initrd saya, dan kemudian boot dari iso di virtualbox.
  • Saya menggunakan vmlinuz dan /lib/modulesyang ada pada debian-businesscard.iso dan menyalinnya ke initrd saya yang saya buat dengan mengikuti tutorial yang saya tautkan sebelumnya.
  • Kernel telah CONFIG_DEVTMPFS=y
  • Beberapa perangkat muncul /dev, seperti tty0-tty63 dan beberapa lainnya, tetapi tidak ada sda / hda.
  • Berlari lspci -kdi OS saya yang sedang berjalan dan di kotak virtual untuk memeriksa modul mana yang digunakan. SATA Controllermengatakan itu digunakan ahcisebagai modul.
  • Ketika saya menjalankannya modprobe -v ahcibanyak mengeluh tentang "simbol tidak dikenal: ata_some_stuff", tetapi setelah itu mengembalikan sesuatu seperti SCSI Subsystem initialized, ATA-6: VBOX HARDDISKdan Direct-Access ATA VBOX HARDDISK. Namun, masih belum ada perangkat harddisk yang ditemukan di /dev.

/init/Script saya saat ini adalah sebagai berikut:

#!/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

Adakah yang tahu kesalahan saya dan apa yang seharusnya saya lakukan?

Carlito
sumber

Jawaban:

12

Sementara jawaban gilles benar, itu adalah sekolah tua :-). Hal lain yang perlu diperhatikan (lebih penting tentang terminologi daripada apa pun) adalah bahwa panduan yang Anda tautkan adalah instruksi tentang cara membuat initramfs, bukan initrd. Keduanya serupa, dan melayani tujuan yang sama, tetapi berbeda dalam cara gambar disimpan dan dimuat.

Bagaimanapun, jawaban atas pertanyaan Anda sebenarnya sangat sederhana.

  1. Aktifkan devtmpfsdi kernel ( CONFIG_DEVTMPFS=y)
  2. Jalankan mount -t devtmpfs none /devsebagai hal pertama dalam initskrip Anda .

Itu dia. Devtmpfs akan terisi /devseperti udev. Anda bahkan tidak perlu pra-populate /dev(pada gambar initramfs) dengan dasar-dasar seperti null, zero, atau console.

Patrick
sumber
Terima kasih atas komentar Anda. Saya menjalankan perintah Anda, dan sekarang saya memiliki lebih banyak perangkat, tetapi masih belum ada sda atau hda untuk dipasang. Apakah ada sesuatu yang saya lupa lakukan? Saya menggunakan kernel vmlinuz yang saya dapatkan dari sistem live debian, haruskah saya mengkompilasi sendiri?
Carlito
@Carlito Apakah kernel ini memiliki devtmpfs yang diaktifkan (periksa file konfigurasi)? Debian baru saja beralih ke devtmpfs.
Gilles 'SO- stop being evil'
@Gilles Tidak ada file konfigurasi yang disediakan, tapi saya memuat kernel yang saya dapatkan dari debian, kata file konfigurasi CONFIG_DEVTMPFS=y, tapi saya masih belum mendapatkan perangkat sda. Saya pikir ini karena saya belum memuat modul apa pun (lsmod tidak mengembalikan apa pun). Modul apa yang harus saya muat untuk mendapatkan perangkat sistem file? Atau ada hal lain yang saya lupa?
Carlito
@Carlito ya, jika Anda memiliki hal-hal lain yang muncul /dev, tidak hanya drive, maka devtmpfs bekerja dan Anda kemungkinan besar kehilangan modul pengontrol disk (seperti yang Anda duga). Sayangnya satu-satunya cara untuk mengetahui driver / modul yang Anda butuhkan adalah dengan membaca informasi untuk masing-masing di konfigurasi kernel, atau menjalankan lspci -kdalam sistem linux yang sedang berjalan (yang akan menunjukkan kepada Anda apa driver kernel berbagai komponen sistem Anda menggunakan) .
Patrick
1
@ CiroSantilli709 大 抓捕 六四 事件 法轮功CONFIG_DEVTMPFS_MOUNT=ytidak memiliki efek pada initramfs. Dari teks bantuan kernel: "Opsi ini tidak memengaruhi booting berbasis initramfs, di sini sistem file devtmpfs selalu perlu di-mount secara manual setelah rootfs di-mount"
Patrick
4

Udev mengisi /devsecara otomatis berdasarkan driver yang dimuat ke dalam kernel dan perangkat yang dideteksi driver ini. Nama-nama perangkat dan izinnya didasarkan pada seperangkat aturan yang dapat disesuaikan oleh administrator. Sebagian besar sistem Linux harus menggunakan udev; pengecualiannya adalah sistem (biasanya tertanam) di mana konfigurasi perangkat keras diketahui pada saat sistem diatur dan tidak akan berubah setelahnya.

Anda biasanya akan menelepon udevcukup awal dalam urutan startup Anda. Salah satu dari beberapa hal yang harus (harus Anda lakukan) sebelum itu adalah mount /procdan /sys. Setelah memulai daemon, panggil udevadm trigger --action=add; udevadm settleuntuk membuat udev memproses semua peristiwa yang tertunda dari kernel ( trigger) dan menunggu hingga acara diproses sebelum melanjutkan ( settle). Anda kemudian dapat melanjutkan untuk menemukan perangkat yang berisi sistem file root.

Selain udevdbiner, Anda akan membutuhkan bagian lain dari udevinitrd Anda. Ini termasuk file konfigurasi di /etc/udev, konfigurasi dasar di /lib/udevserta binari pembantu seperti scsi_idjuga di /lib/udev. Anda memerlukan semua program yang dipanggil dari aturan udev yang Anda sertakan di initrd.

Di akhir initrd, sebelum mentransfer kontrol ke partisi root sebenarnya, Anda harus berhenti udevdseperti setiap program lain dari initrd. Ini tidak menghapus perangkat apa pun dari /dev. Gunakan mount --move /dev /root/devuntuk memindahkan yang dipasang /devke root nyata.

Gentoo memiliki panduan initramfs dan halaman wiki initramfs yang menyebutkan udev. Initramfs adalah penerus modern untuk initrd, menggunakan arsip cpio daripada gambar filesystem, dan dengan antarmuka proses yang berbeda (pada initrd, /linuxrcharus keluar, sedangkan pada initramfs, initramf /initharus execdari init ke root asli); sebagian besar sistem telah beralih hari ini (bahkan jika file tersebut mungkin masih disebut initrd).

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Terima kasih atas jawaban anda. Saya sampai pada kesimpulan bahwa saya benar-benar membuat initramf daripada initrd. Tapi saya menggunakan kernel vmlinuz yang saya dapatkan dari sistem debian live, haruskah saya benar-benar mengkompilasi kernel saya sendiri untuk ini (jadi saya tahu modul mana yang ada untuk memuat harddrives), atau apakah ada semacam versi minimal yang bisa saya gunakan dengan modul dasar ? Saya mungkin akan mengunduh udev terbaru dan mencoba mengkompilasi dan menjalankannya.
Carlito
@Carlito Saya sarankan pertama kali mencoba dengan kernel Debian, karena melupakan driver yang diperlukan adalah kesalahan umum ketika mengkompilasi kernel Anda sendiri.
Gilles 'SANGAT berhenti menjadi jahat'
Tapi bagaimana saya mendapatkannya? Saya baru saja menyalin vmlinuz yang saya temukan di debian-businesscard.iso (mungkin bukan ide terbaik). Haruskah saya menyalin kernel standar yang saya dapatkan dari ubuntu atau debian, dan seluruh direktori / lib / modules?
Carlito
@Carlito Anda membutuhkan setidaknya semua modul yang diperlukan untuk perangkat keras Anda. Mungkin sulit untuk menemukan semua yang Anda butuhkan dari menelusuri daftar. Cara terbaik untuk mengetahui apa yang Anda butuhkan adalah dengan menjalankan lsmodsistem kerja. Jadi mulailah dengan semuanya, lalu pangkas dengan cerdas jika Anda perlu menghemat ruang.
Gilles 'SANGAT berhenti menjadi jahat'