Pertanyaan saya berkaitan dengan mem-boot sistem Linux dari partisi / boot terpisah. Jika sebagian besar file konfigurasi terletak di partisi / terpisah, bagaimana kernel memasangnya dengan benar pada saat boot?
Elaborasi apa pun tentang ini akan bagus. Saya merasa seolah kehilangan sesuatu yang mendasar. Saya sebagian besar peduli dengan proses dan urutan operasi.
Terima kasih!
EDIT: Saya pikir apa yang perlu saya tanyakan lebih pada baris file dev yang digunakan dalam parameter kernel root. Sebagai contoh, katakan saya berikan param root saya sebagai root = / dev / sda2. Bagaimana kernel memiliki pemetaan file / dev / sda2?
Jawaban:
Linux awalnya boot dengan ramdisk (disebut
initrd
, untuk "INITial RamDisk") sebagai/
. Disk ini cukup memiliki cukup untuk dapat menemukan partisi root nyata (termasuk driver dan modul sistem file yang diperlukan). Ini me-mount partisi root ke titik mount sementara padainitrd
, kemudian memanggilpivot_root(8)
untuk menukar titik mount root dan sementara, meninggalkaninitrd
dalam posisi untukumount
diedit dan sistem file root yang sebenarnya aktif/
.sumber
Pada zaman dahulu, kernel diberi kode keras untuk mengetahui perangkat utama / minor dari root fs dan memasang perangkat itu setelah menginisialisasi semua driver perangkat, yang dibangun ke dalam kernel. The
rdev
utilitas dapat digunakan untuk mengubah jumlah perangkat root pada gambar kernel tanpa harus mengkompilasi ulang itu.Akhirnya boot loader datang dan dapat melewati baris perintah ke kernel. Jika
root=
argumen itu disahkan, itu memberitahu kernel di mana root fs bukan nilai bawaan. Driver diperlukan untuk mengakses yang masih harus dibangun ke dalam kernel. Sementara argumennya terlihat seperti simpul perangkat normal dalam/dev
direktori, jelas tidak ada/dev
direktori sebelum root fs di-mount, jadi kernel tidak dapat mencari node dev di sana. Sebaliknya, nama-nama perangkat tertentu yang terkenal sulit dikodekan ke dalam kernel sehingga string dapat diterjemahkan ke nomor perangkat. Karena itu, kernel dapat mengenali hal-hal seperti/dev/sda1
, tetapi tidak hal-hal yang lebih eksotis seperti/dev/mapper/vg0-root
atau volume UUID.Kemudian,
initrd
gambar itu muncul. Bersamaan dengan kernel, boot loader akan memuatinitrd
gambar, yang merupakan semacam gambar sistem file terkompresi (gzipped ext2 image, gzipped image romfs, squashfs akhirnya menjadi dominan). Kernel akan mendekompres gambar ini ke dalam ramdisk dan me-mount ramdisk sebagai root fs. Gambar ini berisi beberapa driver tambahan dan skrip boot bukan yang asliinit
. Skrip boot ini melakukan berbagai tugas untuk mengenali perangkat keras, mengaktifkan hal-hal seperti raid arrays dan LVM, mendeteksi UUID, dan mengurai baris perintah kernel untuk menemukan root yang sebenarnya, yang sekarang dapat ditentukan oleh UUID, label volume dan hal-hal canggih lainnya. Kemudian me-mount root nyata fs di/initrd
, kemudian mengeksekusipivot_root
panggilan sistem untuk memiliki swap kernel/
dan/initrd
, kemudian exec/sbin/init
pada root sebenarnya, yang kemudian akan meng/initrd
- unmount dan membebaskan ramdisk.Akhirnya, hari ini kita punya
initramfs
. Ini mirip denganinitrd
, tetapi alih-alih menjadi image sistem file terkompresi yang dimuat ke dalam ramdisk, ini adalah arsip cpio terkompresi. Tmpfs dipasang sebagai root, dan arsip diekstraksi di sana. Alih-alih menggunakanpivot_root
, yang dianggap sebagai hack kotor,initramfs
skrip boot me-mount root asli/root
, menghapus semua file di root tmpfs, laluchroot
ke/root
, dan exec/sbin/init
.sumber
Kedengarannya seperti 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 kebanyakan bootloader lain 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 panggilan di kernel yang berjalan).
Salah satu opsi baris perintah adalah
root
, di mana Anda dapat menentukan sistem file root, yaituroot=/dev/sda1
.Jika kernel menggunakan initrd, bootloader bertanggung jawab untuk memberitahu kernel di mana ia berada, atau meletakkan initrd di lokasi memori standar (saya pikir) - itu setidaknya cara kerjanya di Guruplug saya.
Sangat mungkin untuk tidak menentukan satu dan kemudian panik kernel Anda segera setelah mulai mengeluh bahwa itu tidak dapat menemukan sistem file root.
Mungkin ada cara lain untuk meneruskan opsi ini ke kernel.
sumber
/dev/sda1
itu karena itu entri dalam sistem file. Anda dapat melakukancp -p /dev/sda1 /tmp/foo
dan/tmp/foo
akan mewakili perangkat yang sama. Pada baris perintah kernel, kernel menggunakan parser built-in yang mengikuti konvensi penamaan perangkat yang biasa:sda1
berarti partisi pertama dari disk mirip-SCSI pertama.initrd
atauinitramfs
maksud saya. Itu harus berupa partisi "sederhana" dalam/dev/sdx
formulir?init/do_mounts.c
.Grub me-mount
/boot
partisi dan kemudian menjalankan kernel. Dalam konfigurasi Grub, ia memberi tahu kernel apa yang harus digunakan sebagai perangkat root.Misalnya di Grub's
menu.lst
:sumber
Ayo, GRUB tidak "me-mount" / boot, ia hanya membaca 'menu.lst' dan beberapa modul, itu juga bukan bagian dari kernel LINUX. Ketika Anda memanggil kernel, Anda akan memberikan argumen "root" dengan partisi root. Paling buruk, kernel tahu bahwa just / boot telah di-mount (LOL).
Berikutnya: geekosaur benar, Linux menggunakan ramdisk awal dalam format gambar terkompresi, dan kemudian me-mount sistem file root sebenarnya dengan memanggil
pivot_root
. Jadi Linux mulai berjalan dari gambar, dan kemudian dari disk drive lokal Anda.sumber
Boot loader, baik itu grub atau lilo atau apa pun, memberitahu kernel di mana harus melihat dengan
root=
flag, dan secara opsional memuat ramdisk awal ke dalam memori melaluiinitrd
sebelum mem-boot kernel.Kernel kemudian memuat, menguji perangkat keras dan driver perangkatnya dan melihat-lihat sistem untuk mengetahui apa yang dapat dilihatnya (Anda dapat meninjau informasi diagnostik ini dengan mengetik
dmesg
; saat ini cenderung menggulir dengan cara yang terlalu cepat untuk dilihat) kemudian mencoba untuk me-mount partisi yang disebutkan dalam yangroot=
parameter.Jika initrd hadir, itu sudah terpasang terlebih dahulu dan setiap modul / driver perangkat di dalamnya dimuat dan diselidiki sebelum root filesystem dipasang. Dengan cara ini Anda dapat mengkompilasi driver untuk hard drive Anda sebagai modul dan masih bisa boot.
sumber