Linux Minimal dengan kernel dan BusyBox: / etc / inittab diabaikan, hanya / init yang dieksekusi

12

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 initrddan mengisi /dev, /procdan /sysdan juga saya tidak memiliki masalah sama sekali dengan saya /initshell script.

Baru-baru ini saya membaca bahwa BusyBox mendukung /etc/inittabkonfigurasi (setidaknya ke tingkat tertentu) dan saya ingin melakukan salah satu dari yang berikut:

  • Lupakan /initskrip shell saya dan bergantung sepenuhnya pada /etc/inittabkonfigurasi.
  • Gunakan /initskrip shell dan /etc/inittabkonfigurasi.

Sekarang masalah sebenarnya - sepertinya /etc/inittabbenar-benar diabaikan ketika distro saya boot. Gejala-gejalanya adalah:

  • Ketika saya menghapus /initdan meninggalkan hanya /etc/inittabsaya berakhir dengan panik kernel. Asumsi saya adalah bahwa kernel tidak mengeksekusi /sbin/initsama sekali, atau yang /sbin/inittidak menemukan (atau membaca) /etc/inittab.
  • Saya membaca bahwa BusyBox akan berfungsi dengan baik bahkan tanpa /etc/inittab. Jadi, saya dihapus baik /initdan /etc/inittabdan coba tebak - kernel panik lagi.
  • Saya mencoba mengeksekusi /sbin/initdari shell saya dan setelah beberapa tebakan yang termasuk exec /sbin/init, setsid /sbin/initdan exec setsid /sbin/initsaya berakhir dengan panik kernel. Baik dengan dan tanpa / etc / inittab ada pada sistem file.

Inilah isi /initskrip 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/inittabakan menjadi, selama saya punya cara untuk mengetahui bahwa konfigurasi di sana benar-benar berfungsi. Saya mencoba beberapa /etc/inittabkonfigurasi, 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/inittabitu diabaikan.

Ada saran bagaimana memaksa distro live kecil saya bekerja dengan BusyBox's /etc/inittabsangat dihargai!

Memperbarui:

  • Hanya untuk memperjelas - Saya tidak memiliki masalah panik kernel dengan /initskrip shell saya saat ini dengan dan tanpa /etc/inittab. Semuanya bekerja dengan baik, /bin/ashkonsol saya berfungsi dengan baik dan saya tidak mengalami masalah yang tidak terduga. Satu-satunya masalah adalah yang /etc/inittabsepenuhnya diabaikan, seperti yang saya jelaskan di atas.
  • Saya memeriksa 3 distribusi Linux langsung yang berbeda: Slax, Finnix dan SysResCD. Mereka semua memiliki /initdan tidak ada yang memiliki /etc/inittab. Selain itu artikel Wiki ini menyimpulkan kecurigaan saya bahwa /sbin/inittidak ada sama sekali.
Ivan Davidov
sumber
Jika Anda datang ke sini, lihatlah Minimal Linux Live yang tampaknya melakukan apa yang diinginkan, dan hanya berfungsi: github.com/ivandavidov/minimal
Ciro Santilli 冠状 病毒 审查 六四 六四 事件
Ah, OP menulis Minimal Linux Live! Man you rock.
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功

Jawaban:

11

Oke, saya melakukan banyak penelitian dan saya menemukan apa yang salah. Mari kita mulai satu per satu:

  • Ketika kita menggunakan initramfsskema boot, proses pertama yang dipanggil kernel adalah /initskrip. Kernel tidak akan pernah mencoba untuk mengeksekusi /sbin/initsecara langsung.
  • /init ditugaskan pengidentifikasi proses 1. Ini sangat penting!
  • Masalahnya sekarang adalah itu /sbin/inithanya bisa dimulai PID 1tetapi kita sudah berjalan /initsebagai PID 1.
  • Solusinya adalah dengan mengeksekusi baris perintah exec /sbin/initsaat kita masih di dalam /init. Dengan cara ini proses baru (yaitu /sbin/init) akan mewarisi PID dari induknya ( /initdengan 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 /initdilakukan skrip saya adalah menelurkan /bin/shproses baru yang diberi PID baru. Dari titik ini tidak mungkin untuk menjalankan /sbin/initlangsung dari konsol interaktif karena bahkan ketika kita mengeksekusi baris perintah exec /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/initlangsung dari /initdan itu saja.

Ivan Davidov
sumber