Cách sử dụng lệnh Init trong Linux

Init là cha mẹ của tất cả các quy trình. Vai trò chính của nó là tạo các tiến trình từ một tập lệnh được lưu trữ trong tập tin / etc / inittab (xem inittab (5)). Tệp này thường có các mục nhập khiến init tạo ra các getty trên mỗi dòng mà người dùng có thể đăng nhập. Nó cũng kiểm soát các quá trình tự quản theo yêu cầu của bất kỳ hệ thống cụ thể nào.

Runlevels

Runlevel là một cấu hình phần mềm của hệ thống cho phép chỉ một nhóm các quy trình được chọn tồn tại. Các tiến trình sinh ra bởi init cho mỗi runlevel này được định nghĩa trong tệp / etc / inittab . Init có thể thuộc một trong tám runlevel: 0-6S hoặc s . Runlevel được thay đổi bằng cách có một telinit người dùng đặc quyền chạy, gửi tín hiệu thích hợp tới init , cho nó biết runlevel nào thay đổi.

Runlevels 0 , 16 được đặt trước. Runlevel 0 được sử dụng để tạm dừng hệ thống, runlevel 6 được sử dụng để khởi động lại hệ thống, và runlevel 1 được sử dụng để đưa hệ thống xuống chế độ người dùng đơn. Runlevel S là không thực sự có nghĩa là để được sử dụng trực tiếp, nhưng nhiều hơn cho các kịch bản được thực thi khi nhập runlevel 1. Để biết thêm thông tin về điều này, xem manpages cho tắt máy (8) và inittab (5).

Runlevels 7-9 cũng hợp lệ, mặc dù không thực sự được ghi lại. Điều này là do các biến thể Unix "truyền thống" không sử dụng chúng. Trong trường hợp bạn tò mò, runlevels Ss trong thực tế là như nhau. Trong nội bộ họ là bí danh cho cùng một runlevel.

Khởi động

Sau khi init được gọi là bước cuối cùng của trình tự khởi động hạt nhân, nó sẽ tìm tệp / etc / inittab để xem nếu có một mục nhập kiểu initdefault (xem inittab (5)). Mục initdefault xác định runlevel ban đầu của hệ thống. Nếu không có mục nhập như vậy (hoặc không có / etc / inittab nào cả), một runlevel phải được nhập vào bảng điều khiển hệ thống.

Runlevel S hoặc s mang hệ thống đến chế độ người dùng đơn lẻ và không yêu cầu tệp / etc / inittab . Trong chế độ người dùng đơn, một vỏ gốc được mở trên / dev / console .

Khi vào chế độ người dùng đơn, init đọc ioctl (2) của giao diện điều khiển từ /etc/ioctl.save . Nếu tệp này không tồn tại, init sẽ khởi tạo dòng tại 9600 baud và với các thiết lập CLOCAL . Khi init rời khỏi chế độ người dùng đơn, nó lưu trữ các cài đặt ioctl của giao diện điều khiển trong tệp này để nó có thể tái sử dụng chúng cho phiên người dùng đơn tiếp theo.

Khi vào chế độ đa người dùng lần đầu tiên, init thực hiện các mục khởi độngbootwait để cho phép các hệ thống tệp được gắn kết trước khi người dùng có thể đăng nhập. Sau đó, tất cả các mục khớp với runlevel được xử lý.

Khi bắt đầu một quá trình mới, trước tiên, init kiểm tra xem tệp / etc / initscript có tồn tại hay không. Nếu có, nó sử dụng tập lệnh này để bắt đầu quá trình.

Mỗi khi một đứa trẻ chấm dứt, init ghi lại thực tế và lý do nó chết trong / var / run / utmp/ var / log / wtmp , miễn là các tệp này tồn tại.

Thay đổi Runlevels

Sau khi nó đã sinh ra tất cả các quy trình được chỉ định, init chờ đợi một trong các quá trình hậu duệ của nó chết, một tín hiệu powerfail, hoặc cho đến khi nó được báo hiệu bằng telinit để thay đổi runlevel của hệ thống. Khi một trong ba điều kiện trên xảy ra, nó kiểm tra lại tệp / etc / inittab . Các mục nhập mới có thể được thêm vào tệp này bất kỳ lúc nào. Tuy nhiên, init vẫn chờ một trong ba điều kiện trên xảy ra. Để cung cấp phản hồi ngay lập tức, lệnh Q hoặc q của telinit có thể đánh thức init để kiểm tra lại tệp / etc / inittab .

Nếu init không ở chế độ người dùng đơn lẻ và nhận được tín hiệu powerfail (SIGPWR), nó đọc tệp / etc / powerstatus . Sau đó nó bắt đầu một lệnh dựa trên nội dung của tập tin này:

THẤT ​​BẠI)

Nguồn điện bị lỗi, UPS đang cung cấp điện. Thực hiện các mục powerwaitpowerfail .

ĐƯỢC)

Sức mạnh đã được khôi phục, thực hiện các mục nhập powerokwait .

L (OW)

Nguồn điện bị lỗi và UPS có pin yếu. Thực hiện các mục nhập powerfailnow .

Nếu / etc / powerstatus không tồn tại hoặc chứa bất cứ thứ gì khác thì các chữ cái F , O hoặc L , init sẽ hoạt động như thể nó đã đọc chữ F.

Việc sử dụng SIGPWR/ etc / powerstatus không được khuyến khích. Ai đó muốn tương tác với init nên sử dụng kênh điều khiển / dev / initctl - xem mã nguồn của gói sysvinit để biết thêm tài liệu về điều này.

Khi init được yêu cầu thay đổi runlevel, nó sẽ gửi tín hiệu cảnh báo SIGTERM tới tất cả các tiến trình không được xác định trong runlevel mới. Sau đó nó chờ 5 giây trước khi buộc phải chấm dứt các quá trình này thông qua tín hiệu SIGKILL . Lưu ý rằng init giả định rằng tất cả các quá trình này (và con cháu của chúng) vẫn nằm trong cùng một nhóm tiến trình mà init ban đầu được tạo cho chúng. Nếu bất kỳ quá trình nào thay đổi liên kết nhóm quá trình của nó, nó sẽ không nhận được những tín hiệu này. Các quá trình như vậy cần phải được chấm dứt riêng biệt.

Telinit

/ sbin / telinit được liên kết với / sbin / init . Phải có đối số một ký tự và dấu hiệu init để thực hiện hành động thích hợp. Các đối số sau đây dùng làm chỉ thị cho telinit :

0 , 1 , 2 , 3 , 4 , 5 hoặc 6

yêu cầu init chuyển sang mức chạy được chỉ định.

a , b , c

yêu cầu init chỉ xử lý các mục / etc / inittab có runlevel a , b hoặc c .

Q hoặc q

yêu cầu init kiểm tra lại tệp / etc / inittab .

S hoặc s

yêu cầu init chuyển sang chế độ người dùng đơn.

Bạn hoặc bạn

yêu cầu init thực hiện lại chính nó (bảo toàn trạng thái). Không cần kiểm tra lại tệp / etc / inittab . Cấp độ chạy phải là một trong Ss12345 , nếu không yêu cầu sẽ bị bỏ qua âm thầm.

telinit cũng có thể cho biết thời gian chờ đợi giữa quá trình gửi tín hiệu SIGTERM và SIGKILL. Mặc định là 5 giây, nhưng điều này có thể được thay đổi bằng tùy chọn -t sec .

telinit chỉ có thể được gọi bởi người dùng với các đặc quyền thích hợp.

Mã nhị phân init kiểm tra nếu nó là init hay telinit bằng cách nhìn vào id tiến trình của nó; id quá trình thực của init luôn là 1 . Từ đó, nó thay vì gọi telinit, bạn cũng có thể sử dụng init thay cho shortcut.