Saya menemukan bahwa jika saya memilih jffs
atau sd
sebagai filesystem (dan bukan initramfs
), ukuran kernel akan sangat kecil (1,4 MB dibandingkan dengan initramfs
yang 3,4MB). Ini berarti initramfs
membutuhkan 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.
/root
- itu saja. Satu-satunya hal yang dilakukannya berbeda adalahswitch_root
tetapi 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.Jawaban:
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,
vmlinux
danbzImage
jangan menyertakan initramfs (mereka adalah kernel mentah dan terkompresi masing-masing ), tetapiuImage
(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.
sumber
Dari LFS :
...
...
Sumber lain www.kernel.org
Selain itu ada banyak sistem Linux yang suka router yang tidak menggunakan initramfs.
sumber
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.
sumber
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.)
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
/boot
partisi, 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.
sumber
Saya menemukan penjelasan berikut lebih jelas,
sumber
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?
Rootfs
adalah contoh khusus dariramfs
(atautmpfs
, 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
rootfs
dan mengabaikannya. Jumlah ruang contoh kosong ramf mengambil kecil.Jika * CONFIG_TMPFS * diaktifkan,
rootfs
akan digunakantmpfs
alih-alihramfs
secara default. Untuk memaksaramfs
, tambahkan"rootfstype=ramfs"
ke baris perintah kernel.Apa itu initramfs?
Semua kernel Linux 2.6 berisi
"cpio"
arsip berformatgzip, yang diekstraksi menjadirootfs
ketika kernel dinyalakan. Setelah mengekstraksi, kernel memeriksa untuk melihat apakahrootfs
berisi file"init"
, dan jika demikian dieksekusi sebagai PID 1. Jika ditemukan,init
proses ini bertanggung jawab untuk membawa sistem ke sisa jalan, termasuk menemukan dan memasang perangkat root sebenarnya ( jika ada). Jikarootfs
tidak mengandunginit
program setelahcpio
arsiptertanamdiekstraksi ke dalamnya, kernel akan jatuh ke kode yang lebih lama untuk menemukan dan me-mount partisi root, kemudian jalankan beberapa varian/sbin/init
dari itu.Semua ini berbeda dari initrd lama dalam beberapa cara:
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:
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.
sumber
do_mounts.c
- khususnyaprepare_namespace
, di manasaved_root_name
datang diisi denganroot=
argumen baris perintah.