Mengapa saya perlu initramfs?

17

Saya menemukan bahwa jika saya memilih jffsatau sdsebagai filesystem (dan bukan initramfs), ukuran kernel akan sangat kecil (1,4 MB dibandingkan dengan initramfsyang 3,4MB). Ini berarti initramfsmembutuhkan ruang yang sangat besar. Jadi jika saya bisa, saya akan menghapus sepenuhnya, dan dengan demikian akan memiliki kernel yang sangat kecil, itulah yang saya inginkan.

Pertanyaan mendasar yang muncul di benak saya adalah: Mengapa saya perlu initramfs? Tidak bisakah kernel Linux boot tanpa memiliki sistem file awal?

Aplikasi akhir saya hanya akan melakukan perhitungan & komunikasi - tidak ada penyimpanan sama sekali. Jadi OS tanpa sistem file masuk akal - setidaknya untuk aplikasi saya.

gpuguy
sumber
2
Anda tidak dapat melakukannya tanpa initramfs. Mungkin dilakukan tanpa file initramfs tambahan, tetapi terlepas dari apa yang Anda lakukan, kernel menyertakan sendiri yang kosong atau tidak. Jadi saya tidak mengerti pertanyaan Anda - distribusi apa yang Anda bicarakan? Bagaimana Anda membangun kernel Anda? Bisakah Anda memberikan file kernel .config? Ini sangat penting. Saya menduga distro Anda sedang mengkompilasi initramfs langsung ke kernel - dan karena itu mengisi initramfs kosong yang dikandungnya - tetapi saya tidak bisa tahu berdasarkan informasi yang Anda berikan.
mikeserv
2
@ mikeserv, jelas initramfs built in tapi kosong / tidak digunakan tidak masuk hitungan.
psusi
Nah, @psusi, kernel kernel tidak setuju. Dan saya sangat bersikeras tentang hal itu karena tidak perlu ada misteri - hanya /root- itu saja. Satu-satunya hal yang dilakukannya berbeda adalah switch_roottetapi bahkan itu, asalkan tindakan pencegahan yang tepat diambil dengan modul kernel dimuat tertentu, dapat dilakukan kapan saja. Initramfs tidak lebih dari gambar disk - penuh atau tidak, itu ada di sana. Dan Anda tidak akan pernah tanpanya - itu adalah akar Anda. Seharusnya tidak menjadi misteri, adalah apa yang saya pikirkan, dan saya tidak suka semua kebingungan yang tidak perlu di sekitarnya.
mikeserv
2
@ mikeserv, tidak, / root adalah direktori home untuk pengguna root. Rootfs adalah /, yang kemudian memiliki root asli yang dipasang di atasnya. Anda hanya berdebat semantik. Untuk keperluan diskusi ini, tidak memiliki initramfs berarti tidak memiliki file pada disk boot loader Anda harus memuat dan lolos ke kernel.
psusi
Itu benar, saya hanya menggunakan / root demi kejelasan, tapi saya akan memberikan yang itu. Tapi tidak, mereka bukan semantik, mereka adalah mekanisme mendasar dari kernel linux Anda. Ini adalah hal mendasar. Mari kita coba untuk memperbaikinya.
mikeserv

Jawaban:

11

Peningkatan ukuran memiliki initramfs bukan karena driver ramfs (itu hanya beberapa kB, dan dibutuhkan untuk hal-hal lain) tetapi ke initramfs itu sendiri. Initramfs berisi program yang diperlukan untuk merakit dan me-mount sistem file root yang sebenarnya.

Initramfs membuatnya jauh lebih mudah, dan dalam beberapa kasus mungkin (misalnya dienkripsi /), untuk mem-boot sistem. Sangat disarankan untuk menyimpannya di perangkat keras bergaya PC dengan banyak periferal hotpluggable. Di sisi lain, sangat masuk akal untuk mem-boot perangkat yang tertanam tanpa initramfs, dengan kernel yang hanya mendukung konfigurasi perangkat keras tertentu yang dibuat untuk itu.

Kernel tentu saja perlu boot ke sistem file: harus ada beberapa cara untuk memuat aplikasi apa pun yang ingin Anda jalankan. Jika Anda tidak akan menjalankan apa pun, maka sebaiknya matikan mesin.

Jika Anda tidak ingin menggunakan initramfs, cukup beri tahu bootloader Anda untuk tidak meneruskannya. Juga jangan menyertakan satu dalam output kernel build, tentu saja - bagaimana hal ini terjadi jika sama sekali bergantung pada arsitektur dan bootloader: misalnya, vmlinuxdan bzImagejangan menyertakan initramfs (mereka adalah kernel mentah dan terkompresi masing-masing ), tetapi uImage(untuk U-Boot) mengemas kernel dan initramfs jika ada.

(Secara teknis, seperti catatan mikeserv , selalu ada initramf - tetapi secara default, ini adalah arsip 134 byte yang kosong. Apa yang Anda lihat, dan ingin singkirkan, adalah initramfs "true", non-kosong yang dibuat oleh proses build Anda dan mengandung alat-alat yang kemudian digunakan untuk me-mount sistem file root.)

Pikiran Anda, sebuah initramfs bisa menjadi cara yang masuk akal untuk membuat sistem aplikasi tunggal tanpa data yang persisten: masukkan semua aplikasi Anda ke initramfs, boot itu dan simpan. Ini membuatnya lebih mudah untuk mengatur penyimpanan persisten Anda atau image booting (yang Anda butuhkan adalah kernel dan initramfs, yang dapat dibundel). Namun ada kelemahan dalam pendekatan ini: semua data dalam initramfs akan disimpan dalam RAM secara permanen, dan Anda tidak dapat dengan mudah memodifikasi file dalam image boot, Anda harus membangun kembali arsip.

Gilles 'SO- berhenti menjadi jahat'
sumber
Jika Anda menggunakan kernel Linux 2.6 atau yang lebih baru, Anda memiliki initramfs. Apakah Anda menggunakan gambar initramfs sekunder atau tidak, seperti kebiasaan, adalah masalah lain, tetapi initramfs tidak opsional.
mikeserv
2
@ mikeserv Anda punya, ya. Tapi initramf kosong adalah kacang. Itu tidak harus digunakan (yang mengharuskan itu berisi cukup banyak program untuk me-mount root asli, yang meningkatkan ukuran dengan cara yang tidak dapat diabaikan dalam sistem embedded yang khas).
Gilles 'SO- stop being evil'
Kacang tanah wajib. Dan saya tidak tahu kapan saya mengatakan sebaliknya! Penanya meminta informasi tentang cara menghapusnya sebagai sistem file - yang tidak mungkin.
mikeserv
Dan ya itu memang harus digunakan - tanpa initramfs tidak ada root. Pernah.
mikeserv
8

Dari LFS :

Satu-satunya tujuan initramfs adalah untuk me-mount sistem file root. Initramfs adalah sekumpulan direktori lengkap yang akan Anda temukan pada sistem file root yang normal. Itu dibundel menjadi arsip cpio tunggal dan dikompres dengan salah satu dari beberapa algoritma kompresi.

...

Hanya ada empat alasan utama untuk memiliki initramf di lingkungan LFS: memuat rootfs dari jaringan, memuatnya dari volume logis LVM, memiliki rootf terenkripsi di mana kata sandi diperlukan, atau untuk kenyamanan menentukan rootfs sebagai LABEL atau UUID. Hal lain biasanya berarti bahwa kernel tidak dikonfigurasi dengan benar.

...

Untuk sebagian besar distribusi, modul kernel adalah alasan terbesar untuk memiliki initramfs. Dalam distribusi umum, ada banyak yang tidak diketahui seperti tipe sistem file dan tata letak disk. Di satu sisi, ini adalah kebalikan dari LFS di mana kemampuan dan tata letak sistem diketahui dan kernel kustom biasanya dibangun. Dalam situasi ini, initramf jarang diperlukan.

Sumber lain www.kernel.org

Selain itu ada banyak sistem Linux yang suka router yang tidak menggunakan initramfs.


sumber
1

Anda memerlukan initramfs untuk pengaturan yang lebih kompleks, seperti boot jaringan, atau lvm atau raid, karena mereka memerlukan beberapa utilitas mode pengguna untuk mengkonfigurasi akses ke root fs. Untuk partisi sederhana dan konvensional pada disk, maka selama Anda memiliki driver disk yang dibangun ke dalam kernel, dan tentukan argumen root dengan lintasan perangkat daripada UUID, maka Anda dapat melakukannya tanpa initramfs. Tentu saja, jalur perangkat dapat berubah, tergantung pada perangkat plug and play (yaitu usb) apa yang telah Anda hubungkan, atau bahkan hanya varian waktu acak, itulah sebabnya mengapa setiap orang menggunakan uuids dan initramfs untuk keandalan.

psusi
sumber
Ini juga salah.
mikeserv
6
@ mikeserv, komentar Anda tidak berguna. Jika Anda akan mengklaim itu, Anda perlu menjelaskan alasannya.
psusi
Saya telah melakukan, atau lebih tepatnya, dokumentasi kernel yang menyusun 99% jawaban saya.
mikeserv
@ mikeserv, itu benar. Saya menjalankan Gentoo linux selama bertahun-tahun sekarang tanpa initramfs.
Tim
1

Ini adalah pertanyaan lama tetapi tampaknya masih belum memiliki jawaban yang diterima jadi saya akan membuang ini di luar sana (saya bukan ahli di sini, saya mencoba mencari tahu sendiri.)

Dari https://www.kernel.org/doc/Documentation/early-userspace/README (semuanya di bagian bawah yang mengatakan belum diperbarui sejak 2004.)

Kernel saat ini memiliki 3 cara untuk memasang sistem file root:

a) semua driver perangkat dan sistem file yang diperlukan dikompilasi ke dalam kernel, tanpa initrd. init / main.c: init () akan memanggil prep_namespace () untuk me-mount sistem file root terakhir, berdasarkan pada root = opsi dan opsional init = untuk menjalankan beberapa biner init lain daripada yang terdaftar di akhir init / main.c: init ().

b) beberapa perangkat dan driver sistem file yang dibangun sebagai modul dan disimpan dalam initrd. Initrd harus mengandung binary '/ linuxrc' yang seharusnya memuat modul driver ini. Dimungkinkan juga untuk me-mount filesystem root terakhir melalui linuxrc dan menggunakan syscall pivot_root. Initrd di-mount dan dieksekusi melalui prep_namespace ().

c) menggunakan initramfs. Panggilan ke prep_namespace () harus dilewati. Ini berarti bahwa biner harus melakukan semua pekerjaan. Biner tersebut dapat disimpan ke dalam initramfs baik dengan memodifikasi usr / gen_init_cpio.c atau melalui format initrd baru, arsip cpio. Itu harus disebut "/ init". Biner ini bertanggung jawab untuk melakukan semua hal yang akan dilakukan prep_namespace ().

Untuk menjaga kompatibilitas ke belakang, biner / init hanya akan berjalan jika ia datang melalui arsip cpio initramfs. Jika ini bukan masalahnya, init / main.c: init () akan menjalankan prep_namespace () untuk me-mount root terakhir dan mengeksekusi salah satu binari init yang telah ditentukan.

Untuk apa nilainya, saya percaya perangkat / distro seperti Raspberry Pi, dll. Jangan gunakan initramfs; dalam beberapa kasus, kernel berada di partisi root (dipasang oleh bootloader yang memiliki modul fs yang diperlukan). Dalam kasus lain di mana kernel berada pada /bootpartisi, initramfs pada partisi yang sama dapat diakses secara langsung sebelum me-mount rootfs seperti yang lain. telah menyatakan.

Dalam beberapa kasus, initramfs dapat dibangun ke dalam file yang sama dengan kernel tetapi hal ini tidak selalu terjadi. (a) tampaknya menyatakan dengan cukup jelas bahwa dalam beberapa kasus initramf tidak diperlukan.

thom_nic
sumber
0

Saya menemukan penjelasan berikut lebih jelas,

initramfsadalah sistem file root yang tertanam ke dalam kernel dan dimuat pada tahap awal proses boot. Ini adalah penerus initrd. Ini menyediakan userspace awal yang dapat melakukan hal-hal yang kernel tidak dapat dengan mudah melakukannya sendiri selama proses boot.

Menggunakan initramfs adalah opsional. Secara default, kernel menginisialisasi perangkat keras menggunakan driver built-in, me-mount partisi root yang ditentukan, memuat sistem init dari distribusi Linux yang diinstal. Sistem init kemudian memuat modul tambahan dan memulai layanan hingga akhirnya memungkinkan Anda untuk masuk. Ini adalah perilaku default yang baik dan cukup untuk banyak pengguna. initramfs adalah untuk pengguna dengan persyaratan canggih; untuk pengguna yang perlu melakukan sesuatu sedini mungkin, bahkan sebelum partisi root di-mount.

Berikut adalah beberapa contoh yang dapat Anda lakukan dengan initramfs:

  • Pasang partisi root (untuk partisi yang dienkripsi, logis, dan khusus);
  • Berikan shell penyelamat minimalis (jika terjadi kesalahan);
  • Kustomisasi proses boot (mis. Cetak pesan selamat datang, boot splash, dll.);
  • Muat modul (misalnya driver pihak ketiga);
  • Apa pun yang tidak dapat dilakukan oleh kernel (selama Anda dapat melakukannya di ruang pengguna, misalnya dengan menjalankan perintah). Jika Anda tidak memiliki persyaratan lanjutan, Anda tidak perlu initramfs.
Sufiyan Ghori
sumber
-1

Apa pun yang Anda lakukan, Anda punya initramfs. Tidak ada gunanya tanpa itu - itu adalah satu-satunya sistem file yang dikenakan pada Anda. Dari kernel.org :

Apa itu rootfs?

Rootfsadalah contoh khusus dari ramfs(atau tmpfs, jika itu diaktifkan), yang selalu ada di sistem 2.6. Anda tidak dapat mengrootfs - unmount dengan alasan yang kira-kira sama dengan Anda tidak dapat mematikan proses init; Daripada memiliki kode khusus untuk memeriksa dan menangani daftar kosong, ini lebih kecil dan sederhana untuk kernel untuk memastikan daftar tertentu tidak menjadi kosong.

Sebagian besar sistem hanya memasang sistem file lain rootfsdan mengabaikannya. Jumlah ruang contoh kosong ramf mengambil kecil.

Jika * CONFIG_TMPFS * diaktifkan, rootfsakan digunakan tmpfsalih-alih ramfssecara default. Untuk memaksa ramfs, tambahkan "rootfstype=ramfs"ke baris perintah kernel.

Apa itu initramfs?

Semua kernel Linux 2.6 berisi"cpio"arsip berformatgzip, yang diekstraksi menjadi rootfsketika kernel dinyalakan. Setelah mengekstraksi, kernel memeriksa untuk melihat apakahrootfsberisi file"init" , dan jika demikian dieksekusi sebagai PID 1. Jika ditemukan,initproses ini bertanggung jawab untuk membawa sistem ke sisa jalan, termasuk menemukan dan memasang perangkat root sebenarnya ( jika ada). Jikarootfstidak mengandunginitprogram setelahcpioarsiptertanamdiekstraksi ke dalamnya, kernel akan jatuh ke kode yang lebih lama untuk menemukan dan me-mount partisi root, kemudian jalankan beberapa varian/sbin/initdari itu.

Semua ini berbeda dari initrd lama dalam beberapa cara:

  • Initrd lama selalu merupakan file terpisah, sedangkan arsip initramfs ditautkan ke citra kernel linux. (Direktori linux - * / usr dikhususkan untuk membuat arsip ini selama pembuatan.)

  • File initrd yang lama adalah imej filesystem gzip (dalam beberapa format file, seperti ext2, yang membutuhkan driver yang dibangun ke dalam kernel), sedangkan arsip initramfs yang baru adalah arsip cpio yang di-gzip (seperti tar hanya lebih sederhana, lihat cpio (1) dan Dokumentasi / awal-userspace / buffer-format.txt). Kode ekstraksi cpio kernel tidak hanya sangat kecil, tetapi juga teks dan data yang dapat dibuang selama proses boot.

  • Program dijalankan oleh initrd lama (yang disebut / initrd, bukan / init) melakukan beberapa pengaturan dan kemudian kembali ke kernel, sedangkan program init dari initramfs tidak diharapkan untuk kembali ke kernel. (Jika / init perlu menyerahkan kontrol, ia dapat overmount / dengan perangkat root baru dan mengeksekusi program init lain. Lihat utilitas switch_root, di bawah ini.)

  • Saat mengganti perangkat root lain, initrd akan pivot_root dan kemudian umount ramdisk. Tetapi initramfs adalah rootfs: Anda tidak bisa pivot_root rootfs, maupun unmount. Alih-alih hapus semua dari rootfs untuk membebaskan ruang (find -xdev / -exec rm '{}' ';'), overmount rootfs dengan root baru (cd / newmount; mount --move. /; Chroot.), lampirkan stdin / stdout / stderr ke / dev / console baru, dan exec init baru.

Karena ini adalah proses yang sangat gigih (dan melibatkan menghapus perintah sebelum Anda dapat menjalankannya), paket klibc memperkenalkan program pembantu (utils / run_init.c) untuk melakukan semua ini untuk Anda. Sebagian besar paket lain (seperti busybox) menamai perintah ini "switch_root".

Populasi initramfs:

Proses build kernel 2.6 selalu membuat arsip initramfs berformat cpio gzip dan menautkannya ke dalam biner kernel yang dihasilkan. Secara default, arsip ini kosong (menghabiskan 134 byte pada x86).

Opsi konfigurasi CONFIG_INITRAMFS_SOURCE (dalam Pengaturan Umum di menuconfig, dan tinggal di usr / Kconfig) dapat digunakan untuk menentukan sumber untuk arsip initramfs, yang secara otomatis akan dimasukkan ke dalam biner yang dihasilkan. Opsi ini dapat mengarah ke arsip cpio yang di-gzip, direktori yang berisi file yang akan diarsipkan, atau spesifikasi file teks seperti contoh berikut:

  dir /dev 755 0 0
  nod /dev/console 644 0 0 c 5 1
  nod /dev/loop0 644 0 0 b 7 0
  dir /bin 755 1000 1000
  slink /bin/sh busybox 777 0 0
  file /bin/busybox initramfs/busybox 755 0 0
  dir /proc 755 0 0
  dir /sys 755 0 0
  dir /mnt 755 0 0
  file /init initramfs/init.sh 755 0 0

Jalankan "usr / gen_init_cpio" (setelah kernel membangun) untuk mendapatkan pesan penggunaan yang mendokumentasikan format file di atas.

Salah satu keuntungan dari file konfigurasi adalah akses root tidak diperlukan untuk mengatur izin atau membuat node perangkat dalam arsip baru. (Perhatikan bahwa dua contoh entri "file" tersebut mengharapkan menemukan file bernama "init.sh" dan "busybox" dalam direktori yang disebut "initramfs", di bawah direktori linux-2.6. *. Lihat Dokumentasi / awal-ruang pengguna / README untuk keterangan lebih lanjut.)

Kernel tidak tergantung pada alat cpio eksternal. Jika Anda menentukan direktori alih-alih file konfigurasi, infrastruktur build kernel membuat file konfigurasi dari direktori tersebut (usr / Makefile memanggil skrip / gen_initramfs_list.sh), dan mulai mengemas direktori tersebut menggunakan file konfigurasi (dengan memasukkannya ke usr / gen_init_cpio, yang dibuat dari usr / gen_init_cpio.c). Kode pembuatan cpio kernel waktu-bangun sepenuhnya mandiri, dan ekstraktor waktu-boot kernel juga (jelas) mandiri.

mikeserv
sumber
1
Anda dapat boot tanpa initramfs. Jawaban Anda menguraikan manfaat dari initramfs, tetapi itu tidak berlaku untuk sistem embedded yang tipikal, dan bahkan pada desktop atau server di mana initramfs direkomendasikan, itu tidak wajib.
Gilles 'SANGAT berhenti menjadi jahat'
@Gilles - tidak bisa. Terlepas dari apa yang Anda lakukan, Anda memiliki initramfs. Itu dikompilasi ke dalam kernel - sekarang, kernel Anda, kernel saya, semua kernel kami. Baca dokumentasi kernel - seluruh posting saya adalah copy-paste. Anda salah. Bagaimana Anda bisa membantah dokumentasi resmi?
mikeserv
1
Saya tidak membantah dokumentasi resmi, saya membantah kesimpulan yang Anda ambil darinya. Anda sedang membaca dokumentasi yang menjelaskan cara menggunakan initramfs. Tidak disebutkan di mana initramf harus digunakan.
Gilles 'SO- stop being evil'
@Gilles Jika ini tidak cukup baik: "Proses pengembangan kernel 2.6 selalu membuat arsip initramfs berformat gzip dan menautkannya ke dalam biner kernel yang dihasilkan. Secara default, arsip ini kosong (menghabiskan 134 byte pada x86) .... "Aku bisa melakukan yang lebih baik. Di atas adalah pencarian web 2 atau 3 menit.
mikeserv
3
Saya sudah membaca dokumentasinya. Saya melakukan ini untuk mencari nafkah. Itu bukan masalah pendapat. Selalu ada initramfs, tetapi ini tidak selalu digunakan untuk booting. Saya tidak dapat menemukan penjelasan yang layak tentang struktur kernel untuk kasus itu, mungkin karena ini adalah kasus klasik yang dianggap tidak memerlukan penjelasan. Logika utama ada di do_mounts.c- khususnya prepare_namespace, di mana saved_root_namedatang diisi dengan root=argumen baris perintah.
Gilles 'SANGAT berhenti menjadi jahat'