Monday, 9 October 2017

7 init runlevel của hệ thống Linux

Khi để bài chứa tới 3 yếu tố đáng sợ, xác suất người ta sẽ đọc hết bài sẽ giảm còn 4 %.
- 7
- init
- runlevel

Và để tránh thêm một yếu tố đáng sợ khác, tôi đã thay từ "SysV" bằng từ "hệ thống" - dù biết là rất sai.

Bài này để giải thích khái niệm Runlevel - có thể gặp khi đi phỏng vấn sysadmin - mặc dù ... nó có gì đó hơi sai sai.


Khi máy tính khởi động - không hề đơn giản - và không có trong bài này - trải qua nhiều bước, kernel (các UNIX/UNIX-like OS) sẽ chạy chương trình đầu tiên với PID 1 - chương trình đó có tên chung là init.
Chương trình này, nhìn chung sẽ đảm nhiệm các công việc: bật, tắt, restart các chương trình cần bật lên cùng máy tính (và có thể nhiều việc khác nữa). Tưởng tượng bạn là người dùng Ubuntu giao diện bình thường, vậy ai sẽ chạy "chương trình giao diện (X)"?, ai sẽ bật phần mềm quản lý kết nối mạng / wifi ...? tất cả đều do init thực hiện.

Init là gì?

Init chỉ là tên chung ám chỉ chương trình được Kernel chạy đầu tiên khi khởi động máy tính, giống như ta nói web server / HTTP server - chỉ là tên nói chung chung, còn chương trình cụ thể là NGINX, Apache2...


Các phần mềm init phổ biến
- SysV (có từ lâu, giờ ít được dùng)
- Upstart (viết bởi Ubuntu, đã bị thay thế bằng Systemd do Debian (upstream của Ubuntu) quyết định chuyển đổi)
- Systemd: chương trình init làm nhiều hơn những gì các init truyền thống thường làm -gây tranh cãi / chia rẽ trong cộng đồng Linux - nhưng hiện tại là Systemd được dùng chính thức tại nhiều OS phổ biến: Debian, Ubuntu 16.04 trở đi, (và Mint vì Mint là distro base trên Ubuntu), Fedora, ArchLinux ...
- OSX có Launchd

Một kiến thức chung các sysadmin thường biết thời SysV/Upstart (2014 đổ về trước), là khi khởi động, SysV chia các nhóm chương trình thành các `runlevel` khác nhau.

7 runlevel

Có 7 runlevel, như mọi lập trình viên sẽ làm: đếm từ 0->6, mỗi hệ điều hành cụ thể có thể sử dụng level theo cách của riêng mình. (cũng có chỗ gọi level S là 1 level -> 8 level)

Chỉ có 3 level tiểu chuẩn:
- 0: halt (tắt máy)
- 1: single user textmode
- 6: reboot

RHEL6

Trên RedHat EL 6, các runlevel còn lại được định nghĩa như sau.
- 3 - multiple user text mode
- 5 -  đồ họa cho multiple user.
- 2,4: không được dùng, để người dùng tùy ý sử dụng (chú ý nó xen giữa 1->3 ->5)

Level mặc định khi bật máy lên được cấu hình ở file /etc/inittab

Nếu máy bạn không có file này, có vẻ như bạn đang không dùng SysV mà dùng một init khác.

Ubuntu Upstart

Upstart là một chương trình init khá thành công và chạy ổn định trên hàng triệu server Ubuntu, Upstart sử dụng khái niệm Runlevel để chỉ định các dịch vụ (service) được bật tắt ở level nào,

Đây là giá trị/ ý nghĩa các level trên Ubuntu 14.04 (16.04 trở đi đã dùng Systemd)
0 : System halt.
1 : Single-User mode.
2 : Graphical multi-user plus networking (DEFAULT)
3 : Same as "2", but not used.
4 : Same as "2", but not used.
5 : Same as "2", but not used.
6 : System reboot.

http://upstart.ubuntu.com/cookbook/#runlevels

Thử trên 1 Ubuntu server 14.04

$ grep 'env DEFAULT' /etc/init/rc-sysinit.conf
env DEFAULT_RUNLEVEL=2
$ lsb_release -d && runlevel
Description: Ubuntu 14.04.5 LTS
N 2
Xem 1 file cấu hình upstart cho NGINX có ghi level để bật service: 
# nginx

description "nginx http daemon"
author "George Shammas <georgyo@gmail.com>"

start on (filesystem and net-device-up IFACE!=lo)
stop on runlevel [!2345]

Hay cho cron:
$ grep runlevel /etc/init/cron.conf
start on runlevel [2345]
stop on runlevel [!2345]

Systemd Runlevel?

$ lsb_release -d; runlevel
Description: Ubuntu 16.04.3 LTS
N 5

Ubuntu 16.04 sử dụng init: Systemd, hệ thống này không hề có khái niệm "runlevel", nó chỉ tồn tại ở đó với mục đích đối chiếu / tương thích một phần với SysV

>  "Runlevels" are an obsolete way to start and stop groups of services used in SysV init. systemd provides a compatibility layer that maps runlevels to targets, and associated binaries like runlevel.

Level 5 ở đây ám chỉ:  graphical.target - tức ứng với level Graphical multi-user plus networking của Upstart - level giao diện đồ họa có kết nối mạng - thường dùng trên máy desktop / laptop.
(PS: server Ubuntu 16.04 cũng cho ra kết quả này).

Tham khảo:
- RHEL6 https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Installation_Guide/s1-boot-init-shutdown-sysv.html
- Ubuntu Upstart: http://upstart.ubuntu.com/cookbook/
- https://en.wikipedia.org/wiki/Init#Runlevels

Hết.
HVN at http://www.familug.org/ and http://pymi.vn

Đăng ký học #Python tại https://pymi.vn/
Nhập email vào http://invite.pymi.vn/ để nhận thư mời tham gia forum hỏi đáp Python, Django, Golang, Linux ...