Mengapa initramfs me-mount sistem file root hanya-baca

12

Apa alasan untuk filesystem root yang dipasang rodi initramfs (dan initrd).

Sebagai contoh, panduan initramfs Gentoo memasang sistem file root dengan:

mount -o ro /dev/sda1 /mnt/root

Kenapa tidak mengikuti yang berikut?

mount -o rw /dev/sda1 /mnt/root

Saya dapat melihat bahwa mungkin ada alasan yang bagus (dan mungkin melibatkan switchroot), namun sepertinya tidak didokumentasikan di mana pun.

Portablejim
sumber

Jawaban:

19

The initial ramdisk (initrd) biasanya versi dilucuti-down dari filesystem root yang berisi hanya itu yang diperlukan untuk me-mount filesystem root yang sebenarnya dan tangan off boot untuk itu.

Initrd ada karena dalam sistem modern, boot loader tidak dapat dibuat cukup pintar untuk menemukan sistem file root dengan andal. Ada terlalu banyak kemungkinan untuk program sekecil itu untuk boot loader. Pertimbangkan NFS root, kartu RAID yang tidak standar, dll. Pemuat boot harus melakukan tugasnya hanya menggunakan BIOS plus kode apa pun yang dapat dijejalkan ke dalam sektor boot.

Initrd disimpan di suatu tempat yang dapat ditemukan oleh boot loader , dan itu cukup kecil sehingga sedikit ruang ekstra yang diperlukan biasanya tidak mengganggu siapa pun. (Dalam sistem tertanam kecil, biasanya tidak ada root "nyata", hanya initrd.)

Initrd sangat berharga: isinya harus dipertahankan dalam semua kondisi, karena jika initrd rusak, sistem tidak dapat boot. Salah satu pilihan desain yang dibuat oleh perancang untuk memastikan ini adalah membuat boot loader memuat read-only initrd. Ada prinsip-prinsip lain yang bekerja untuk ini, juga, seperti dalam kasus sistem kecil di mana tidak ada root "nyata", Anda masih me-mount terpisah /tmp, /var/cachedan seperti itu untuk menyimpan sesuatu. Mengubah initrd jarang dilakukan, dan kemudian harus dilakukan dengan sangat hati-hati.

Mendapatkan kembali ke kasus normal di mana ada adalah akar filesystem nyata, itu awalnya dipasang read-only karena initrd adalah. Itu kemudian disimpan hanya-baca selama mungkin untuk alasan yang sama. Tulisan apa pun ke root sebenarnya yang perlu dilakukan ditunda sampai sistem di-boot, dengan preferensi, atau setidaknya sampai akhir dalam proses boot ketika preferensi itu tidak dapat dipenuhi.

Hal paling penting yang terjadi selama fase read-only ini adalah bahwa sistem file root diperiksa untuk melihat apakah itu di-mount dengan bersih. Itu adalah sesuatu yang bisa dilakukan oleh boot loader alih-alih menyerahkannya ke initrd, tetapi apa yang terjadi jika sistem file root tidak di- unmount dengan bersih? Maka harus menelepon fsckuntuk memeriksa dan mungkin memperbaikinya. Jadi, dari mana initrdmendapatkan fsck, jika itu bertanggung jawab untuk langkah ini alih-alih menunggu sampai handoff ke akar "nyata"? Anda bisa mengatakan bahwa Anda perlu menyalin fsckke initrdsaat membangunnya, tetapi sekarang lebih besar. Dan di atas itu, mana yang fsck akan Anda salin? Sistem Linux secara teratur menggunakan selusin atau lebih filesystem yang berbeda. Apakah Anda menyalin hanya yang diperlukan untuk root asli pada saat itu?initrddibuat? Apakah Anda membesar-besarkan ukuran initrddengan menyalin semua fsck.fooprogram yang tersedia ke dalamnya, jika sistem file root kemudian dimigrasi ke beberapa jenis sistem file lain, dan seseorang lupa untuk membangun kembali initrd?

Arsitek sistem boot Linux dengan bijak memilih untuk tidak membebani initrd dengan masalah-masalah ini. Mereka mendelegasikan pengecekan filesystem root yang sebenarnya ke filesystem root yang sebenarnya, karena ia berada dalam posisi yang lebih baik untuk melakukan itu daripada initrd.

Setelah proses boot berjalan cukup jauh sehingga aman untuk melakukannya, initrd akan ditukar dengan root sebenarnya pivot_root(8), dan sistem file di-remount dalam mode baca-tulis.

Warren Young
sumber
4
Initramfs tidak di-mount hanya baca; kernel membukanya menjadi tmpfs baca / tulis yang di-mount sebagai /. Juga pivot_root () digunakan dalam initrd yang sekarang didepresiasi, tetapi bukan initramfs, yang sebagian besar sistem gunakan saat ini (walaupun file tersebut masih bernama initrd). Dengan initrd, pivot_root terjadi sebelum mengeksekusi / sbin / init, yang berlanjut ke fsck dan remount r / w. Dengan initramfs, ia hanya menghapus semua file di initramfs, kemudian chroot ke root asli dan execs / sbin / init.
psusi
0

Karena selama bootup, sistem file root pada awalnya selalu dipasang hanya-baca. Setelah berbagai tes mandiri selesai, remount sistem file root sebagai baca / tulis dan mulai memasang sistem file lain.

Shadur
sumber
0

Salah satu alasan yang dapat saya pikirkan adalah untuk mencegah beberapa jenis korupsi. Misalnya, Anda dapat me-mount filesystem ext4 sebagai ext2 (atau sebaliknya) dan ini aman dalam mode-ro, tetapi dapat menyebabkan perubahan format yang tidak kompatibel jika dipasang rw dari initram.

Oh, dan ada satu alasan lagi: initramfs mungkin tidak memiliki fsck, tetapi Anda mungkin perlu memeriksa sistem file sebelum memasangnya.

rvs
sumber