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


51

Gần đây tôi phát hiện ra rằng nếu tôi chỉnh sửa GRUB trước khi khởi động và tôi thêm rw init=/bin/bashtôi sẽ kết thúc với một vỏ gốc.

Ở trong một điều kiện mà tôi muốn hiểu mọi thứ tôi muốn biết tại sao điều này xảy ra. Ý tôi là nó có lỗi không? nó là một tính năng? Có phải nó giúp quản trị viên sửa chữa mọi thứ vì nó chỉ hoạt động nếu bạn có quyền truy cập vật lý vào máy tính?

Được cung cấp bởi GRUB hoặc kernel thực tế?


12
Nếu bạn muốn "sửa" lỗi này, hãy khóa GRUB và BIOS của bạn bằng mật khẩu và đặt đĩa cứng của bạn lên trước theo thứ tự khởi động. Nếu ai đó có quyền truy cập vật lý và có thể đặt đĩa cứng (không được mã hóa) vào một máy tính khác, thì dù sao bạn cũng đã mất
jofel 18/03/2016

Câu trả lời:


44

Đây là một tính năng và được sử dụng để bảo trì hệ thống: nó cho phép một sysadmin khôi phục hệ thống từ các tệp khởi tạo bị rối hoặc thay đổi mật khẩu đã quên.

Bài đăng này trong danh sách gửi thư của Red Hat giải thích một số điều:

Trong các hệ thống giống như Unix, init là quá trình đầu tiên được chạy và là tổ tiên cuối cùng của tất cả các tiến trình từng chạy. Nó chịu trách nhiệm chạy tất cả các tập lệnh init.

Bạn đang bảo kernel Linux chạy / bin / bash là init, chứ không phải là init hệ thống. [...]

Do đó, bạn không khai thác bất cứ điều gì, bạn chỉ đang sử dụng một tính năng kernel tiêu chuẩn.

Ngoài ra, như đã lưu ý trong một nhận xét, rwcờ tách biệt với init=nó, nó chỉ bảo hệ thống gắn hệ thống tệp gốc dưới dạng đọc-ghi (do đó bạn có thể chỉnh sửa tệp bị định cấu hình sai hoặc thay đổi mật khẩu).


2
Ngoài ra, rwlà hoàn toàn tách biệt với init=. Cái trước chỉ bảo kernel gắn kết hệ thống tập tin gốc đọc-ghi.
Alexios

19

Hệ thống của bạn có các cơ chế để chạy và gỡ lỗi (như tham số init) và nó có thể có các cơ chế bảo mật để ngăn người dùng không mong muốn lợi dụng chúng. Đây là những tính năng, không phải lỗi.

Bộ tải khởi động có trách nhiệm khởi động HĐH. Bảo mật hệ điều hành rõ ràng không áp dụng tại thời điểm đó. Bạn chỉ có thể tải một kernel khác, initrd, root fs hoặc đặt các tùy chọn khác nhau (như đường dẫn init). Nếu bạn muốn ngăn người dùng làm điều đó, nó phải được thực hiện tại bộ nạp khởi động.

Hệ thống của bạn (có thể là PC, do đó BIOS) tải bộ tải khởi động và do đó, rõ ràng, bảo mật bộ tải khởi động không áp dụng cho nó. Nếu bạn muốn ngăn người dùng thực hiện khởi động bios từ USB hoặc tương tự, bạn cần phải làm điều đó ở cấp độ đó.

Hệ thống của bạn có thể ở trên bàn ở đâu đó. Nếu bạn muốn ngăn người dùng mở máy tính và chuyển hdd cho một người của họ hoặc tháo ổ đĩa để gắn nó vào máy của họ, bạn cần thực hiện ở cấp độ vật lý. Và nó sẽ không ngăn họ nhặt toàn bộ bàn và lái xe đi trong chiếc xe ...

Đó là cách bảo mật. Voi hết đường xuống.


Tóm tắt tốt đẹp. Có thể muốn thêm mã hóa hdd vào đó, như một câu trả lời có thể chống lại van.
MvG

11

Khi máy tính khởi động, nó chạy một chương trình gọi là "init", thường được tìm thấy tại /bin/inithoặc /sbin/init. Chương trình này chịu trách nhiệm cho tất cả các hệ thống khởi động và tạo ra một môi trường có thể sử dụng.

Chỉ định init=/bin/bashcho hạt nhân chạy /bin/bashthay thế (đó là một vỏ). Chỉ định rwcho hạt nhân khởi động với đĩa cứng ở chế độ đọc thay vì chế độ chỉ đọc. Theo truyền thống, kernel bắt đầu với đĩa ở chế độ chỉ đọc và một quá trình sau đó sẽ kiểm tra tính toàn vẹn của đĩa trước khi chuyển sang đọc-ghi.


6

Ghép lại với nhau từ kernel.org :

KNL     Is a kernel start-up parameter.

init=   [KNL]
        Format: <full_path>
        Run specified binary instead of /sbin/init as init
        process.

rw      [KNL] Mount root device read-write on boot

1

Đây là một tính năng từ kernel: nó cho phép trình gọi điện thoại của anh ấy, tức là bộ tải khởi động, tính linh hoạt cao. Grub cung cấp cho bạn các phương tiện để sử dụng tính linh hoạt này trong khi khởi động, nhưng nó cũng cung cấp cho bạn các phương tiện để hạn chế loại giả mạo này . Điều này có ý nghĩa đặc biệt trong những trường hợp người dùng trái phép có thể nắm giữ quy trình khởi động, nhưng nếu không thì bị từ chối truy cập vào chính ổ cứng.


1

init=có thể thực hiện bất kỳ thực thi

init=có thể thực hiện bất kỳ thực thi, bao gồm các kịch bản shell .

Ví dụ ở đây tôi trình bày cách tạo một C tối thiểu tùy ý được biên dịch init: Làm thế nào để tạo một bản phân phối Linux tùy chỉnh chỉ chạy một chương trình và không có gì khác?

Vậy tại sao nó không chấp nhận /bin/bash, trong tất cả mọi thứ, vốn chỉ là một thực thi thông thường, và thực sự có thể hữu ích? :-)

Tiếp theo, bạn cũng nên cố gắng hiểu sự đánh đổi sẽ là gì với thông thường của bạn initnhư systemd hoặc Busybox '

Về cơ bản, với một nguyên /bin/bash, bạn:

Kiểm soát công việc có thể được khôi phục trên init của Busybox và các mục tương tự khác với vị trí dẫn đầu -trong inittab:

tty3::respawn:-/bin/sh

Các inittabmục bình thường hơn , sử dụng đăng nhập và giữ vỏ sinh sản nếu bạn thực hiện Ctrl + D là:

::respawn:/sbin/getty -L ttyS0 0 vt100

sử dụng gettytệp thực thi, nhưng TODO: Tôi chưa thể tự sinh ra chúng mà không cần Busybox init: getty bắt đầu từ dòng lệnh?

Bạn có thể sử dụng thiết lập này để chơi xung quanh nó và đạt được kết luận ở trên.

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.