Có phải tất cả các đối số kernel thực sự được sử dụng bởi kernel?


11

Tại sao Linux cho phép 'init = / bin / bash'?

Tôi đọc nó, câu trả lời đang nói rằng đó là KernEL chạy chương trình init này.

Sau đó, tôi bắt đầu tự hỏi, Linux thường đi kèm với một initramfs, cuối cùng sẽ gắn kết và p Pivot_root vào hệ thống tập tin gốc thực sự. Vậy initlập luận này có ý nghĩa gì? Con đường trong initramfs? Hoặc như tôi đoán, nó không được đọc bởi kernel mà bởi init của initramfs để thực thi init thực sự.

Ngoài ra, root=UUID=xxxxđối số, đó có thực sự được đọc bởi kernel hay chỉ bằng init của initramfs để tìm hệ thống tập tin gốc thực sự?

Có vẻ như tôi có thể vượt qua bất kỳ đối số nào tôi muốn làm đối số kernel, vì vậy tất cả chúng đều được đọc bởi kernel hay ít nhất một số trong số chúng chỉ có ý nghĩa đối với các chương trình không gian người dùng?

Câu trả lời:


18

Các tham số được truyền trên dòng lệnh kernel không phải có ý nghĩa đối với kernel: tài liệu tham số kernel nói

Nhân phân tích cú pháp các tham số từ dòng lệnh kernel lên đến - -; nếu nó không nhận ra một tham số và nó không chứa '.', tham số được truyền cho init: tham số với '=' đi vào môi trường init, các tham số khác được truyền dưới dạng đối số dòng lệnh cho init. Tất cả mọi thứ sau khi - - được thông qua như là một đối số cho init.

Điều này không áp dụng cho initrootđó thực sự là các tham số kernel và được xử lý bởi kernel. Chúng cũng có thể được tác động bởi không gian người dùng, vì chúng xuất hiện trong /proc/cmdline. (Vì vậy, ví dụ systemd đưa quiettham số kernel vào tài khoản để giảm đầu ra của nó.)

Khi kernel được khởi động với initramfs, roottham số không được kernel sử dụng trực tiếp và inittham số chỉ được sử dụng nếu rdinitthất bại. initkhởi động được xử lý kernel_init, hoạt động như sau:

  • nếu có một lệnh ramdisk của người Viking thực hiện lệnh (hoặc giá trị được đưa ra rdinittrên dòng lệnh kernel hoặc /init) có thể truy cập được, thì kernel sẽ cố chạy nó;
  • nếu điều đó không thành công và có một lệnh thực thi của người Viking, (giá trị được đưa ra inittrên dòng lệnh kernel), kernel cố gắng chạy nó và hoảng loạn nếu không thể;
  • như một phương sách cuối cùng, hạt nhân cố gắng chạy /sbin/init, /etc/init, /bin/init, và /bin/sh; nếu không ai trong số họ có thể chạy, nó hoảng loạn .

Khi có initramfs, tất cả điều này xảy ra ở đó và âm lượng đích không được gắn bởi kernel. Điều gì xảy ra sau khi kernel chạy initchương trình đầu tiên (thông thường, /inittập lệnh trong initramfs) tùy thuộc vào chương trình, không phải kernel. Các đối số không được chuyển đến initvẫn khả dụng /proc/cmdlinenếu /prochệ thống tệp được gắn kết.


Cũng có một chút tò mò, điều gì sẽ xảy ra nếu init-in-the-initramfs là một tập tin set-uid-non-root? Một tập tin không có bit thực thi? Nó sẽ được chạy như root chứ? Điều gì xảy ra nếu ELF bị hỏng hoặc không thể tìm thấy ld-linux.soELF hoặc tập lệnh quá sâu hoặc bất cứ điều gì không thể được thực thi?
炸鱼 薯条

3
Tôi khá chắc chắn rằng kernel không tải chương trình được chỉ định trong "init =" từ initramfs. Nó là một initramfs đang được sử dụng sau đó nó dường như chạy như bình thường trước khi chương trình init do người dùng chỉ định chạy (không chắc đó là kernel thực hiện điều này hay mã trong initramfs).
cắm vào

@ 炸鱼 薯条 Để chỉ định một chương trình thay thế thay vì /initkhi khởi động từ ramdisk, bạn có thể sử dụng rdinit=/path/totham số khởi động.
pizdelect

3

Truyền các đối số kernel tùy chỉnh là một cách để tùy chỉnh hệ thống trong quá trình cài đặt KickStart, ví dụ: máy chủ PXE có thể đặt:

linuxefi /c7/vmlinuz ks=http://.../ks/c7 lab ksdevice=eth0 net.ifnames=0 biosdevname=0

nơi labđược sử dụng trong cấu hình KickStart để làm những việc khác với các bản dựng hệ thống khác:

%pre
...
case " $(cat /proc/cmdline)" in
   ...
   *\ lab*)
      filesystems_lab
      ;;
   *)
      filesystems_common
      ;;
...

Ở đây để thiết lập một bố trí hệ thống tập tin khác với sử dụng trên các loại hệ thống khác. Hy vọng rằng các nhãn khác nhau được sử dụng cho các tùy chỉnh cục bộ hơn là được sử dụng bởi kernel, với không gian tên duy nhất có liên quan.

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.