UNPKG

arch-wiki-md-repo

Version:

All arch-wiki articles in markdown format, updated every two days.

218 lines (142 loc) 12.4 kB
**翻译状态:** 本文是英文页面 [SysVinit](/index.php/SysVinit "SysVinit") 的[翻译](/index.php/ArchWiki_Translation_Team_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87) "ArchWiki Translation Team (简体中文)"),最后翻译时间:2012-09-20,点击[这里](https://wiki.archlinux.org/index.php?title=SysVinit&diff=0&oldid=228574)可以查看翻译后英文页面的改动。 **init**是Linux内核加载后执行的第一个进程。Arch的默认的 init 程序是[systemd-sysvcompat](https://www.archlinux.org/packages/?name=systemd-sysvcompat)提供的`/sbin/init`(新安装的系统已经默认使用[systemd](/index.php/Systemd "Systemd")) 或 [sysvinit](https://aur.archlinux.org/packages/sysvinit/).。本文中,**init**指sysvinit。 **inittab**文件位于/etc目录,是init的启动配置文件,其中指定了一些启动脚本、程序的路径,并指定在哪些运行级别执行它们。 **Note:** Arch's initscripts has been officially unsupported since 2012-11-04[[1]](https://www.archlinux.org/news/end-of-initscripts-support/). ## Contents * [1 迁移到 Systemd](#.E8.BF.81.E7.A7.BB.E5.88.B0_Systemd) * [1.1 安装](#.E5.AE.89.E8.A3.85) * [1.2 附加信息](#.E9.99.84.E5.8A.A0.E4.BF.A1.E6.81.AF) * [2 init、inittab 概览](#init.E3.80.81inittab_.E6.A6.82.E8.A7.88) * [3 调整运行级别](#.E8.B0.83.E6.95.B4.E8.BF.90.E8.A1.8C.E7.BA.A7.E5.88.AB) * [3.1 通过启动加载器](#.E9.80.9A.E8.BF.87.E5.90.AF.E5.8A.A8.E5.8A.A0.E8.BD.BD.E5.99.A8) * [3.2 启动之后](#.E5.90.AF.E5.8A.A8.E4.B9.8B.E5.90.8E) * [4 inittab](#inittab) * [4.1 默认运行级别](#.E9.BB.98.E8.AE.A4.E8.BF.90.E8.A1.8C.E7.BA.A7.E5.88.AB) * [4.2 主启动脚本](#.E4.B8.BB.E5.90.AF.E5.8A.A8.E8.84.9A.E6.9C.AC) * [4.3 单用户启动](#.E5.8D.95.E7.94.A8.E6.88.B7.E5.90.AF.E5.8A.A8) * [4.4 终端初始化](#.E7.BB.88.E7.AB.AF.E5.88.9D.E5.A7.8B.E5.8C.96) * [4.5 Ctrl-Alt-Del](#Ctrl-Alt-Del) * [4.6 X 程序](#X_.E7.A8.8B.E5.BA.8F) * [4.7 电源检测脚本](#.E7.94.B5.E6.BA.90.E6.A3.80.E6.B5.8B.E8.84.9A.E6.9C.AC) * [4.8 自定义键盘请求](#.E8.87.AA.E5.AE.9A.E4.B9.89.E9.94.AE.E7.9B.98.E8.AF.B7.E6.B1.82) * [4.8.1 触发 kbrequest](#.E8.A7.A6.E5.8F.91_kbrequest) * [5 另见](#.E5.8F.A6.E8.A7.81) * [6 外部链接](#.E5.A4.96.E9.83.A8.E9.93.BE.E6.8E.A5) ## 迁移到 Systemd 从[2012-10-13版安装介质](https://www.archlinux.org/news/systemd-is-now-the-default-on-new-installations/)开始,安装程序已经默认安装[systemd](https://www.archlinux.org/packages/?name=systemd) 和 [systemd-sysvcompat](https://www.archlinux.org/packages/?name=systemd-sysvcompat)。本部分帮助还在使用[sysvinit](https://aur.archlinux.org/packages/sysvinit/) 和 initscripts 的用户迁移到 **systemd**. **注意:** 如果是在 VPS 中使用 Arch,请先阅读:[Virtual Private Server#Moving_your_VPS_from_initscripts_to_systemd](/index.php/Virtual_Private_Server#Moving_your_VPS_from_initscripts_to_systemd "Virtual Private Server")。 * 阅读[该站](http://freedesktop.org/wiki/Software/systemd/),了解 systemd。 * systemd 自己有一套日志(**journal**)系统,用于代替 **syslog**。两者也可以共存,参见后面的[日志部分](#.E6.97.A5.E5.BF.97)。 * 虽然 systemd 可以替换 **cron****acpid****xinetd** 等的部分功能。至少目前还可以继续使用这些服务,无需立即切换。 * 交互式 initscripts 启动脚本在 systemd 中无法工作。 ### 安装 1. 从[官方软件仓库](/index.php/Official_repositories_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87) "Official repositories (简体中文)")安装 [systemd](https://www.archlinux.org/packages/?name=systemd) 并添加[内核参数](/index.php/Kernel_parameters "Kernel parameters")`init=/usr/lib/systemd/systemd` 2. 使用 `systemctl enable <服务名>` 启用需要的服务(大致相当于以前 `DAEMONS` 数组的作用,新的服务名称参见 [Daemons List (简体中文)](/index.php/Daemons_List_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87) "Daemons List (简体中文)"))。 3. 重启系统,执行命令 `cat /proc/1/comm`,如果返回`systemd`,表示 systemd 已经正常启动。 4. 确认主机名已经正确设置:`hostnamectl set-hostname myhostname`5. 删除 initscripts 和 sysvinit,并安装[systemd-sysvcompat](https://www.archlinux.org/packages/?name=systemd-sysvcompat). 6. (可选)删除`init=/usr/lib/systemd/systemd`内核参数,现在已经不需要它了。[systemd-sysvcompat](https://www.archlinux.org/packages/?name=systemd-sysvcompat) 软件包提供了一个软链接,使 systemd 成为默认 init。 ### 附加信息 * 如果内核参数中有 `quiet`,建议在一开始先去掉,以便调试。 * 使用 systemd 的时候**无需**将用户加入特殊[用户组](/index.php/Users_and_groups_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87) "Users and groups (简体中文)")(如`sys``disk``lp``network``video``audio``optical``storage``scanner``power`等等)。加入这些组反而会有问题,例如audio组会导致程序阻塞软件混声。每个 PAM 登录都拥有一个 logind 会话,它通过[POSIX ACLs](https://en.wikipedia.org/wiki/Access_control_list "wikipedia:Access control list"),赋予本地会话以声音设备访问权限、通过[udisks](/index.php/Udisks "Udisks")挂载和卸载移动设备的权限等。 * 阅读 [Network configuration (简体中文)](/index.php/Network_configuration_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87) "Network configuration (简体中文)"),了解如何配置网络。 ## init、inittab 概览 init总是Linux的1号进程,并且是**一切**进程的父进程。通过`pstree`可以形象看出init在所有进程中所处的地位。 `$ pstree -Ap` ``` init(1)-+-acpid(3432) |-crond(3423) |-dbus-daemon(3469) |-gpm(3485) |-mylogin(3536) |-ngetty(3535)---login(3954)---zsh(4043)---pstree(4326) |-polkitd(4033)---{polkitd}(4035) |-syslog-ng(3413)---syslog-ng(3414) `-udevd(643)-+-udevd(3194) `-udevd(3218) ``` 除了系统初始化,init还负责重启、关机、单用户恢复模式。为了支持上述操作,inittab把条目分到不同的**运行级别**(runlevel)中去。Arch使用以下运行级别:0——关机,1(又叫S)——单用户模式,3——普通的多用户模式,5——X使用,6——重启。其他发行版可能有所不同,但0、1、6级别是通用的。 运行时,init检查inittab并进行适当的操作。inittab中的启动项目格式如下: ``` id:runlevels:action:process ``` `id`是项目独一无二的标识符(但只是个名称,对init没任何作用);`runlevels`是一串无分隔字符串,设置运行级别;当init进入了指定的`runlevels`,执行`action`;如果顺利,执行`process`。某些特殊的`action`会忽略`runlevels`,使用特殊的匹配方法。下一节有更详细的介绍。 ## 调整运行级别 ### 通过启动加载器 想要改变系统启动时的运行级别,只需要添加想要的运行级别 `n` 到启动加载器的内核参数。这通常的应用是 [Start X at login#/etc/inittab](/index.php/Start_X_at_login#.2Fetc.2Finittab "Start X at login")。要启动到需要的运行级别,将号码加入 [内核参数](/index.php/Kernel_parameters "Kernel parameters") (例如 `3` 则启动要运行级别 3)。 运行级别追加到最后,这样内核就知道用哪个运行级别启动。想要使用另一个 init 程序(如 [systemd](/index.php/Systemd "Systemd")),添加`init=/usr/lib/systemd/systemd`或者类似的命令到内核行。 **注意:** 如果你使用 sysvinit 之外的 init 程序,运行级别参数可能被忽略。 ### 启动之后 系统启动后,可以调用`telinit n`通知init切换到运行级别`n`。然后init读取inittab,并做出当前运行级别到新的运行级别需要的改变——杀死新级别中没有的进程,执行旧级别未执行过的操作。两个级别共有的进程此时都会保留不动。杀死进程的过程有些复杂,技术信息参见init的manpage。 init不会监视inittab的改动,需要执行`telinit`应用更改。`telinit q` 命令只应用inittab而不会修改运行级别。 ## inittab 这一部分将探究inittab中的常见项目,之后会给出几个inittab项目的实例。叙述顺序按照Arch默认的inittab。 **警告:** 重启之前,务必使用 `telinit q` 测试修改过的 `/etc/inittab`,任何小小的语法错误都将导致系统无法启动。 ### 默认运行级别 默认运行级别为3。如果想要设置默认运行级别为5(通常X使用的级别),添加下面一行内容: ``` id:5:initdefault: ``` ### 主启动脚本 下面几行描述了主启动脚本: ``` rc::sysinit:/etc/rc.sysinit rs:S1:wait:/etc/rc.single rm:2345:wait:/etc/rc.multi rh:06:wait:/etc/rc.shutdown ``` ### 单用户启动 有时,因为重要文件丢失、文件系统损坏或硬件问题,内核可能启动失败。此时init可能自动进入**单用户模式**,此模式只允许使用root登陆,使用/sbin/sulogin(而非/sbin/login)控制login进程。也可以在 [GRUB](/index.php/GRUB "GRUB"), [LILO](/index.php/LILO "LILO") 或 [syslinux](/index.php/Syslinux "Syslinux") 启动项添加S参数进入单用户模式。如果不想使用sulogin,可以在这里设置: ``` su:S:wait:/sbin/sulogin -p ``` ### 终端初始化 该部分是初始化虚拟终端的关键。默认设置会在tty1-6开启6个[getty](/index.php/Getty "Getty"),显示终端登陆提示。另见:openvt, chvt,stty,ioctl。 ``` c1:234:respawn:/sbin/agetty 9600 tty1 xterm-color c5:5:respawn:/sbin/agetty 57600 tty2 xterm-256color ``` ### Ctrl-Alt-Del 以下内容定义按下`Ctrl+Alt+Del`组合键时进行的操作: ``` ca::ctrlaltdel:/sbin/shutdown -t3 -r now ``` ### X 程序 如果不怕麻烦,在inittab中启动各种程序都是可以的。以下内容示范了如何设置系统进入运行级别5时启动登陆管理器 [SLiM](/index.php/SLiM "SLiM") : ``` x:5:respawn:/usr/bin/slim >/dev/null 2>&1 #x:5:respawn:/usr/bin/xdm -nodaemon -confi /etc/X11/xdm/archlinux/xdm-config ``` ### 电源检测脚本 init可以根据UPS设备状态执行相应进程,示例如下: ``` pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down" pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled" ``` ### 自定义键盘请求 类似`Ctrl+Alt+Del`,下面的内容添加了按下特定组合键时执行命令的功能: ``` kb::kbrequest:/usr/bin/wall "Keyboard Request -- edit /etc/inittab to customize" ``` #### 触发 kbrequest 使用root用户,可以通过向init发送WINCH信号触发**kbrequest**。对于上述例子,命令: ``` kill -WINCH 1 ``` 会导致`wall`命令执行,向所有用户发送信息: ``` Broadcast message from root@askapachehost (console) (Wed Oct 27 14:02:26 2010): Keyboard Request -- edit /etc/inittab to customize ``` ## 另见 * [Automatic login to virtual console](/index.php/Automatic_login_to_virtual_console "Automatic login to virtual console") * [Disable clearing of boot messages](/index.php/Disable_clearing_of_boot_messages "Disable clearing of boot messages") * [开机启动 X](/index.php/Start_X_at_Login_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87) "Start X at Login (简体中文)") * [Xinitrc (简体中文)](/index.php/Xinitrc_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87) "Xinitrc (简体中文)") * [登陆管理器](/index.php/Display_manager_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87) "Display manager (简体中文)") * [SLiM (简体中文)](/index.php/SLiM_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87) "SLiM (简体中文)") ## 外部链接 * [维基百科:init](https://zh.wikipedia.org/wiki/Init) * [Linux Knowledge Base and Tutorial:运行级别](http://www.linux-tutorial.info/modules.php?name=MContent&pageid=65) * [Linux.com:runlevels 和 inittab 的介绍](http://www.linux.com/articles/114107) * [Linux.com:服务、运行级别、rc.d脚本的介绍](http://www.linux.com/news/enterprise/systems-management/8116-an-introduction-to-services-runlevels-and-rcd-scripts)