• 练习 15:系统启动:运行级别,/etc/init.drcconfupdate-rc.d
    • 这样做
    • 你会看到什么
    • 解释
    • 附加题

    练习 15:系统启动:运行级别,/etc/init.drcconfupdate-rc.d

    原文:Exercise 15. System boot: runlevels, /etc/init.d, rcconf, update-rc.d

    译者:飞龙

    协议:CC BY-NC-SA 4.0

    自豪地采用谷歌翻译

    首先我会给出一个典型的系统启动过程的概述:

    1. 按电源开关(或启动虚拟机)
    2. 现在计算机获得控制权
    3. 控制权传给了 BIOS
    4. BIOS
    5. 执行硬件特定的任务
    6. 执行开机自检(POST),测试你的硬件
    7. 检测安装的硬件,如硬盘,内存类型和数量,...
    8. 通过将初始值写入其内存来初始化硬件
    9. 找到一个启动设备,通常是一个硬盘
    10. 读取并执行位于此磁盘开头的 MBR(主引导记录)
    11. 控制权现在传给了 MBR
    12. MBR
    13. MBR 寻找并执行 GRUB(多重操作系统启动管理器)
    14. 控制权现在传给了 GRUB
    15. GRUB
    16. 查找可用的文件系统
    17. 查找并读取其配置文件,来了解:
    18. 系统位于哪里
    19. 启动什么系统
    20. 执行什么其他的操作
    21. 执行 Linux 内核,Linux 操作系统的主要部分
    22. 控制权现在传给了 Linux 内核
    23. Linux 内核
    24. 查找并加载 initrd,这是初始的 ram 磁盘
    25. initrd 包含必要驱动程序,允许真实文件系统的访问和挂载
    26. 挂载文件系统,它在 GRUB 配置文件中指定。
    27. 执行`/sbin/init`,一个启动所有其他程序的特殊程序
    28. 控制权现在传给了 init
    29. init
    30. 查看`etc/inittab`来确定所需的运行级别
    31. 加载适合此运行级别的所有程序
    32. 加载来自`/etc/rc.d/rc2.d/`的所有程序,因为 2 是默认的 Debian 运行级别
    33. 启动 SSH TTY,以便你可以连接到你的计算机
    34. 启动现在完成了
    35. 使用 SSH 连接到你的计算机
    36. SSH 守护进程为你执行 bash shell
    37. 你现在可以输入东西
    38. 你再次获得控制权

    现在我们只对“init”和“运行级别”阶段感兴趣,所以我将总结一下,系统如何启动并自动启动一些程序。首先,有一些术语​​:

    • 守护进程 - 一直运行在后台的程序。这意味着它不在乎你是否登录系统,通常你不需要手动启动它,因为它在计算机启动时自动启动。
    • 运行级别 - 系统运行模式。基本上,这只是一个数字,提供给init程序,它知道哪些守护程序与每个数字相关联,并根据需要启动并停止这些守护程序。

    在 Debian 中有以下运行级别:

    ID 描述
    S 系统通电后会执行它
    0 停止,这定义了当系统关闭时执行哪些操作。
    1 单用户模式,这是一种特殊的故障排除模式。在这种模式下,大多数守护进程不会自动启动。
    2~5 完全多用户,配置的守护程序在此模式下启动。
    6 重启,类似停止,但不是关闭系统而是重新启动。

    但是init怎么知道的?好吧,这是用于它的特殊目录。

    1. user1@vm1:/etc$ find /etc -type d -name 'rc*' 2>/dev/null | sort
    2. /etc/rc0.d
    3. /etc/rc1.d
    4. /etc/rc2.d
    5. /etc/rc3.d
    6. /etc/rc4.d
    7. /etc/rc5.d
    8. /etc/rc6.d
    9. /etc/rcS.d

    你可能能猜到,每个数字和S对应表中的运行级别。让我们列出其中一个目录,它在正常启动中启动所有所需的守护进程。

    1. user1@vm1:/etc$ ls -al /etc/rc2.d | awk '{printf "%-15.15s %-3.3s %s\n",$9,$10,$11}'
    2. .
    3. ..
    4. README
    5. S14portmap -> ../init.d/portmap
    6. S15nfs-common -> ../init.d/nfs-common
    7. S17rsyslog -> ../init.d/rsyslog
    8. S17sudo -> ../init.d/sudo
    9. S18acpid -> ../init.d/acpid
    10. S18atd -> ../init.d/atd
    11. S18cron -> ../init.d/cron
    12. S18exim4 -> ../init.d/exim4
    13. S18ssh -> ../init.d/ssh
    14. S20bootlogs -> ../init.d/bootlogs
    15. S21rc.local -> ../init.d/rc.local
    16. S21rmnologin -> ../init.d/rmnologin
    17. S21stop-bootlog -> ../init.d/stop-bootlogd

    如你所见,此目录中的文件只是实际启动脚本的符号链接。我们来看看其中一个链接:S18ssh→../init.d/ssh。这是关于这个文件的事情:

    • 它是一个./init.d/ssh文件的链接
    • 它以S开始,意味着“启动”。Debian 启动系统中使用的每个脚本至少有 2 个参数,“启动”和“停止”。现在我们可以说,当我们的系统切换到运行级别 2 时,该脚本将使用动作“启动”来执行 。
    • 它有一个数字 18。rc目录中的脚本以字典序执行,所以现在我们明白,在启动ssh之前 ,系统启动portmapnfs-commonrsyslogsudorsyslog是一个系统日志守护程序,特别是ssh想要记录谁在什么时候访问系统,所以在启动之前需要运行rsyslog

    现在,你将学习如何列出启用的服务(守护程序),以及启用和禁用服务(守护程序)。

    这样做

    1. 1: sudo aptitude install rcconf
    2. 2: ls -al /etc/rc2.d
    3. 3: sudo rcconf --list
    4. 4: sudo update-rc.d exim4 disable
    5. 5: ls -al /etc/rc2.d
    6. 6: sudo rcconf --list
    7. 7: sudo update-rc.d exim4 enable
    8. 8: ls -al /etc/rc2.d
    9. 9: sudo rcconf --list

    你会看到什么

    1. user1@vm1:/var/log$ sudo aptitude install rcconf
    2. The following NEW packages will be installed:
    3. rcconf
    4. 0 packages upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
    5. Need to get 0 B/23.9 kB of archives. After unpacking 135 kB will be used.
    6. Selecting previously deselected package rcconf.
    7. (Reading database ... 24239 files and directories currently installed.)
    8. Unpacking rcconf (from .../archives/rcconf_2.5_all.deb) ...
    9. Processing triggers for man-db ...
    10. Setting up rcconf (2.5) ...
    11. user1@vm1:/etc$ ls -al /etc/rc2.d
    12. total 12
    13. drwxr-xr-x 2 root root 4096 Jun 27 11:42 .
    14. drwxr-xr-x 68 root root 4096 Jun 25 18:43 ..
    15. -rw-r--r-- 1 root root 677 Mar 27 05:50 README
    16. lrwxrwxrwx 1 root root 17 Jun 4 11:53 S14portmap -> ../init.d/portmap
    17. lrwxrwxrwx 1 root root 20 Jun 4 11:53 S15nfs-common -> ../init.d/nfs-common
    18. lrwxrwxrwx 1 root root 17 Jun 4 11:53 S17rsyslog -> ../init.d/rsyslog
    19. lrwxrwxrwx 1 root root 14 Jun 15 19:02 S17sudo -> ../init.d/sudo
    20. lrwxrwxrwx 1 root root 15 Jun 4 11:53 S18acpid -> ../init.d/acpid
    21. lrwxrwxrwx 1 root root 13 Jun 4 11:53 S18atd -> ../init.d/atd
    22. lrwxrwxrwx 1 root root 14 Jun 4 11:53 S18cron -> ../init.d/cron
    23. lrwxrwxrwx 1 root root 15 Jun 27 11:42 S18exim4 -> ../init.d/exim4
    24. lrwxrwxrwx 1 root root 13 Jun 4 11:53 S18ssh -> ../init.d/ssh
    25. lrwxrwxrwx 1 root root 18 Jun 4 11:53 S20bootlogs -> ../init.d/bootlogs
    26. lrwxrwxrwx 1 root root 18 Jun 4 11:53 S21rc.local -> ../init.d/rc.local
    27. lrwxrwxrwx 1 root root 19 Jun 4 11:53 S21rmnologin -> ../init.d/rmnologin
    28. lrwxrwxrwx 1 root root 23 Jun 4 11:53 S21stop-bootlogd -> ../init.d/stop-bootlogd
    29. user1@vm1:/etc$ sudo rcconf --list
    30. rsyslog on
    31. ssh on
    32. bootlogs on
    33. portmap on
    34. sudo on
    35. nfs-common on
    36. udev on
    37. console-setup on
    38. kbd on
    39. exim4 on
    40. keyboard-setup on
    41. acpid on
    42. cron on
    43. atd on
    44. procps on
    45. module-init-tools on
    46. user1@vm1:/etc$ sudo update-rc.d exim4 disable
    47. update-rc.d: using dependency based boot sequencing
    48. insserv: warning: current start runlevel(s) (empty) of script `exim4' overwrites defaults (2 3 4 5).
    49. insserv: warning: current stop runlevel(s) (0 1 2 3 4 5 6) of script `exim4' overwrites defaults (0 1 6).
    50. user1@vm1:/etc$ ls -al /etc/rc2.d
    51. total 12
    52. drwxr-xr-x 2 root root 4096 Jun 27 11:43 .
    53. drwxr-xr-x 68 root root 4096 Jun 25 18:43 ..
    54. lrwxrwxrwx 1 root root 15 Jun 27 11:43 K01exim4 -> ../init.d/exim4
    55. -rw-r--r-- 1 root root 677 Mar 27 05:50 README
    56. lrwxrwxrwx 1 root root 17 Jun 4 11:53 S14portmap -> ../init.d/portmap
    57. lrwxrwxrwx 1 root root 20 Jun 4 11:53 S15nfs-common -> ../init.d/nfs-common
    58. lrwxrwxrwx 1 root root 17 Jun 4 11:53 S17rsyslog -> ../init.d/rsyslog
    59. lrwxrwxrwx 1 root root 14 Jun 15 19:02 S17sudo -> ../init.d/sudo
    60. lrwxrwxrwx 1 root root 15 Jun 4 11:53 S18acpid -> ../init.d/acpid
    61. lrwxrwxrwx 1 root root 13 Jun 4 11:53 S18atd -> ../init.d/atd
    62. lrwxrwxrwx 1 root root 14 Jun 4 11:53 S18cron -> ../init.d/cron
    63. lrwxrwxrwx 1 root root 13 Jun 4 11:53 S18ssh -> ../init.d/ssh
    64. lrwxrwxrwx 1 root root 18 Jun 4 11:53 S20bootlogs -> ../init.d/bootlogs
    65. lrwxrwxrwx 1 root root 18 Jun 4 11:53 S21rc.local -> ../init.d/rc.local
    66. lrwxrwxrwx 1 root root 19 Jun 4 11:53 S21rmnologin -> ../init.d/rmnologin
    67. lrwxrwxrwx 1 root root 23 Jun 4 11:53 S21stop-bootlogd -> ../init.d/stop-bootlogd
    68. user1@vm1:/etc$ sudo rcconf --list
    69. rsyslog on
    70. ssh on
    71. bootlogs on
    72. portmap on
    73. sudo on
    74. nfs-common on
    75. udev on
    76. console-setup on
    77. kbd on
    78. keyboard-setup on
    79. acpid on
    80. cron on
    81. atd on
    82. procps on
    83. module-init-tools on
    84. exim4 off
    85. user1@vm1:/etc$ sudo update-rc.d exim4 enable
    86. update-rc.d: using dependency based boot sequencing
    87. user1@vm1:/etc$ ls -al /etc/rc2.d
    88. total 12
    89. drwxr-xr-x 2 root root 4096 Jun 27 11:43 .
    90. drwxr-xr-x 68 root root 4096 Jun 25 18:43 ..
    91. -rw-r--r-- 1 root root 677 Mar 27 05:50 README
    92. lrwxrwxrwx 1 root root 17 Jun 4 11:53 S14portmap -> ../init.d/portmap
    93. lrwxrwxrwx 1 root root 20 Jun 4 11:53 S15nfs-common -> ../init.d/nfs-common
    94. lrwxrwxrwx 1 root root 17 Jun 4 11:53 S17rsyslog -> ../init.d/rsyslog
    95. lrwxrwxrwx 1 root root 14 Jun 15 19:02 S17sudo -> ../init.d/sudo
    96. lrwxrwxrwx 1 root root 15 Jun 4 11:53 S18acpid -> ../init.d/acpid
    97. lrwxrwxrwx 1 root root 13 Jun 4 11:53 S18atd -> ../init.d/atd
    98. lrwxrwxrwx 1 root root 14 Jun 4 11:53 S18cron -> ../init.d/cron
    99. lrwxrwxrwx 1 root root 15 Jun 27 11:43 S18exim4 -> ../init.d/exim4
    100. lrwxrwxrwx 1 root root 13 Jun 4 11:53 S18ssh -> ../init.d/ssh
    101. lrwxrwxrwx 1 root root 18 Jun 4 11:53 S20bootlogs -> ../init.d/bootlogs
    102. lrwxrwxrwx 1 root root 18 Jun 4 11:53 S21rc.local -> ../init.d/rc.local
    103. lrwxrwxrwx 1 root root 19 Jun 4 11:53 S21rmnologin -> ../init.d/rmnologin
    104. lrwxrwxrwx 1 root root 23 Jun 4 11:53 S21stop-bootlogd -> ../init.d/stop-bootlogd
    105. user1@vm1:/etc$ sudo rcconf --list
    106. rsyslog on
    107. ssh on
    108. bootlogs on
    109. portmap on
    110. sudo on
    111. nfs-common on
    112. udev on
    113. console-setup on
    114. kbd on
    115. exim4 on
    116. keyboard-setup on
    117. acpid on
    118. cron on
    119. atd on
    120. procps on
    121. module-init-tools on
    122. user1@vm1:/etc$

    解释

    1. 安装rcconf包,让你轻松管理运行级别。
    2. 打印包含运行级别 2 的启动脚本的目录。现在启用了邮件服务器exim4
    3. 仅仅打印出相同运行级别的服务。请注意,由于它们被视为系统服务,因此存在多个未显示的服务。rcconf –list –expert会把它们全部列出,以及更多的驻留在不同的运行级别上的服务。
    4. 禁用邮件服务器exim4的自动启动。
    5. 打印出包括运行级别 2 的启动脚本的目录。exim4启动脚本现在从S18exim4重命名为K01exim4。这意味着exim4进入此级别时已停止(被杀死)。如果exim4开始没有运行,就没有任何反应。
    6. 打印运行级别 2 的服务。服务exim4现在已关闭。
    7. 开启exim4的自动启动。
    8. 再次打印包含运行级别 2 的启动脚本的目录,exim4再次启动。
    9. 打印运行级别 2 的服务。exim4的状态变更为已启动,和预期一样。

    附加题

    • 请阅读 Debian 启动过程:http://www.debian.org/doc/manuals/debian-reference/ch03.en.html
    • 尝试这样做:aptitude install sysv-rc-confsysv-rc-conf -list。阅读man sysv-rc-conf