一、Linux系统启动流程
centos6 Linux系统启动流程大致概括为:POST加电自检-->Boot Sequence(BIOS)-->Boot Loader(MBR)-->Kernel(ramdisk)-->rootfs(readonly)-->/sbin/init等六个阶段。
POST加电自检
在接通电源后,系统会启动同CMOS上的POST程序,根据其配置信息读取硬件设备信息并检测硬件是否存在并能正常运行,然后对硬件设备进行初始化。
Boot Sequence(BIOS)
加电自检完成后,系统进入BIOS阶段,启动BOIS中的Boot Sequence程序来选择设备启动顺序,当检测到第一个可启动的设备时,该设备即为本次启动所需的设备。
Boot Loader(MBR)
当系统通过Boot Sequence确定了启动所需设备后,会读取设备中操作系统的核心文件,会启动存放在MBR分区中的Boot Loader管理程序。此程序为引导加载器,在Linux中使用的是GRUB和LILO两种,其中GRUB分为grub legacy和grub2两个版本。而LILO现主要用于移动设备内核。BootLoader程序主要功能是提供菜单信息,向用户提供不同的启动项目,来加载不同的操作系统或内核版本,将用户选的的系统或内核装载到RAM特定空间中加载,并将启动控制权移交内核。
Kernel(ramdisk)
在BootLoader读取操作系统内核文件后,会将内核问价解压装载至内存中,然后根据内核提供的功能开始探测可识别的各硬件设备,加载硬件驱动程序。在加载硬件驱动时,可能会借助虚拟文件系统ramdisk来加载驱动,此虚拟文件系统放置在/boot目录下以initrd开头的文件。
rootfs(readonly)
通过BootLoader程序将initrd加载至内存中,解压缩并模拟一个根文件系统,并以只读方式挂载,这个根文件系统能够提供一个可运行的程序,通过此程序加载在启动过程中所需的核心模块,加载完成后会协助内核唤醒/sbin/init程序。
/sbin/init
在加载内核和硬件及驱动信息完成后,会启动用户空间第一个执行程序/sbin/init,进行完成启动前的初始化操作。根据系统的不同,所采用的方式也有所不同:
centos5中采用SysV init方式,其配置文件为/etc/inittab
centos6中采用Upstart方式,并实现向下兼容。其配置文件为/etc/inittab和/etc/init/*.conf
centos7中采用Systemd方式。其配置文件为/usr/lib/systemd/目录下的所有文件
/sbin/init程序的处理流程:
1. 设置默认运行级别。运行级别包括以下几种:
0:关闭所有服务,关机
1:单用户模式(sigle user),root用户,无需认证,维护模式
2:多用户模式(multi user),会启动网络功能,但不会启动NFS,维护模式,需要用户认证
3:多用户模式,正常级别,完全功能模式,文本界面
4:预留级别
5:正常级别,完全功能多用户模式,图形界面
6:重启,关闭所有服务
2. 使用/etc/rc.d/rc.sysinit进行系统初始化。初始化操作分为以下几点:
- 设置主机名
- 设置欢迎信息
- 激活udev和selinux
- 挂载所有定义在/etc/fstab文件中的文件系统
- 检测根文件系统,并以读写方式重新挂载根文件系统
- 设置系统时钟
- 根据/etc/sysctl.conf文件来是指内核参数
- 激活lvm及软raid设备
- 激活swap设备
- 加载额外设备的驱动程序
- 清理操作
3. 关闭对应级别的需要停止的服务
4. 启动对应级别下需要启动的服务
5. 启动终端,若是5级别会启动图形化界面。
二、GRUB启动引导程序配置及其命令行接口
linux系统的启动引导程序现主流使用的是grub,其现有版本分为grub 0.X(grub legacy) 和grub 1.X(grub 2) 。目前centos7采用的是grub2作为启动引导程序,而centos5和6使用的是grub legacy版本。此处使用centos6作为参照。
grub的三个阶段
1. stage1:存放于MBR中,用于启动BootLoader来加载stage2的内容至内存中
2. stage1_5:位于MBR之后的扇区,让stage1中的BootLoader能识别stage2所在的分区上的文件系统。
3. stage2:位于基础磁盘分区/boot/grub下,用于读取grub.conf配置文件,并实现引导功能的扩展
stage2以及内核等通常防止于一个基础磁盘分区/boot目录下
grub的配置文件
grub的配置文件为/boot/grub/grub.conf和/etc/grub.conf,实际上/etc/grub.conf是指向/boot/grub/grub.conf的软连接。通常其内容为:
- default=0:表示默认的启动条目,加入同事安装有多个操作系统,0表示定义的第一个title的系统
- timeout=5:表示在grub菜单中可供选择的等待时间,若超过5秒未选择,则使用default中指定的title菜单中的配置。
- splashimage=(hd0,0)/grb/splash.xpm.gz:定义引导才当中的背景图片的路径
- (hd0,0):表示第一块硬盘上的第一个分区。硬盘代号以()括起来,hd表示硬盘,后面接的数值表示餐盘编号,第一个搜寻到的磁盘编号为0,第二个为1,以此类推。
- hiddenmenu:启动时是否要显示菜单,默认情况下是不现实菜单信息,若要现实菜单,可将此项配置注释掉。
- title:定义引导菜单中显示的每个操作系统的名称
- root (hd0,0):表示内核文件存放的位置,此处指的是分区位置,而非根目录
- kernel:定义内核的名称以及一些启动时的核心参数,通常为要运行的内核文件路径以及相关的内核参数。
- initrd:微内核运行指定可用的ramdisk文件,其版本必须与内核版本一致。
grub程序的功能
grub程序的功能如下:
1. 提供引导菜单,并提供交互式的命令行接口。在菜单界面中,按e进入编辑模式,用于编辑菜单。按c可以进入命令模式,提供了命令行交互式接口。
2. 加载用户选择的内核或操作系统,并允许传递参数给内核。也可以隐藏此菜单。
3. 为菜单提供保护机制,可分别为编辑菜单和启用内核或操作系统设置认证。
在启动系统是按任意键可进入grub菜单,进入菜单后会显示菜单信息:
grub的命令行接口
在grub菜单页面,按c进入命令模式,打开命令行接口,即可配置grub的相关设置。grub命令行接口的常用指令有:
help:获取帮助列表
help KEYWORD:详细帮助信息
find(hd#,#) /path/to/somefile:用于查找对应分区下的文件。常用于当不确认内核文件在哪个分区时,可使用此命令确认文件所在路径;支持tab补全;
root(hd#,#):指定系统和内核文件所在的分区,如root(hd0,0)。
kernel /path/to/kernel_file:设定本次启动使用到的呢和文件;额外还可以添加许多内核支持使用的cmdline参数
initrd /part/to/initranfs:设定为选定的内核提供额外文件ramdisk
boot:引导启动选定的内核
grub的安装
- 使用grub-install命令安装:
grub-install [--root-directory=DIR] DEVICE
--root-directory=DIR:指定gruv镜像文件的存放位置,默认为当前系统根目录。grub-install会在指定的目录下创建boot/grub/的层级目录,并生成相关的grub文件生成在DIR/boot/grub/下。
DEVICE:grub安装的目标磁盘
- 在grub命令行模式下安装grub
grub的保护机制
grub程序提供了菜单保护机制,可以为grub菜单和启用内核或操作系统设置认证。
设置认证的方法:在grub的配置文件grub.conf中添加passwd --md5 STRING
在第一个title之上添加passwd --md5 STRING,适用于保护grub菜单编辑功能,在title中添加passwd --md5 STRING适用于保护内核。
生成md5加密密码的命令为:grub-md5-crypt
以下为菜单编辑认证:
以下为内核认证:在选定了操作系统或内核并确定之后,会要求输入密码,然后才能启动系统。
三、kickstart文件制作和光盘镜像制作
kickstart是一个定义了Linux系统安装过程的配置文件,比如说定义了系统要使用的时区、硬盘如何分区、安装哪些安装包等等。通过自定义该文件,我们可以实现不需要人工干预即可完成Linux系统的自动化安装,这种方法在同时部署大量的主机时非常有用。在Centos系统中,完成系统安装后,在root目录下会生成一个名为anaconda-ks.cfg的kickstart文件。
kickstart文件的组成和配置
kickstart文件由命令段、程序包段和脚本段三部分组成,每部分的功能和配置选项如下:
- 命令段:用于配置系统安装时处理安装软件之外的自动应答操作
必备命令
1、auth或authconfig:认证选项;
--useshadow或--enableshadow启用shadown文件来验证;
--passalgo=sha512:使用sha512算法;
2、bootloader:指定如何安装引导程序,需要提供分区,指明引导程序安装的位置等;
--location=mbr:指定引导程序的位置;
--driverorder=sda:指定grub安装所在的分区;
--append="crashkernel=auto rhgb quiet":指定内核参数;
3、keyboard:指定键盘类型,一般使用keyboard us;
4、lang:设置系统语言类型:
lang zh_CN.UTF-8:安装中文语言包;
5、part:创建分区;
-fstype=FSSTYPE:指定创建的分区类型;
--grow:允许使用剩下的磁盘空间建立分区;
--size=NUM:设置分区大小;
--maxsize=NUM:设置分区大小的最大值;
6、rootpw:设置管理员密码;
--iscrypted STRING:输入加密的密钥串,STRING为加密后的密钥串
7、timezone:设置时区;```
可选命令
1、selinux:设置selinux的状态;
--enforcing
--permissice
--disable
2、driverdisk:指定驱动程序所在的位置;
driverdisk --source=sda
3、firewall:设置firewall的状态;
--disable:禁用防火墙
4、graphical:在图形化模式下根据kickstart执行安装,默认为该选项;
5、cmdline:在完全非交互的命令行模式下进行安装;
6、text:在文本模式下根据kickstart执行安装;
7、reboot:安装完成后自动重启;
8、install/upgrade:指定是安装还是升级系统;
对于install,还指定系统安装包的来源为下述之一:
cdrom:指定从第一个光盘驱动器安装;
harddrive:从本地硬盘安装,要求硬盘必须是vfat或者ext2文件系统格式;
nfs:指定从nfs路径获取安装包来源;
url:指定从ftp、http、https安装;如:url --url=ftp://1.1.1.1
13、network:为系统配置网络信息,并在安装过程中激活该网络设备,可多次出现使用;
--bootproto:设置dhcp或static;
--device:指定网卡名称;
--hostname:指定主机名;
--onboot:是否在系统开机后开启网卡;
如:network --bootproto=static --ip=1.1.1.1 --netmask=255.255.255.0 --gateway=1.1.1.2 --onboot=on
14、autopart:自动创建分区;
15、zerombr:清除磁盘分区表mbr;
16、clearpart:在安装系统前清除分区表;
--all:清除所有分区;
--linux:清除Linux分区;
--none:不清楚分区;
--initlabel:创建标签,对于没有MBR或者GPT的新硬盘,该选项是必须的;
--drivers=sdb:清除指定分区;
clearpart --all --initlabel是常见的方式;
17、user:在系统中生成一个用户;
--name:指定用户名;
--groups:指定用户的附加组,非默认组;
--homedir:指定用户的家目录,不指定则默认为/home/USERNAME;
--password:设置该用户的密码,不指定的话创建后用户处于锁定状态;
--shell:指定用户的默认shell;
--uid:指定用户的UID;
- 程序包段
程序包段用于指明系统安装的个程序以及包组,包括不安装的程序包。
程序包段的开始标记为%packages,结束标记为%end。在两者之间为相应的程序包及程序包组,其中@GROUP_NAME表示为需要安装的程序包组,PACKAGES_NAME为需要安装的程序包,不安装某个程序包则在对应的程序包前加"-"号。@base和@core两个包组为默认选项。 如:
%packages
@Base
@Core
@Desktop
@Fonts
@General Purpose Desktop
@Internet Browser
@Printing client
@X Window System
binutils
gcc
kernel-devel
make
patch
python
%end
- 脚本段
脚本段可以概括为两部分:%pre和%post,两者均以%end为结束标记。
%pre:其后紧跟系统安装前执行的命令或脚本,支持命令很少;
%post:表示系统安装完成后执行的命令,基本支持所有命令; 如:
%post
if [ -f /boot/grub/menu.lst -a ! -h /boot/grub/menu.lst ]; then cp /boot/grub/menu.lst /boot/grub/menu.lst.bak && sed -i 's/ rhgb//' /boot/grub/menu.lst; fi
if [ -f /boot/grub/grub.conf -a ! -h /boot/grub/grub.conf ]; then cp /boot/grub/grub.conf /boot/grub/grub.conf.bak && sed -i 's/ rhgb//' /boot/grub/grub.conf; fi
if [ -f /boot/grub2/grub.conf -a ! -h /boot/grub2/grub.conf ]; then cp /boot/grub2/grub.conf /boot/grub2/grub.conf.bak && sed -i 's/ rhgb//' /boot/grub2/grub.conf; fi
if [ -f /etc/rc.d/rc.local ]; then cp /etc/rc.d/rc.local /etc/rc.d/rc.local.backup; fi
cat >>/etc/rc.d/rc.local <<EOF
#!/bin/bash
echo
echo "Installing VMware Tools, please wait..."
if [ -x /usr/sbin/getenforce ]; then oldenforce=\$(/usr/sbin/getenforce); /usr/sbin/setenforce permissive || true; fi
mkdir -p /tmp/vmware-toolsmnt0
for i in hda sr0 scd0; do mount -t iso9660 /dev/\$i /tmp/vmware-toolsmnt0 && break; done
cp -a /tmp/vmware-toolsmnt0 /opt/vmware-tools-installer
chmod 755 /opt/vmware-tools-installer
cd /opt/vmware-tools-installer
mv upgra32 vmware-tools-upgrader-32
mv upgra64 vmware-tools-upgrader-64
mv upgrade.sh run_upgrader.sh
chmod +x /opt/vmware-tools-installer/*upgr*
umount /tmp/vmware-toolsmnt0
rmdir /tmp/vmware-toolsmnt0
if [ -x /usr/bin/rhgb-client ]; then /usr/bin/rhgb-client --quit; fi
cd /opt/vmware-tools-installer
for s in sr0 sr1; do eject -s /dev/\$s; done
./run_upgrader.sh
if [ -f /etc/rc.d/rc.local.backup ]; then mv /etc/rc.d/rc.local.backup /etc/rc.d/rc.local; else rm -f /etc/rc.d/rc.local; fi
rm -rf /opt/vmware-tools-installer
sed -i 's/3:initdefault/5:initdefault/' /etc/inittab
if [ -f /boot/grub/menu.lst.bak ]; then mv /boot/grub/menu.lst.bak /boot/grub/menu.lst; fi
if [ -f /boot/grub/grub.conf.bak ]; then mv /boot/grub/grub.conf.bak /boot/grub/grub.conf; fi
if [ -f /boot/grub2/grub.conf.bak ]; then mv /boot/grub2/grub.conf.bak /boot/grub2/grub.conf; fi
if [ -x /usr/sbin/getenforce ]; then /usr/sbin/setenforce \$oldenforce || true; fi
if [ -x /bin/systemd ]; then systemctl restart prefdm.service; else telinit 5; fi
EOF
kickstart文件的制作
kickstart文件有两种制作方式:
- 手动编辑kickstart文件,可参考/root/anaconda-ks.conf文件进行修改编辑
- 通过system-config-kickstart图形化工具编辑生成kickstart文件。此工具需要使用yum -y install system-config-kickstart 命令安装。制作完成后也可同时使用ksvalidator命令来验证kickstart文件中是否有语法错误
创建光盘镜像文件
- 将系统安装光盘挂载至/media目录下
- 创建一个存放创建光盘镜像文件的目录myboot(名称随意),并移动至该目录下
- 将/media/isolinux/目录复制到myboot目录下。
- 由于/myboot/isolinux目录下内容是从光盘中复制,无法编辑,需要加写权限
- 在/myboot/isolinux目录下有个isolinux.cfg文件,可修改此文件中选项参数,添加自己需要的内容,如修改背景图片等···
- 将事先准备好的kickstart问价ks.cfg复制到/myboot目录下,要确保ks文件无问题即可使用。
- 此时就可以使用mkisofs命令创建镜像文件了;命令如下:
mkisofs -R -J -T -v --no-emul-boot --boot-load-size 4 --boot-info-table -V "CentOS 6 x86_64 boot" -c isolinux/boot.cat -b isolinux/isolinux.bin -o /root/boot.iso myboot/
注:"CentOS 6 x86_64 boot"此名称随意指定;/root/boot.iso此为保存路径,按需指定。