Saya telah melalui tutorial tentang cara mengatur initramfs kustom di mana ia menyatakan:
Satu-satunya hal yang hilang adalah / init, yang dapat dieksekusi di root initramfs yang dieksekusi oleh kernel setelah di-load. Karena sys-apps / busybox menyertakan shell yang berfungsi penuh, ini berarti Anda dapat menulis biner / init Anda sebagai skrip shell sederhana (alih-alih menjadikannya aplikasi rumit yang ditulis dalam Assembler atau C yang harus Anda kompilasi).
dan memberikan contoh init sebagai skrip shell yang dimulai dengan #!/bin/busybox sh
Sejauh ini, saya mendapat kesan bahwa init adalah proses utama yang diluncurkan dan bahwa semua proses ruang pengguna lainnya pada akhirnya adalah anak-anak init. Namun, dalam contoh yang diberikan, proses pertama sebenarnyabin/busybox/ sh
dari init yang kemudian melahirkan.
Apakah ini interpertasi yang benar? Jika saya, misalnya, memiliki juru bahasa yang tersedia pada saat itu, saya bisa menulis init sebagai skrip Python dll?
sumber
/
tidak hilang ke udara tipis - itu sudah terpasang (meskipun biasanya isinya semua dihapus sebelum untuk menghemat memori) . Itu masih di sana .switch_root
melakukan syscallswitchroot
- yang disediakan oleh devs kernel ketika mereka mengubah proses boot di kernel 2.6.sesuatu yang membutuhkan initramfs. Adalah kernel yang melakukan keajaiban.switchroot
syscall memang akan menjadi berita kepada saya. Apakah Anda punya sumber untuk itu? Jika Anda melihat kode sumber switch_root.c, sepertinya itu proses yang cukup manual, dan sama seperti yang dijelaskan dalam Dokumentasi / filesystems / ramfs-rootfs-initramfs.txt. Juga jika Anda menghapus semuanya dan me-mount-nya, itu cukup banyak menghilang pada saat ini, bukan begitu?pivot_root
, di sisi lain, adalah syscall. Itu tidak digunakan untuk sementaraswitch_root
dan tidak dapat digunakan tanpa melompati beberapa simpai, dan bagaimanapun juga tidak ada masalah apa pun untuk jawaban ini, jadi saya hanya menghapusnya sama sekali. Sayang sekali, saya berpikir bahwa sihir dan menghilang ke udara bekerja dengan sangat baik ... :-Pswitch_root
- yang saya minta maaf, dan saya berterima kasih kepada Anda karena menunjukkan saya - tetapi itu tidak menghilangkan apa pun. initramfs akar tetap terjadi dan selalu ada untuk semua orang - itu adalah root.find -xdev / -exec rm '{}' ';'
cd /newmount; mount --move . /; chroot .
Perintah eksekutif dari kernel Linux kurang memahami shebangs secara asli
Ketika file yang dieksekusi dimulai dengan byte ajaib
#!
, mereka memberi tahu kernel untuk menggunakan#!/bin/sh
sebagai:exec
panggilan sistem/bin/sh
Ini persis sama dengan yang terjadi ketika Anda menjalankan skrip shell userland biasa dengan:
Jika file dimulai dengan byte ajaib
.ELF
alih-alih#!
, kernel akan memilih loader ELF untuk menjalankannya.Lebih detail di: Mengapa orang menulis #! / Usr / bin / env python shebang di baris pertama skrip Python? | Stack Overflow
Setelah Anda memikirkan hal ini, menjadi mudah untuk menerima bahwa
/init
apa pun yang dapat dieksekusi kernel, termasuk skrip shell, dan juga mengapa/bin/sh
akan menjadi yang pertama dieksekusi dalam kasus itu.Berikut adalah contoh runnable minimal bagi mereka yang ingin mencobanya: https://github.com/cirosantilli/linux-kernel-module-cheat/tree/cbea7cc02c868711109ae1a261d01fd0473eea0b#custom-init
sumber