<![CDATA[Latest posts for the topic "An introduction to services, runlevels, and rc.d scripts"]]> /hvaonline/posts/list/24.html JForum - http://www.jforum.net An introduction to services, runlevels, and rc.d scripts Bản English: http://www.linux.com/article.pl?sid=06/01/03/1728227 Bản tạm dịch: Một dịch vụ Linux là một ứng dụng chạy trên nền đợi được sử dụng hoặc là carrying out các tác vụ thiết yếu. Bạn có thể nói gì về các dịch vụ đang chạy, hoặc quan trọng hơn là các dịch vụ cài đặt của chính bạn? Hãy bắt đầu bằng cách xem cách thức hệ thống khởi động, và trong một thư mục đặc biệt /etc/rc.d. Trong thư mục này, bạn sẽ tìm thấy các file: rc.0, rc.1, rc.2, rc.3, rc.4, rc.5, and rc.6, và một tập hợp các thư mục rc0.d, rc1.d, rc2.d, rc3.d, rc4.d, rc5.d, and rc6.d. Bạn cũng tìm thấy một file với tên là: /etc/inittab. Hệ thống sử dụng những file này để kiểm soát những dịch vụ được khởi động. Một ví dụ về file /etc/inittab: Code:
id:4:initdefault:

l0:0:wait:/etc/rc.d/rc.0
l6:6:wait:/etc/rc.d/rc.6
x1:4:wait:/etc/rc.d/rc.4
Tiến trình khởi động sử dụng các tham số này để định danh các runlevel mặc định và các files sẽ được sử dụng bởi các runlevel đó. Trong ví dụ này runlevel 4 là mặc định, và các scripts định nghĩa runlevel 4 có thể được tìm thấy trong /etc/rc.d/rc.4 Vậy Runlevel là gì? Thường bạn sẽ cho rằng nó sẽ tham chiếu đến các levels khác nhau mà hệ thống sẽ sử dụng trong suốt quá trình khởi động. Nhưng thay vào đó hãy xem runlevel như những điểm mà từ đó hệ thống đi vào. Runlevel 1 là cấu hình cơ bản nhất (dành cho truy cập người dùng đơn, môi trường Text), trong khi runlevel 5 là cấu hình cao cấp nhất (đa người dùng, mạng, và GUI). Runlevel 0 và runlevel 6 được sử dụng khi hệ thống tạm nghỉ hoặc khởi động lại. Tuy nhiên có sự khác nhau giữa các distro của Linux. Ví dụ Fedora sử dụng runlevel 5 cho X-based logins, trong khi Slackware sử dụng runlevel 4 để làm điều này (Xem bảng liệt kê tóm tắt các cấu hình cho Linux từ url trên) Khi muốn thay đổi level mặc định, bạn phải sửa theo đường dẫn: /etc/inittab Tại sao bạn lại muốn thay đổi các runlevel. Bình thường bạn sẽ chỉ sử dụng GUI hoặc text với chế độ đa người dùng- tức là runlevel 4 hoặc 5. bạn sẽ chỉ cần đến runlevel 1 hoặc 2 nếu bạn có một vài vấn đề hệ thống và bạn muốn các truy cập cơ bản. Runlevel 0 và 6 không bao giờ được sử dụng như một cấu hình mặc định. Dĩ nhiên, bạn có thể thay đổi chế độ mà hệ thống đang chạy. Ví dụ: Code:
init 6
Lệnh này sẽ khởi động lại hệ thống Quá trình boot sẽ quyết định các runlevel nào được lựa chọn và từ đó sẽ quyết định rc.d script nào được chạy. Hãy xem một vài ví dụ về rc.d script file: Code:
# Try to use GNOME's gdm session manager:
if [ -x /usr/bin/gdm ]; then
  exec /usr/bin/gdm -nodaemon
fi

# Not there?  OK, try to use KDE's KDM session manager:
if [ -x /opt/kde/bin/kdm ]; then
  exec /opt/kde/bin/kdm -nodaemon
fi

# If all you have is XDM, I guess it will have to do:
if [ -x /usr/X11R6/bin/xdm ]; then
  exec /usr/X11R6/bin/xdm -nodaemon
fi
Đây là file rc.4 mặc định của Slackware 10.2 Trong các distro khác bạn sẽ tìm thấy các script để chạy các liên kết tượng trưng thật sự đến các file trong thư mục: /etc/init.d – một kho chứa trung tâm cho tất cả các script. Do đó tất cả những gì bạn phải làm là viết các đoạn script khởi động, đặt nó vào /etc/init.d, sau đó tạo liên kết tượng trưng cho nó từ thư mục runlevel (hoặc file runlevel nếu hệ thống của bạn sử dụng) Ví dụ, runlevel 2 là runlevel mặc định cho Debian trong môi trường non-GUI. Nếu bạn chạy Apache 2 trên Debian, bạn phải tìm một init script cho Apache 2 trong /etc/init.d được gọi là apache2, một liên kết tượng trưng trỏ đến /etc/init.d/apache2. Điều này sẽ khởi động Apache 2 ở runlevel 2, nhưng chỉ sau khi các dịch vụ với số S thấp hơn được khởi động. Khi hệ thống shutdown sẽ có một liên kết tượng trưng khác trong thư mục /etc/rc0.detc/rc6.d được khởi động với K thay vì S, liên kết này sẽ shutdown the process. (Tớ sẽ tìm hiểu và viết một bài khác về S và K sau) Nếu cảm thấy tất cả những điều này quá rắc rối, bạn có thể đơn giản hơn bằng cách sử dụng file /etc/rc.d/rc.local. File script này được chạy một lần, sau khi các script khác được chạy, nhưng trước khi màn hình logon xuất hiện. Theo mặc định, file này như sau: Code:
#!/bin/bash
#
# /etc/rc.local - run once at boot time
# Put any local setup commands in here:
Bạn có thể add thêm các đoạn code khác vào cuối, để định nghĩa các script được chạy, ví dụ: Code:
/root/bin/start_bb
hoặc: Code:
modprobe -r uhci
modprobe usb-uhci
eciadsl-start
iptable -F
iptables -A INPUT -i ppp0 -p tcp --syb -j DROP
netdate time.nist.gov
hoặc Code:
apachectl start
echo "/usr/bin/mysqld_safe &" | su mysql
Chú ý rằng với một vài Distro như Debian, nó không sử dụng các rc.local cho các script khởi động Một điểm nữa, thêm vào các script khởi động, hãy nhớ viết các script close-down để add vào rc.0rc.6. Điều này sẽ làm cho các dịch vụ của bạn shutdown một cách gọn gàng và không để lại bất kỳ một trạng thái lạ nào khi hệ thống tạm nghỉ. Khi bạn khởi động lại, bạn làm thế nào để dừng các dịch vụ đang chạy? Đơn giản chỉ là đảo ngược của những gì đã làm. Hoặc là chỉnh sửa các file runlevel thích hợp, hoặc là remove những liên kết từ thư mục runlevel. Chú ý rằng, có thể không cần thiết phải làm điều này bằng tay, nhiều distro bao gồm các tool để quản lý các dịch vụ. Ví dụ Red Hat, Fedora sử dụng chkconfig, trong khi Debian sử dụng update-rc.d. ]]>
/hvaonline/posts/list/10589.html#60889 /hvaonline/posts/list/10589.html#60889 GMT
Re: An introduction to services, runlevels, and rc.d scripts /hvaonline/posts/list/10589.html#60890 /hvaonline/posts/list/10589.html#60890 GMT Re: An introduction to services, runlevels, and rc.d scripts quanta. Hăng hái hơn nữa, bạn làm một bài về su, sudo, file permission nữa thì hay:mrgreen:. Toàn những kiến thức cơ bản mà ai động vào Linux cũng cần phải biết.]]> /hvaonline/posts/list/10589.html#60895 /hvaonline/posts/list/10589.html#60895 GMT Re: An introduction to services, runlevels, and rc.d scripts Understanding Red Hat Run Levels Bản English: http://www.linuxjournal.com/article/1274 Bản dịch: Với mỗi runlevel các đoạn scripts được chạy để khởi động từng dịch vụ riêng biệt, thay vì một số lượng lớn các file phải chỉnh sửa bằng tay. Những đoạn scripts này được đặt trong thư mục /etc/rc.d/init.d, và phần lớn đều có một tuỳ chọn start hoặc stop. Thiết lập này sẽ bao gồm một chùm các thư mục trong /etc/rc.d. Đó là: rc0.d: chứa đựng những đoạn script được chạy khi hệ thống shutdown rc1.d đến rc3.d: chứa những đoạn scripts được chạy khi hệ thống thay đổi runlevel. Runlevel 1 thường được sử dụng cho chế độ người dùng đơn. Runlevel 2 cho thiết lập đa người dùng không có NFS. Runlevel 3 cho thiết lập đa người dùng đầy đủ và môi trường mạng. Runlevel 4 thường không được dùng Runlevel 5 chứa những đoạn script để khởi tạo hệ thống trong chế độ X11, nó gần giống runlevel 3 ngoại trừ là chương trình xdm được khởi động với một màn hình login đồ hoạ Runlevel 6: chứa những đoạn scripts được chạy khi hệ thống reboot. Những đoạn scripts này được gọi bởi lệnh reboot init.d: thường chứa tất cả các scripts. Những file này nằm trong thư mục rc?.d là những đường link thật sự đến thư mục init.d The boot sequence Hãy xem những gì sẽ xảy ra trong một trình tự boot Red Hat thông thường. Khi hệ thống khởi động, file /etc/rc.d/rc.sysinit được chạy đầu tiên. Runlevel khởi động nằm trong /etc/inittab được tìm thấy và các /etc/rc.d/rc script được chạy. Trong hầu hết các trường hợp đó là Runlevel 3. Chương trình rc tìm thấy trong thư mục /etc/rc.d/rc3.d sẽ thi hành bất cứ K* script nào với tuỳ chọn stop. Sau đó tất cả các S* scripts được khởi động với tuỳ chọn start. Các script được khởi động theo thứ bậc giá trị, ví dụ S10network script được khởi động trước S85httpd script. Điều này cho phép bạn lưạ chọn chính xác khi nào những đoạn scripts của bạn được chạy, mà không cần phải chỉnh sửa file. Điều tương tự cũng đúng với K* script. Hãy xem những gì xảy ra khi chúng ta thực hiện chuyển runlevels chẳng hạn từ runlevel 3 (networking và chế độ đa người dùng) sang runlevel 1 (chế độ đơn người dùng). Đầu tiên tất cả các K* scripts thuộc level của hệ thống đang thay đổi, được thi hành. Red Hat 2.0 cài đặt 7 K* script và 1 S* script trong thư mục /etc/rc.d/rc.1. K* script sẽ shutdown nfs, send mail, lpd, inet, cron, và syslog. Sau đó S* script sẽ kills off bất cứ chương trình còn lại nào và thi hành lệnh: Code:
init -t1 S
để đưa hệ thống về chế độ đơn người dùng. Trong chế độ này bạn có thể chuyển ngược trở lại chế độ đa người dùng bằng cách gõ: Code:
init 3
Side-stepping init Có 2 điểm chính cần bổ sung: Đầu tiên, bạn có thể lựa chọn script start hoặc stop, thậm chí khi nó không thuộc runlevel của bạn. Các scripts thi hành nằm trong thư mục: /etc/rc.d/init.d với tuỳ chọn start hoặc stop sẽ khởi động hoặc dừng bất cứ chương trình hoặc dịch vụ nào mà nó kiểm soát. Điều này cho phép bạn tắt NFS từ runlevel 3 trong khi giữ tất cả các hệ thống khác vẫn hoạt động Dừng NFS trong trường hợp này sẽ yêu cầu dừng 2 hệ thống: nfsfs, nfs. Nfsfs script sẽ mount hoặc unmount bất kỳ hệ thống file NFS-mounted nào trong /etc/fstab của bạn. Còn sau đó nfs script sẽ tắt các tiến trình liên kết với NFS, trong trường hợp này là mountd và nfsd. Do đó thủ tục cho việc shutdown NFS sẽ là: Code:
# /etc/rc.d/init.d/nfs start
Starting NFS services: rpc.mountd rpc.nfsd
# /etc/rc.d/init.d/nfsfs start
Mounting remote filesystems.
#
và khởi động NFS sẽ là: Code:
# /etc/rc.d/init.d/nfs start
Starting NFS services: rpc.mountd rpc.nfsd
# /etc/rc.d/init.d/nfsfs start
Mounting remote filesystems.
#
Managing init Files Chẳng hạn, nếu bạn không muốn khởi động HTTP daemon, ngoài cách xoá file trong thư mục rc3.d, đơn giản bạn hãy đổi tên /etc/rc.d/rc3.d/S85httpd thành bất cứ tên gì không bắt đầu bằng các chữ cái viết hoa “S” hoặc “K”. Sự lựa chọn tốt nhất cho bạn là đổi tên chúng thành bắt đầu bằng chữ cái viết thường “s” hoặc “k”. Cách này không chỉ làm cho các đoạn script không được khởi động, nó còn làm cho các file này xuất hiện sau khi bạn dùng lệnh “ls”. Một chú ý quan trọng ở đây: Hãy chắc chắn rằng bạn biết những đoạn script nào được chạy khi bạn disable chúng. Nếu chẳng hạn bạn disable S10network thì sẽ không có 1 dịch vụ mạng nào của bạn hoạt động. Đó là bởi vì S10network là một low number, những scripts khác phụ thuộc vào mạng phải được thi hành sau khi dịch vụ mạng khởi động Nếu bạn muốn tạo những init process của riêng bạn để khởi động hoặc dừng. Đơn giản, hãy tạo một đoạn script với một tuỳ chọn start. Nếu đoạn script của bạn khởi động một tiến trình nền, thì bạn cũng nên có thêm tuỳ chọn stop cho nó. Viết một lần và được đặt trong thư mục /etc/rc.d/init.d. Hãy nói về những chương trình kiểm tra thời gian trên mạng 15 phút một lần, chúng được gọi là script “netdate”. Bạn có thể tạo đường link trong thư mục này khi bạn muốn khởi động chúng. Nếu bạn muốn chương trình của bạn được chạy ở runlevel 3, hãy tạo link đến script của bạn từ /etc/rc.d/rc3.d/S??netdate. Đưa vào vị trí 2 dấu hỏi chấm một con số không xung đột với phần còn lại của thư mục, chẳng hạn S55netdate. Nếu bạn muốn dừng một tiến trình trong quá trình shutdown, hãy chắc chắn rằng đoạn script của bạn chấp nhận tuỳ chọn stop, sau đó hãy tạo đường link đến /etc/rc.d/init.d/netdate từ /etc/rc.d/rc0.d/K55netdate. Một lần nữa hãy chắc chắn rằng con số bạn sử dụng không được dùng bởi bất kỳ một hệ thống con nào khác để tránh sự hỗn loạn. Bạn có thể test những thiết lập mới của bạn bằng cách dùng init 3. Từ những hệ thống con đang được chạy, chỉ có một cái sẽ khởi động chính là cái bạn đã thêm vào. Nếu lệnh init 3 bị treo, đoạn script của bạn không exit, bạn phải đặt một ký hiệu ở cuối dòng để đặt tiến trình vấn đề trên background. Bạn cũng có thể chạy những đoạn scripts này bằng tay từ thư mục /etc/rc.d/init.d/ . Bây giờ bạn đã biết cách thức các hệ thống con làm việc, bạn có thể dễ dàng thêm hoặc chỉnh sửa những hệ thống con đang tồn tại cho thiết lập Linux đặc thù của bạn. ]]>
/hvaonline/posts/list/10589.html#61323 /hvaonline/posts/list/10589.html#61323 GMT
An introduction to services, runlevels, and rc.d scripts Với mỗi runlevel các đoạn scripts được chạy để khởi động từng dịch vụ riêng biệt, thay vì một số lượng lớn các file phải chỉnh sửa bằng tay. Những đoạn scripts này được đặt trong thư mục /etc/rc.d/init.d, và phần lớn đều có một tuỳ chọn start hoặc stop.   Bạn quanta cho mình hỏi là trong lúc hệ thống đang boot thì những scripts này được chạy. Vậy những scripts này được chạy bằng cách nào? Vì thông thường sau khi một user login thành công thì shell của user mới được chạy và từ đó user mới có thể chạy được các scripts thông qua shell của mình. Liệu có phải trong lúc các init scripts được gọi thì có một shell nào đó phải được chạy? Vậy thì shell này là shell của root user phải không bạn? Và sau khi shell này chạy xong thì nó có bị kill đi không và cái gì đã kill nó hay là nó tự exit? Thanks]]> /hvaonline/posts/list/10589.html#270635 /hvaonline/posts/list/10589.html#270635 GMT An introduction to services, runlevels, and rc.d scripts

ngocson2vn wrote:
Bạn quanta cho mình hỏi là trong lúc hệ thống đang boot thì những scripts này được chạy. Vậy những scripts này được chạy bằng cách nào? Vì thông thường sau khi một user login thành công thì shell của user mới được chạy và từ đó user mới có thể chạy được các scripts thông qua shell của mình. Liệu có phải trong lúc các init scripts được gọi thì có một shell nào đó phải được chạy? Vậy thì shell này là shell của root user phải không bạn? Và sau khi shell này chạy xong thì nó có bị kill đi không và cái gì đã kill nó hay là nó tự exit? Thanks 
Trong quá trình boot, sau khi load kernel, process nào được chạy đầu tiên? Nói cách khác, process nào là "cha" (hoặc "ông nội") của mọi processes khác?]]>
/hvaonline/posts/list/10589.html#270637 /hvaonline/posts/list/10589.html#270637 GMT
An introduction to services, runlevels, and rc.d scripts

ngocson2vn wrote:
Với mỗi runlevel các đoạn scripts được chạy để khởi động từng dịch vụ riêng biệt, thay vì một số lượng lớn các file phải chỉnh sửa bằng tay. Những đoạn scripts này được đặt trong thư mục /etc/rc.d/init.d, và phần lớn đều có một tuỳ chọn start hoặc stop.  
Bạn quanta cho mình hỏi là trong lúc hệ thống đang boot thì những scripts này được chạy. Vậy những scripts này được chạy bằng cách nào? Vì thông thường sau khi một user login thành công thì shell của user mới được chạy và từ đó user mới có thể chạy được các scripts thông qua shell của mình. Liệu có phải trong lúc các init scripts được gọi thì có một shell nào đó phải được chạy? Vậy thì shell này là shell của root user phải không bạn? Và sau khi shell này chạy xong thì nó có bị kill đi không và cái gì đã kill nó hay là nó tự exit? Thanks 
Bạn này đang nhập nhằn với khái niệm shell :) Thực ra shell là vỏ cung cấp khả năng tương tác của người dùng với OS. Đối với các tác vụ hệ thống gọi lẫn nhau thì đâu nhất thiết phải có shell mới được. Trong Linux, về lí thuyết thì các process sinh ra được đánh thứ tự từ 0 và tăng dần cho đến khi "đụng trần" thì nó lặp lại từ 0 và ... Tuy nhiên, có process id không bao giờ được recycle trừ khi reboot hệ thống, đó là process có PID = 1, init process. Quá trình boot kết thúc bằng việc định danh process init với PID = 1, và việc còn lại để "lôi" các thứ còn lại là của process init này, và tất nhiên nó chính là process đọc /etc/inittab và làm các thứ còn lại như anh quanta đã trình bày ở trên :) P/S: riêng về việc gọi process này thì mình gọi nó là "process chúa" thay vì "ông nội" hay "cha" như anh quanta :D]]>
/hvaonline/posts/list/10589.html#270638 /hvaonline/posts/list/10589.html#270638 GMT
An introduction to services, runlevels, and rc.d scripts /hvaonline/posts/list/10589.html#270645 /hvaonline/posts/list/10589.html#270645 GMT An introduction to services, runlevels, and rc.d scripts Vậy thì rõ ràng là các shell script này phải được interpret bằng một shell nào đó phải không các bạn?   Cái này đúng. Các script này luôn có chỉ định interpreter ở đầu, và được chmod +x. Interpreter đó sẽ được gọi khi init process gọi thực thi các script đó. Tuy nhiên init process không có "kill" (bash/sh/...) sau đó mà chính là script trong rc?.d với "exit" ở cuối script. Về suy luận, bạn đã đi đúng hướng, chỉ có một chút nhập nhằng ở chỗ shell thôi. Shell vừa là interface tương tác giữa user và OS, nhưng bản thân nó cũng là một interpreter. Trong TH trên, nó được sử dụng như một interpreter :D]]> /hvaonline/posts/list/10589.html#270653 /hvaonline/posts/list/10589.html#270653 GMT