简述linux操作系统启动流程
本示例流程以centos6的以MBR结构的linux启动流程为例:
加电自检: 自检要是检查设备:如CPU、内存、硬盘是否正常、鼠标键盘等外接设备是否存在等。
启动BIOS:BIOS(基本的输入输出系统)装载在硬件芯片CMOS之上,自检时会启动这个程序,并根据CMOS上的配置信息去读取其他的硬件信息,检测正常之后进行硬件设备的初始化。
Boot Loader(MBR):引导加载程序,在MBR(主引导记录)中,主要功能是识别,加载操作系统的核心文件,并提交到内存中运行来启动对应的系统,windows的Boot Loader不具备控制权转交功能,因此windows的Boot Loader不能加载linux系统的Boot Loder,相反linux系统的Boot Loader可以加载windows的Boot Loader。
启动Kernel(ramdisk):Kernel会自身初始化,探测可识别的硬件设备,因为Kernel是存在硬盘之中的,但是在内核启动时还没有加载硬盘,为了解决这个问题Kernel内核通过ramdisk(虚拟文件系统)来加载硬件程序,为了防止根文件系统加载时出现bug等问题无法挽回的情况,以只读方式来挂载根文件系统,来完成根文件系统的初始化。
rootfs(readonly):启动真正的根文件系统,然后虚拟的根文件系统与真实的根文件系统进行交换。
/sbin/init:在内核,硬件及驱动信息加载完毕后,内核会运行用户空间的第一个应用程序:/sbin/init,包括系统的主机名称,网络管理,文件系统格式等其他服务。
centos6的文件格式
[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:
- 执行/etc/inittab,/etc/init/*.conf:centos6的配置文件在/etc/init目录下所有以.conf结尾的文件中。
每行定义一种action以及与之对应的process
id:runlevels:action:process
id:一个任务的标识符;
runlevels:在哪些级别启动此任务;#,###,也可以为空,表示所有级别;
action:在什么条件下启动此任务;
process:任务;
action:
wait:等待切换至此任务所在的级别时执行一次;
respawn:一旦此任务终止,就自动重新启动之;
initdefault:设定默认运行级别;此时,process省略;
sysinit:设定系统初始化方式,此处一般为指定/etc/rc.d/rc.sysinit脚本;
例如:
id:3:initdefault:
si::sysinit:/etc/rc.d/rc.sysinit
l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
…………
l6:6:wait:/etc/rc.d/rc 6
- 设定默认运行级别:根据系统的设定来启动系统要进入的运行级别,默认的运行级别有7种,可以用runlevel命令查看当前的运行级别,init #命令可以切换当前的运行级别,默认运行级别不能设置成0和6级别中的任何一个级别,这7种运行级别分别代表如下:
运行级别:为了系统的运行或维护等目的而设定的机制;
0-6:7个级别;
0:关机, shutdown
1、单用户模式(single user),root用户,无须认证;维护模式;
2、多用户模式(multi user),会启动网络功能,但不会启动NFS;维护模式;
3、多用户模式(mutli user),完全功能模式;文本界面;
4、预留级别:目前无特别使用目的,但习惯以同3级别功能使用;
5、多用户模式(multi user), 完全功能模式,图形界面;
6、重启,reboot
[root@localhost ~]# runlevel
N 3 # N:表示 系统启动时就进入3级别 3:目前系统的运行级别
[root@localhost ~]# init 5
[root@localhost ~]# runlevel
3 5 # N:由3级别切换到5级别运行
-
系统初始化脚本:
系统初始化脚本:/etc/rc.d/rc.sysinit配置文件中,主要进行如下的操作:
(1) 设置主机名;
(2) 设置欢迎信息;
(3) 激活udev和selinux;
(4) 挂载/etc/fstab文件中定义的所有文件系统;
(5) 检测根文件系统,并以读写方式重新挂载根文件系统;
(6) 设置系统时钟;
(7) 根据/etc/sysctl.conf文件来设置内核参数;
(8) 激活lvm及软raid设备;
(9) 激活swap设备;
(10) 加载额外设备的驱动程序;
(11) 清理操作;
#!/bin/bash
#
# /etc/rc.d/rc.sysinit - run once at boot time
#
# Taken in part from Miquel van Smoorenburg's bcheckrc.
#
HOSTNAME=$(/bin/hostname)
set -m
if [ -f /etc/sysconfig/network ]; then
. /etc/sysconfig/network
fi
if [ -z "$HOSTNAME" -o "$HOSTNAME" = "(none)" ]; then
HOSTNAME=localhost
fi
if [ ! -e /proc/mounts ]; then
mount -n -t proc /proc /proc
mount -n -t sysfs /sys /sys >/dev/null 2>&1
fi
if [ ! -d /proc/bus/usb ]; then
modprobe usbcore >/dev/null 2>&1 && mount -n -t usbfs /proc/bus/usb /proc/bus/usb
. /etc/sysconfig/network
fi
if [ -z "$HOSTNAME" -o "$HOSTNAME" = "(none)" ]; then
HOSTNAME=localhost
fi
if [ ! -e /proc/mounts ]; then
mount -n -t proc /proc /proc
mount -n -t sysfs /sys /sys >/dev/null 2>&1
fi
if [ ! -d /proc/bus/usb ]; then
modprobe usbcore >/dev/null 2>&1 && mount -n -t usbfs /proc/bus/usb /proc/bus/usb
else
mount -n -t usbfs /proc/bus/usb /proc/bus/usb
fi
#remount /dev/shm to set attributes from fstab #669700
mount -n -o remount /dev/shm >/dev/null 2>&1
#remount /proc to set attributes from fstab #984003
mount -n -o remount /proc >/dev/null 2>&1
. /etc/init.d/functions
-
关闭或启动对应级别下的服务:意味着去启动或关闭/etc/rc.d/rc#.d/目录下的服务脚本所控制服务;
K:要停止的服务;K##,优先级,数字越小,越是优先关闭;依赖的服务先关闭,而后关闭被依赖的;
S:要启动的服务;S##,优先级,数字越小,越是优先启动;被依赖的服务先启动,而依赖的服务后启动;
同一个服务的K脚本数值小时,S的脚本数值就应该比K的数值大,相反的,如果S数值小,则K的数值要比S的数值要大。
chkconfig命令:管控/etc/init.d/每个脚本在各级别下的启动或关闭状态:
查看该服务在各级别下的开启或关闭状态:chkconfig --list [name]
添加该服务在各级别下的开启或关闭状态:chkconfig --add name
能被添加的服务的脚本定义格式之一:
#!/bin/bash
#
# chkconfig: LLL NN1 NN2
LL: 运行级别(runlevel)
NN1:启动优先级
NN2:关闭优先级
# description: 表明此配置文件的作用
删除指定服务在各级别下的开启或关闭状态:chkconfig --del name
修改指定的链接类型:
chkconfig [--level LEVELS] name <on|off|reset>
--level LEVELS:指定要控制的级别;默认为2345;
[root@localhost ~]# chkconfig --list crond
crond 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
[root@localhost ~]# chkconfig --level 23 crond off
[root@localhost ~]# chkconfig --list crond
crond 0:关闭 1:关闭 2:关闭 3:关闭 4:启用 5:启用 6:关闭
注意:正常级别下,最后启动的一个服务S99local没有链接至/etc/init.d下的某脚本,而是链接至了/etc/rc.d/rc.local (/etc/rc.local)脚本;因此,不便或不需写为服务脚本的程序期望能开机自动运行时,直接放置于此脚本文件中即可。
在3级别下的服务有:
[root@localhost ~]# ls /etc/rc.d/rc3.d
K10saslauthd K89netconsole S07iscsid S10network S13iscsi S25netfs S80postfix
K87multipathd K89rdisc S08ip6tables S11auditd S15mdmonitor S26udev-post S90crond
K87restorecond S02lvm2-monitor S08iptables S12rsyslog S25blk-availability S55sshd S99local
- 启动终端:最后mingetty会调用login程序。
简述grub启动引导程序配置及命令行接口详解
grub是目前最广泛linux启动管理程序,其配置文件为:/boot/grub/grub.conf,此目录其实是/etc/grub.conf的符号链接
[root@localhost ~]# ll /etc | grep grub.conf
lrwxrwxrwx. 1 root root 22 9月 6 01:57 grub.conf -> ../boot/grub/grub.conf
注意:此处grub.conf仅限centos5和centos6版本,而centos7的grub的配置文件在/boot/grub2/grub.cfg中
[root@localhost ~]# cat /boot/grub/grub.conf
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You have a /boot partition. This means that
# all kernel and initrd paths are relative to /boot/, eg.
# root (hd0,0)
# kernel /vmlinuz-version ro root=/dev/mapper/VolGroup-lv_root
# initrd /initrd-[generic-]version.img
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
password --md5 $1$E7rO20$rqSROpSM6VCDdjlra727I1
title CentOS 6 (2.6.32-754.el6.i686)
root (hd0,0)
kernel /vmlinuz-2.6.32-754.el6.i686 ro root=/dev/mapper/VolGroup-lv_root rd_NO_LUKS rd_NO_MD rd_LVM_LV=VolGroup/lv_swap crashkernel=auto LANG=zh_CN.UTF-8 rd_LVM_LV=VolGroup/lv_root KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
initrd /initramfs-2.6.32-754.el6.i686.img
配置项:
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.img: 内核匹配的ramfs文件;
password [--md5] STRING: 启动选定的内核或操作系统时进行认证;
grub界面支持命令行接口 ,在界面输入e、b、c等命令可以进入对应的命令编辑,在对应的“title”中输入c进入命令模式
为了防止他人随意进入grub对系统造成破坏(修改root密码等操作)可以在grub配置文件文件中加入密码来防止他人随意进入。
- 使用grub-md5-crypt命令来生成加密的密码
[root@localhost ~]# grub-md5-crypt
Password:
Retype password:
$1$94MZ20$VEC6jrQzic0nYg3CgFxaD.
- 在配置文件中一个或某一个title添加password --md5 ***********格式的密码保护编辑模式
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You have a /boot partition. This means that
# all kernel and initrd paths are relative to /boot/, eg.
# root (hd0,0)
# kernel /vmlinuz-version ro root=/dev/mapper/VolGroup-lv_root
# initrd /initrd-[generic-]version.img
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
password --md5 $1$94MZ20$VEC6jrQzic0nYg3CgFxaD. #此处password可以对grub界面加密,使用的就是上面得到的加密的密码
title CentOS 6 (2.6.32-754.el6.i686)
root (hd0,0)
kernel /vmlinuz-2.6.32-754.el6.i686 ro root=/dev/mapper/VolGroup-lv_root rd_NO_LUKS rd_NO_MD rd_LVM_LV=VolGroup/lv_swap crashkernel=auto LANG=zh_CN.UTF-8 rd_LVM_LV=VolGroup/lv_root KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
initrd /initramfs-2.6.32-754.el6.i686.img
password --md5 $1$94MZ20$VEC6jrQzic0nYg3CgFxaD. #此处password可以对进入系统之前加密
加密后回到grub界面提示按p输入密码解锁下一步设置或环境
按p后提示输入密码
输入密码后按c可以进入编辑模式,在编辑模式下可以进行find来查看grub第一和第二阶段所有的硬盘位置,具体的命令可以通过help来获取帮助:
实现kickstart文件制作与光盘镜像制作
kickstart只能在图形界面下运行并先安装kickstart,命令如下:
定制kickstart文件:
# yum install system-config-kickstart
# system-config-kickstart
-
制作kickstart文件配置安装方法
-
配置分区
-
配置网络
-
配置防火墙
-
配置图形界面
-
配置包组
-
保存并检验
[root@localhost ~]# ksvalidator ks.cfg
[root@localhost ~]#
kickstart文件格式
kickstart配置文件由命令段,程序包段,脚本段等一个分段内容组成
-
命令段:指定各种安装前配置选项,如键盘类型等
必备命令
可选命令authconfig:认证方式配置 authconfig --enableshadow --passalgo=sha512 bootloader:定义bootloader的安装位置及相关配置 bootloader --location=mbr --driveorder=sda --append="crashkernel=auto rhgb quiet" keyboard:设置键盘类型 keyboard us lang:语言类型 lang zh_CN.UTF-8 part:分区布局; part /boot --fstype=ext4 --size=500 part pv.008002 --size=51200 #pv后面的数字是pv的id号 clearpart:清除分区 clearpart --none --drives=sda:清空磁盘分区; volgroup:创建卷组 volgroup myvg --pesize=4096 pv.008002 logvol:创建逻辑卷 logvol /home --fstype=ext4 --name=lv_home --vgname=myvg --size=5120 rootpw:管理员密码 rootpw --iscrypted $6$4Yh15kMGDWOPtbbW$SGax4DsZwDAz4201.O97WvaqVJfHcISsSQEokZH054juNnoBmO/rmmA7H8ZsD08.fM.Z3Br/67Uffod1ZbE0s. 生成加密密码的方式: ~]# openssl passwd -1 -salt `openssl rand -hex 4` timezone:时区 timezone Asia/Shanghai
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格式; 如:url --url=http://...省略
- 程序包段:指明要安装程序包,以及包组,也包括不安装的程序包
%packages 包安装的开始标识符
@group_name 包要安装的包组
package 要安装的单个包
-package 不需要安装的包
%end 包安装的结束标识符
- 脚本段:指明要运行的脚本,分为linux安装前的脚本和安装后脚本
%pre:安装前脚本
运行环境:运行安装介质上的微型Linux系统环境;
%post:安装后脚本
运行环境:安装完成的系统
- ks:指明kickstart文件的位置,主要有以下几种格式,其中http,ftp和https三种形式引导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
以下是系统安装完成之后在/root目录下根据用户选择生成的kickstart的配置文件信息
[root@localhost ~]# cat anaconda-ks.cfg
# Kickstart file automatically generated by anaconda.
#version=DEVEL
install
cdrom
lang zh_CN.UTF-8
keyboard us
network --onboot yes --device eth0 --bootproto dhcp --noipv6
rootpw --iscrypted $6$Ka7MzfgRm5CS9N22$cMgIl.79/xGrzOG4jWCfWHnsbl0fuPIfI5zhfCEC.PKlAr18gJR7auJp8smR1MI73i9Hl3XV2Aa5tFMQ4/j9i0
firewall --service=ssh
authconfig --enableshadow --passalgo=sha512
selinux --enforcing
timezone Asia/Shanghai
bootloader --location=mbr --driveorder=sda --append="nomodeset crashkernel=auto rhgb quiet"
# The following is the partition information you requested
# Note that any partitions you deleted are not expressed
# here so unless you clear all partitions first, this is
# not guaranteed to work
#clearpart --none
#volgroup MYVG --pesize=4096 pv.008002
#logvol / --fstype=ext4 --name=lv_ --vgname=MYVG --size=10240
#logvol /home --fstype=ext4 --name=lv_home --vgname=MYVG --size=5000
#logvol swap --name=lv_swap --vgname=MYVG --size=2000
#logvol /usr --fstype=ext4 --name=lv_usr --vgname=MYVG --size=15000
#logvol /var --fstype=ext4 --name=lv_var --vgname=MYVG --size=10000
#part /boot --fstype=ext4 --size=500
#part pv.008002 --size=60000
repo --name="CentOS" --baseurl=cdrom:sr0 --cost=100
%packages --nobase
@core
%end
对于修改的kickstart配置文件如果有语法错误可以使用检查语法错误命令: ksvalidator
[root@localhost ~]# ksvalidator anaconda-ks.cfg
[root@localhost ~]#
#如果有错误会有提示
引导光盘镜像制作及kickstart文件安装系统
1. 创建目录并复制isolinux目录:
引导光盘仅需要isolinux即可,并把配置好的kickstart文件复制到创建目录中
[root@localhost ~]# mount /dev/cdrom /media
mount: block device /dev/sr0 is write-protected, mounting read-only
[root@localhost ~]# mkdir /tmp/myiso
[root@localhost ~]# cp -r /media/isolinux/ /tmp/myiso/
[root@localhost ~]# ls /tmp/myiso/isolinux/
boot.cat grub.conf isolinux.bin memtest TRANS.TBL vmlinuz
boot.msg initrd.img isolinux.cfg splash.jpg vesamenu.c3
[root@localhost ~]# cp ks.cfg /tmp/myiso/isolinux
2. 创建iso文件系统:
使用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 myiso/
[root@localhost ~]# cd /tmp
[root@localhost tmp]# 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 myiso/
I: -input-charset not specified, using utf-8 (detected in locale settings)
genisoimage 1.1.9 (Linux)
Scanning myiso/
Scanning myiso/isolinux
Excluded by match: myiso/isolinux/boot.cat
Excluded: myiso/isolinux/TRANS.TBL
Writing: Initial Padblock Start Block 0
Done with: Initial Padblock Block(s) 16
Writing: Primary Volume Descriptor Start Block 16
Done with: Primary Volume Descriptor Block(s) 1
Writing: Eltorito Volume Descriptor Start Block 17
Size of boot image is 4 sectors -> No emulation
Done with: Eltorito Volume Descriptor Block(s) 1
Writing: Joliet Volume Descriptor Start Block 18
Done with: Joliet Volume Descriptor Block(s) 1
Writing: End Volume Descriptor Start Block 19
Done with: End Volume Descriptor Block(s) 1
Writing: Version block Start Block 20
Done with: Version block Block(s) 1
Writing: Path table Start Block 21
Done with: Path table Block(s) 4
Writing: Joliet path table Start Block 25
Done with: Joliet path table Block(s) 4
Writing: Directory tree Start Block 29
Done with: Directory tree Block(s) 2
Writing: Joliet directory tree Start Block 31
Done with: Joliet directory tree Block(s) 2
Writing: Directory tree cleanup Start Block 33
Done with: Directory tree cleanup Block(s) 0
Writing: Extension record Start Block 33
Done with: Extension record Block(s) 1
Writing: The File(s) Start Block 34
21.94% done, estimate finish Tue Oct 9 19:30:39 2018
43.79% done, estimate finish Tue Oct 9 19:30:39 2018
65.71% done, estimate finish Tue Oct 9 19:30:39 2018
87.57% done, estimate finish Tue Oct 9 19:30:39 2018
Total translation table size: 4701
Total rockridge attributes bytes: 1438
Total directory bytes: 2654
Path table size(bytes): 26
Done with: The File(s) Block(s) 22659
Writing: Ending Padblock Start Block 22693
Done with: Ending Padblock Block(s) 150
Max brk space used 0
22843 extents written (44 MB)
-----------------------------------------------------------------------------------------
[root@localhost ~]# ls
ab download.cgi hostname line sum 公共的 文档
anaconda-ks.cfg filename idsum linesum user 模板 下载
boot.iso foo.sh install.log linesum2 useradd 视频 音乐
dead.letter hadoop install.log.syslog menu wordlist 图片 桌面
3. 使用FTP工具将boot.iso传到主机上:
4. 配置虚拟机并启动:
光盘要选择boot.iso这个文件
5. 开机启动并配置kickstart文件:
在以上界面按下ESC后进入boot,并输入ks.cfg的路径
最后敲入命令即可进入自动引导安装了.