linux启动过程
RedHat Enterprise 5
1.文件系统布局
①/bin、/sbin、/lib、/dev、与/etc这5个分区必须存放于根文件系统(Root Filesystem)中.
所谓根文件系统就是存储根目录数据的文件系统,有时又称根设备。
/bin:存储常用且开机时必须用到的执行文件。
/sbin:存储着开机过程中所需的系统执行文件
※/lib:存储/bin、/sbin的执行文件所需的链接库,以及linux内核模块。
/dec:存储设备文件
/etc:存储重要的配置文件,比如各种服务的启动时的配置文件
这样就是为什么grub.conf中开机三巨头中有一句
kernel /VMlinuxz-2.6.18-8.el5 ro root=LABEL=/ rlgb quiet
以只读方式挂在根文件系统
根文件系统之所以在前面加一个”根“,说明它是加载其它文件系统的”根“,既然是根的话,那么如果没有这个根,其它的文件系统也就没有办法进行加载的。它包含系统引导和使其他文件系统得以挂载(mount)所必要的文件。
②/boot分区最好建在磁盘的第一个分区中,并且最好不要建立于LVM的逻辑卷上。
But 在FreeBSD中不要设置/boot 分区,这样会造成无法启动。
③如果不知道建多大的交换内存,则建立一个物理内存两倍大的SWAP。
PS:如果要架设因特网的服务器,则/var分区分的大一些。如果做桌面系统则,/home分区大一些。如果打算多装些软件,那么/usr能多大就多大。
2.分区
一、硬盘的组成(一个硬盘有若干张磁盘(Disk)构成):
①磁面:每一张磁盘的表面,称为磁面(Head)
②磁道:每一个磁面的空间,会逻辑地切割出许多磁道(Track)
③扇区:每一个磁道可以再切割出若干扇区(Sector),也是调用磁盘的最小单位。现今磁盘中的扇区的默认大小为512字节。
④柱面:一个硬盘有多个磁盘,n个磁盘上同一编号的磁道就组成一个柱面(Cylinder)
二、主引导扇区(引导扇区在每个分区里都存在,*主引导扇区*是硬盘的第一物理扇区。)
(PS: 备份主引导扇区:dd if=file_name of=/devsda1 bs=512 count=1
还原主引导扇区:dd if=/dev/sda1 of=file_name bs=512 conut=1 )
整张磁盘的第0号柱面的第0号磁面的第0号扇区就是主引导扇区。
| <-----------------512Bytes--------->|
初始化程序加载器 446Bytes |
分区数据表 64字节 |
检验码2 |
446+64+2=512主引导扇区,主引导记录MBR(Main Boot Record)和分区表DPT(Disk Partition Table)和验证码。
初始化程序加载器(主引导记录):用来存储操作系统的内核(只是内核的一部分,起到引导内核加载)
分区数据表:存储磁盘的分区信息。由于每一个分区都会占用16个字节,所以只能分4个主分区。(详见《鸟哥的私房菜》)
验证码:用来存放初始化程序加载器的验证码。
三、分区 细节 (分区后可以用partprobe 或partx + 设备名来跟新分区表)
①分区系统标识符
81---->linux的第一代ext
82---->swap空间
83---->ext2与ext3
8e--->LVM使用的分区
fd---->软件磁盘列阵的分区
5---->系统标识为5的扩展分区----最多只能存储12个逻辑分区的信息
85---->系统标识为85的扩展分区
IDE磁盘最多只能存储60个逻辑分区的信息
SCSI磁盘最多只能存储12个逻辑分区的信息
/etc/fstab 开机自动挂载文件.<-------/etc/mtab是它的备份配置文件
由于RedHat关机的最后一步包括卸载所有已挂载的文件系统。所以/etc/fstab就应运而生了。
磁盘设备名 挂载点 分区文件系统 文统参数 是否被dump 是否fsck检验扇区
LABEL=/ / ext3 defaults 1 1
LABEL=/boot /boot ext3 defaults 1 2
这是正常挂载分区卷标名、挂载点 、文件系统、和其他参数
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc procfs defaults 0 0
这种挂载的第一列和第3列看起来差距这么大是因为这些是和内核有关挂载在内存中的。
Linux提供了一种特殊的文件系统procfs,他通常以/proc目录的形式呈现。该目录包含了许多特殊文件用来对驱动程序和内核信息进行跟高层的访问。
第5列:是否能被dump备份(eg: dump 0 -f /dev/sda1 /boot 把/dev/sda1按照0备份级别备份到/boot目录下),0表示不要做dump备份,1表示要每天进行dump的操作,2表示不定期备份。通常这一列的值是1或0.
第6列:开机过程中,系统会默认会以fsck检验文件系统是否完整(clean)。不过,某些文件系统不用检验比如swap和一些特殊文件系统/peoc、/sys等。所以存在fsck自段来设置是否检验文件系统。0表示不检验,1表示最早检验(一般只有根文件系统设为1),2也是检验不过没有1早,其他文件系统设为2就行了。
Ps: 千万不要对已挂载的文件系统执行fsck
四、mount
monut | grep ‘/dev/sda1’ 查看挂载信息
mount -o remount,ro (已只读方式重新挂载,不需要先卸载哦) /dev/sda1 /boot
因为每个文件系统都有一个根目录,所以挂载这个动作只是把某一个文件系统的根目录,放在另一个目录中,原本文件系统的目录下的文件就暂时被遮蔽,取消挂载后又会恢复。即挂载就是使一个分区可以读取存入,就是放在一个目录下。谁挂上去就可以操作谁,互不影响,取消挂载后文件也不会消失。
3.系统启动流程
(1)BOIS
1.检测所有外置设备
2.寻找启动磁盘
(2)启动加载器
寻找主引导记录(通过这个446字节的小程序来加载存储到其他位置的操作系统)
(3)启动内核
当BOIS顺利执行启动加载器后,启动加载器会寻找存储在其他扇区中的操作系统,然后顺利启动操作系统。若是Red Hat 操作系统,那么启动加载器可以在启动LINUX内核时,传递一些参数给内核,以便让内核能够改变启动方式,或者取得启动时重要的信息。这些参数称为内核启动参数(Kernel Boot Parameter)
即在引导三巨头之一的后面加内核启动参数
kernel /VMlinuxz-2.6.18-8.el5 ro root=LABEL=/ rlgb quiet 3(启动Run level 3)
Linux启动内核后会执行下面几项工作
①检测所有硬件设备
Linux内核首先会向BIOS查询计算机的所有硬件设备的信息,然后自己接手管理这些硬件设备,以便提供给Red Hat Linux 系统使用。
②驱动硬件设备
要驱动硬件设备,linux就必须加载硬件的驱动程序。Red Hat Enterprise的驱动程序可以分为编译在内核镜像文件中的静态驱动程序(即initrd镜像,初始化内存磁盘镜像)和内核模块(kernel Module,全部存储在文件系统上)的动态驱动程序。
由于Linux此时还没挂载文件系统,所以不能使用在文件系统上的模块。启动内核阶段只会
使用静态驱动程序,驱动必要的硬件设备。
这里就引出了引导三巨头的最后一句:在内存中加载必要的驱动。
initrd /initrd-2.6.18-194.el5.img 它和内核版本是对应的!!
启动内核时,把initrd镜像文件加载到内存,内核便可以从initrd镜像文件加载外置设备的模块,再去驱动这些外置设备。如此一来,就可以让Linux 系统顺利挂载根文件系统并正常的启动Red Hat Enterprise Linux了。
③以只读方式挂载根文件系统.
挂载根文件系统的目的有两个:
1.安装适当的内核模块,以便驱动某些硬件设备或启动某些功能
2.启动存储于根文件系统中的init服务,以便让init服务接手后续的启动工作。
Ps: 根文件系统是采用只读方式进行挂载的即Linux内核只能读取根文件系统,而无法改变。这样做是因为此时的Linux内核仍在启动阶段,还不是很稳定,如果与读写方式挂载,万一Linux宕机了,可能破坏根文件系统上的数据,若破坏下次开机时还得花很多时间来修复。
④启动init服务
Linux内核启动后的最后一个动作,就是从根文件系统上找出并执行init服务。内核会按照下列顺序查寻init服务
①找/sbin是否有init服务
②/etc/init
③/bin/init
④如果都找不到,最后执行/bin/sh
在这个过程中,只要有某一步找到init,linux内核就会去执行该目录之中的init。然后让init服务辅助后续初始化系统使用环境的工作。
如果最后内核还是没找到init服务,Red Hat Linux内核就会显示“Kernel panic - not sysncing:
Attempted to kill init !!”,然后内核就慢慢的“死去”了。
(4)执行init服务
init服务时Linux启动后第一个被启动的程序,因此init服务的进程标识符永远是1.启动init服务时,init服务会读取/etc/inittab文件,根据/etc/inittab中的设置数据进行初始化系统环境的工作。/etc/inittab定义init服务在Linux启动过程中必须依序执行以下几个RC script
· /etc/rc.d/rc.sysinit
· /etc/rc.d/rc
· /etc/rc.d/rc.local
①/etc/rc.d/rc.sysinit
/etc/rc.d/rc.sysinit主要功能是设置系统的基本环境。当init服务执行rc.sysinit时,会做如下工作
·启动udev与SELinux子系统
udev负责管理 /dev中所有的设备文件,而SELinux则可以增强Linux系统的安全性。当rc.sysinit执行时,必须先启动这两个子系统,才能进行其他的初始化环境的工作。
你可以在启动内核时添加内核参数 selinux=0来禁止启动SELinux。Selinux=0,内核不识别它会把该参数向下传递给init服务供其使用,尽管参数不是给内核用的他也叫内核参数---》因为只能在启动内核前添加参数。
·设置内核参数
rc.sysctl会执行 sysctl -p(把/etc/sysctl.conf文件内容设置成Linux的内核参数),把配置文件读入内核参数。
·设置系统时间
·加载键盘对应表
·启用置换内存空间
rc.sysinit会执行 swapon -a (将/etc/fstab文件中所有设置为swap的设备,启动为交换区。)-e (不知道它是什么东西常与参数a一起出现)命令,以便根据/etx/fstab的设置启用所有的内存交换空间。
·设置主机名
rc.sysinit会根据 /etc/sysconfig/network的HOSTNAME参数设置Linux的主机名。
·检查并挂载所有文件系统
·初始化硬件设备
Linux除了在启动内核时以静态驱动程序驱动部分的硬件外,在执行rc.sysinit时,也会驱动几项硬件设备
1.定义在 /etc/modprobe.config的模块
2. ISA PnP的硬件设备
3.USB设备
·启用软件磁盘列阵与LVM
·若果有必要,卸载/initrd/
因为初始化内存磁盘镜像只在启动前有用,因此当Linux进入到这个阶段时,初始化内存磁盘已经没有价值了,所以rc.sysint会视情况卸除initrd ,以节省更多的内存空间。
·初始化串行端口设备
·清除过期的锁定文件与IPC文件
某些服务为了确保同时间只能执行一个实例(instance),通常会使用下面方法:
首先,当服务被执行时,先检查是已经有锁定文件(Lock File)存在。如果有,就表示之前已经有人执行过这个服务,那么服务就会结束;如果没有,那就会产生一个空的文件并且锁定。等到服务顺利结束的时候,在解除这个文件的锁定状态并将其删除。如此一来,就可以避免同时有多个进程实体执行。
当Linux主机因不正常关机而重新启动时,在不正常关机的一刹那,服务来不及删除这些锁定文件;重新开机时,锁定文件仍保留在磁盘上,这样会使Linux启动服务时发现锁定文件已经存在而无法顺利启动。
所以在启动过程中Linux会强迫清除所有残留下来的老旧锁定文件。
·重新设置磁盘参数
rc.sysinit的最后一项工作,则是根据 /etc/sysconfig/harddisk device_name 配置文件重新设置该dev设备的磁盘参数。
init服务执行完 /etc/rc.d/rc.sysinit后,紧接着就会执行/etc/rc.d/rc
②/etc/rc.d/rc
/etc/rc.d/rc 这个Script用来建立Runlevel的环境。
l0:0:wait:/etc/rc.d/rc 0 =====》 /etc/rc.d/rc0.d/
l1:1:wait:/etc/rc.d/rc 1 =====》 /etc/rc.d/rc1.d///单用户模式下,只启动唯一一个控制台终端
l2:2:wait:/etc/rc.d/rc 2 =====》 /etc/rc.d/rc2.d/
l3:3:wait:/etc/rc.d/rc 3 =====》 /etc/rc.d/rc3.d/
l4:4:wait:/etc/rc.d/rc 4 =====》 /etc/rc.d/rc4.d/
l5:5:wait:/etc/rc.d/rc 5 =====》 /etc/rc.d/rc5.d/
l6:6:wait:/etc/rc.d/rc 6 =====》 /etc/rc.d/rc6.d/
/etc/rc.d/rcN.d里面存放了许多S.*(启动某服务,start)和K.*(关闭某服务,kill)的脚本。
Chkconfig --level [服务] [on/off] 来改变/etc/rc.d/rcN.d里面的文件。
Eg:chkconfig --level 3 sshd on
这样/etc/rc.d/rc3.d里面只有一个K25sshd(number决定执行的顺序)
#init n 切换运行级别(runlevel 查看当前运行级别),比如当前是init 5然后运行init 3 。则系统进行的操作是。查看init 3 的文件,即/etc/rc.d/rc3.d里面的所有K***和S***。如果发现有K***的服务,在运行则运行K*** stop 来关闭服务。若果发现有S***开头的服务关闭,则运行S*** start 来开启这个服务。
开机启动时也是根据相应的运行级别,查看相应的/etc/rc.d/rcN.d 来开启关闭服务!!
/etc/rc.d/rcN.d里面的文件则是通过chkconfig来设置!!!eg:chkconfig sshd off
则/etc/rc.d/rcN.d里面只有K**sshd 这个文件!!从这也可以看出chkconfig可以设置开机启动某服务,就是通过控制/etc/rc.d/rcN.d来实现的!(详见鸟哥)
由此可以看出/etc/rc.d/rc是通过许多脚本来开关不同的服务来配置不同的RunLevel环境。
②/etc/rc.d/rc.local
/etc/rc.d/rc.local是整个启动过程中唯一一个可以修改的Rc Script.(因为如果 rc.sysint或rc出错的话可能直接导致系统无法启动,所以轻易不要修改这两个RC script)
如果你想在Linux启动过程中执行某些命令,或者执行某些工作的话,你可以把这写工作命令写入/etc/rc.d/rc.local。
Eg在开机登录信息中显示最后启动的时间信息。
首先,先接绍下/etc/issue.
从Linux的虚拟控制台(Virtual Console)登录系统时,你会看到类似下面的欢迎界面
Red Hat Enter[rise linux Server release 5 (Tikanga)
Kernel 2.6.18-8el5 on an i686
Login:
上面的欢迎界面由/etc/issue. 文件提供,该文件如下
(由man手册可知mingtty 能够识别/etc/issue文件中的特殊字符,见附录1)
Red Hat Enter[rise linux Server release 5 (Tikanga)
Kernel \r on an \m
/etc/inittab文件中
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
###在2、3、4、5级别上以ttyX为参数执行/sbin/mingetty程序,打开ttyX终端用于用户登录,
###如果进程退出则再次运行mingetty程序(respawn)
PS:几个Unix的主要分支:①FreeBSD ②Linux③Solari④MacOS X(X为罗马数字,发音为ten)
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。