Linux 启动之init
1.init初探
init是Linux系统操作中不可缺少的程序之一。init进程,它是一个由内核启动的用户级进程,然后由它来启动后面的任务,包括多用户环境,网络等。
内核会在过去曾使用过init的几个地方查找它,它的正确位置(对Linux系统来说)是/sbin/init。如果内核找不到init,它就会试着运行/bin/sh,如果运行失败,系统的启动也会失败。
根据实际看一下,我们来到/boot下,
可以看见,Grub就在这里,vmlinuz-2.6.32-358.el6.i686这个文件很重要,说通俗一点的话应该是我们的内核,在启动后加载所有驱动(这个有另外的章节再讲,这里不详述)。另外initramfs-2.6.32-358.el6.i686.img是启动init进程的一个镜像文件,包含一个最小的linux系统。
Linux内核在初始化之后会执行init进程,而init进程会挂载我们的根文件系统,但由于init程序也是在根文件系统上的,所以这就有了悖论。Linux采用两步走的方法来解决这个问题。Linux2.6版以前的方法是:除了内核vmlinuz之外还有一个独立的initrd.img映像文件,其实它就是一个文件系统映像,linux内核在初始化后会mount initrd.img作为一个临时的根文件系统,而init进程就是在initrd.img里的,然后init进程会挂载真正的根文件系统,然后umount initrd.img。但Linux2.6内核的实现方式却不太一样,虽然完成的功能是一样的。Linux2.6采用initramfs。initramfs:init ram filesystem,它是一个cpio格式的内存文件系统,其实这部分也有很多内容可以讲,我们以后再谈。
通常的步骤是先启动内核,然后内核挂载initrd.img,并执行里面的脚本来进一步挂载各种各样的模块,然后发现真正的root分区,挂载并执行/sbin/init。
如果没有这个文件,计算机的启动时第一个进程都启动不起来。有他存在1号进程才可以开启。相当于是一个指挥官,他要指挥哪些程序在启动时应当存在,哪些程序不应当存在。/etc/inittab文件是init在启动时读取的文件,也就是指挥官的决策书,这个决策书规定了当前战争的局势,比如和平局势、冷战局势、战争局势。以及该局势下的核心策略。init就是这样,通过inittab这个文件控制了计算机的启动级别,及该级别下启动的进程。
[root@hao boot]# cat /etc/inittab # Default runlevel. The runlevels used are: # 0 - halt (Do NOT set initdefault to this) # 1 - Single user mode # 2 - Multiuser, without NFS (The same as 3, if you do not have networking) # 3 - Full multiuser mode # 4 - unused # 5 - X11 # 6 - reboot (Do NOT set initdefault to this) # id:5:initdefault:
从这里可以看出,我这里linux的default启动级别是runevel 5(注意,此处不要擅自改为6,如果默认的runlevel是6,那么就会比较麻烦,为什么会这么说,看完下面每个级别具体对应的进程就会明白)。那么具体每个级别都是什么呢?其实每个级别都有若干个进程,只不过每个级别开的进程不同。
0:几乎所有进程都关闭,停机状态
1:单用户模式,root账户进行操作
2:多用户,不能使用net file system,一般很少用
3:完全多用户,一部分启动,一部分不启动,命令行界面
4:未使用、未定义的保留模式
5:图形化,3级别中启动的进程都启动,并且会启动一部分图形界面进程。
6:停止所有进程,卸载文件系统,重新启动
这些级别中1、2、4很少用,相对而言0、3、5、6用的会较多。3级别和5级别除了桌面相关的进程外没有什么区别。为了减少资源占用,推荐都用3级别。
那么这些级别是如何定义的呢,在/etc/rc.d/目录内,有如下目录。
[root@Hao rc.d]# ll total 60 drwxr-xr-x. 2 root root 4096 Mar 11 13:44 init.d -rwxr-xr-x. 1 root root 2617 Feb 22 2013 rc drwxr-xr-x. 2 root root 4096 Apr 3 08:36 rc0.d drwxr-xr-x. 2 root root 4096 Apr 3 08:36 rc1.d drwxr-xr-x. 2 root root 4096 Apr 3 08:36 rc2.d drwxr-xr-x. 2 root root 4096 Apr 3 08:36 rc3.d drwxr-xr-x. 2 root root 4096 Apr 3 08:36 rc4.d drwxr-xr-x. 2 root root 4096 Apr 3 08:36 rc5.d drwxr-xr-x. 2 root root 4096 Apr 3 08:36 rc6.d -rwxr-xr-x. 1 root root 220 Feb 22 2013 rc.local -rwxr-xr-x. 1 root root 19472 Feb 22 2013 rc.sysinit
在诸如rc3.d和rc5.d目录下有runlevel 3 和runlevel 5中允许和不允许启动的进程,
再进去目录看一下。
[root@Hao rc.d]# ls rc3.d/ K01smartd K69rpcsvcgssd S10network S26acpid K02oddjobd K73winbind S11auditd S26haldaemon K05wdaemon K75ntpdate S11portreserve S26udev-post K10psacct K75quota_nld S12rsyslog S28autofs K10saslauthd K76ypbind S13cpuspeed S50bluetooth K15htcacheclean K80kdump S13irqbalance S58ntpd K15httpd K84wpa_supplicant S13rpcbind S80postfix K15svnserve K87restorecond S15mdmonitor S82abrt-ccpp K25sshd K88sssd S22messagebus S82abrtd K30spice-vdagentd K89rdisc S23NetworkManager S90crond K36mysqld K95firstboot S24nfslock S95atd K50dnsmasq K99rngd S24rpcgssd S99certmonger K50netconsole S01sysstat S24rpcidmapd S99local K50snmpd S02lvm2-monitor S25blk-availability K50snmptrapd S08ip6tables S25cups K60nfs S08iptables S25netfs
root@Hao rc.d]# ls rc5.d/ K01smartd K75ntpdate S11portreserve S26udev-post K02oddjobd K75quota_nld S12rsyslog S28autofs K05wdaemon K76ypbind S13cpuspeed S50bluetooth K10psacct K80kdump S13irqbalance S55sshd K10saslauthd K84wpa_supplicant S13rpcbind S58ntpd K15htcacheclean K87restorecond S15mdmonitor S70spice-vdagentd K15httpd K88sssd S22messagebus S80postfix K15svnserve K89rdisc S23NetworkManager S82abrt-ccpp K36mysqld K95firstboot S24nfslock S82abrtd K50dnsmasq K99rngd S24rpcgssd S90crond K50netconsole S01sysstat S24rpcidmapd S95atd K50snmpd S02lvm2-monitor S25blk-availability S99certmonger K50snmptrapd S08ip6tables S25cups S99local K60nfs S08iptables S25netfs K69rpcsvcgssd S10network S26acpid K73winbind S11auditd S26haldaemon
这些都是链接文件lrwxrwxrwx,链接的路径都是/etc/init.d中的脚本文件。
[root@Hao rc.d]# ll rc3.d/ | grep ab lrwxrwxrwx. 1 root root 19 Feb 10 19:46 S08ip6tables -> ../init.d/ip6tables lrwxrwxrwx. 1 root root 18 Feb 10 19:44 S08iptables -> ../init.d/iptables lrwxrwxrwx. 1 root root 26 Feb 10 19:51 S25blk-availability -> ../init.d/blk-availability lrwxrwxrwx. 1 root root 19 Feb 10 19:46 S82abrt-ccpp -> ../init.d/abrt-ccpp lrwxrwxrwx. 1 root root 15 Feb 10 19:46 S82abrtd -> ../init.d/abrtd
K开头的文件意味着是要关闭进程的文件,S开头的进程则是开启的进程,之后的数字表示启动的顺序,比如S23NetworkManager和S80postfix都要依赖S10network,如果这个顺序错了或者电脑了,那么和网络有关的程序都会启动错误,这个也在管理服务器的过程中也需要定期去看一下。
对比rc3.d/目录与rc5.d/
[root@Hao rc.d]# diff rc3.d/ rc5.d/ Only in rc3.d/: K30spice-vdagentd Only in rc5.d/: S70spice-vdagentd
发现spice-vdagentd服务在runlevel 3中是KILL的,在runleve5是START的,spice-vdagentd服务是Redhat桌面虚拟组件之一,所以在runlevel3中没必要开,在runleve5中是要开启的,否则Linux将无法提供桌面服务,除此之外,两个运行级别没区别。
还记得那个之前提到的决策书吗?核心策略对应的会启动的内容都是在这里,比如和平局势(之于runlevel 1)下启用基本的民防系统(之于S01sysstat)就可以了,冷战时期(之于runlevel 3)除了民防以外,还开启了自卫系统(之于S08iptables)、消息传递(S10network)、警报机制(之于S22messagebus)、派遣间谍(之于sshd)、调动步兵部队(之于httpd)等等,如果是战争时期(之于runlevel 5)除了上面种种之外还要启动更多的战争活动,调度更强大的部队。
2.相关命令
通过chkconfig –level 3 sshd off在运行级别中的开启或者关闭服务。
通过chkconfig –list sshd来查看sshd在所有runlevel中的状态。
[root@Hao rc.d]# chkconfig --list sshd sshd 0:off 1:off 2:on 3:on 4:on 5:on 6:off[root@Hao rc.d]# chkconfig --level 3 sshd off[root@Hao rc.d]# chkconfig --list sshd sshd 0:off 1:off 2:on 3:off 4:on 5:on 6:off
init 6是重启,init 0是关机。
# who –r 查看当前级别
run-level 5 2012-09-02 06:23
3.附文1.不小心把init 默认的运行级别设为6怎么办
通过查看 /etc/rc.d/rc6.d可以看到,runlevel 6中只有两个服务是开启的,分别是 S00killall和S01reboot,如果默认的运行级别设为6,那么重启之后,机器会不停重启。
如果真的意(shou)外(jian)把默认的runlevel运行级别设置成了6,那么需要如下操作更改默认运行级别。在GRUB界面按e
然后选中第二行,再按e进入
在出现的命令行后加 [\空格]1 (单用户),按Enter键确认操作并后退到Linux配置页面
再按b重启Linux进入单用户模式就可以修改了,我们这里改为3好了。然后重启就可以了。
4.推荐文章
Linux启动这个很不经意的过程里面包含了太多的内容,本文只是介绍了很小的一部分,推荐大家去深入了解,顺便推荐几篇还不错的文章。
rc.d rc.local rc.sysinit 等Linux系统脚本启动顺序详解 作者:jsxubar (朱秀龙)
Linux2.6 内核的 Initrd 机制解析 作者: dazhi.li(李 大治)
深入理解linux启动过程
转自:https://www.cnblogs.com/LinuxBlogs/p/4389415.html
Linux 启动之init相关推荐
- 启动级别:init 0,1,2,3,4,5,6
这是个很久的知识点了,只是自己一直都迷迷糊糊的,今天在翻出来好好理解下.. 0:停机 1:单用户形式,只root进行维护 2:多用户,不能使用net file system 3:完全多用户 5:图形化 ...
- Linux 启动详解之init
1.init初探 init是Linux系统操作中不可缺少的程序之一.init进程,它是一个由内核启动的用户级进程,然后由它来启动后面的任务,包括多用户环境,网络等. 内核会在过去曾使用过init的几个 ...
- Linux 启动流程即init程序分析--1
1.init程序剖析 init进程是内核引导过程完成时创建的第一个进程.Linux使用了init进程来对组成Linux的服务和应用程序进行初始化. 当 init 进程启动时(使用传统的 ...
- arm linux 启动之一:汇编启动到start_kernel
描述arm linux启动的概要过程,以S5PV210(Cortex A8)为例,本文描述第一个阶段. 一.arm linux的引导 uboot在引导arm linux(uImage镜像)到SDRAM ...
- linux 启动流程图
代码的执行 代码执行过程中,CS:IP始终指向下一条指令的地址~ 顺序执行:总是指向地址连续的下一条指令 跳转/分支:执行这样的指令的时候,cs : eip的值会根据程序需要被修改 call:将当前c ...
- linux 主进程 等待,Linux启动与进程
操作系统中,前台进程和后台进程有什么区别?特征是什么? 后台程序基本上不和用户交互,优先级别稍微低一点 前台的程序和用户交互,需要较高的响应速度,优先级别稍微高一点 直接从后台手工启动一个进程用得比较 ...
- Android的启动脚本–init.rc
在 Android中使用启动脚本init.rc可以在系统的初始化过程中进行一些简单的初始化操作.这个脚本被直接安装到目标系统的根文件系统中,被 init可执行程序解析. init.rc是在init启动 ...
- 服务器系统加速,系统加速技巧:让Linux启动更加快速
#5: 使用轻型发行版 不要装载重型的Fedora,为什么不试一下Gentoo.Arch或Puppy Linux呢?这些较小的发行版的启动时间比更加臃肿的Fedora(甚至Ubuntu)要快很多.在较 ...
- [转载] Linux启动过程详解-《别怕Linux编程》之八
本原创文章属于<Linux大棚>博客,博客地址为http://roclinux.cn.文章作者为rocrocket. 为了防止某些网站的恶性转载,特在每篇文章前加入此信息,还望读者体谅. ...
- 从无盘启动看 Linux 启动原理
作者:bobyzhang,腾讯 IEG 运营开发工程师 0. 故事的开始 0.1 为什么和做什么 最近家里买了对音响,我需要一个数字播放器.一凡研究后我看上了 volumio(https://volu ...
最新文章
- python 取list 里面最大的数或者最小数
- python分隔符的使用,在python中使用分隔符“\”拆分字符串
- mac mysql使用_在Mac中安装和使用MySQL
- (xy)+((x^y)1)
- 转:Linux搭建git私服
- ios开发中遇到的文件和字符的问题大总结
- 自动布局AutoLayout
- 关于Restful Web Service的一些理解
- express ajax分页实例,DevExpress Navigator 数据分页 示例
- arm汇编—str,mov等指令
- 蜘蛛侠天堂,打死我mac键盘
- java选课管理_学生选课管理系统(Java语言期末前测试)
- 8月5日发布卡巴斯基授权许可key-卡巴斯基key
- 桌面应用之electron开发
- python多种方法压缩图片,opencv、PIL、tinypng、pngquant压缩图片
- 最新网狐旗舰版整理、编译和搭建教程
- 【Java面试题】常规Java面试题分享
- AT32 MCU Audio 24bit例程
- Pycharm工具栏等菜单设置
- unity3d资源管理
热门文章
- 2.1.1 -1【SV数据类型、过程快、方法、例化连接】
- 西门子S7-200PLC和昆仑通泰MCGS触摸屏控制步进伺服
- 怎么做好软件项目的管理
- 修改CentOs7 上Docker默认文件系统DeviceMapper为OverlayFS
- mysql默认join是什么类型_理解 SQL 中的各类 JOIN
- js常用插件(十二)之手写签名jsignature.js
- 漫漫人生路---第一记
- 一个程序在计算机中是如何运行的?超级干货!!!
- 局域网发现服务-Bonjour from apple
- UWB定位 | 监狱人员精准管控,助力司法安全!