Saya berhasil membuat CD Linux live kecil dan berfungsi penuh yang hanya berisi kernel (dikompilasi dengan opsi default) dan BusyBox (dikompilasi dengan opsi default + statis, semua applet hadir, termasuk /sbin/init
). Saya tidak memiliki masalah untuk membuat initrd
dan mengisi /dev
, /proc
dan /sys
dan juga saya tidak memiliki masalah sama sekali dengan saya /init
shell script.
Baru-baru ini saya membaca bahwa BusyBox mendukung /etc/inittab
konfigurasi (setidaknya ke tingkat tertentu) dan saya ingin melakukan salah satu dari yang berikut:
- Lupakan
/init
skrip shell saya dan bergantung sepenuhnya pada/etc/inittab
konfigurasi. - Gunakan
/init
skrip shell dan/etc/inittab
konfigurasi.
Sekarang masalah sebenarnya - sepertinya /etc/inittab
benar-benar diabaikan ketika distro saya boot. Gejala-gejalanya adalah:
- Ketika saya menghapus
/init
dan meninggalkan hanya/etc/inittab
saya berakhir dengan panik kernel. Asumsi saya adalah bahwa kernel tidak mengeksekusi/sbin/init
sama sekali, atau yang/sbin/init
tidak menemukan (atau membaca)/etc/inittab
. - Saya membaca bahwa BusyBox akan berfungsi dengan baik bahkan tanpa
/etc/inittab
. Jadi, saya dihapus baik/init
dan/etc/inittab
dan coba tebak - kernel panik lagi. - Saya mencoba mengeksekusi
/sbin/init
dari shell saya dan setelah beberapa tebakan yang termasukexec /sbin/init
,setsid /sbin/init
danexec setsid /sbin/init
saya berakhir dengan panik kernel. Baik dengan dan tanpa / etc / inittab ada pada sistem file.
Inilah isi /init
skrip shell saya :
#!/bin/sh
dmesg -n 1
mount -t devtmpfs none /dev
mount -t proc none /proc
mount -t sysfs none /sys
setsid cttyhack /bin/sh
Pada titik ini saya tidak peduli apa isi /etc/inittab
akan menjadi, selama saya punya cara untuk mengetahui bahwa konfigurasi di sana benar-benar berfungsi. Saya mencoba beberapa /etc/inittab
konfigurasi, semua berdasarkan pada informasi yang saya temukan di sini .
Minimal saya / etc / inittab hanya berisi satu baris ini:
::sysinit:/bin/sh
Lagi - saya berakhir dengan panik kernel dan tampaknya /etc/inittab
itu diabaikan.
Ada saran bagaimana memaksa distro live kecil saya bekerja dengan BusyBox's /etc/inittab
sangat dihargai!
Memperbarui:
- Hanya untuk memperjelas - Saya tidak memiliki masalah panik kernel dengan
/init
skrip shell saya saat ini dengan dan tanpa/etc/inittab
. Semuanya bekerja dengan baik,/bin/ash
konsol saya berfungsi dengan baik dan saya tidak mengalami masalah yang tidak terduga. Satu-satunya masalah adalah yang/etc/inittab
sepenuhnya diabaikan, seperti yang saya jelaskan di atas. - Saya memeriksa 3 distribusi Linux langsung yang berbeda: Slax, Finnix dan SysResCD. Mereka semua memiliki
/init
dan tidak ada yang memiliki/etc/inittab
. Selain itu artikel Wiki ini menyimpulkan kecurigaan saya bahwa/sbin/init
tidak ada sama sekali.
Jawaban:
Oke, saya melakukan banyak penelitian dan saya menemukan apa yang salah. Mari kita mulai satu per satu:
initramfs
skema boot, proses pertama yang dipanggil kernel adalah/init
skrip. Kernel tidak akan pernah mencoba untuk mengeksekusi/sbin/init
secara langsung./init
ditugaskan pengidentifikasi proses 1. Ini sangat penting!/sbin/init
hanya bisa dimulaiPID 1
tetapi kita sudah berjalan/init
sebagai PID 1.exec /sbin/init
saat kita masih di dalam/init
. Dengan cara ini proses baru (yaitu/sbin/init
) akan mewarisi PID dari induknya (/init
dengan PID 1) dan hanya itu yang harus kita lakukan.Masalah yang saya alami dengan konfigurasi awal saya (lihat pertanyaan) adalah karena fakta bahwa hal terakhir yang
/init
dilakukan skrip saya adalah menelurkan/bin/sh
proses baru yang diberi PID baru. Dari titik ini tidak mungkin untuk menjalankan/sbin/init
langsung dari konsol interaktif karena bahkan ketika kita mengeksekusi baris perintahexec /sbin/init
, yang terbaik yang kita capai adalah dengan menetapkan PID yang sama yang telah ditugaskan ke shell dan PID ini jelas bukan PID 1.Singkat cerita - jalankan perintah
exec /sbin/init
langsung dari/init
dan itu saja.sumber