Linux系统启动

下面主要以ubuntu的为准(我的版本是Ubuntu 14.04)

1.GRUB(引导系统启动程序),在ubuntu中,主要包括三个部分:

/boot/grub/grub.cfg
/etc/grub.d
/etc/default/grub
如果要修改配置文件,只需修改对后一个即可,即修改 /etc/default/grub文件,因为在/boot/grub/grub.cfg文件中提示到:

# DO NOT EDIT THIS FILE
#
# It is automatically generated by grub-mkconfig using templates
# from /etc/grub.d and settings from /etc/default/grub

执行命令:sudo gedit /etc/default/grub,得到文件内容,部分如下:

# If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.
# For full documentation of the options in this file, see:
#   info -f grub -n 'Simple configuration'

GRUB_DEFAULT=0#默认启动GRUB配置文件的第几个系统,编号从零开始(开机进入ubuntu会有一个选项,从这里计算排列的编号)。
#GRUB_HIDDEN_TIMEOUT=0
GRUB_HIDDEN_TIMEOUT_QUIET=true
GRUB_TIMEOUT=10#等待用户选择的时间
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX="locale=zh_CN"
修改完成后,按照提示,执行 sudo update-grub,这时,系统会自动更新/boot/grub/grub.cfg文件。

2. /etc/fstab 文件(启动需要挂在文件系统的信息)

打开这个文件,得到如下的信息:

# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
# / was on /dev/sda9 during installation
UUID=4ade1b2c-a88c-4cc5-bf7f-4d4efc1ca3e4 /               ext4    errors=remount-ro 0       1
# /boot was on /dev/sda7 during installation
UUID=e1cf63b8-d34f-4e3f-9cca-b5df185ae4f7 /boot           ext4    defaults        0       2
# /home was on /dev/sda12 during installation
UUID=765642d5-9e52-497b-a6b8-208fedd0caa5 /home           ext4    defaults        0       2
# /tmp was on /dev/sda11 during installation
UUID=6af197e3-6887-40ee-9f3c-6770c9cedb76 /tmp            ext4    defaults        0       2
# /usr was on /dev/sda10 during installation
UUID=d55e5b00-517e-4e27-a083-962c8db96a3b /usr            ext4    defaults        0       2
# swap was on /dev/sda8 during installation
UUID=d14f2972-d451-459d-aeab-b03850b6e306 none            swap    sw              0       0
其实就只一张表,有各种属性,下表对各属性进行说明:

1. <file system>: 你要挂载的文件系统的设备名称火块信息,也可以是远程的文件系统。如果是本地设备,可以写 /dev/sda1, /dev/sda5 等。如果是远程的文件系统,可以写 192.168.10.36:/home/。此外,还可以用卷标(label)或 UUID(Universally Unique Identify 全局唯一标识)来表示。默认的 /etc/fstab 就是采用 UUID 来表示的,这里也不详解了。 

 
        2. <mount point>: 挂载点,也就是自己找一个或创建一个目录,然后把文件系统<file system> 挂到这个目录下,然后就可以从这个目录中访问要挂载的文件系统。对于 swap 分区,这个域应该填写 none,表示没有挂载点。 
 
        3. <type>: 这里用来指定文件系统的类型。下面的文件系统都是目前 Linux 所能支持的:adfs, befs, cifs, ext3, ext2, ext, iso9660, kafs, minix, ms dos, vfat, umsdos, proc, reiserfs, swap, squashfs, nfs, hpfs, ncpfs, ntfs, affs, ufs。 
 
        4. <options>: 这里用来填写设置选项,各个选项用逗号隔开。由于选项非常多,而这里篇幅有限,所以不再作详细介绍,如需了解,请用命令 man mount 来查看。但在这里有个非常重要的关键字需要了解一下:defaults,它代表包含了选项 rw, suid, dev, exec, auto, nouser 和 async。 
              auto: 开机自动挂载 
              noauto: 开机不自动挂载 
              defaults: 按照大多数永久文件系统的缺省值设置挂载定义 
              ro: 按只读权限挂载 
              rw: 按可读可写权限挂载 
              user: 任何用户都可以挂载 
              user: 同步磁盘与内存中的数据,async 则是异步 
        请注意光驱和软驱只有在装有介质时才可以进行挂载,因此它是 noauto。 
 
        5. <dump>: 此处为 1 的话,表示要将整个 <fie sysytem> 里的内容备份;现在很少用到 dump 这个工具,在这里一般选 0。 0 表示不做 dump 备份,1 表示要进行 dump 备份,2 也表示要做 dump 备份,不过,该分区的重要行比 1 小。 
 
        6. <pass>: 这里用来指定如何使用 fsck 来检查硬盘。如果这里填 0,则不检查;挂载点为 / 的(即根分区),必须在这里填写 1,其它的都不能填写 1。如果有分区填写大于 1 的话,则在检查完根分区后,接着按填写的数字从小到大依次检查下去。同数字的同时检查。比如第一和第二个分区填写 2,第三和第四个分区填写 3,则系统在检查完根分区后,接着同时检查第一和第二个分区,然后再同时检查第三和第四个分区。
 
        当编辑了 /etc/fstab 后,为了避免可能的错误,通常回使用 mount -a 命令来测试,这是很重要的测试!

3. /etc/init文件(系统启动的默认参数文件):来源:

ubuntu与传统的不太一样,默认情况下是找不到/etc/inittab文件的,而且运行级别也有差别,具体分这样几个级别:

# 0 – 关闭系统

# 1 – 单用户模式

# 2~5 – 完整的多用户模式

# 6 – 重新启动

也就是说,默认情况下级别2、3、4、5都是一样的,同时系统的默认级别设定也不是在inittab文件中,而是写在/etc/init/rc-sysinit.conf文件中。打开此文件,可以找到下面一句:

env DEFAULT_RUNLEVEL=2

这表明系统当前默认是进入级别2。

另外,在此文见中还有一段以if [ -r /etc/inittab ] 开始的代码,这里保留了使用inittab指定系统默认运行级别的功能,也就是说,如果用户手动创建了/etc/inittab,那么init将以 /etc/inittab中指定的默认运行级别进行系统的启动。比如说用户希望系统以级别3为默认运行级别,则只需在inittab文件中加入如下一行:

id:3:initdefault:

在经过/etc/init/rc-sysinit.conf确定运行级别后,init将进一步运行/etc/init.d/rc,然后根据级别进入/etc/rc[?].d启动或关闭相应的服务。

服务的启动和关闭脚本

ubuntu下启动与关闭服务的脚本存放与/etc/rc[?].d目录下。其中[x]表示0~6,分别对应级别0~6,如/etc目录下的 rc0.d  rc1.d  rc2.d  rc3.d  rc4.d  rc5.d  rc6.d。假设rc-sysinit.conf或inittab中指定的默认级别是2,那么init将执行/etc/rc2.d目录下的脚本启动或关 闭相应服务。

如果打开/etc/rc[?].d目录,会发现这些目录下的文件都是形如SnnxxxxKnnxxxx符号链接(细看README说明文档),而且都是指向/etc /init.d。也就是说不同运行级别下服务的启动或关闭脚本均是放在/etc/init.d下,只不过根据不同级别的需要,在对应/etc /rc[?].d目录下放一个链接,不同的级别会需要不同的服务,因此不同/etc/rc[?].d目录下的链接文件也不尽相同以此区分。其中链接文件中以S开头的表示在调用/etc/init.d目录中对应脚本的时候会传递一个start参数,也就是启动对应服务,而以K开头的则是传递一个stop参数,由此关闭此服务,此处的K表示kill。S和K后面的nn是一个数字,表示本脚本被执行的先后顺序,小号在前大号在后,这样以解决不同服务之间可能存在的先后依赖关系。比如说ftp服务依赖于网络服务的启动,所以ftp服务的编号就要大于网络服务的编号,在网络服务启动后再行启动。最后的xxxx则是服务的名字。

另外,除了/etc/rc[0~6].d文件外,还有一个/etc/rcS.d目录,这个目录下的服务脚本与/etc/rc[0~6].d格式类似,也为指向/etc/init.d中的脚本的链接,但是会在/etc/rc[0~6].d中的脚本执行前首先被执行。

服务的安装

根据上面的介绍,如何将一个软件安装为服务也就比较清楚了,那就是在/etc/init.d添加一个服务的启动脚本,然后在需要启动服务的对应级别的/etc/rc[0~6].d中按照文件名格式添加一个指向/etc/init.d中脚本的符号链接

以apache2为例,默认情况下,apache2编译安装在/usr/local/apache2,apache2的服务器启动脚本是/usr /local/apache2/bin/apachectl,那么安装服务就是要把此apachectl拷贝到需要启动apache2服务器的运行级别对 应的/etc/rc[?].d目录下,一半来说ubuntu是运行在级别2下,所以也就是拷到/etc/rc2.d下,命令如下:

sudo cp /usr/local/apache2/bin/apachectl /etc/init.d/httpd

在这里,我们把拷贝的脚本文件名改为惯用的httpd,那么在系统服务中apache2的名称也就是httpd。

手动添加服务的话,就是要在/etc/rc2.d里为httpd作一个形如Snnxxxx的链接。假定启动顺序我们定为80,那么就是要建立一个指向/etc/init.d/httpd的链接/etc/rc2.d/S80httpd,命令如下:

sudo ln -s /etc/init.d/httpd /etc/rc2.d/S80httpd

然后用sysv-rc-conf或者chkconfig –list检查一下就能看到已经在运行级别2下建立的名为httpd的服务,重启后,系统会自动启动apache2。

现在要手动启动、关闭或重启httpd服务器可以使用service命令+服务名+参数的形式,如下三句分别是启动、关闭和重启apache2服务器的命令:

service httpd start

service httpd stop

service httpd restart

要安装服务除了以上手动作链接外,还可以使用一些工具软件来实现,比如常用的有update-rc.d、chkconfig和sysv-rc-conf等。

这里主要以update-rc.d为例

update-rc.d

如用update-rc.d在运行级别2,3,4,5中都添加httpd服务启动命令,并指定启动序号是80,可以如下(注意命令最后的那个点号不能少):

sudo update-rc.d httpd start 80 2 3 4 5 .

如果要在运行级别2,3,4,5中都添加httpd服务关闭命令,并指定关闭序号是80,则可以如下(注意命令最后的那个点号不能少):

sudo update-rc.d httpd stop 80 2 3 4 5 .

而如果要删除httpd服务,则用以下命令就删掉/etc/rc[?].d中所有存在的指向/etc/init.d/httpd的链接:

sudo update-rc.d httpd remove

另外,还可以用带有defaults参数的形式同时向运行级别2,3,4,5中添加启动服务命令,即Start命令,并同时向运行级别0,1,6添加关闭命令,即Kill命令,其中start命令的序号是80,kill命令的序号是90:

sudo update-rc.d httpd defaults 80 90

这条命令也等同于(注意命令stop前面和最后的那两个点号不能少):

sudo update-rc.d httpd start 80 2 3 4 5 . stop 90 0 1 6 .

以上两条命令的效果就是作了如下几个链接:

/etc/rc0.d/K90httpd -> ../init.d/httpd

/etc/rc1.d/K90httpd -> ../init.d/httpd

/etc/rc6.d/K90httpd -> ../init.d/httpd

/etc/rc2.d/S80httpd -> ../init.d/httpd

/etc/rc3.d/S80httpd -> ../init.d/httpd

/etc/rc4.d/S80httpd -> ../init.d/httpd

/etc/rc5.d/S80httpd -> ../init.d/httpd

chkconfig

查看所有服务在所有级别下的情况:

chkconfig –list

查看某服务的情况,如下将查看httpd服务在哪些级别下是被启动的:

chkconfig httpd

在此,如果httpd在2,3,4,5下是被启动,将返回信息:

httpd 2345

sysv-rc-conf

这个软件是有图形界面的,比较直观简单,就不多说了,看看就明白了。

rc.local

在/etc/rc[2~5].d目录下都会有一个S99rc.local,这是一个指向/etc/init.d/rc.local的链接,可以看 出,在正常的2~5级别启动的最后都会调用这个rc.local脚本,而/etc/init.d/rc.local中又会检查是否存在/etc /rc.local,并运行之,因此,我们就可以在/etc/rc.local中写入代码,来随系统启动某些程序,实现类似服务的功能。

系统的启动过程

综上,可以看到,系统的启动调用过程就如下过程:

内核 → /etc/init/rc-sysinit.conf → [/etc/inittab] → /etc/init.d/rc → /etc/rc[?].d → /etc/init.d/rc.local → /etc/rc.local




你可能感兴趣的:(Linux系统启动)