开机第四阶段:init进程对系统初始化流程图

  • Post author:
  • Post category:其他



启动重要部分

/sbin/init

    |--->/etc/init/rcS.conf
    
        |--->exec /etc/rc.d/rc.sysinit 执行第一个脚本系统初始化( Ubuntu中为/etc/init/rc-sysinit.conf )
            
        
        |--->/etc/inittab
            |--->id:5:initdefault: 查找initdefault 定义的运行级别(为5,图形用户界面)
            
        
        |--->telinit $runlevel 切换到对应级别运行
        
    
    |--->/etc/init/rc.conf
        |--->exec /etc/rc.d/rc $RUNLEVEL
            |--->/etc/profile.d/lang.sh 设置语言环境
            |--->/etc/rc.d/rc5.d/KNxxxx 先关闭相关服务(在关闭系统时也会执行)
                --->/etc/rc.d/init.d/xxxx
            |--->/etc/rc.d/rc5.d/SNxxxx 再开启相关服务
                |--->etc/rc.d/rc5.d/xxxx
                
    |--->/etc/rc.d/rc.local 在所有init 脚本运行完之后运行, 可在些添加自己的初始化命令(Ubuntu中为/etc/rc.local )
    
    |--->/etc/init/start-ttys.conf 启动tty1-tty6 设备
        |--->/etc/sysconfig/init 指定tty 设备,通常为/dev/tty1-/dev/tty6
        |--->/etc/init/tty.conf
            |--->exec /sbin/mingetty $TTY 在每个tty 设备上启动mingetty
    |---> 成功后就可以通过Ctrl+Alt+F1..F6 在各个不同的tty 之间切换


启动完整部分

/sbin/init

    |--->/etc/init/rcS.conf
    
        |--->exec /etc/rc.d/rc.sysinit 执行第一个脚本( Ubuntu中为/etc/init/rc-sysinit.conf )
            |--->/bin/hostname 获取主机名( 设置$HOSTNAME)
            |--->/etc/sysconfig/network 配置网络基本参数
            |--->/proc/mounts 检测并挂载procfs,sysfs 到/proc,/sys
            |--->/etc/init.d/functions 包含一些通用函数,会被/etc/init.d (是到rc.d/init.d 的链接)下的脚本用到
                |--->/etc/sysconfig/i18n 设置终端字符集
                |--->/etc/sysconfig/init 设置终端和图形界面的一些参数
                |--->deamon(),killproc(),pidofproc() 一些通用函数
                |--->status(),echo_success() 等
                |--->update_boot_stage(),strstr() 等
            |--->/selinux/enforce 检查SELinux的状态
            |--->/etc/system-release 打印熟悉的发行版信息“ Welcome to SentOS ..."
            |--->/proc/cmdline 获取内核启动的命令行参数
            |--->/proc/sys/kernel/modprobe 获取modprobe的位置(为/sbin/modprobe )
                |--->/sbin/sysctl 初始化硬件(通过sysctl 设置运行时内核参数)
            |--->kill $nashpid 杀死所有的nash进程(我们在initrd 中使用的shell )
            |--->/sbin/start_udev 启动udev( 动态设备管理进程)
            |--->/bin/taskset 设置进程的默认CPU亲合值(即优先使用哪个CPU,用在多处理器环境中)
            |--->/etc/sysconfig/modules/*.modules 加载其他用户自定义的模块
            |--->sysctl -e -p /etc/sysctl.conf 配置内核参数
            |--->/proc/devices 获取设备号及相应设备名,以便进行设备初始化
            |--->/sbin/dmraid 激活software raid
            |--->/sbin/kpartx “/dev/mapper/..." 为software raid 上的每块硬盘创建设备映射
            |--->/.autofsck 是否自动执行文件系统检查
                |--->sulogin 若为单用户模式,执行单用户登录程序
                |--->plymouth --show-splash 显示启动时的背景画面
            |--->/etc/sysconfig/readonly-root 设置root 文件系统挂载方式
            |---> 从/etc/fstab 挂载暂存设备
            |--->/etc/rwtab, /etc/rwtab.d/* 挂载其他有卷标的分区
            |--->ip addr show 获取并设置网上ip 地址
            |---> 从/etc/fstab 挂载持久数据的存储设备
            |--->/etc/statetab, /etc/statetab.d/* 持载其他持久数据的存储设备
            |--->/sbin/fsck 检查文件系统
                |--->umount -a & reboot -f 如果检查失败,卸载文件系统并重启
            |---> 如果文件系统检查没有失败, 以读写方式重新挂载root 文件系统
            |---> 挂载所有其他的文件系统
            |--->cat /var/lib/random-seed >/dev/urandom 初始化伪随机数生成器
            |--->/usr/sbin/system-config-keyboard,passwd,... 配置机器相关参数(如果有需要的话)
            |--->/etc/sysconfig/network 重新读取网络配置数据,并重设hostname
            |---> 清除相关的/, /var,/tmp 数据
            |--->/sbin/swapon 开启各个交换区分(根据/proc/swaps )
                |--->/usr/sbin/system-config-network-cmd 执行引导时的网络配置(传递内核启动的netprofile 参数)
            |--->dmesg -s 131072 > /var/log/dmesg 转储内核启动的消息信息
        
        |--->/etc/inittab
            |--->id:5:initdefault: 查找initdefault 定义的运行级别(为5,图形用户界面)
        
        |--->telinit $runlevel 切换到对应级别运行
    
    |--->/etc/init/rc.conf
        |--->exec /etc/rc.d/rc $RUNLEVEL
            |--->/etc/profile.d/lang.sh 设置语言环境
            |--->/etc/rc.d/rc5.d/KNxxxx 先关闭相关服务(在关闭系统时也会执行)
                --->/etc/rc.d/init.d/xxxx
            |--->/etc/rc.d/rc5.d/SNxxxx 再开启相关服务
                |--->etc/rc.d/rc5.d/xxxx
                
    |--->/etc/rc.d/rc.local 在所有init 脚本运行完之后运行, 可在些添加自己的初始化命令(Ubuntu中为/etc/rc.local )
    |--->/etc/init/start-ttys.conf 启动tty1-tty6 设备
        |--->/etc/sysconfig/init 指定tty 设备,通常为/dev/tty1-/dev/tty6
        |--->/etc/init/tty.conf
            |--->exec /sbin/mingetty $TTY 在每个tty 设备上启动mingetty
    |---> 成功后就可以通过Ctrl+Alt+F1..F6 在各个不同的tty 之间切换
    
######################################### 字符界面 ####################################
    |--->fork()--->/sbin/mingetty 运行mingetty 程序,出现字符登录界面
        |--->/etc/issue 在登录界面上显示发行版信息
        |--->exec("/bin/login",...) 运行/bin/login 程序,验证用户名和口令
        |--->/etc/passwd 读取passwd文件核对用户名和口令
            |--->everzhou:x:500:500:everzhou:/home/everzhou:/bin/bash
        |---> 切换到工作目录/home/everzhou
        |---> 初始化环境变量 $HOME,$PAT等H
        |--->/etc/motd 显示当天的消息
        |---> 检查新邮件
        |--->exec("/bin/bash",...) 运行bash程序
            |--->/etc/profile 执行这些脚本中的命令
            |--->.bash_profile 或.bashrc
                |--->ENV=$HOME/.anyfilename; export ENV 运行$ENV指向的脚本(如果设置了的话)
    |--->bash 运行中 mingetty,login 最后替换成了bash, 登录成功
    
########################################## 图形界面 #######################################
    |--->/etc/init/prefdm.conf
        |--->exec /etc/X11/prefdm -nodaemon 准备启动指定的X图形界面(X Display Manager)
            |--->/etc/sysconfig/i18n 设置语言环境
            |--->/etc/sysconfig/desktop 读取指定的DM配置(如果有的话)
            |--->exec /usr/sbin/gdm 启动指定的DM( gdm, kdm, wdm或xdm,默认为/usr/sbin/gdm )
                |---> 启动X server 窗口
                |--->/etc/gdm/custom.conf 根据配置在X窗口中显示登录界面
                |---> 用户选择语言、键盘布局、会话等
                    |--->/usr/share/xsessions/gnome.desktop 读取会话要显示的名称
                        --->Exec=gnome-session 指定默认的会话程序
                |---> 用户输入用户名和密码
                |---> 用/bin/login 验证用户名和密码
                |--->/etc/gdm/PreSession/* 执行会话前的一些任务(比如更改X窗口的默认背景)
                |--->/etc/gdm/PostLogin/* 执行一些登录后立即需要运行的命令
                |--->/etc/gdm/Xsession gnome-session--->/etc/X11/xinit/Xsession 启动GNOM会E话
                    |--->/etc/X11/xinit/xinitrc-common 导入Xsession 与xinitrc 共用的代码
                        |--->/etc/profile.d/lang.sh 设置i18n 环境
                        |--->/etc/X11/Xresources 读取用户登录时需要载入的全局资源
                        |--->/etc/X11/Xmodmap 读取的全局的键盘配置(用于xdm和xinit ,用startx启动图形界面时要用到)
                        |--->/etc/X11/xinit/xinitrc.d/* 运行所有的xinitrc 脚本
                        |--->exec -l $SHELL -c gnome-session 执行特定的环境设置(以前是执行 ./Xclients.d/Xclients.gnome-session.sh )
                    |--->/etc/X11/xinit/Xclients 运行各个X客户端的脚本(或者$HOME/.xsession,或者$HOME/.Xclients )
                        |--->/etc/sysconfig/desktop 读取指定的会话程序配置(如果有的话)
                        |--->exec "$(type -p gnome-session)" 默认运行gnome-session ,进入GNOME桌面
    |--->GNOME 桌面运行中 ,mingetty,login 最后替换成了gnome程序, 登录成功
    |--->/etc/gdm/PostSession/* GNOME 会话结束时运行的脚本

########################## 在字符界面下通过startx 启动图形界面 ##############################
    |--->/bin/bash 在字符界面的Shell 下
    |--->/usr/bin/startx
        |---> 记录$HOME 目录和/etc/X11/xinit 下的.xinitrc 和.xserverrc 文件以$HOME 目录下的为优先
        |---> 解析用户指定的client 、server 、display 参数及其选项
        |---> 没有指定参数时就设为前面记录的.xinitrc 和.xserverrc 文件
        |--->XAUTHORITY=$HOME/.Xauthority 设置XAUTHORIT环Y境变量
        |---> 设置X server 的权限信息
        |--->xinit $client $clientargs -- $server $display $serverargs 启动X server 和第一个X client
            |--->/etc/X11/xinit/xinitrc 用来运行各个X client (上面没有指定第一个client 时)
                |--->/etc/X11/xinit/xinitrc-common 导入Xsession 与xinitrc 共用的代码
                    |--->/etc/profile.d/lang.sh 设置i18n 环境
                    |--->/etc/X11/Xresources 读取用户登录时需要载入的全局资源
                    |--->/etc/X11/Xmodmap 读取全局的键盘配置
                    |--->/etc/X11/xinit/xinitrc.d/* 运行所有的xinitrc 脚本
                |--->/etc/X11/xinit/Xclients 运行各个X client 的脚本(或者$HOME/.Xclients )
                    |--->/etc/sysconfig/desktop 读取指定的会话程序配置(如果有的话)
                    |--->exec "$(type -p gnome-session)" 默认运行gnome-session, 进入GNOME桌面
    |--->GNOME 桌面运行中 mingetty,login 最后替换成了gnome程序, 登录成功
    |--->/etc/gdm/PostSession/* GNOME 会话结束时运行的脚本
    
    
    



本文转自:




https://wenku.baidu.com/view/066bbbde77232f60ddcca194.html