Apakah skrip / init (atau / linuxrc) membuat node perangkat sementara di / dev?

5

Menimbang bahwa GRUB mengeksekusi baris berikut:

kernel /vmlinuz root=/dev/sda1 ro
initrd /initrd

Saat boot, bagaimana kernel Linux mengetahui tentang /dev/sda1node perangkat?

Saya tahu bahwa gambar initrd / initramfs berisi modul untuk perangkat penyimpanan (dll.), Yang dimuat ke dalam memori untuk memungkinkan akses ke penyimpanan. Yang mengganggu saya, adalah bagaimana tepatnya parameter kernel root=/dev/sda1diurai oleh kernel.

Apakah skrip /init(atau /linuxrc) di initrd / initramfs membuat /devdirektori dan kemudian simpul perangkat /dev/sda1di dalamnya? Atau nomor "utama" dan "kecil" untuk /dev/sda1hardcoded di kernel?

evaldaz
sumber

Jawaban:

3

Jika Anda memiliki initramfs, kernel hanya membongkar dan me-mount initramfs dan dijalankan /initsetelahnya. Segala sesuatu yang lain akan ditangani oleh yang /initdapat dieksekusi. Ini juga berarti kernel tidak memasang perangkat yang ditentukan dalam rootparameter boot.

Distribusi yang berbeda menggunakan kerangka kerja initramfs yang berbeda seperti misalnya dracut untuk Fedora atau initramfs-tools untuk Debian. Sebagian besar solusi umum adalah menggunakan sesuatu seperti udev, mdevatau devtmpfs. Beberapa juga mungkin hanya menggunakan MAKEDEVuntuk menghasilkan tata letak statis atau memiliki file perangkat yang sudah diintegrasikan ke dalam gambar mereka.

Jika Anda mem-boot tanpa initramfs, kernel dapat mem-boot dari perangkat dengan nomor mayor / minor yang diketahui, mis. /dev/sda1Tetapi tidak dari perangkat lvm.

Ulrich Dangel
sumber
0

Nomor-nomor utama perangkat root disimpan dalam kernel image (lihat halaman manual rdevuntuk informasi lebih lanjut).

Namun, argumen baris perintah kernel TIDAK ditafsirkan oleh kernel. Ramdisk awal, initrd, berisi sistem file dengan linux minimal yang biasanya melakukan bagian interpreting. Bagaimana initrd bekerja tergantung pada distribusi Anda. Ini mungkin hanya berisi simpul / dev / sda1 atau beberapa skrip / program yang membuatnya saat runtime.

Jika Anda menggunakan Linux berbasis Debian Anda dapat membongkar ramdisk Anda seperti ini:

mkdir /tmp/initrd
cd /tmp/initrd
zcat /boot/path/to/initrd | cpio -iv

Initr debian adalah skrip dan Anda dapat melihat cara kerjanya. Setelah kernel membongkar initrd, ia meluncurkan skrip inityang sekarang harus Anda temukan /tmp/initrd. Perhatikan blok di mana dikatakan for x in $(cat /proc/cmdline); do.

Dalam /proc/cmdlineadalah argumen berlalu menggunakan Grub (Anda dapat memeriksa / memverifikasi bahwa sekarang dengan shell Anda!). Jika Anda ingin menyelam lebih dalam ke initrd Debian, Anda akan mencatat bahwa Anda dapat membuat kernel / initrd Anda menggunakan share NFS sebagai sistem file root dengan meneruskan opsi root=/dev/nfsdengan Grub. Ketika Anda melakukannya, tidak ada simpul /dev/nfsyang dibuat atau dipasang. Itu hanya memberitahu initrd apa yang harus dilakukan.

Pada akhirnya setiap initrd akan menjalankan perintah yang disediakan oleh beberapa opsi seperti init=atau default/sbin/init

Kembali ke pertanyaan awal Anda di tajuk utama: yes / init (kemungkinan besar) membuat simpul itu pada saat runtime. Ia menggunakan semua jenis program / heuristik / voodoo untuk mengetahui cara me-mount sistem file root Anda.

Bananguin
sumber
Jika kernel tidak dapat mengeksekusi (tidak dapat menemukan) /init, itu akan mengurai root=parameter. Referensi: landley.net/writing/rootfs-howto.html
evaldaz
0

Kode awal menjalankan program yang disebut mdevyang pada dasarnya adalah versi cut-down udev. Ini memindai semua perangkat dan membuat konten awal /devfolder. Kernel kemudian dapat menjalankan mount /dev/sda1 /dan mulai menemukan sistem lengkap secara efektif .

Lihat di sini adalah Anda ingin tahu lebih banyak tentang mdev.

Nomor perangkat utama dan kecil sebenarnya telah di-hardcode ke dalam modul-modul kernel yang merupakan driver perangkat dan yang menggunakan nomor-nomor utama statis (lihat, misalnya, Documentation / devices.txt dalam sumber kernel). Kebanyakan modul kernel driver disk (semua?) Akan masuk dalam kategori ini. Jadi, seperti yang dikatakan @Ulrich Dangel, beberapa kernel dapat mem-boot tanpa initramfs / initrd selama modul yang diperlukan terhubung secara statis dengan image kernel.

StarNamer
sumber
Sebagai catatan, ini adalah implementasi khusus, Debian misalnya menggunakan udev dan tidak menggunakan
mdev