• SysVinit


    SysVinit

    https://wiki.archlinux.org/index.php/SysVinit_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)

    init是Linux内核加载后执行的第一个进程。Arch的默认的 init 程序是systemd-sysvcompat提供的/sbin/init(新安装的系统已经默认使用systemd) 或 sysvinit.。本文中,init指sysvinit。

    inittab文件位于/etc目录,是init的启动配置文件,其中指定了一些启动脚本、程序的路径,并指定在哪些运行级别执行它们。

    小贴士: 参见 man 5 inittab 以及 man 8 init 获取更多专业信息。

    小贴士: 虽然Arch使用了init,但多数任务还是由#主启动脚本承担。本文重点是init和inittab,如果需要更多Arch启动方面的信息,参见:Arch Boot Process (简体中文)

    Contents

     [hide

    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。要启动到需要的运行级别,将号码加入 内核参数 (例如 3 则启动要运行级别 3)。

    运行级别追加到最后,这样内核就知道用哪个运行级别启动。想要使用另一个 init 程序(如 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进程。也可以在 GRUBLILO 或 syslinux 启动项添加S参数进入单用户模式。如果不想使用sulogin,可以在这里设置:

    su:S:wait:/sbin/sulogin -p
    

    终端初始化

    该部分是初始化虚拟终端的关键。默认设置会在tty1-6开启6个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 :

    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
    

    另见

    外部链接

  • 相关阅读:
    愿你出走半生,归来多赚点钱
    喝下这碗毒鸡汤:作为一个『乖』学生,请一定要以学业为主!
    劝你理财,是我最大的温柔-lip师兄
    大半夜客户问我为什么这么拼,我给她算了笔账,她嚎啕大哭......
    女人为什么要经济独立
    定投6年以亏损收场,他到底做错了什么
    你的死工资,正在拖垮你&一辈子需要花多少钱
    字符串的长度
    泥塑课
    最大的数
  • 原文地址:https://www.cnblogs.com/cnland/p/2981967.html
Copyright © 2020-2023  润新知