Di zaman kuno, kernel diberi kode keras untuk mengetahui jumlah mayor/minor perangkat dari root fs dan memasang perangkat tersebut setelah menginisialisasi semua driver perangkat, yang dibangun ke dalam kernel. rdev
utilitas dapat digunakan untuk memodifikasi nomor perangkat root di imej kernel tanpa harus mengkompilasi ulang.
Akhirnya boot loader muncul dan dapat meneruskan baris perintah ke kernel. Jika root=
argumen dilewatkan, yang memberi tahu kernel di mana root fs berada, bukan nilai bawaan. Driver perlu mengakses yang masih harus dibangun ke dalam kernel. Sedangkan argumennya terlihat seperti device node biasa di /dev
direktori, jelas tidak ada /dev
direktori sebelum root fs dipasang, sehingga kernel tidak dapat mencari node dev di sana. Sebagai gantinya, nama perangkat terkenal tertentu dikodekan keras ke dalam kernel sehingga string dapat diterjemahkan ke nomor perangkat. Oleh karena itu, kernel dapat mengenali hal-hal seperti /dev/sda1
, tetapi bukan hal-hal yang lebih eksotik seperti /dev/mapper/vg0-root
atau UUID volume.
Kemudian, initrd
masuk ke dalam gambar. Bersamaan dengan kernel, boot loader akan memuat initrd
gambar, yang merupakan semacam gambar sistem file terkompresi (gambar ext2 yang di-gzip, gambar romfs yang di-gzip, squashfs akhirnya menjadi dominan). Kernel akan mendekompresi image ini ke dalam ramdisk dan me-mount ramdisk sebagai root fs. Gambar ini berisi beberapa driver tambahan dan skrip boot alih-alih init
asli . Skrip boot ini melakukan berbagai tugas untuk mengenali perangkat keras, mengaktifkan hal-hal seperti raid array dan LVM, mendeteksi UUID, dan mem-parsing baris perintah kernel untuk menemukan root sebenarnya, yang sekarang dapat ditentukan oleh UUID, label volume, dan hal-hal lanjutan lainnya. Itu kemudian me-mount fs root asli di /initrd
, lalu jalankan pivot_root
panggilan sistem untuk memiliki pertukaran kernel /
dan /initrd
, lalu jalankan /sbin/init
pada root asli, yang kemudian akan meng-unmount /initrd
dan bebaskan ramdisk.
Terakhir, hari ini kita memiliki initramfs
. Ini mirip dengan initrd
, tetapi alih-alih menjadi gambar sistem file terkompresi yang dimuat ke ramdisk, itu adalah arsip cpio terkompresi. Tmpfs dipasang sebagai root, dan arsip diekstraksi di sana. Alih-alih menggunakan pivot_root
, yang dianggap sebagai peretasan kotor, initramfs
skrip boot me-mount root asli di /root
, hapus semua file di root tmpfs, lalu chroot
ke dalam /root
, dan exec /sbin/init
.
Linux awalnya melakukan booting dengan ramdisk (disebut initrd
, untuk "INITial RamDisk") sebagai /
. Disk ini memiliki cukup untuk dapat menemukan partisi root yang sebenarnya (termasuk modul driver dan sistem file yang diperlukan). Itu me-mount partisi root ke titik mount sementara di initrd
, lalu memanggil pivot_root(8)
untuk menukar titik pemasangan root dan sementara, meninggalkan initrd
dalam posisi menjadi umount
ed dan sistem file root sebenarnya di /
.
Sepertinya Anda bertanya bagaimana kernel "tahu" partisi mana yang merupakan partisi root, tanpa akses ke file konfigurasi di /etc.
Kernel dapat menerima argumen baris perintah seperti program lainnya. GRUB, atau sebagian besar bootloader lainnya dapat menerima argumen baris perintah sebagai input pengguna, atau menyimpannya dan membuat berbagai kombinasi argumen baris perintah tersedia melalui menu. Bootloader meneruskan argumen baris perintah ke kernel saat memuatnya (Saya tidak tahu nama atau mekanisme konvensi ini, tetapi mungkin mirip dengan cara aplikasi menerima argumen baris perintah dari proses pemanggilan di kernel yang sedang berjalan).
Salah satu opsi baris perintah tersebut adalah root
, tempat Anda dapat menentukan sistem file root, yaitu root=/dev/sda1
.
Jika kernel menggunakan initrd, bootloader bertanggung jawab untuk memberi tahu kernel di mana letaknya, atau meletakkan initrd di lokasi memori standar (menurut saya) - setidaknya itulah cara kerjanya di Guruplug saya.
Sangat mungkin untuk tidak menentukan satu dan kemudian panik kernel Anda segera setelah mulai mengeluh bahwa ia tidak dapat menemukan sistem file root.
Mungkin ada cara lain untuk meneruskan opsi ini ke kernel.