1 Linux开机流程
——————————————————————————–
1.1 加载BIOS 的硬件信息和进行自我测试,并依据设定取得第一个可开机的装置
——————————————————————————–
BIOS(Basic Input Output System):系统加载BIOS,并通过BIOS加载CMOS的信息,并且借由CMOS内的设定值取得主机的各项硬件配置;BIOS依据获取的信息进行开机自我测试(Power-on Self Test, POST) ,并确定可开机的装置顺序。
1.2 读取并执行第一个开机装置内MBR 的boot Loader (亦即是grub, spfdisk 等开机启动管理程序)
——————————————————————————–
由于不同的os的filesystem格式不同,需要开机管理程序来处理核心档案加载 (load),即所谓的boot loader。boot loader 程序安装在第一个开机装置的第一个扇区(sector) 内,即MBR(Master Boot Record,主要启动记录区,446bytes)。BIOS通过INT13中断来读取MBR。每个操作系统默认会安装一套boot loader 到他自己的文件系统中,这是多系统的前提。
1.3 依据boot loader 的设定加载Kernel ,Kernel 会开始侦测硬件与加载驱动程序
——————————————————————————–
boot loader依据设定读取内核文件,并解压缩到内存中,Kernel会开始侦测硬件与加载驱动程序。核心一般放在/boot/vmlinuz-核心版本,linux核心可以通过动态加载核心模块的(磁盘装置的驱动程序都是以模块的形式出现),这些核心模块就放置在 /lib/modules/ 目录内。
虚拟文件系统(Initial RAM Disk):/boot/initrd,通过boot loader加载到内存中仿真成一个根目录,该虚拟文件系统能够提供一支可执行的程序,透过该程序来加载开机过程中所最需要的核心模块。
boot loader 通过加载kernel和initrd,然后在内存中将initrd解压缩成为根目录,kernel 就能够藉此加载适当的驱动程序,最终释放虚拟文件系统,并挂载实际的根目录文件系统,就能够开始后续的正常开机流程。
1.4 在硬件驱动成功后,Kernel会主动启动init 程序,而init 会取得run-level 信息
——————————————————————————–
核心启动第一支程序/sbin/init,准备软件执行的环境,包括系统的主机名、网络设定、语系处理、文件系统格式及其他服务的启动等,依据的配置文件是/etc/inittab。inittab还会取得run-level(开机执行等级)。
1.5 init 执行/etc/rc.d/rc.sysinit 档案来准备软件执行的作业环境(如网络、时区等)
——————————————————————————–
init 处理系统初始化流程(/etc/rc.d/rc.sysinit),包括决定是否启动SELinux、读取网络配置文件/etc/sysconfig/network、用户自定义模块的加载/etc/sysconfig/modules/*.modules、以fsck 检验磁盘文件系统:filesystem check 、清除开机过程当中的临时文件、将开机相关信息加载到/var/log/dmesg文件中等。
1.6 init 执行run-level 的各个服务的启动(script 方式)
——————————————————————————–
依据run-level来启动系统服务与相关启动配置文件(/etc/rc.d/rc N & /etc/sysconfig)。例如run-level为5,即图形界面启动时,会执行那个/etc/rc5.d/目录下的脚本,每一个脚本都真实指向/etc/init.d/目录下的对应启动脚本。最后一个执行的为/etc/rc.d/rc.local。
1.7 init 执行/etc/rc.d/rc.local 档案
——————————————————————————–
执行用户自定义开机启动程序/etc/rc.d/rc.local。
1.8 init 执行终端机仿真程序mingetty 来启动login 程序,最后等待用户登入
2 开机过程的相关文件和关键点
——————————————————————————–
2.1. 关于模块加载的配置文件:/etc/modprobe.d/*.conf:(CentOS6.5中已经不再使用/etc/modprobe.conf文件。)
2.2. /etc/sysconfig/*:开机过程中读取的相关配置文件,包括authconfig(规范使用者的身份认证机制)、network-scripts/*(网卡设定)等。
2.3. 关于核心与核心模块(驱动模块):
核心: /boot/vmlinuz 或/boot/vmlinuz-version;
核心解压缩所需RAM Disk: /boot/initrd (/boot/initrd-version);
核心模块: /lib/modules/version/kernel 或/lib/modules/$(uname -r)/kernel;
核心原始码: /usr/src/linux (预设不安装)
核心版本: /proc/version
系统核心功能: /proc/sys/kernel
两种方法加入新硬件的驱动模块:重新编译核心,并加入相应驱动程序源码;将该硬件的驱动程序编译成为模块,在开机时加载该模块。
内核模块的相关性:/lib/modules/$(uname-r)/kernel中模块相关性记录在/lib/modules/$(uname-r)/modules.dep文件中,使用depmod命令来建立该文件。
内核模块相关命令:lsmod——显示目前已经存在于核心当中的模块,模块相关性也会显示
modinfo——显示某个模块详细信息
modpobe——自动分析模块相关性(modprobe.dep)并加载模块,-r移除模块
insmod——手动加载完整文件名的模块
rmmod——移除模块,-f强制移除,-w等待使用完再移除
ps:insmod、rmmod的操作模块有依赖性时,无法完成操作。
2.4. initrd:initrd文件包含/lib/modules/$(uname-r)/kernel/ 当中开机必需的模块,在开机时通过主机的 INT13 硬件功能将该文件读出来解压缩,initrd 在内存中仿真成为根目录,由于此虚拟文件系统(Initial RAM Disk)主要包含磁盘与文件系统的模块,则核心最后就能够识别实际的磁盘,就能够进行实际根目录的挂载。使用mkinitrd命令重制initrd文件:mkinitrd [-v] [–with=模块名称] initrd文件名 核心版本
2.5. 关于开机管理神器grub:
通过配置文件/boot/grub/menu.lst来修改和增加启动项,增加启动项后需通过grub将主程序安装到系统中(比如setup(hd0),如MBR 的(hd0) 戒boot sector 的(hd0,0) 等等
为某个启动项加密:grub-md5-crypt,获取加密后的密码,添加在menu.lst文件对应title的下面的第一行,eg:title CentOS
password –md5 $1$kvlI0/$byrbNgkt/.REKPQdfg287.
不安全性:用户可以透过编辑模式(e)进入选单,并删除密码字段并按下b就能够进行开机流程,所以要加密menu.lst文件:将password放在所有的title前面,并在需要锁定的title下面加上lock来锁定,该启动项只能按p来解锁。