Linux Giày ống

Hóa ra, không có nhiều thứ cho quá trình khởi động:

1. Bộ tải khởi động tìm thấy hình ảnh hạt nhân trên disk, tải nó vào bộ nhớ và khởi động nó.
2. Kernel khởi tạo các thiết bị và trình điều khiển của nó.
3. Kernel gắn tập tin gốcsystem.
4. Kernel khởi động init gọi là Chương trình.
5. Reset bộ phần còn lại của quá trình chuyển động.
6. Các quy trình cuối cùng Đó init bắt đầu như một phần của tiến trình khởi động cho phép bạn đăng nhập.

Xác định từng giai đoạn của quá trình khởi động là vô giá trong việc khắc phục các sự cố khởi động và hiểu system nói chung. Để bắt đầu, hãy nhập vào bộ tải khởi động, đây là màn hình ban đầu hoặc lời nhắc bạn nhận được sau khi máy tính tự kiểm tra nguồn điện của nó, hỏi hoạt động nào system chạy. Sau khi bạn lựa chọn, bộ nạp khởi động sẽ chạy Linux kernel, trao quyền kiểm soát system vào nhân.

Có một cuộc thảo luận chi tiết về kernel Ở những nơi khác trong cuốn sách này từ nào bài viết này được trích. Bài viết này bao gồm các giai đoạn kernel khởi, giai đoạn khi hạt nhân in một loạt thông báo về phần cứng có trên system. Kernel bắt đầu init ngay sau khi nó hiển thị một thông báo thông báo rằng kernel đã gắn kết tập tin gốcsystem:

VFS: gắn kết gốc (tệp ext2system) chỉ đọc.

Ngay sau đó, bạn sẽ thấy một thông báo về việc bắt đầu init, tiếp theo là system thông báo khởi động dịch vụ, và cuối cùng bạn nhận được một lời nhắc đăng nhập nào đó.

LƯU Ý : Trên Red Hat Linux, ghi chú init đặc biệt rõ ràng, vì nó "chào mừng" bạn đến với Red Hat Linux. ” Tất cả các thông báo sau đó hiển thị thành công hoặc thất bại trong dấu ngoặc ở phía bên phải của màn hình.

Hầu hết các chương này giao dịch với init, Bởi vì nó là một phần của tiến trình khởi động ở đâu có sự kiểm soát nhất.
trong đó

Không có gì đặc biệt về init. Nó là một chương trình giống như bất kỳ chương trình nào khác trên Linux systemvà bạn sẽ tìm thấy nó trong / sbin cùng với system nhị phân. Mục đích chính của init là khởi động và dừng các chương trình khác theo một trình tự cụ thể. Tất cả những gì bạn phải biết là trình tự này hoạt động như thế nào.

Có một vài biến thể khác nhau, nhưng hầu hết Linux phân phối sử dụng System V phong cách thảo luận ở đây. Một số bản phân phối sử dụng phiên bản đơn giản hơn giống với BSD init, nhưng bạn không chắc gặp phải điều này.

runlevel

Tại bất kỳ thời điểm nào trên một Linux system, một tập hợp quy trình cơ sở nhất định đang chạy. Trạng thái này của machine được gọi là runlevel của nó, và nó được biểu thị bằng một số từ 0 đến 6. system dành phần lớn thời gian của nó trong một cấp chạy duy nhất. Tuy nhiên, khi bạn đóng machine down, init chuyển sang một runlevel khác để chấm dứt system các dịch vụ một cách có trật tự và yêu cầu kernel dừng lại. Tuy nhiên, một runlevel khác dành cho người dùng đơn lẻ mode, thảo luận sau.

Cách dễ nhất để xử lý runlevel là kiểm tra tệp cấu hình init, /etc/inittab. Hãy tìm một dòng như sau:

ID: 5: initdefault:

Dòng này có nghĩa là default runlevel trên system là 5. Tất cả các dòng trong tệp inittab đều có dạng này, với bốn trường được phân tách bằng dấu hai chấm xuất hiện theo thứ tự sau:
# Một định danh duy nhất (một chuỗi ngắn, Chẳng hạn như trong ví dụ id trước)
# Số đối runlevel (s)
# Hành động mà init sẽ thực hiện (trong ví dụ trước, hành động là đặt default runlevel đến 5)
# Một lệnh để thực hiện (không bắt buộc)

Không có lệnh nào để thực thi trong init trướcdefault ví dụ vì một lệnh không có ý nghĩa trong ngữ cảnh thiết lập default đường chạy. Nhìn xuống sâu hơn một chút trong inittab, cho đến khi bạn thấy một dòng như thế này:

l5: 5: chờ: /etc/rc.d/rc 5

Dòng này kích hoạt hầu hết các system cấu hình và các dịch vụ thông qua các thư mục rc * .d và init.d. Bạn có thể thấy rằng init được thiết lập để thực thi lệnh có tên /etc/rc.d/rc 5 khi ở runlevel 5. Hành động chờ cho biết khi nào và như thế nào init chạy lệnh: chạy rc 5 một lần khi entering runlevel 5, sau đó đợi lệnh này kết thúc trước khi làm bất cứ điều gì khác.

Có một số hành động khác nhau trong addbắt đầu khởi tạodefault và chờ đợi, đặc biệt là liên quan đến quản lý điện năng và trang hướng dẫn sử dụng inittab (5) cho bạn biết tất cả về chúng. Những vấn đề mà bạn có nhiều khả năng gặp phải được giải thích trong các phần sau.

respawn

Hành động hồi sinh khiến init chạy lệnh tiếp theo và nếu lệnh thực thi xong thì chạy lại lệnh đó. Bạn có thể thấy nội dung tương tự như dòng này trong tệp inittab của mình:

1: 2345: respawn: / sbin / mingetty tty1

Chương trình getty Cung cấp nhắc nhở đăng nhập. Điểm mấu trước là dành cho giao diện điều khiển ảo đầu tiên (/ dev / tty1), là bạn nhìn thấy khi bạn nhấn ALT-Control-Alt-F1 hoặc F1. Hành động respawn mang lại dấu nhắc đăng nhập sau khi bạn đăng xuất.

ctrlnơi khác

Sản phẩm ctrlhành động altdel kiểm soát những gì system khi bạn nhấn CONTROL-ALT-DELETE trên bảng điều khiển ảo. Hầu hết systems, đây là một số loại lệnh khởi động lại bằng lệnh tắt máy.

sysinit

Hành động sysinit là hành động đầu tiên mà init nên chạy khi khởi động, trước khi entertrong bất kỳ runlevels nào.

Làm thế nào Processes trong runlevel bắt đầu

Bây giờ bạn đã sẵn sàng để học cách bắt đầu system dịch vụ, ngay trước khi nó cho phép bạn đăng nhập. Nhớ lại dòng inittab này trước đó:

l5: 5: chờ: /etc/rc.d/rc 5

dòng nhỏ này gây nên nhiều chương trình khác. RC là viết tắt của lệnh chạy, và bạn sẽ nghe thấy mọi người đề cập đến các lệnh như kịch bản, chương trình, hoặc dịch vụ. Vì vậy, ở đâu NÀY lệnh, dù sao?

Đối với runlevel 5, trong ví dụ này, các lệnh có thể nằm trong /etc/rc.d/rc5.d hoặc /etc/rc5.d. Runlevel 1 sử dụng rc1.d, runlevel 2 sử dụng rc2.d, v.v. Bạn có thể tìm thấy những điều sau items trong thư mục rc5.d:

S10sysklogd S20ppp S99gpm
S12kerneld S25netstd_nfs S99httpd
S15netstd_init S30netstd_misc S99rmnologin
S18netbase S45pcmcia S99sshd
S20acct S89atd
S20logoutd S89cron

Bộ chỉ huy 5 rc runlevel bắt đầu chương trình trong thư mục này bằng cách chạy lệnh giờ:

S10sysklogd nhà
S12kerneld nhà
S15netstd_init nhà
S18netbase nhà
...
S99sshd nhà

Lưu ý đối số bắt đầu trong mỗi lệnh. Chữ S trong tên lệnh có nghĩa là lệnh sẽ chạy khi bắt đầu mode, và số (00 đến 99) xác định vị trí trong chuỗi rc bắt đầu lệnh.

Các rc * .d lệnh thường là shell script Đó Chương Start trong / sbin hoặc / usr / sbin. Thông thường, bạn-có thể tìm ra những gì một trong các lệnh thực hiện bằng cách nhìn vào kịch bản với ít hoặc Một chương trình máy nhắn tin.

Bạn có thể bắt đầu một trong những dịch vụ này bằng tay. Ví dụ: nếu bạn muốn khởi động chương trình máy chủ Web httpd theo cách thủ công, hãy chạy S99httpd start. Tương tự, nếu bạn cần phải hủy một trong các dịch vụ khi machine đang bật, bạn có thể chạy lệnh trong thư mục rc * .d với đối số dừng (ví dụ: dừng S99httpd).

Một số thư mục rc*.d chứa các lệnh bắt đầu bằng K (đối với "giết" hoặc dừng mode). Trong trường hợp này, rc chạy lệnh với đối số dừng thay vì bắt đầu. Bạn có nhiều khả năng gặp phải các lệnh K trong các mức chạy tắt system xuống.

Addnhập và xóa dịch vụ

Nếu bạn là add, xóa hoặc sửa đổi các dịch vụ trong thư mục rc*.d, bạn cần xem xét kỹ hơn các tệp bên trong. Một danh sách dài cho thấy một cấu trúc như thế này:

lrwxrwxrwx. . . S10sysklogd -> ../init.d/sysklogd
lrwxrwxrwx. . . S12kerneld -> ../init.d/kerneld
lrwxrwxrwx. . . S15netstd_init -> ../init.d/netstd_init
lrwxrwxrwx. . . S18netbase -> ../init.d/netbase
...

Các lệnh trong thư mục rc*.d thực chất là các liên kết tượng trưng đến các tệp trong thư mục init.d, thường là trong /etc hoặc /etc/rc.d. Linux bản phân phối chứa các liên kết này để chúng có thể sử dụng các tập lệnh khởi động giống nhau cho tất cả các cấp chạy. Quy ước này hoàn toàn không phải là một yêu cầu, nhưng nó thường làm cho việc tổ chức trở nên dễ dàng hơn một chút.

Để ngăn một trong các lệnh trong thư mục init.d chạy trong một cấp chạy cụ thể, bạn có thể nghĩ đến việc xóa liên kết tượng trưng trong thư mục rc * .d thích hợp. Điều này có hiệu quả, nhưng nếu bạn mắc lỗi và cần đặt lại liên kết vào vị trí cũ, bạn có thể gặp khó khăn khi nhớ chính xác tên của liên kết. Do đó, bạn không nên xóa các liên kết trong thư mục rc * .d mà thay vào đó, add dấu gạch dưới (_) ở đầu tên liên kết như thế này:

mv S99httpd _S99httpd

Tại thời điểm khởi động, rc bỏ qua _S99httpd vì nó không bắt đầu bằng S hoặc K. Hơn nữa, tên gốc vẫn còn rõ ràng và bạn có quyền truy cập nhanh vào lệnh nếu bạn đang gặp khó khăn và cần khởi động nó bằng tay.

Đến add một dịch vụ, bạn phải tạo một tập lệnh giống như những tập lệnh khác trong thư mục init.d và sau đó tạo một liên kết tượng trưng trong đúng thư mục rc * .d. Cách dễ nhất để viết một tập lệnh là kiểm tra các tập lệnh đã có trong init.d, tạo một bản sao của một tập lệnh mà bạn hiểu và sửa đổi bản sao.

Thời Gian addtrong một dịch vụ, hãy đảm bảo rằng bạn chọn một vị trí thích hợp trong trình tự khởi động để bắt đầu dịch vụ. Nếu dịch vụ bắt đầu quá sớm, nó có thể không hoạt động do phụ thuộc vào một số dịch vụ khác. Đối với các dịch vụ không thiết yếu, hầu hết systems administrators thích những con số trong những năm 90, sau khi hầu hết các dịch vụ đi kèm với system.

Linux bản phân phối thường đi kèm với lệnh để bật và tắt các dịch vụ trong thư mục rc * .d. Ví dụ, trong Debian, lệnh là update-rc.d và trong Red Hat Linux, lệnh là chkconfig. Giao diện người dùng đồ họa cũng có sẵn. Sử dụng các chương trình này giúp giữ cho các thư mục khởi động nhất quán và giúp nâng cấp.

GỢI Ý: Một trong những điều phổ biến nhất Linux installvấn đề ation là một máy chủ XFree86 được định cấu hình không đúng, bật và tắt, làm cho system không sử dụng được trên bảng điều khiển. Để dừng hành vi này, hãy khởi động vào một người dùng mode và thay đổi mức chạy hoặc các dịch vụ mức chạy của bạn. Tìm thứ gì đó có chứa xdm, gdm hoặc kdm trong thư mục rc*.d hoặc /etc/inittab của bạn.

kiểm soát init

Đôi khi, bạn cần tác động nhẹ lên init để yêu cầu nó chuyển cấp độ chạy, đọc lại tệp inittab hoặc chỉ để shut down các system. Vì init luôn là quy trình đầu tiên trên system, ID quy trình của nó luôn là 1.

Bạn có thể kiểm soát init với telinit. Ví dụ, nếu bạn muốn chuyển sang runlevel 3, sử dụng lệnh này:

telinite 3

Khi chuyển đổi cấp độ chạy, init sẽ cố gắng loại bỏ mọi tiến trình không có trong tệp inittab dành cho cấp độ chạy mới. Vì vậy, bạn nên cẩn thận khi thay đổi runlevel.

Khi bạn cần add hoặc xóa công việc hồi sinh hoặc thực hiện bất kỳ thay đổi nào khác đối với tệp inittab, bạn phải thông báo cho init về thay đổi đó và khiến init đọc lại tệp. Một số người sử dụng kill -HUP 1 để yêu cầu init thực hiện việc này. Phương pháp truyền thống này hoạt động trên hầu hết các phiên bản Unix, miễn là bạn gõ đúng. Tuy nhiên, bạn cũng có thể chạy lệnh telinit này:

telinit q

Bạn cũng có thể sử dụng telinit s để chuyển sang chế độ một người dùng mode.

Tắt

init cũng kiểm soát cách system tắt và khởi động lại. Cách thích hợp để shut down a Linux machine là sử dụng lệnh tắt máy.

Có hai cách cơ bản để sử dụng tắt máy. Nếu bạn dừng lại system, nó tắt machine down và giữ nó xuống. Để làm cho mactạm dừng ngay lập tức, sử dụng lệnh này:

shutdown -h tại

Hầu hết modern macgợi ý với các phiên bản gần đây hợp lý của Linux, việc dừng sẽ cắt điện cho machine. Bạn cũng có thể khởi động lại machine. Để khởi động lại, hãy sử dụng -r thay vì -h.

Quá trình tắt máy mất vài giây. Bạn không bao giờ nên đặt lại hoặc tắt nguồn machine trong giai đoạn này.

Trong ví dụ trước, bây giờ là lúc để shut down. Đối số này là bắt buộc, nhưng có nhiều cách để xác định nó. Nếu bạn muốn machine sẽ ngừng hoạt động vào một lúc nào đó trong tương lai, một cách là sử dụng + n, trong đó n là số phút tắt máy nên đợi trước khi thực hiện công việc của nó. Cho người khác options, xem trang hướng dẫn tắt máy (8).

Để làm cho system khởi động lại sau 10 phút, chạy lệnh này:

shutdown -r + 10

On Linux, tắt máy sẽ thông báo cho bất kỳ ai đã đăng nhập rằng machine đang đi xuống, nhưng nó thực sự không có tác dụng mấy. Nếu bạn chỉ định thời gian khác với thời điểm hiện tại, việc tắt máy sẽ tạo một tệp có tên /etc/nologin. Khi có tập tin này, system cấm bất kỳ ai đăng nhập ngoại trừ superuser.

Thời Gian system thời gian tắt máy cuối cùng cũng đến, việc tắt máy cho init biết chuyển sang cấp độ 0 để tạm dừng và cấp độ 6 để khởi động lại. Khi init enters runlevel 0 hoặc 6, tất cả những điều sau đều diễn ra, bạn có thể xác minh bằng cách xem các tập lệnh bên trong rc0.d và rc6.d:

1. Rằng nó giết chết quá trình init Mỗi CAN (vì nó sẽ Khi chuyển sang bất kỳ runlevel khác).

# Các lệnh rc0.d / rc6.d ban đầu chạy, khóa system các tập tin vào đúng vị trí và thực hiện các chuẩn bị khác cho việc tắt máy.
# Lệnh rc0.d/rc6.d tiếp theo sẽ ngắt kết nối tất cả các tệpsystems khác với gốc.
# Các lệnh rc0.d/rc6.d khác sẽ kết nối lại tập tin gốcsystem chỉ đọc.
# Vẫn còn nhiều lệnh rc0.d/rc6.d ghi tất cả dữ liệu được lưu vào bộ đệm vào tệpsystem với chương trình đồng bộ.
# Các lệnh rc0.d / rc6.d thức nói với hạt nhân để khởi động lại hoặc ngừng với khi khởi động lại, dừng lại, hoặc chương trình poweroff.

Các chương trình khởi động lại và tạm dừng hoạt động khác nhau đối với mỗi cấp chạy, có thể gây nhầm lẫn. bởi default, các chương trình này gọi tắt bằng -r hoặc -h options, nhưng nếu system đã tạm dừng hoặc khởi động lại runlevel, các chương trình yêu cầu hạt nhân tự tắt ngay lập tức. Nếu bạn thực sự muốn đóng cửa machãy tắt máy một cách vội vàng (bỏ qua bất kỳ thiệt hại nào có thể xảy ra do việc tắt máy mất trật tự), hãy sử dụng tùy chọn -f.

Là người yêu công nghệ, tôi rất vui được viết tại StealthSettings.com từ năm 2006. Tôi có kinh nghiệm đa dạng với các hệ điều hành: macOS, Windows và Linux, cũng như trong các ngôn ngữ lập trình và nền tảng blogging (WordPress) và cửa hàng trực tuyến (WooCommerce, Magento, PrestaShop).

Để lại một bình luận