Saya mencoba memahami proses boot mesin secara keseluruhan sejak Anda menekan tombol power. Ada bagian ini dari bootloader ke tahap initramfs saya tidak begitu mengerti di antara beberapa bit kecil lainnya.
Dengan konfigurasi Grub ini untuk entri, diambil dari instalasi default Ubuntu baru-baru ini:
insmod gzio
insmod part_msdos
insmod ext2
set root='(hd0,msdos1)'
search --no-floppy --fs-uuid --set=root 96fb7310-5adb-4f66-bf59-04acd08d76a3
echo 'Loading Linux x.y.z ...'
linux /vmlinuz-x.y.z root=/dev/mapper/some-device-name ro nomodeset
echo 'Loading initial ramdisk ...'
initrd /initrd.img-x.y.z
Apa yang sebenarnya dilakukan dalam hal status sistem dan memori? Saya mengerti bahwa tugas Grub adalah "memuat dan menjalankan kernel" dan ia memiliki set modul sendiri untuk mengakses file di perangkat (atau jaringan) untuk mendapatkannya. Dalam contoh di sini insmod
s, set root
dan search
- tetapi ini hanya dari perspektif Grub, dan tidak dibagikan dengan kernel, kan?
Saya juga menduga bahwa Grub memuat (salinan?) Dari kernel ke dalam memori ( linux
perintah ) dan menendangnya untuk memulai eksekusi. (dua langkah yang berbeda rupanya - jadi, bagaimana?) Parameter yang diberikan dapat dibaca di kernel dan ditafsirkan (apakah ini string besar yang dipetakan ke dalam memori di suatu tempat?) dan memberikan opsi untuk mengatur hal-hal yang diminta.
Saya juga melihat initrd
opsi ini . Ini menunjuk ke initramfs saya yang dikompresi gzip, diperlukan untuk mem-boot perangkat root aktual yang ditentukan oleh root=
. Tetapi bagaimana initramf ini disediakan untuk kernel? Ini tidak meneruskan alamat memori apa pun ke tempat ia dapat memuatnya, juga tidak dapat mengaksesnya sendiri, karena sudah dimuat sebelum kernel dimulai. Beberapa dokumentasi kernel mengatakan ini 'perangkat' file sistem initramfs dapat diakses melalui /dev/ram0
, tapi saya tidak melihat bagaimana itu menjadi file perangkat yang dapat diakses untuk memulai. Ada sesuatu yang terjadi di bawah air yang tidak saya lihat, saya kira.
Saya juga tidak melihat bagaimana ini berhubungan dengan bootloader lain, termasuk platform yang tertanam, misalnya menggunakan U-boot / Coreboot. Apakah ini melakukan hal yang sama dengan Grub (alamat memori standar yang sama?) Dan sejauh mana ini dibandingkan dengan Grub tentang memuat kernel / initrd?
Untuk memperjelas pertanyaan saya, saya pikir saya benar-benar mengerti mengapa ada tahapan boot yang berbeda dan transisi apa yang terjadi, namun saya tidak melihat bagaimana itu terjadi dan apa tanggung jawab yang tepat untuk masing-masing tahapan. Saya merasa saya kehilangan beberapa "standar" yang menjadi dasar semua ini.
Saya akan sangat menghargai beberapa penjelasan tentang ini.
sumber
boot
perintah implisit di akhir urutan. Saya tidak yakin persis apa fungsinya di Grub, tetapi jika Anda menggunakan baris perintah Grub untuk memasukkan perintah-perintah ini secara manual, Anda perluboot
atau hanya akan duduk selamanya digrub>
(atau setidaknya, sampai Anda bosan dan matikan komputer ). Perintah sebelumnya "hanya" mengatur lingkungan.boot
akan membuat CPU melompat ke alamat kernel yang dimuat (mulai eksekusi). Untuk entri menu ini didefinisikan secara implisit. lihat ini .Jawaban:
Secara umum harus ada semacam protokol karena biasanya tidak cukup hanya memuat file ke memori dan melompat di lokasi tertentu tetapi Anda harus melewati argumen tambahan seperti parameter kernel, yaitu mengakses argumen memdisk dari DOS .
Karena ini tergantung perangkat keras (lengan berbeda dari x86 misalnya) Anda harus menemukan informasi yang benar, lihat artikel ini tentang lengan booting atau protokol boot Linux / x86 untuk beberapa contoh.
sumber
Bootloader menyimpan initrd ke lokasi di memori, dan memberitahu kernel alamat memori dari gambar initrd. Sebagian besar sistem linux modern menggunakan skema initramfs menggunakan dracut , yang sebenarnya merupakan arsip cpio (bukan gambar disk) yang diurai ke sistem file tmpfs yang dibuat oleh kernel segera setelah eksekusi.
sumber