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这个文件控制了计算机的启动级别,及该级别下启动的进程。

[[email protected] 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/目录内,有如下目录。

[[email protected] 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中允许和不允许启动的进程,

  再进去目录看一下。

[[email protected] 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
[email protected] 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中的脚本文件。

[[email protected] 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/

[[email protected] 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中的状态。

[[email protected] 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启动过程

时间: 2024-10-08 10:57:16

Linux 启动详解之init的相关文章

Linux 目录详解 树状目录结构图

1.树状目录结构图 2./目录 目录 描述 / 第一层次结构的根.整个文件系统层次结构的根目录. /bin/ 需要在单用户模式可用的必要命令(可执行文件):面向所有用户,例如:cat.ls.cp,和/usr/bin类似. /boot/ 引导程序文件,例如:kernel.initrd:时常是一个单独的分区[6] /dev/ 必要设备, 例如:, /dev/null. /etc/ 特定主机,系统范围内的配置文件. 关于这个名称目前有争议.在贝尔实验室关于UNIX实现文档的早期版本中,/etc 被称为

Gentoo Linux安装详解--根据官方WiKi整理

1. 前期准备 远程登录: 开启ssh服务: /etc/init.d/sshd start 设置密码: passwd 以便使用putty.ssh client远程登录上传stage等(有时在线下载很慢,而局域网上传很快) 准备磁盘: 分区: fdisk /dev/sda /dev/sda1 : /boot 100M(32-100M) 设启动笔记-a/dev/sda2 : / 20G/dev/sda3 : /home 20G/dev/sda5 : /swap 1G (内存< 512 MB,分区分配

Gentoo Linux安装详解

1. 前期准备 远程登录: 开启ssh服务: /etc/init.d/sshd start 设置密码: passwd 以便使用putty.ssh client远程登录上传stage等(有时在线下载很慢,而局域网上传很快) 准备磁盘: 分区: fdisk /dev/sda /dev/sda1 : /boot 100M(32-100M) 设启动笔记-a/dev/sda2 : / 20G/dev/sda3 : /home 20G/dev/sda5 : /swap 1G (内存< 512 MB,分区分配

10.Linux系统启动详解

10.Linux系统启动详解 ·1.BIOS,负责检查硬件并且查找可启动设备, ·2.MBR:Boot Code, ·bios找到可启动设备后执行其引导代码,MBR的前446字节, ·/boot/grub/stage1内容为当前硬盘MBR的镜像, ·3.执行引导程序-GRUB ·grub是现在Linux使用的主流引导程序,可以用来引导大多数主流系统, ·Linux的grub可以识别windows的启动程序,但windows的会覆盖Linux的,故先windows后Linux, ·grub相关文件

Linux procfs详解

1.0 proc文件系统总览在类Unix系统中体现了一种良好的抽象哲学,就是几乎所有的数据实体都被抽象成一个统一的接口--文件来看待,这样我们就可以用一些简单的基本工具完成大量复杂的操作.在Linux中存在着一类特殊的伪文件系统,用于使用与文件接口统一的操作来完成各种功能,例如ptyfs.devfs.sysfs和procfs.而procfs就是其中应用最广泛的一种伪文件系统.procfs是Linux内核信息的抽象文件接口,大量内核中的信息以及可调参数都被作为常规文件映射到一个目录树中,这样我们就

Android之Zygote启动详解

我们知道Android系统是基于Linux内核的,在Linux系统中所有的进程都是init进程的子进程.Zygote也一样它是在系统启动的过程中由init进程创建的,在系统启动脚本init.rc中: <span style="font-size:14px;">@init.rc service zygote /syste/bin/app_process -Xzygote /system/bin -zygote --start-system-server class main

Linux基本命令详解《二》(Linux中对目录和文件管理所使用的命令)

Linux基本命令详解<二>内容概述:Linux目录结构查看及检索文件备份及恢复文档vi文本编辑器一,Linux目录结构:树形目录结构(自顶而下)常见的子目录及作用:a./root:系统管理员root的宿主目录b./home:普通用户的宿主目录c./boot:系统内核/启动文件d./dev:设备文件e./etc:配置文件f./bin:所有用户可执行的命令g./sbin:管理员可执行的管理命令h./usr:应用程序i./var:日志文件(俗称可变长文件目录)j./proc :硬件配置信息k. /

centos启动详解

centos启动的过程是怎样的呢? 1:加载BIOS信息(计算机的硬件信息在BIOS中有保存的)找到第一个引导设备(硬盘在bios里我们可以设置boot引导) 2:根据第一个引导设备找到它的MBR  的boot Loader(mbr是硬盘的第一个扇区 boot Loader可以认为是grub spfdisk等程序 ) 3:boot Loader 找kernel(内核),kernel会加载硬件信息和加载驱动程序(这里由硬件转到软件了) 4:之后会调用init进程 init会让各相关服务启动起来 c

PXE的概述及Linux使用详解

PXE的概述及使用详解 现在企业采购的很多计算机都是没光驱的,怎么安装系统呢?另外,如何能快速大规模安装Linux服务器操作系统呢,有什么好办法吗? 答案是有的,那就是本文要说的:PXE PXE(preboot execute environment,预启动执行环境)是由Intel公司开发的最新技术,工作于Client/Server的网络模式,支持工作站通过网络从远端服务器下载映像,并由此支持通过网络启动操作系统,在启动过程中,终端要求服务器分配IP地址,再用TFTP(trivial filet