1、请详细描述CentOS系统的启动流程(详细到每个过程系统做了哪些事情)
一、内核空间详细过程如下:
POST –> BootSequence(BIOS) –> Bootloader(MBR) –> kernel(ramdisk) –> rootfs(只读) –> /sbin/init(systemd)
1.POST:(power on system test)加电自检
负责完成对CPU、主板、内存、硬盘子系统、显示子系统、串并行接口、键盘、CD-ROM光驱等硬件情况的检测。
ROM: BIOS(Basic Input and Output System) ,即基本输入输出系统,它是装载ZA在一个硬件芯片 CMOS 之上,加电过程就是给CMOS通电,然后启动其上的BIOS程序,BIOS程序会根据CMOS上面的一些配置信息去读取其他硬件设备信息并检测其是否存在并能正常运行,之后进行硬件设备的初始化。
2.Boot Sequnence
按次序查找引导设备,第一个有引导程序的设备为本次启动设备,即:bootloader ;
1)bootloader: 引导加载器,引导程序
Linux:
LILO:LInux LOader
GRUB: GRand Unified Bootloader
GRUB 0.X: Grub Legacy,
GRUB 1.X: Grub2
grub功能 :功能丰富,提供一个菜单,允许用户选择要启动系统或不同的内核版本; 把用户选定的内核装载到内存中的特定空间RAM中,解压、展开,并把系统控制权移交给内核 ;
2)bootloader装在MBR中:Master Boot Record(主引导记录)
512bytes :
446bytes: bootloader,
64bytes: 分区表
2bytes: 55AA(有效标识)
3)GRUB(2各阶段)
bootloader : 1st stage
Partitioon :1.5 stage filesystem driver
Partitioon :2nd stage 分区文件在/boot/grub上
3.Kernel:加载系统内核,执行系统初始化信息
1) 自身初始化 :
· 探测可识别到的所有硬件设备
· 加载硬件驱动程序(可能借助于ramdisk加载驱动 )
· 以只读方式挂载根文件系统
· 运行用户空间的第一个应用程序:/sbin/init
2)ramdisk :
内核中的特性之一:使用缓冲和缓存来加速对磁盘上的文件访问
·ramdisk–> ramfs 提高速度(完成对真正根文件系统的驱动加载)
CentOS 5: initrd, 工具程序:mkinitrd
CentOS 6;7: initramfs,工具程序:mkinitrd,dracut
一旦启动了init,内核就不管了,所有的后续操作都是由init去加载运行用户空间的应用程序来完成各种各样的工作,只有当这些应用程序完成系统调用或者系统发生中断时需要特权操作时,内核才会参与;剩余的其他过程都不在参与,而是由用户空间的程序来完成。
启动用户空间的第一个执行程序/sbin/init, 完成系统初始化
在内核、硬件及驱动信息加载完毕后,内核会呼叫用户空间中的第一个执行程序/sbin/init,init程序主要功能是准备软件运行环境,包括系统的主机名称、网络配置、文件系统各式等其他服务的启动管理。而这些所有的操作都是通过init的配置文件来定义。
二、用户空间启动流程
设置默认运行级别-->运行系统初始化脚本,完成系统初始化-->关闭对应级别下需要停止的服务,启动对应级别下需要开启的服务-->设置登录终端-->[启动图形终端]
1.运行级别:为了系统的运行或维护等目的而设定的机制
0-6:7个级别
0:关机,shutdown
1:单用户模式(single user),root用户 无需认证 维护模式
2:多用户模式(multi user),会启动网络功能,但不会启动NFS 维护模式
3:多用户模式(multi user),完全功能,文本界面(only)
4:预留模式;目前无特别使用目的,同三级别功能使用
5:多用户模式(multi user),完全功能,图形界面
6:重启,reboot
默认级别:3或者5
级别切换: init #
2.系统初始化的脚本文件:/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.清理操作
3. 关闭对应级别下需要停止的服务,启动对应级别下需要开启的服务
根据运行级别的不同,系统会运行rc0.d到rc6.d中的响应的脚本程序,来完成相应的初始化工作和启动相应的服务。
执行/etc/rc.d/rc.local
4. 启动终端
2、为运行于虚拟机上的CentOS 6添加一块新硬件,提供两个主分区;
(1) 为硬盘新建两个主分区;并为其安装grub;
(2) 为硬盘的第一个主分区提供内核和ramdisk文件; 为第二个分区提供rootfs;
(3) 为rootfs提供bash、ls、cat程序及所依赖的库文件;
(4) 为grub提供配置文件;
(5) 将新的硬盘设置为第一启动项并能够正常启动目标主机;
添加硬盘创建分区:
[root@dodo ~]# cat /proc/partitions
major minor #blocks name
8 16 20971520 sdb
8 17 10490413 sdb1
8 18 10474380 sdb2
8 0 20971520 sda
8 1 512000 sda1
8 2 20458496 sda2
253 0 18423808 dm-0
253 1 2031616 dm-1
[root@dodo /]# mkfs.ext4 /dev/sdb1
[root@dodo /]# mkfs.ext4 /dev/sdb2
[root@dodo /]# mkdir /mnt/boot
[root@dodo /]# mount /dev/sdb1 /mnt
[root@dodo /]# mkdir /mnt/sysroot/{bin,proc,lib64,mnt,sbin,usr,tmp,etc,home,var,dev.media}
[root@dodo /]# mount /dev/sdb1 /mnt/sysroot
安装grub:
[root@dodo /]# grub-install --root-directory=/mnt /dev/sdb
Probing devices to guess BIOS drives. This may take a long time.
Installation finished. No error reported.
This is the contents of the device map /mnt/boot/grub/device.map.
Check if this is correct or not. If any of the lines is incorrect,
fix it and re-run the script `grub-install'.
(fd0) /dev/fd0
(hd0) /dev/sda
(hd1) /dev/sdb
复制内核文件和initramfs:
[root@dodo /]# cp /boot/vmlinuz-2.6.32-504.el6.x86_64 /mnt/boot/vmlinuz
[root@dodo /]# cp /boot/initramfs-2.6.32-504.el6.x86_64.img /mnt/boot/initramfs.img
编辑grub配置文件:
[root@dodo /]# vim /mnt/boot/grub/grub.conf
default=0
timeout=5
title CentOS-dodo
root(hd0,0)
kernel /vmlinuz ro root=/dev/sda2 selinux=0 init=/bin/bash
initrd /initramfs.img
为rootfs提供bash、ls、cat程序及所依赖的库文件:
[root@dodo mnt]# cp /bin/{bash,ls,cat} /mnt/sysroot/bin
[root@dodo sysroot]# ldd /bin/{ls,cat,bash}
/bin/ls:
linux-vdso.so.1 => (0x00007fff74dff000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f9994022000)
librt.so.1 => /lib64/librt.so.1 (0x00007f9993e1a000)
libcap.so.2 => /lib64/libcap.so.2 (0x00007f9993c15000)
libacl.so.1 => /lib64/libacl.so.1 (0x00007f9993a0d000)
libc.so.6 => /lib64/libc.so.6 (0x00007f9993679000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f9993474000)
/lib64/ld-linux-x86-64.so.2 (0x00007f999424f000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f9993257000)
libattr.so.1 => /lib64/libattr.so.1 (0x00007f9993052000)
/bin/cat:
linux-vdso.so.1 => (0x00007fff64fb1000)
libc.so.6 => /lib64/libc.so.6 (0x00007f58726f8000)
/lib64/ld-linux-x86-64.so.2 (0x00007f5872a9a000)
/bin/bash:
linux-vdso.so.1 => (0x00007fffe1d44000)
libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007f715b19a000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f715af96000)
libc.so.6 => /lib64/libc.so.6 (0x00007f715ac01000)
/lib64/ld-linux-x86-64.so.2 (0x00007f715b3c9000)
[root@dodo mnt]# cp /lib64/libselinux.so.1 /mnt/sysroot/lib64
[root@dodo mnt]# cp /lib64/librt.so.1 /mnt/sysroot/lib64
[root@dodo mnt]# cp /lib64/libcap.so.2 /mnt/sysroot/lib64
[root@dodo mnt]# cp /lib64/libacl.so.1 /mnt/sysroot/lib64
[root@dodo mnt]# cp /lib64/libc.so.6 /mnt/sysroot/lib64
[root@dodo mnt]# cp /lib64/libdl.so.2 /mnt/sysroot/lib64
[root@dodo mnt]# cp /lib64/ld-linux-x86-64.so.2 /mnt/sysroot/lib64
[root@dodo mnt]# cp /lib64/libattr.so.1 /mnt/sysroot/lib64
[root@dodo mnt]# cp /lib64/libtinfo.so.5 /mnt/sysroot/lib64
[root@dodo sysroot]# sync
3、制作一个kickstart文件以及一个引导镜像。描述其过程。
通过编辑/root/anaconda-ks.cfg为模板的文件
#version=DEVEL
# System authorization information 认证方式
auth --enableshadow --passalgo=sha512
# Use CDROM installation media 光盘
cdrom
# Use graphical install 图形化安装
graphical
# Run the Setup Agent on first boot 第一次启动时设置系统的向导
firstboot --enable
ignoredisk --only-use=sda
# Keyboard layouts 键盘
keyboard --vckeymap=us --xlayouts='us'
# System language 系统语言
lang en_US.UTF-8
# Network information 网络服务
network --bootproto=dhcp --device=ens33 --ipv6=auto --activate
network --hostname=localhost.localdomain
# Root password 管理员密码
rootpw --iscrypted $6$tvsSxwFwiO2Ekcq1$8jRMyxa3cXqXwEN/HKzfcNG9vEi7XBWCr..rI3Id.mMzHq8uL4F15K9YgqN3N1sLoUI3nEtnaF5YGjZPsgs/E0
# System services 同步时间服务
services --enabled="chronyd"
# System timezone 时区
timezone Asia/Shanghai --isUtc
# X Window System configuration information 窗口配置化信息
xconfig --startxonboot
# System bootloader configuration 定义BootLoader的安装位置设置级相关配置
bootloader --append=" crashkernel=auto" --location=mbr --boot-drive=sda
autopart --type=lvm
# Partition clearing information 清空磁盘分区
clearpart --none --initlabel
%packages 程序包
@^gnome-desktop-environment
@base
@core
@desktop-debugging
@dial-up
@directory-client
@fonts
@gnome-desktop
@guest-agents
@guest-desktop-agents
@input-methods
@internet-browser
@java-platform
@multimedia
@network-file-system-client
@networkmanager-submodules
@print-client
@x11
chrony
kexec-tools
#结束自动化部署
%end
%addon com_redhat_kdump --enable --reserve-mb='auto'
%end
%anaconda
pwpolicy root --minlen=6 --minquality=50 --notstrict --nochanges --notempty
pwpolicy user --minlen=6 --minquality=50 --notstrict --nochanges --notempty
pwpolicy luks --minlen=6 --minquality=50 --notstrict --nochanges --notempty
%end
或安装system-config-kickstart,图形自动生成ks文件
1.复制安装系统光盘引导文件和配置好的ksdodo.cfg文件到/dodoroot/isolinux目录
cp -rf /mnt/isolinux /dodoroot/isolinux
cp /boot/ksdodo.cfg /dodoroot/isolinux/
2.在isolinux.cfg中指明kickstart文件位置,可以实现完全自动化安装。也可以在“boot:”提示符下手动指定
append initrd=initrd.img ks=cdrom:/isolinux/ksdodo.cfg
3.创建ISO启动镜像 mkisofs -R -J -T -v --no-emul-boot --boot-load-size 4 --boot-info-table -V "CentOS 7 dodo" -c isolinux/boot.cat -b isolinux/isolinux.bin -o isolinux/boot.iso dodoroot/
4、写一个脚本
(1) 能接受四个参数:start, stop, restart, status
start: 输出“starting 脚本名 finished.”
…
(2) 其它任意参数,均报错退出;
#!/bin/bash
#判断
#author:dodo
case $1 in
start)
echo "start $0 finished."
;;
stop)
echo "stop $0 finished."
;;
restart)
echo "restart $0 finished."
;;
status)
echo "status $0 ok."
;;
*)
echo "error"
exit 1
;;
esac
5、写一个脚本,判断给定的用户是否登录了当前系统;
(1) 如果登录了,则显示用户登录,脚本终止;
(2) 每3秒钟,查看一次用户是否登录;
#!/bin/bash
#判断用户
#author:dodo
[ "$#" -lt 1 ] && echo "Please inter a username" && exit 1
! (id $1 &>/dev/null) && echo "Error: No user" && exit 2
while true;do
if who | grep "^$1\>" &>/dev/null ; then
echo "$1 is login"
break
else
echo "Waiting 3sec,I will be check"
sleep 3
fi
done
6、写一个脚本,显示用户选定要查看的信息;
cpu) display cpu info
mem) display memory info
disk) display disk info
quit) quit
非此四项选择,则提示错误,并要求用户重新选择,只到其给出正确的选择为止;
#!/bin/bash
#查询硬件状态
#author:dodo
cat << EOF
cpu) display cpu info
mem) display memory info
disk) display disk info
quit) quit
EOF
while true;do
read -p "please choose:" choose
case ${choose} in
cpu)
lscpu
;;
mem)
free -m
;;
disk)
df -HT
;;
quit)
exit
;;
*)
echo “Error!Please choose again!!”
continue
esac
done
7、写一个脚本
(1) 用函数实现返回一个用户的UID和SHELL;用户名通过参数传递而来;
(2) 提示用户输入一个用户名或输入“quit”退出;
当输入的是用户名,则调用函数显示用户信息;
当用户输入quit,则退出脚本;进一步地:显示键入的用户相关信息后,再次提醒输出用户名或quit:
#!/bin/bash
#查询用户及shell
#author:dodo
user_id () {
if id $username &> /dev/null; then
grep "^$username" /etc/passwd | awk -F: '{print "UID is:"$3, " Shell is:"$7}'
else
echo "none user"
fi
}
while true;do
read -p "please enter username or quit:" username
if [ $username == "quit" ];then
exit 0
else
user_id $username
fi
done
原创文章,作者:lyj821202,如若转载,请注明出处:http://www.178linux.com/69879

