共计 2962 个字符,预计需要花费 8 分钟才能阅读完成。
这篇文章主要介绍“Ubuntu 启动流程是怎样的”,在日常操作中,相信很多人在 Ubuntu 启动流程是怎样的问题上存在疑惑,丸趣 TV 小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Ubuntu 启动流程是怎样的”的疑惑有所帮助!接下来,请跟着丸趣 TV 小编一起来学习吧!
Ubuntu 启动流程
Ubuntu 启动流程和我们熟知的 RedHat 的启动方式有所区别。
这是我们熟知的 linux 启动流程,但是 Ubuntu 启动流程和这个有些区别,我在 Ubuntu 的 /etc/ 目录下面找不到 inittab 这个文件,一开始很纳闷 Ubuntu 是怎么启动的?一查资料发现 Ubuntu 并没有采用 init 的方法,所以在 /etc/ 目录下面找不到 inittab,这主要是因为 init 采用串行的方式,引导很费时,RedHat9 启动时串行执行大量脚本以及启动各种需要的服务,因此从 Ubuntu6.10 开始逐步采用 upstart 来代替 init,进行服务进程的管理。为了对原有的 init 实现向后兼容,upstart 可以说是在表象上保留了大部分原来 init 的特性,因此目前 Ubuntu 初始化进程名仍然叫 init,而改变的核心,则是 Event 机制。
Event 机制就是将进程的触发、停止都看成是 Event。Ubuntu 启动流程的 /etc/ 下有一个 event.d,这个目录是 upstart 的核心。/etc/event.d/ 下面存放了目前 upstart 需要识别的各种 event。这其中主要有三种:rc-default,rcX(X = 0,1,2,3,4,5,6,S),ttyX(X = 0,1,2,3,4,5,6,S)。
其中 rc-default 就类似与 inittab 文件,用来设置默认运行级别的。cat rc-default,我们可以看到:
# rc – runlevel compatibility
# This task guesses what the default runlevel should be and starts the
# appropriate script.
start on stopped rcS script
runlevel –reboot || true
if grep -q -w — -s\|single\|S /proc/cmdline; then
telinit S
elif [-r /etc/inittab]; then
RL= $(sed -n -e /^id:[0-9]*:initdefault:/{s/^id://;s/:.*//;p} /etc/inittab || true)
if [-n $RL]; then
telinit $RL
else
telinit 2
fi
else
telinit 2
fi
end script
默认的运行级别是 2。
rcX 是发生相应运行级别事件时需要运行程序的脚本,我们再 cat 一下 rc2:
# rc2 – runlevel 2 compatibility
# This task runs the old sysv-rc runlevel 2 (multi-user) scripts. It
# is usually started by the telinit compatibility wrapper.
start on runlevel 2
stop on runlevel [!2]
console output
script
set $(runlevel –set 2 || true)
if [$1 != unknown]; then
PREVLEVEL=$1
RUNLEVEL=$2
export PREVLEVEL RUNLEVEL
fi
exec /etc/init.d/rc 2
end script
不去考虑细节,只要注意到前两行和倒数第二行就可以了。可以看到,rc2 文件是定义在发生运行级别 2 的时候所要执行的东西,核心就是这句:exec /etc/init.d/rc 2。这样,我们就可以自然地过渡到下一个重要的目录,/etc/init.d/ 了。
/etc/init.d/ 中存放的都是服务或者任务的执行脚本。可以这么说,只要你安装了一个程序 (特别是服务程序 daemon),它可以在系统 Ubuntu 启动流程的时候运行,那么它必定会在 /etc/init.d/ 中有一个脚本文件。回到上面的 rc2,它执行了 exec /etc/init.d/rc 2,也就是给 /etc/init.d/rc 传递了一个参数”2”,让它执行。Rc 脚本里面有这样一段:
# Now run the START scripts for this runlevel.
# Run all scripts with the same level in parallel
for s in /etc/rc$runlevel.d/S*
这说明,当给 rc 脚本传递一个数字参数 X 的时候,它在经过一系列的设置后,将会开始执行 /etc/rcX.d/ 下 S 开头的脚本。这就过渡到下一个目录 /etc/rcX.d/ 了。
ls 一下 /etc/rcX.d/,发现里面全是一堆到 /etc/init.d/ 中的脚本符号链接,不同的是它们的开头加上了 S 和一个数字。熟悉原本 init 的人应该知道,S 表示在启动时运行,数字则表示执行的先后顺序。其中有一个链接叫做 S30gdm,gdm 的意思是 gnome display management,也就是用来启动 gnome 桌面的。
二. x-window 启动过程解析
从控制台进入 X 一般用 startx 命令,故启动应该从 startx 这个脚本开始分析。以下是 startx 脚本的一部分:
#!/bin/sh
userclientrc=$HOME/.xinitrc #用户的 client 定义文件
userserverrc=$HOME/.xserverrc #用户的 server 定义文件
sysclientrc=/usr/X11R6/lib/X11/xinit/xinitrc #系统的 client
sysserverrc=/usr/X11R6/lib/X11/xinit/xserverrc #系统的 server
defaultclient=/usr/X11R6/bin/xterm #默认的 client 程序
defaultserver=/usr/X11R6/bin/X #默认的 server 程序
defaultclientargs= #下面定义了 client 和 server 的参数变量
defaultserverargs=
clientargs=
serverargs=
可以看到,startx 主要是置 X client 和 X server 所在的位置,并处理相关参数,*** 交给 xinit 处理。可以看出 startx 设置 X client 的位置是先搜寻 $HOME/.xinitrc,然后是 /etc/X11/xinit/xinitrc;设置 X server 的位置是先搜寻 $HOME/.xserverrc,然后是 /etc/X11/xinit/xserverrc。在 Ubuntu8.10 的 $HOME 下面没有.xinitrc 和.xerverrc,所以 startx 直接去 /etc/ 下面找 x -client 和 x -server,完成 Ubuntu 启动流程的工作。
到此,关于“Ubuntu 启动流程是怎样的”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注丸趣 TV 网站,丸趣 TV 小编会继续努力为大家带来更多实用的文章!