一、CentOS启动流程
POST –> Boot Sequence(BIOS) –> Boot Loader (MBR) –> Kernel(ramdisk) –> rootfs –> switchroot –> /sbin/init –>(/etc/inittab, /etc/init/*.conf) –> 设定运行级别 –> 系统初始化脚本 –> 关闭或启动对应级别下的服务 –> 启动终端
1.POST:加电自检,检查硬件设备是否存在
用于实现POST的代码在主板上ROM(CMOS)芯片上
BIOS:Basic Input and Output System 基本上输入输出系统,固化在ROM芯片上
2.Boot Sequence:
按次序查找各引导设备,第一个有引导程序的设备即为本次启动要用到的设备;
bootloader:引导加载器,程序;
提供一个菜单,允许用户选择要启动的系统或不同的内核版本; 把用户选定的内核装载到RAM中的特定空间中,解压、展开,而后把系统控制权移交给内核;
(1)Windows上引导加载器:ntloader
(2)Linux上引导加载器:
LILO:短小精悍的linux加载器,1024柱面之后无法加载,现在多用于安卓手机启动
GRUB:Grand Uniform Bootloader统一引导加载器
GRUB 0.X(CentOS 5/6):Grub Legacy
GRUB 1.X(CentOS 7):Grub2,完全重写,设计理念上很大改变
3.Kernel实现功能
kernel自身初始化,实现功能
—> 探测可识别到的所有硬件设备;
—> 加载硬件驱动程序;(有可能会借助于ramdisk加载驱动)
—> 以只读方式挂载根文件系统;
—> 运行用户空间的第一个应用程序:/sbin/init
4./sbin/init管理用户空间服务进程
init程序的在不同CentOS版本上类型:
CentOS 5及以前:SysV init 配置文件:/etc/inittab
CentOS 6:Ubantu研发的Upstart 配置文件:/etc/inittab /etc/init/*.conf
CentOS 7:Systemd 配置文件:/usr/lib/systemd/system/, /etc/systemd/system/
二、为运行于虚拟机上的Centos 6 添加一块新硬盘,提供两个主分区;
1.为硬盘新建两个主分区;并为其安装Grub
echo “- - -” > /sys/class/scsi_host/hos0/scan #扫描新添加的硬盘
fdisk /dev/sdb #将新硬盘分区
mkfs.ext4 /dev/sdb1 #格式化分区
mkfs.ext4 /dev/sdb2
mount /dev/sdb2 /mnt/minilinux/ #第二个分区为rootfs
mkdir -v /mnt/minilinux/{etc,bin,sbin,lib,lib64,var,proc,usr,sys,boot,dev,tmp} #创建rootfs所需目录
mount /dev/sdb1 /mnt/minilinux/boot/ #挂载第一分区为启动分区
grub-install --root-directory=/mnt/minilinux /dev/sdb #安装grub
[root@N5 桌面]# ls /mnt/minilinux/boot/grub/ #查看grub是否安装成功
device.map iso9660_stage1_5 stage1 xfs_stage1_5
e2fs_stage1_5 jfs_stage1_5 stage2
fat_stage1_5 minix_stage1_5 ufs2_stage1_5
ffs_stage1_5 reiserfs_stage1_5 vstafs_stage1_5
2.为硬盘的第一个主分区提供内核和ramdisk文件;为第二个分区提供rootfs
cp /boot/initramfs-2.6.32-431.el6.x86_64.img /mnt/minilinux/boot/initramfs.img #复制ramdisk文件
cp /boot/vmlinuz-2.6.32-431.el6.x86_64 /mnt/minilinux/boot/vmlinuz #复制kernel文件
3.为rootfs提供bash、ls、cat程序及所依赖的库文件;
cp /bin/{bash,ls,cat} /mnt/minilinux/bin/ #复制程序主文件
cp $(ldd /bin/{bash,ls,cat} |grep -o "/.*\.[0-9]") /mnt/minilinux/lib64/ #复制程序依赖库文件
[root@N5 桌面]# chroot /mnt/minilinux/ #chroot测试
bash-4.1# ls
bin boot dev etc lib lib64 lost+found proc sbin sys tmp usr var
bash-4.1# exit
4.为grub提供配置文件
vi /mnt/minilinux/boot/grub/grub.conf #创建grub配置文件,并写入如下配置;
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title Minilinux
root (hd0,0)
kernel /vmlinuz root=/dev/sda2 selinux=0 init=/bin/bash quiet
initrd /initramfs.img
注:如不在内核启动参数里写入selinux=0,可能会导致无法开机
5.将新的硬盘设为第一启动项并能正常启动目标主机
新建一个虚拟机并设置硬盘为现有硬盘
启动后Grub正常
正常开机
三、制作一个Kickstart文件以及一个引导镜像,描述其过程
1.制作Ks文件
yum -y install system-config-kickstart #安装Kickstart程序
[root@N4 桌面]# system-config-kickstart #使用Kickstart图形化工具
设置为http方式安装系统
2.创建引导镜像
[root@N4 桌面]# mkdir /root/miniboot
[root@N4 桌面]# cp -r /media/CentOS_6.5_Final/isolinux/ /root/miniboot/
[root@N4 桌面]# cp /root/ks.cfg /root/miniboot/
[root@N4 桌面]# vi /root/miniboot/isolinux/isolinux.cfg
#将第一个label修改为如下配置
label linux
menu label ^Auto Ks Network Install
menu default
kernel vmlinuz
append initrd=initrd.img ks=cdrom:/ks.cfg
#创建iso镜像文件
[root@N4 桌面]# mkisofs -R -J -T -v --no-emul-boot --boot-load-size 4 --boot-info-table -V "CentOS 6 miniboot" -c isolinux/boot.cat -b isolinux/isolinux.bin -o /root/boot.iso /root/miniboot/
3.新建一个虚拟机进行测试
可以看到第一项已经被改为Auto Ks Network Install,回车进入
已经开始自动安装了
四、写一个脚本
(1) 能接受四个参数:start, stop, restart, status
start: 输出“starting 脚本名 finished.” …
(2) 其它任意参数,均报错退出; #!/bin/bash
case $1 in
start)
echo "starting $0 finished"
;;
stop)
echo "stop $0 finished"
;;
restart)
echo "restart $0 finished"
;;
status)
echo "status"
;;
*)
echo "error"
exit 1
;;
esac
五、写一个脚本,判断给定的用户是否登录了当前系统;
(1) 如果登录了,则显示用户登录,脚本终止;
(2) 每3秒钟,查看一次用户是否登录;
#!/bin/bash
if [ $# -lt 1 ];then
echo "please input '$0 username'"
exit 1
fi
while true;do
if who | grep $1 &>/dev/null ;then
echo "user $1 is loggin"
exit 0
fi
sleep 3
done
六、写一个脚本,显示用户选定要查看的信息;
cpu) display cpu info
mem) display memory info
disk) display disk info
quit) quit
非此四项选择,则提示错误,并要求用户重新选择,只到其给出正确的选择为止;
#!/bin/bash
cat <<EOF
cpu) display cpu info
mem) display memory info
disk) display disk info
quit) quit
EOF
echo
read -p "please input your choice: " input
while true;do
case $input in
cpu)
lscpu
exit 0
;;
mem)
free -m
exit 0
;;
disk)
fdisk -l
exit 0
;;
quit)
exit 0
;;
*)
echo "argument error"
read -p "please input your choice: " input
;;
esac
done
七、写一个脚本
(1) 用函数实现返回一个用户的UID和SHELL;用户名通过参数传递而来;
(2) 提示用户输入一个用户名或输入“quit”退出;
当输入的是用户名,则调用函数显示用户信息;
当用户输入quit,则退出脚本;进一步地:显示键入的用户相关信息后,再次提醒输出用户名或quit:
#!/bin/bash
userinfo () {
echo
grep $user /etc/passwd | awk -F: '{print "Uid is "$3" Shell is "$7}'
echo
}
while true;do
read -p "Please input username or quit: " user
if [ $user == "quit" ];then
exit 0
elif id $user &>/dev/null;then
userinfo
else
echo "user not exist,input agin"
fi
done
本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/87812