Linux tối thiểu với kernel và BusyBox: / etc / inittab bị bỏ qua, chỉ / init được thực thi


12

Tôi đã quản lý để tạo một đĩa CD Linux nhỏ và đầy đủ chức năng, chỉ chứa kernel (được biên dịch với các tùy chọn mặc định) và BusyBox (được biên dịch với các tùy chọn mặc định + tĩnh, tất cả các applet đều có, bao gồm /sbin/init). Tôi không có vấn đề gì để tạo initrdvà cư trú /dev, /proc/systôi cũng không có vấn đề gì với /initkịch bản shell của mình .

Gần đây tôi đọc được rằng BusyBox hỗ trợ các /etc/inittabcấu hình (ít nhất là ở một mức nào đó) và tôi rất muốn thực hiện một trong những điều sau đây:

  • Hãy quên đi /initkịch bản shell của tôi và hoàn toàn dựa vào /etc/inittabcấu hình.
  • Sử dụng cả /initshell script và /etc/inittabcấu hình.

Bây giờ vấn đề thực tế - có vẻ như /etc/inittabhoàn toàn bị bỏ qua khi distro của tôi khởi động. Các triệu chứng là:

  • Khi tôi gỡ bỏ /initvà chỉ còn lại /etc/inittabtôi kết thúc với sự hoảng loạn hạt nhân. Giả định của tôi là kernel hoàn toàn không thực thi /sbin/inithoặc /sbin/initkhông tìm thấy (hoặc đọc) /etc/inittab.
  • Tôi đọc rằng BusyBox sẽ hoạt động tốt ngay cả khi không có /etc/inittab. Vì vậy, tôi loại bỏ cả hai /init/etc/inittabvà đoán những gì - hạt nhân hoảng loạn một lần nữa.
  • Tôi đã cố gắng thực hiện /sbin/inittừ shell của mình và sau vài lần đoán bao gồm exec /sbin/init, setsid /sbin/initexec setsid /sbin/inittôi đã kết thúc với sự hoảng loạn của kernel. Cả có và không có / etc / inittab đều có mặt trên hệ thống tệp.

Đây là nội dung của /inittập lệnh shell của tôi :

#!/bin/sh
dmesg -n 1
mount -t devtmpfs none /dev
mount -t proc none /proc
mount -t sysfs none /sys
setsid cttyhack /bin/sh

Tại thời điểm này tôi không quan tâm nội dung của /etc/inittabnó sẽ là gì, miễn là tôi có cách để biết rằng cấu hình thực sự hoạt động. Tôi đã thử một vài /etc/inittabcấu hình, tất cả dựa trên thông tin mà tôi tìm thấy ở đây .

Ở mức tối thiểu, my / etc / inittab chỉ chứa một dòng này:

::sysinit:/bin/sh

Một lần nữa - tôi đã kết thúc với sự hoảng loạn hạt nhân và dường như điều đó /etc/inittabđã bị bỏ qua.

Mọi đề xuất làm thế nào để buộc bản phân phối trực tiếp nhỏ của tôi hoạt động tốt với BusyBox /etc/inittabđều được đánh giá cao!

Cập nhật:

  • Chỉ cần làm cho nó rõ ràng - Tôi không gặp rắc rối hoảng loạn hạt nhân với /inittập lệnh shell hiện tại của mình cả có và không có /etc/inittab. Tất cả đều hoạt động tốt, /bin/ashbảng điều khiển của tôi hoạt động rất tốt và tôi không gặp phải bất kỳ rắc rối bất ngờ nào. Vấn đề duy nhất /etc/inittablà hoàn toàn bị bỏ qua, như tôi đã mô tả ở trên.
  • Tôi đã kiểm tra 3 bản phân phối Linux trực tiếp khác nhau: Slax, Finnix và SysResCD. Tất cả trong số họ có /initvà không ai trong số họ có /etc/inittab. Ngoài ra , bài viết Wiki này kết luận sự nghi ngờ của tôi /sbin/initkhông được viện dẫn.

Nếu bạn đến đây, hãy xem Minimal Linux Live dường như làm những gì họ muốn và chỉ hoạt động: github.com/ivandavidov/minimal
Ciro Santilli 改造 心 心 事件 事件

À, OP đã viết Minimal Linux Live! Người đàn ông bạn đá.
Ciro Santilli 心 心 事件

Câu trả lời:


11

OK, tôi đã làm rất nhiều nghiên cứu sâu rộng và tôi đã tìm ra những gì sai. Hãy bắt đầu từng cái một:

  • Khi chúng ta sử dụng initramfssơ đồ khởi động, quá trình đầu tiên mà kernel gọi là /initscript. Nhân sẽ không bao giờ cố gắng thực hiện /sbin/inittrực tiếp.
  • /init được gán định danh quy trình 1. Điều này rất quan trọng!
  • Vấn đề bây giờ là /sbin/initchỉ có thể được bắt đầu PID 1nhưng chúng tôi đã chạy /initnhư là 1.
  • Giải pháp là thực thi dòng lệnh exec /sbin/inittrong khi chúng ta vẫn ở bên trong /init. Theo cách này, quy trình mới ( /sbin/initsẽ) sẽ kế thừa PID từ cha mẹ của nó ( /initvới PID 1) và đó là tất cả những gì chúng ta phải làm.

Vấn đề tôi gặp phải với cấu hình ban đầu của mình (xem câu hỏi) là do thực tế rằng điều cuối cùng mà /initkịch bản của tôi làm là tạo ra /bin/shquy trình mới được gán cho PID hoàn toàn mới. Từ thời điểm này, không thể chạy /sbin/inittrực tiếp từ bảng điều khiển tương tác bởi vì ngay cả khi chúng ta thực thi dòng lệnh exec /sbin/init, điều tốt nhất chúng ta đạt được là gán cùng một PID đã được gán cho trình bao và PID này chắc chắn không phải là PID 1.

Câu chuyện dài - thực hiện dòng lệnh exec /sbin/inittrực tiếp từ /initvà đó là tất cả.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.