简述linux操作系统启动流程
CentOS的启动流程总体顺序如下CentOS 6:
POST --> Boot Sequence --> bootloader(MBR) --> Kernel --> 加载临时的rootfs --> switchroot --> /sbin/init --> (配置文件:/etc/inittab, /etc/init/*.conf) --> 根据init配置文件设置默认运行级别 --> 运行系统初始化脚本/etc/rc.d/rc.sysinit,完成系统初始化 --> 开启或关闭用户选定的对应运行级别下所对应的服务 --> 启动终端,打印登录提示符。
接下来逐一详解:
第一步:POST加电自检
主要实现的功能是检测各个外围硬件设备是否存在而且能够正常运行起来,实现这一自检功能的是固化在主板上的ROM(主要代表为CMOS)芯片上的BIOS(Basic Input/Output System)程序;例如BIOS会检测CPU、Memory以及I/O设备是否能够正常运行,如果是个人计算机的话可能还会检测一下显示器。只要一通电,CPU就会自动去加载ROM芯片上的BIOS程序,是这样来实现的。而检测完成之后就进行硬件设备的初始化。
第二步:Boot Sequence(选择启动设备以加载MBR)
主要实现的功能是选择要启动的硬件设备,选择可以读取这个设备上位于MBR里头的bootloader了。这一步的实现是这样的:根据BIOS中对启动顺序的设定,BIOS自己会依次扫描各个引导设备,然后第一个被扫描到具有引导程序(bootloader)的设备就被作为要启动的引导设备。
第三步:加载bootloader(MBR) 加载器 程序
而bootloader要实现的功能就是提供一个菜单给用户,让用户去选择要启动的系统或不同的内核版本,然后把用户选择的内核版本加载至RAM中的特定空间,接着在RAM中解压、展开,而后把系统控制权移交给内核。
grub是bootloader中的一种,就grub来说,为了打破在MBR中只有446Bytes用于存放bootloader这一限制,所以这一步的实现是这样的:grub是通过分成三个阶段来实现加载内核这一功能的,这三个阶段分别是:stage1, stage1.5以及stage2。其中:
stage1:存放于MBR的前446Bytes,用于加载stage1.5阶段,目的是为了识别并驱动stage2(或者/boot)所在分区的文件系统;
stage1.5:存放于MBR之后的扇区,加载stage2所在分区的文件系统驱动,让stage1中的bootloader能识别stage2所在分区的文件系统;
stage2:存放于磁盘分区之上,具体存放于/boot/grub目录之下,主要用于加载内核文件(vmlinuz-VERSION-RELEASE)以及ramdisk这个临时根文件系统(initrd-VERSION-RELEASE.img或initramfs-VERSION-RELEASE.img)。作用是操作系统启动以后,把它当做一个磁盘使用,从而把它识别成(临时)根文件系统,借助于ramdisk把真正的根文件系统挂载,临时根文件系统自动退出,真正的根将接替工作,临时根不是必须的,
概述:假如要启动的是硬盘设备,首先我们的硬件平台主板BIOS必须能够识别硬盘,然后BIOS才能加载硬盘中的bootloader,而bootloader自身加载后就能够直接识别当前主机上的硬盘设备了;不过,能够识别硬盘设备不代表能够识别硬盘设备中的文件系统,因为文件系统是额外附加的一层软件组织的文件结构,所以要对接一种文件系统,就必须要有对应的能够识别和理解这种文件系统的驱动,这种驱动就称为文件系统驱动。而stage1.5就是向grub提供文件系统驱动的,这样stage1就能访问stage2及内核所在的分区(/boot)了。
演示:
[root@localhost ~]# ls -1F /boot/
config-2.6.32-642.el6.x86_64 //此版本内核被编译时选择的功能与模块配置文件;
efi/
grub/ //就是引导装载程序grub相关配置文件的目录;
initramfs-2.6.32-642.el6.x86_64.img //临时根文件系统,提供根文件系统所在分区的驱动;
initrd-2.6.32-642.el6.x86_64kdump.img
lost+found/
symvers-2.6.32-642.el6.x86_64.gz
System.map-2.6.32-642.el6.x86_64 //内核功能放置到内存地址的映射表;
vmlinuz-2.6.32-642.el6.x86_64* //就是内核文件;
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]# ls -1F /boot/grub/
device.map
e2fs_stage1_5
fat_stage1_5
ffs_stage1_5
grub.conf
iso9660_stage1_5
jfs_stage1_5
menu.lst@
minix_stage1_5
reiserfs_stage1_5
splash.xpm.gz
stage1
stage2
ufs2_stage1_5
vstafs_stage1_5
xfs_stage1_5
//可以看到stage1, 各种文件系统对应的stage1.5及stage2这几个阶段的文件都存放于此目录下;
查看grub的配置:
[root@localhost ~]# vim /boot/grub/grub.conf
default=0 //设定默认启动第一个菜单项(title);
timeout=5 //等待用户选择菜单项的时长;
splashimage=(hd0,0)/grub/splash.xpm.gz //指明菜单项的背景图片的文件路径;
hiddenmenu //是否隐藏菜单的具体内容;
title CentOS (2.6.18-398.el5) //此处为菜单项的标题;
root (hd0,0) //指定grub查找stage2及Kernel文件所在设备的分区;可理解为grub的"根",对grub而言,所有类型硬盘都是hd,格式为(hd#,N);hd#, #表示第几个磁盘;N表示对应磁盘的分区;修复硬盘使用;
kernel /vmlinuz-2.6.18-398.el5 ro root=/dev/VolGroup00/LogVol00 //启动的内核;
initrd /initrd-2.6.18-398.el5.img //与内核匹配的ramdisk文件;
//注意:kernel和initrd的文件路径均以grub的"根"作为起始目录,且存放于stage2所在分区上;需要注意的是,stage2、内核以及ramdisk文件通常放置于一个基本磁盘分区之上,因为grub无法驱动lvm、高级软raid等复杂逻辑设备,除非提供一个复杂的驱动接口,否则如果stage2及内核等文件都存放在lvm等复杂逻辑设备上将无法被stage1所识别。
第四步:Kernel自身初始化
Kerenl在得到系统控制权之后,首先要进行自身初始化,而初始化的主要作用是:
(1)探测可识别到的所有硬件设备;
bootloader将系统控制权移交给内核。
(2)加载硬件驱动程序,即加载真正的根文件系统所在设备的驱动程序(有可能会借助于ramdisk加载驱动);
这就像统治者(内核)在得知底下存在的人力、财力之后,开始将可以“为我所用”的人力纳入麾下,听自己使唤,而不听使唤的杀掉;
(3)以只读方式挂载根文件系统;
如果有借助于ramdisk这个临时文件系统(虚根),则在这一步之后会执行根切换;否则不执行根切换。
(4)运行用户空间的第一个应用程序:/sbin/init.
到这里内核空间的启动流程就结束了,而接下来是用户空间完成后续的系统启动流程。
注意:
ramdisk和内核是由bootloader一同加载到内存当中的,ramdisk是用于实现系统初始化的、基于内存的磁盘设备,即加载至内存(的某一段空间)后把内存当磁盘使用,并在内存中作为临时根文件系统提供给内核使用,帮助内核挂载真正的根文件系统。而之所以能够帮助内核挂载根文件系统是因为在ramdisk这个临时文件系统的/lib/modules目录下有真正的根文件系统所在设备的驱动程序;除此之外,这个临时文件系统也遵循FHS,例如有这些固定目录结构:/bin, /sbin, /lib, /lib64, /etc, /mnt, /media, ...
因为Linux内核有一个特性就是通过使用缓冲/缓存来达到加 速对磁盘上文件的访问的目的,而ramdisk是加载到内存并模拟成磁盘来使用的,所以Linux就会为内存中的“磁盘”再使用一层缓冲/缓存,但是我们的ramdisk本来就是内存,它只不过被当成硬盘来使用罢了,这就造成双缓冲/缓存了,而且不会起到提速效果,甚至影响了访问性能;CentOS 5系列以及之前版本的ramdisk文件为initrd-VERSION-RELEASE.img,就会出现上述所说到的问题;而为了解决一问题,CentOS 6/7系列版本就将其改为initramfs-VERSION-RELEASE.img,使用文件系统的方式就可以避免双缓冲/缓存了,我们可以说这是一种提速机制。
需要注意的是,系统发行商为了适应于各个不同的硬件接口,因此将各个不同的硬件接口的驱动组装打包起来,例如在用户第一次使用光盘安装完系统之后,会动态探测当前主机上的硬件设备并调用与之对应的设备驱动再做成ramdisk文件的。所以,ramdisk文件并非必须的,如果只是为了将Linux安装于特定硬件平台上,就可以直接把对应的驱动编译进内核即可,而不需要去使用ramdisk文件了。
第五步:init管理用户空间服务进程
init可以理解成是内核派来管理用户空间的使者,就好像天使代表上帝来访问人间一样。init这个初始化程序会根据其配置文件执行一系列操作。虽然CentOS 5、CentOS 6以及CentOS 7的init配置 文件各不相同,但总体的启动流程是不变的。
这一步的流程是:/sbin/init --> 根据init配置文件设置默认运行级别 --> 运行系统初始化脚本/etc/rc.d/rc.sysinit,完成系统初始化 --> 关闭或启动用户选定的默认运行级别所对应的服务 --> 启动终端,打印登录提示符
(1)根据init配置文件设置默认运行级别
对于CentOS 5来说,初始化程序init是SysV init,其配置文件为:/etc/inittab;
对于CentOS 6来说,初始化程序init是upstart,其配置文件为:/etc/inittab, /etc/init/*.conf,也就是upstart将配置文件拆分成多个,在/etc/init/目录下以conf结尾的都是upstart风格的配置文件,而/etc/inittab仅用于设置默认运行级别;
对于CentOS 7来说,初始化程序init是systemd,其配置文件为:/usr/lib/system/systemd/*, /etc/systemd/system/*;
注意:
运行级别是为了系统的运行和维护等目的而设定的一种机制,对于CentOS 5/6来讲,一共有7种运行级别,即0-6,它们的意义如下:
0:关机模式,shutdown;
1:单用户模式(single user):不需要通过认证,登录进去之后为root用户身份,是维护模式;
2:多用户模式(multi user):会启动网络功能,但不会启动NFS,是维护模式;
3:多用户模式(multi user):为完全功能模式,提供文本界面;
4:预留级别,目前无特别使用目的,但习惯上以同3级别功能来使用;
5:多用户模式(multi user):为完全功能模式,提供图形界面;
6:重启模式,reboot;
默认级别:3, 5
级别切换:init #
级别查看:
who -r
runlevel
CentOS 5配置文件详解:
每行定义一种action以及与之对应的process:
格式:id:runlevel:action:process
各字段解释:
id:一个任务的标识符;
runlevel:在哪些级别下启动该任务;格式可以是#,###,也可以为空(表示所有级别);
action:在什么条件下启动该任务;
process:任务;
action种类:
wait:等待切换至该任务所在的级别时执行一次;
respawn:一旦该任务终止,就会重新启动这个任务;
initdefault:设定默认运行级别;此时process是省略掉的;
sysinit:设定系统初始化方式,这里一般指定为/etc/rc.d/rc.sysinit脚本文件;
CentOS 6配置文件/etc/inittab:
[root@localhost ~]# cat /etc/inittab
# inittab is only used by upstart for the default runlevel.
#
# ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# System initialization is started by /etc/init/rcS.conf
#
# Individual runlevels are started by /etc/init/rc.conf
#
# Ctrl-Alt-Delete is handled by /etc/init/control-alt-delete.conf
#
# Terminal gettys are handled by /etc/init/tty.conf and /etc/init/serial.conf,
# with configuration in /etc/sysconfig/init.
#
# For information on how to write upstart event handlers, or how
# upstart works, see init(5), init(8), and initctl(8).
#
# 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:3:initdefault:
[root@localhost ~]#
CentOS 7配置文件/etc/inittab:
[root@localhost ~]# cat /etc/inittab
cat /etc/inittab
# inittab is no longer used when using systemd.
#
# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target
#
# systemd uses 'targets' instead of runlevels. By default, there are two main targets:
#
# multi-user.target: analogous to runlevel 3
# graphical.target: analogous to runlevel 5
#
# To view current default target, run:
# systemctl get-default
#
# To set a default target, run:
# systemctl set-default TARGET.target
#
[root@localhost ~]#
注意:CentOS 7使用target代替了runlevel,也就是在CentOS 7系列已经没有了运行等级这一概念了。而如果需要设置target则可参考该文件的后两行注释;
代码分析:
以下为CentOS 5的/etc/inittab文件
id:3:initdefault: //设置默认运行级别,此处设置为3;
# System initialization.
si::sysinit:/etc/rc.d/rc.sysinit //指定系统初始化脚本;
//根据前面获取到的运行级别信息,运行/etc/rc.d/rc脚本;
l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
//因为默认运行级别为3,因此只会开启或关闭/etc/rc.d/rc3.d/目录下的脚本所控制的服务;而其它
的/etc/rc.d/rc#.d/目录则别略过;
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6
(2)运行系统初始化脚本/etc/rc.d/rc.sysinit,完成系统初始化
运行初始化脚本是为了初始化系统环境,这一步初始化包括:
①设置主机名;
②设置欢迎信息;
③激活udev和selinux;
④挂载/etc/fstab文件中定义的所有文件系统;
⑤检测根文件系统,以读写方式重新挂载根文件系统;
⑥设置系统时钟;
⑦根据/etc/sysctl.conf文件来设置内核参数;
⑧激活lvm及软raid设备;
⑨激活swap设备;
⑩加载额外设备的驱动程序(因为内核只加载根文件系统所在分区的驱动程序);
清理操作;
注意:CentOS 7的systemd没有这一步,而是通过其他机制来实现。
(3)关闭或启动用户选定的默认运行级别下所对应的服务
要实现的功能是:根据前面用户通过init配置文件对默认运行级别的设定,关闭或启动这个运行级别下的服务。(注意:关闭在前,启动在后)
具体实现方式:运行/etc/rc.d/rc这个脚本文件,而初始化程序init根据前面获取的默认运行级别信息,将这个运行级别数字以参数方式传递给/etc/rc.d/rc脚本中的变量$runlevel;然后,这个脚本会以glob方式去把/etc/rc.d/rc$runlevel.d/S*匹配到的脚本所控制的服务开启,而把/etc/rc.d/rc$runlevel.d/K*匹配到的脚本所控制的服务开启。
/etc/rc.d/rc#.d/目录下的脚本文件命名格式:
(1)K##*:表示要停止的服务;'##'表示关闭优先级,数字越小,越是优先关闭;依赖到其他服务的服务会优先关闭,而被依赖的服务则后关闭;
(2)S##*:表示要启动的服务;'##'表示启动优先级,数字越小,越是优先启动;被依赖的服务会优先
启动,而依赖到其他服务的服务则后启动;
例如,runlevel为3时,则匹配到的是/etc/rc.d/rc3.d/目录下的脚本文件;runlevel为5时,则匹配到的是/etc/rc.d/rc5.d/目录下的脚本文件等;而这些目录下的脚本有些是以S打头的,有些是以K打头的,这样的控制机制很容易想明白:其中以S打头的代表要开启的服务,以K打头的代表要关闭的服务。这就是我们的主机启动之后为什么有些服务会自动启动,而有些服务不会自动启动的原因了。
需要注意的是,在这些/etc/rc.d/rc#.d/目录下,除了S99local这个服务脚本之外,其他服务都链接到/etc/init.d/目录下对应的服务脚本,而S99local则链接到/etc/rc.d/rc.local(或/etc/rc.local)。所以,如果我们有不方便或者没必要写成服务脚本的程序,但又希望这样的程序能够在开机自动开启时,可以直接写进/etc/rc.d/rc.local这个脚本文件中就行了!
以下为/etc/rc.d/rc脚本文件代码节选:
# First, run the KILL scripts.
for i in /etc/rc$runlevel.d/K* ; do
//这是一个for循环,根据前面获取的运行级别来匹配并关闭/etc/rc#.d/目录下所有以K打头的脚本
所控制的服务;
check_runlevel "$i" || continue
# Check if the subsystem is already up.
subsys=${i#/etc/rc$runlevel.d/K??}
[ -f /var/lock/subsys/$subsys -o -f /var/lock/subsys/$subsys.init ] \
|| continue
# Bring the subsystem down.
if LC_ALL=C egrep -q "^..*init.d/functions" $i ; then
$i stop //stop,关闭服务!
else
action $"Stopping $subsys: " $i stop
fi
done
# Now run the START scripts.
for i in /etc/rc$runlevel.d/S* ; do
//这是一个for循环,根据前面获取的运行级别信息,匹配并开启/etc/rc#.d/目录下所有以S打头的
脚本所控制的服务;
check_runlevel "$i" || continue
# Check if the subsystem is already up.
subsys=${i#/etc/rc$runlevel.d/S??}
[ -f /var/lock/subsys/$subsys -o -f /var/lock/subsys/$subsys.init ] \
&& continue
# If we're in confirmation mode, get user confirmation
if [ -f /var/run/confirm ]; then
confirm $subsys
test $? = 1 && continue
fi
update_boot_stage "$subsys"
# Bring the subsystem up.
if [ "$subsys" = "halt" -o "$subsys" = "reboot" ]; then
export LC_ALL=C
exec $i start
fi
if LC_ALL=C egrep -q "^..*init.d/functions" $i \
|| [ "$subsys" = "single" -o "$subsys" = "local" ]; then
$i start //start,开启服务!
else
action $"Starting $subsys: " $i start
fi
done
演示:
查看/etc/rc.d/目录下的所有S99local脚本:
[root@localhost ~]# find /etc/rc.d/ -name S99local -exec ls -l {} \;
lrwxrwxrwx. 1 root root 11 Feb 20 06:11 /etc/rc.d/rc2.d/S99local -> ../rc.local
lrwxrwxrwx. 1 root root 11 Feb 20 06:11 /etc/rc.d/rc5.d/S99local -> ../rc.local
lrwxrwxrwx. 1 root root 11 Feb 20 06:11 /etc/rc.d/rc3.d/S99local -> ../rc.local
lrwxrwxrwx. 1 root root 11 Feb 20 06:11 /etc/rc.d/rc4.d/S99local -> ../rc.local
//所有S99local服务脚本都链接至/etc/rc.d/rc.local;
[root@localhost ~]# ll /etc/rc.local
lrwxrwxrwx. 1 root root 13 Feb 20 06:11 /etc/rc.local -> rc.d/rc.local
//服务脚本/etc/rc.local链接至/etc/rc.d/rc.local;
查看/etc/rc.d/目录下的文件及目录:
[root@localhost ~]# ls -1F /etc/rc.d/
init.d/
rc*
rc0.d/
rc1.d/
rc2.d/
rc3.d/
rc4.d/
rc5.d/
rc6.d/
rc.local*
rc.sysinit*
//可以看到多个运行级别多对应的/etc/rc.d/rc#目录;
查看/etc/rc.d/rc0.d/目录下的服务脚本:
[root@localhost ~]# ll /etc/rc.d/rc0.d/
total 320
lrwxrwxrwx 1 root root 17 Feb 20 06:08 K01dnsmasq -> ../init.d/dnsmasq
lrwxrwxrwx 1 root root 16 Feb 20 06:09 K01smartd -> ../init.d/smartd
lrwxrwxrwx 1 root root 22 Feb 20 06:20 K02avahi-daemon -> ../init.d/avahi-daemon
lrwxrwxrwx 1 root root 24 Feb 20 06:20 K02avahi-dnsconfd -> ../init.d/avahi-dnsconfd
.....(中间省略).....
lrwxrwxrwx 1 root root 25 Feb 20 06:09 K99readahead_early -> ../init.d/readahead_early
lrwxrwxrwx 1 root root 25 Feb 20 06:09 K99readahead_later -> ../init.d/readahead_later
lrwxrwxrwx 1 root root 17 Feb 20 06:08 S00killall -> ../init.d/killall
lrwxrwxrwx 1 root root 14 Feb 20 06:08 S01halt -> ../init.d/halt
//因为运行级别0代表关机模式,因此统统都为以K打头的链接文件;
注意:CentOS 7采用的是systemd这个初始化程序,在系统启动过程中不会启动服务,而是在用户需要用到时则立即启动对应的服务。这是为了提高系统启动速度的一种非常精巧的设计。
(4)启动终端,打印登录提示符
根据前面获取的运行级别来启动终端,mingetty程序是用于启动终端的,它会调用登录程序login,这样就能显示出登录提示符了,类似mingetty这种用于打开终端的程序还有getty等。
而如果默认运行级别为5,则会打开图形界面。
以下为CentOS 5的/etc/inittab文件中部分代码:
# Run gettys in standard runlevels
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
//在配置文件这里指明打开留个文本终端,分别对应于[Ctrl]+[Alt]+F1至F6;
# Run xdm in runlevel 5
x:5:respawn:/etc/X11/prefdm -nodaemon
第六步:用户登录
系统启动结束!
2、简述grub启动引导程序配置及命令行接口详解
GRUB(Boot Loader):
grub: GRand Unified Bootloader
grub 0.x: grub legacy
grub 1.x: grub2
grub legacy:
stage1: mbr
stage1_5: mbr之后的扇区,让stage1中的bootloader能识别stage2所在的分区上的文件系统;
stage2:磁盘分区(/boot/grub/)
配置文件:/boot/grub/grub.conf <-- /etc/grub.conf
stage2及内核等通常放置于一个基本磁盘分区;
功用:
(1) 提供菜单、并提供交互式接口
e: 编辑模式,用于编辑菜单;
c: 命令模式,交互式接口;
(2) 加载用户选择的内核或操作系统
允许传递参数给内核
可隐藏此菜单
(3) 为菜单提供了保护机制
为编辑菜单进行认证
为启用内核或操作系统进行认证
如何识别设备:
(hd#,#)
hd#: 磁盘编号,用数字表示;从0开始编号
#: 分区编号,用数字表示; 从0开始编号
(hd0,0)
grub的命令行接口
help: 获取帮助列表
help KEYWORD: 详细帮助信息
find (hd#,#)/PATH/TO/SOMEFILE:
root (hd#,#)
kernel /PATH/TO/KERNEL_FILE: 设定本次启动时用到的内核文件;额外还可以添加许多内核支持使用的cmdline参数;
例如:init=/path/to/init, selinux=0
initrd /PATH/TO/INITRAMFS_FILE: 设定为选定的内核提供额外文件的ramdisk;
boot: 引导启动选定的内核;
手动在grub命令行接口启动系统:
grub> root (hd#,#)
grub> kernel /vmlinuz-VERSION-RELEASE ro root=/dev/DEVICE
grub> initrd /initramfs-VERSION-RELEASE.img
grub> boot
配置文件:/boot/grub/grub.conf
配置项:
default=#: 设定默认启动的菜单项;落单项(title)编号从0开始;
timeout=#:指定菜单项等待选项选择的时长;
splashimage=(hd#,#)/PATH/TO/XPM_PIC_FILE:指明菜单背景图片文件路径;
hiddenmenu:隐藏菜单;
password [--md5] STRING: 菜单编辑认证;
title TITLE:定义菜单项“标题”, 可出现多次;
root (hd#,#):grub查找stage2及kernel文件所在设备分区;为grub的“根”;
kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS]:启动的内核
initrd /PATH/TO/INITRAMFS_FILE: 内核匹配的ramfs文件;
password [--md5] STRING: 启动选定的内核或操作系统时进行认证;
grub-md5-crypt命令
进入单用户模式:
(1) 编辑grub菜单(选定要编辑的title,而后使用e命令);
(2) 在选定的kernel后附加
1, s, S或single都可以;
(3) 在kernel所在行,键入“b”命令;
安装grub:
(1) grub-install
grub-install --root-directory=ROOT /dev/DISK
(2) grub
grub> root (hd#,#)
grub> setup (hd#)
3、实现kickstart文件制作与光盘镜像制作
安装引导选项:
ks:指明kickstart文件的位置;
ks=
DVD drive: ks=cdrom:/PATH/TO/KICKSTART_FILE
Hard Drive: ks=hd:/DEVICE/PATH/TO/KICKSTART_FILE
HTTP Server: ks=http://HOST[:PORT]/PATH/TO/KICKSTART_FILE
FTP Server: ks=ftp://HOST[:PORT]/PATH/TO/KICKSTART_FILE
HTTPS Server: ks=https://HOST[:PORT]/PATH/TO/KICKSTART_FILE
kickstart文件的格式
命令段:
指定各种安装前配置选项,如键盘类型等;
必备命令
可选命令
程序包段:
指明要安装程序包,以及包组,也包括不安装的程序包;
%packages
@group_name
package
-package
%end
用%package指名开始,%end指名结束,包组以@开始标明,软件名可以直接写,但每个之间需要换行
脚本段:
%pre:安装前脚本
运行环境:运行安装介质上的微型Linux系统环境;
%post:安装后脚本
运行环境:安装完成的系统;
命令段中的必备命令:
authconfig:认证方式配置
authconfig --enableshadow --passalgo=sha512
bootloader:定义bootloader的安装位置及相关配置
bootloader --location=mbr --driveorder=sda --append="crashkernel=auto rhgb quiet"
--append= 可以指定内核参数
--driveorder= 设定设备BIOS中的开机设备启动顺序
--location=设定引导记录的位置; mbr:默认值;partition:将boot loader安装于包含kernel的分区超级块
keyboard:设置键盘类型
keyboard us
lang:语言类型
lang zh_CN.UTF-8
part:分区布局;
part /boot --fstype=ext4 --size=500
part pv.008 --size=10240
volgroup vg0 --pesize=8192
pv.008logvol / --fstype=ext4 --name=root --vgname=vg0 --size=1024
logvol swap --name=swap --vgname=vg0 --size=1024
logvol /usr --fstype=ext4 --name=usr --vgname=vg0 --size=1024
logvol /var --fstype=ext4 --name=var --vgname=vg0 --size=2048
rootpw:管理员密码
rootpw --iscrypted $6$4Yh15kMGDWOPtbbW$SGax4DsZwDAz4201.O97WNnoBmO/rmmA7H8s.
timezone:时区
timezone Asia/Shanghai
补充:分区相关的其它指令
clearpart:清除分区
clearpart --none --drives=sda:清空磁盘分区;
在建立新分区前清空系统上原有的分区表,默认不删除分区
clearpart --all
clearpart --drives=hda,hdb --all --initlabel
-all 擦除系统上原有所有分区;
--drives 删除指定驱动器上的分区
--initlabel 初始化磁盘卷标为系统架构的默认卷标
--linux 擦除所有的linux分区
--none(default)不移除任何分区
volgroup:创建卷组
volgroup myvg --pesize=4096 pv.008002
logvol:创建逻辑卷
logvol /home --fstype=ext4 --name=lv_home --vgname=myvg --size=5120
生成加密密码的方式:
~]# openssl passwd -1 -salt `openssl rand -hex 4 //生成的密码可以直接粘贴复制到上面rootpw 后即可生效
可选命令:
install OR upgrade:安装或升级;
text:安装界面类型,text为tui,默认为GUI
network:配置网络接口
network --onboot yes --device eth0 --bootproto dhcp --noipv6
firewall:防火墙
firewall --disabled
selinux:SELinux
selinux --disabled
halt、poweroff或reboot:安装完成之后的行为;
repo:指明安装时使用的repository;
repo --name="CentOS" --baseurl=cdrom:sr0 --cost=100
url: 指明安装时使用的repository,但为url格式;可选,指明安装源为远程的ftp、http方式安装
url --url=http://172.16.0.1/cobbler/ks_mirror/CentOS-6.7-x86_64/
url --url ftp://
url --url http://install.example.com/iso
参考官方文档:《Installation Guide》
系统安装完成之后禁用防火墙:
CentOS 6:
# service iptables stop
# chkconfig iptables off
CentOS 7:
# systemctl stop firewalld.service
# systemctl disable firewalld.service
系统安装完成后禁用SELinux:
编辑/etc/sysconfig/selinux或/etc/selinux/config文件,修改SELINUX参数的值为下面其中之一:
permissive
disabled
立即生效:
# getenforce
# setenforce 0
定制kickstart文件
[root@localhost ~]# ls /mnt/
CentOS_BuildTag GPL LiveOS RPM-GPG-KEY-CentOS-7
EFI images Packages RPM-GPG-KEY-CentOS-Testing-7
EULA isolinux repodata TRANS.TBL
[root@localhost ~]# mkdir myboot
[root@localhost ~]# cd myboot
[root@localhost myboot]# cp -r /mnt/isolinux/ ./
[root@localhost myboot]# ls
isolinux
[root@localhost myboot]#
[root@localhost myboot]# ls isolinux/
boot.cat grub.conf isolinux.bin memtest TRANS.TBL vmlinuz
boot.msg initrd.img isolinux.cfg splash.png vesamenu.c32
[root@localhost myboot]# cd isolinux/
[root@localhost isolinux]# ll
total 58124
-r--r--r--. 1 root root 2048 Oct 10 08:45 boot.cat
-rw-r--r--. 1 root root 84 Oct 10 08:45 boot.msg
-rw-r--r--. 1 root root 281 Oct 10 08:45 grub.conf
-rw-r--r--. 1 root root 52893200 Oct 10 08:45 initrd.img
-rw-r--r--. 1 root root 24576 Oct 10 08:45 isolinux.bin
-rw-r--r--. 1 root root 3032 Oct 10 08:45 isolinux.cfg
-rw-r--r--. 1 root root 190896 Oct 10 08:45 memtest
-rw-r--r--. 1 root root 186 Oct 10 08:45 splash.png
-r--r--r--. 1 root root 2215 Oct 10 08:45 TRANS.TBL
-rw-r--r--. 1 root root 152976 Oct 10 08:45 vesamenu.c32
-rwxr-xr-x. 1 root root 6224704 Oct 10 08:45 vmlinuz
[root@localhost isolinux]# chmod +w *
[root@localhost ~]# mkisofs -R -J -T -v --no-emul-boot --boot-load-size 4 --boot-info-table -V "CentOS 7 x86_64 boot" -c isolinux/boot.cat -b isolinux/isolinux.bin -o /root/boot.iso myboot/
安装时要选择安装.boot.ios镜像文件,按TAB 输入一下内容
也可以通过修改ks.cfg文件,系统重新加载配置文件即可