CentOS 6.x 启动流程之二,init过程

/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(/etc/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 执行引导时的网络配置

|--->dmesg -s 131072 > /var/log/dmesg 转储内核启动的消息信息

|--->/etc/inittab

|--->id:5:initdefault:查找initdefault定义的运行级别(5,图形用户界面,3字符界面)

|--->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脚本运行完之后运行,可在些添加自己的初始化命令

|--->/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,$PATH等

|--->/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启动GNOME会话

|--->/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 设置XAUTHORITY环境变量

|--->设置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会话结束时运行的脚本