当前位置: 首页 > Linux

【转】Linux操作系统启动流程

时间:2023-04-06 22:35:26 Linux

总启动流程这部分转自:https://www.cnblogs.com/liang-io/p/9651656.html一般来说,所有操作系统的启动流程都是基本上:一般来说,linux系统的开机过程可以简单概括为以下几个步骤:开机BIOS自检,加载硬盘。读MBR,引导MBR。grub启动菜单(BootLoader)。加载内核内核。启动init进程,根据inittab文件设置运行级别init进程,执行rc.sysinit文件。启动内核模块,执行不同层次的脚本程序。执行/etc/rc.d/rc.local启动mingetty,进入系统登录界面。Linux系统安装时,如果要设置启动项,可以:开机到BIOS提示界面,按F11(戴尔服务器方式)进入BIOS设置BOOTMENU,然后设置启动项:硬盘HD启动,CD/DVD启动,或U盘USB启动。详细过程下面是对linux操作系统启动过程的详细分析记录。1、加载内核操作系统接管硬件后,首先读取/boot目录下的内核文件。[root@bastion-IDC~]#ll/boot/total21668-rw-r--r--。1rootroot1051952013年11月22日config-2.6.32-431.el6.x86_64drwxr-xr-x。3rootroot1024Aug2216:31efidrwxr-xr-x。2rootroot1024Aug2216:32grub-rw------。1根根152171538月22日16:32initramfs-2.6.32-431。el6.x86_64.imgdrwx-----。2rootroot12288Aug2216:24lost+found-rw-r--r--。1rootroot1937582013年11月22日symvers-2.6.32-431.el6.x86_64.gz-rw-r--r--。1rootroot25182362013年11月22日System.map-2.6.32-431.el6.x86_64-rwxr-xr-x。1rootroot41283682013年11月22日vmlinuz-2.6.32-431.el6.x86_642。启动初始化进程内核文件加载后,开始运行第一个程序/sbin/init,用于初始化系统环境。由于init是第一个运行的程序,因此它的进程号(pid)为1。所有其他进程都派生自它并且是它的子进程。3、确定运行级别很多程序都需要在电脑上启动。它们在Windows中称为“服务”,在Linux中称为“守护进程”。init进程的一个主要任务就是运行这些启动程序。但是,在不同的场合需要启动不同的程序。例如,Apache作为服务器需要启动,作为桌面则不需要。Linux允许为不同的场合分配不同的引导程序,这称为“运行级别”。也就是说,根据启动时的“运行级别”,决定运行哪些程序。Linux预设了七个init操作级别(0-6):0:关机模式(相当于poweroff)1:单用户模式??2:无网络支持的多用户模式??3:有网络支持的多用户模式(即文本Mode,工作中最常用的模式)4:保留,不用5:X-windowswithnetworksupport支持多用户模式(即桌面图形模式)6:Rebootthesystem,即重启(相当于reboot)init进程首先读取文件/etc/inittab,这是运行级别的设置文件。打开可以看到第一行是这样的:[root@bastion-IDC~]#cat/etc/inittab....id:3:initdefault:initdefault的值为3,说明系统在系统启动时运行Level3。如果需要指定其他级别,可以手动修改该值。那么,运行级别3中有哪些程序,系统如何知道每个级别应该加载哪些程序?答案是每个运行级别在/etc目录下都有对应的子目录,指定要加载的程序。/etc/rc0.d/etc/rc1.d/etc/rc2.d/etc/rc3.d/etc/rc4.d/etc/rc5.d/etc/rc6.d上面目录名中的“rc”,表示runcommand(运行程序),最后一个d表示directory(目录)。让我们看看/etc/rc3.d目录中指定了哪些程序。[root@bastion-IDC~]#ll/etc/rc3.d/total0lrwxrwxrwx.1rootroot19Aug2216:30K10saslauthd->../init.d/saslauthdlrwxrwxrwx。1rootroot18Aug2216:47K15svnserve->../init.d/svnservelrwxrwxrwx。1rootroot15Aug2316:21K25squid->../init.d/squidlrwxrwxrwx。1rootroot19Dec2313:14K45memcached->../init.d/memcachedlrwxrwxrwx。1rootroot20Aug2216:30K50netconsole->../init.d/netconsolelrwxrwxrwx。1rootroot13Dec2117:45K60nfs->../init.d/nfslrwxrwxrwx。1rootroot20Dec2117:45K69rpcsvcgssd->../init.d/rpcsvcgssdlrwxrwxrwx。1rootroot17Nov2414:45K75ntpdate->../init.d/ntpdatelrwxrwxrwx。1rootroot20Aug2216:31K87multipathd->../init.d/multipathdlrwxrwxrwx。1rootroot21Aug2216:30K87restorecond->../init.d/restorecondlrwxrwxrwx。1rootroot15Aug2216:30K89rdisc->../init.d/rdisclrwxrwxrwx。1rootroot22Aug2216:31S02lvm2-monitor->../init.d/lvm2-monitorlrwxrwxrwx。1rootroot16Aug2216:31S07iscsid->../init.d/iscsidlrwxrwxrwx。1rootroot19Aug2216:30S08ip6tables->../init.d/ip6tableslrwxrwxrwx。1rootroot18Aug2216:30S08iptables->../init.d/iptableslrwxrwxrwx。1rootroot17Aug2216:30S10network->../init.d/networklrwxrwxrwx。1rootroot16Aug2216:31S11auditd->../init.d/auditdlrwxrwxrwx。1rootroot17Aug2216:30S12rsyslog->../init.d/rsysloglrwxrwxrwx。1rootroot15Dec2117:45S13iscsi->../init.d/iscsilrwxrwxrwx。1rootroot17Dec2117:45S13rpcbind->../init.d/rpcbindlrwxrwxrwx。1rootroot17Dec2117:45S14nfslock->../init.d/nfslocklrwxrwxrwx。1rootroot19Aug2216:31S15mdmonitor->../init.d/mdmonitorlrwxrwxrwx。1rootroot17Dec2117:45S19rpcgssd->../init.d/rpcgssdlrwxrwxrwx。1rootroot26Aug2216:31S25blk-availability->../init.d/blk-availabilitylrwxrwxrwx。1根根22年8月15日16:30S25netfs->../init.d/netfslrwxrwxrwx。1rootroot19Aug2216:30S26udev-post->../init.d/udev-postlrwxrwxrwx。1rootroot18Oct2511:49S50onealert->../init.d/onealertlrwxrwxrwx。1rootroot14Aug2216:31S55sshd->../init.d/sshdlrwxrwxrwx。1rootroot16Oct2609:47S56xinetd->../init.d/xinetdlrwxrwxrwx。1rootroot17Aug2216:30S80postfix->../init.d/postfixlrwxrwxrwx。1rootroot15Aug2216:30S90crond->../init.d/crondlrwxrwxrwx。1rootroot11Aug2216:30S99local->../rc.local可以看到:字母S表示Start,即启动的意思(启动脚本的运行参数为start)。如果这个位置是字母K,则表示Kill(关闭),即如果从其他运行级别切换时,需要关闭程序(启动脚本的running参数为stop)。后面两位数字表示处理顺序,数字越小越早处理,所以最先启动的程序是motd,然后是rpcbing,nfs……当数字相同时,按照程序的字母顺序启动程序名称,所以rsyslog将在sudo之前启动。该目录下的所有文件(README除外)都是启动时加载的程序。如果要增加或删除一些程序,不建议手动修改/etc/rcN.d目录,最好使用一些特殊的命令来管理(参考这里和这里)。4、载入启动程序前面说过,预设的7个“运行级别”各有一个目录,里面存放着开机时需要启动的程序。不难想象,如果多个“运行级别”需要启动同一个程序,那么这个程序的启动脚本在每个目录下都会有一份。这样会造成管理上的麻烦:如果要修改启动脚本,不是每个目录都要改吗?Linux的解决办法是将/etc/rcN.d这7个目录下列出的程序都设置为链接文件,指向另一个目录/etc/init.d,真正的启动脚本都放在这个目录下。init进程一个一个加载启动程序,其实就是运行这个目录下的启动脚本。这是链接文件实际指向的内容:[root@bastion-IDC~]#ls-l/etc/rc3.dlrwxrwxrwx。1rootroot10Aug2216:30/etc/rc3.d->rc.d/rc3。这样做的另一个好处是,如果你想手动关闭或重启一个进程,只要到目录/etc/init.d中找到启动脚本即可。比如我想重启iptables服务器,我运行如下命令:[root@bastion-IDC~]#/etc/init.d/iptablesrestart/etc/init.d目录名最后一个字母d意思是directory,表示这是一个目录,用来区别于程序/etc/init.d5、用户登录启动程序加载完成后,就到了用户登录的时候了。一般来说,用户登录有三种方式:命令行登录、ssh登录、GUI登录。在这三种情况下,每种情况都有自己的方式来验证用户。1)命令行登录:init进程调用getty程序(意思是getteletype),让用户输入用户名和密码。输入完成后,调用登录程序检查密码(Debian会运行另一个身份检查程序/etc/pam.d/login)。如果密码正确,则从文件/etc/passwd中读取并启动用户指定的shell。2)ssh登录:此时系统调用sshd程序(Debian会再次运行/etc/pam.d/ssh),替换getty和login,然后启动shell。3)图形界面登录:init进程调用显示管理器,Gnome图形界面对应的显示管理器为gdm(GNOMEDisplayManager),然后用户输入用户名和密码。如果密码正确,读取/etc/gdm3/Xsession并启动用户会话。6、进入登录shell所谓shell,简单来说就是一个命令行界面,让用户直接与操作系统对话。用户登录时打开的shell称为登录shell。Linux默认的shell是Bash,它读取一系列的配置文件。本步骤中对上一步中的三种情况的处理也有所不同。命令行登录:先看/etc/profile,这是对所有用户有效的配置;然后依次查找以下三个文件,这是当前用户的配置。~/.bash_profile~/.bash_login~/.profile需要注意的是,只要这三个文件有一个存在,后面的文件就不会被读入,比如~/.bash_profile存在,后面两个文件不会被阅读。ssh登录:与第一种情况完全一样。GUI登录:仅加载/etc/profile和~/.profile。也就是说,无论~/.bash_profile是否存在,它都不会运行。7、打开非登录shell老实说,在上一步完成后,Linux的启动过程就结束了,用户已经可以看到命令行提示符或者图形界面了。但是,为了完整起见,这一步必须再次介绍。用户进入操作系统后,往往会手动启动一个shell。这种shell称为非登录shell,意思是它不同于登录时出现的shell,不读取/etc/profile和.profile等配置文件。非登录shell的重要性不仅在于它是用户最常接触到的shell,还在于它读取的是用户自己的bash配置文件~/.bashrc。大多数时候,我们对bash的定制都是写在这个文件中的。你可能会问,如果不进入非登录shell,.bashrc不运行,bash就不能完成定制了吗?其实Debian已经考虑到了这个问题,请打开文件~/.profile,可以看到如下代码:if[-n"$BASH_VERSION"];然后  if[-f"$HOME/.bashrc"];然后    。"$HOME/.bashrc"  fifi上面的代码首先判断变量$BASH_VERSION是否有值,然后判断home目录下是否有.bashrc文件,如果存在则运行该文件。第三行开头的点是source命令的缩写形式,意思是运行某个文件,也可以写成“source~/.bashrc”。因此,只要运行~/.profile文件,~/.bashrc文件就会一起运行。但是在上一节第一种情况中提到,如果有~/.bash_profile文件,那么~/.profile文件可能运行不了。解决这个问题很简单,只需将下面的代码写入.bash_profile即可。如果[-f~/.profile];然后  。~/.profilefi这样,无论什么情况,.bashrc都会被执行,用户的设置可以安全的写入这个文件。Bash的设置之所以如此繁琐,是有历史原因的。早期电脑运行很慢,加载配置文件需要很长时间。Bash的作者不得不将配置文件分成几个部分,分阶段加载。系统的通用设置放在/etc/profile中,需要被所有子进程继承的用户个人设置放在.profile中,不需要继承的设置放在.bashrc中。顺便说一句,除了Linux,MacOSX使用的shell也是Bash。但是,它只加载.bash_profile,然后在.bash_profile中调用.bashrc。而且,无论是ssh登录还是图形界面启动shell窗口都是如此。附:启动过程思维导图图片转自:https://mm.edrawsoft.cn/template/12597欢迎关注我的微信公众号【数据库内核】:分享主流开源数据库和存储引擎相关技术。标题网址GitHubhttps://dbkernel.github.io知乎https://www.zhihu.com/people/...SegmentFaulthttps://segmentfault.com/u/db...掘金https://juejin.im/user/5e9d3e...CSDNhttps://blog.csdn.net/dbkernel博客园(cnblogs)https://www.cnblogs.com/dbkernel