1、请详细描述CentOS系统的启动流程(详细到每个过程系统做了哪些事情)
POST –> BootSequence(BIOS) –>Bootloader(MBR) –>Kernel(ramdisk)–>rootfs(readonly)–>switchroot–>/sbin/init(设置默认运行级别–>运行系统初始化脚本,完成系统初始化–>关闭对应级别下需要停止的服务,启动对应级别下需要开启的服务–>设置登陆终端[启动图形界面])
1)加电自检(POST),BIOS启动引导阶段;
在该过程中实现硬件的初始化以及查找启动介质;
从MBR中装载启动引导管理器(GRUB)并运行该启动引导管理;
MBR才512bytes,所以现在很多都用UEFI,GPT方式咯
2)GRUB(Grand Uniform Bootloader)启动引导阶段;
功能:提供一个菜单,允许用户要选择启动的不同系统或内核版本,把其内核加载到RAM中的特定空间,解压、展开,让后控制权移交给kernel
装载stage1
装载stage1.5
装载stage2(因为MBR很小,所以这里没有限制哦)
读取/boot/grub.conf文件并显示启动菜单;
装载所选的kernel和initrd文件到内存中
PS:LILO:支持柱面1024,现在基本都用在android手机,不用再PC机了
3)内核阶段:
探测可识别到所有硬件设备
加载各种硬件驱动程序;(有可能会借助于randisk加载驱动)
以只读方式挂载根文件系统
运行用户空间的第一个应用程序:/sbin/init
ps: ramdisk:Linux 内核特性之一:使用缓冲和缓存来加速对磁盘上的文件访问:
ramdisk –> ramfs
initramfs — dracut,mkinitrd (CenetOS6,7
4)init用户空间初始化阶段:
启动/sbin/init程序;
运行rc.sysinit脚本,设置系统环境,启动swap分区,检查和挂载文件系统;
读取/etc/inittab文件,运行在/et/rc.d/rc<#>.d中定义的不同运行级别的服务初始化脚本;
打开字符终端1-6号控制台/打开图形显示管理,设置登录
init程序:
CentOS 5 : /ect/inittab
CentOS 6 :Upstart
/etc/inittab:这个文件已废
/etc/init/*.conf,
CentOS 7 : systemd
配置文件:/usr/lib/systemd/system/, /etc/systemd/system/
2、为运行于虚拟机上的CentOS 6添加一块新硬件,提供两个主分区;
(1) 为硬盘新建两个主分区;并为其安装grub;
(2) 为硬盘的第一个主分区提供内核和ramdisk文件; 为第二个分区提供rootfs;
(3) 为rootfs提供bash、ls、cat程序及所依赖的库文件;
(4) 为grub提供配置文件;
(5) 将新的硬盘设置为第一启动项并能够正常启动目标主机;
功能:在其他系统上制作一个完整的grub引导系统,并且能跑起来!!
在虚拟机中另外添加磁盘,fdisk /dev/sdb # 创建三个分区,boot,/,swap
~]#partx -a /dev/sdb
~]#mke2fs -t ext4 /dev/sdb1
~]#mke2fs -t ext4 /dev/sdb3
~]#mkswap /dev/sdb2
注意:这个在centos7没有做成功,centos6可以的
注意:安装grub引导时,必须要指定boot的,不能用当前系统
~]#mkdir /mnt/boot
~]#mount /dev/sdb1 /mnt/boot/
安装grub
~]#grub-install –root-directory=/mnt /dev/sdb ;指定根在什么地方,不能写到/mnt/boot
~]#cd /mnt/boot ;有了第一阶段和第二阶段的文件,还差,配置文件、内核和rootfs
~]#cp /boot/vmlinuz-2.6.32-431.el6.x86_64 /mnt/boot/vmlinuz
~]#cp /boot/initramfs-2.6.32-431.el6.x86_64.img /mnt/boot/initramfs.img
~]#vim /mnt/boot/grub/grub.conf ; 注意,下列信息 是配置后单独分系统使用的,所以,sda,不是sdb
default=0
timeout=5
title CentOS (smile)
root (hd0,0)
kernel /vmlinuz ro root=/dev/sda3 selinux=0 init=/bin/bash
initrd /initramfs.img
mkdir /mnt/sysroot
mount /dev/sdb3 /mnt/sysroot
cd /mnt/sysroot
mkdir -pv etc bin sbin lib lib64 usr home tmp mnt var proc root
cp /bin/bash /mnt/sysroot/bin
ldd /bin/bash | grep "/lib[^[:space:]]*" ;获取这个命令依赖的库文件
注意:这里调用我写的一个脚本,复制命令以及相关的依赖库文件
#!/bin/bash
#
#Athor:smile
#Date:2017-1-22
#Filename: copy_Command_Lib.sh
#Pragram:
#
# Copy enter "command" and "libraries" file
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
export PATH
#指定的根路径
dir_path=/mnt/sysroot/
# 传递给函数可执行命令,复制命令程序和依赖库文件到指定目录 ,并且取掉绝对路径
f_copy_com_lib() {
command_path=$(which –skip-alias "$1" ) #获命令取绝对路径
temp_dir=${command_path#*/} # 取掉绝对路径“/”
temp_dir=${temp_dir%/*} # 取掉后面的文件文件名
mkdir -p $dir_path$temp_dir # 创建/mnt/sysroot下对应的的目录
cp -rf $command_path $dir_path$temp_dir
#获取命令路径要注意两个问题:第一个要避开which查出结果有alias别名问题, which COM | grep -v "alias" 除去别名
#第一步,查出命令路径,第二步,去掉alias,第三步,查出命令所以来的库,第四步,获取库的准确路径
for lib_file in $( ldd $(which –skip-alias "$1" ) | grep -o "/lib[^[:space:]]*") ; do
temp_dir=${lib_file#*/} #取掉绝对路径 ${string#*word}
temp_dir=${temp_dir%/*} #去掉基名
mkdir -p $dir_path$temp_dir #创建一个库文件的路径
cp -rf $lib_file $dir_path$temp_dir #复制库文件到指定的目录中
#echo "${a_library[$i]}" #let i++
echo "$lib_file"
echo
done
}
while true ; do
cat << EOF
+++++++++++++++++++++++++++++++++++++++++++++++++
command)Please enter the system existing command
quit) quit script
+++++++++++++++++++++++++++++++++++++++++++++++++
EOF
read -p "Please enter existing command:" v_command
if [ $v_command == "quit" ] ; then
break
fi
#如果输入的不存在的命令,处理
if ! ( which $v_command &>/dev/null ) ; then
echo "ERROR:command not found!"
continue # 进行下一次循环
fi
f_copy_com_lib $v_command
done
cp ….
chroot /mnt/sysroot ;切换根命令 ,进行测试
exit
sync ;同步到磁盘
第二步:
创建新的虚拟机,加载配置好的分区
如果需要啊添加虚拟机的话,就能就在grub中添加引导记录
mount /dev/sdb1 /mnt/boot
3、制作一个kickstart文件以及一个引导镜像。描述其过程。
制作kickstart文件,我目前我喜欢去安装一个文件系统,等系统安装好了,在/root/anaconda-ks.cfg下获取,再来针对改一改(自己能力弱吧,也可以在网上获取的,CentOS6和CentOS7产生的kickstart文件还是有点不一样,不过CentOS应该可以兼容的)
kickstart文件的模板
命令段
指定各种安装前配置选项,如键盘类型
必备命令
可选命令
程序段
指明要安装程序包,以及包组,也包括不安装的包
%packages ;程序包开始了
@group_name
package
-package ;指定不要的程序包
程序包
%end
脚本段
%pre:安装前脚本
运行环境:运行安装介质微型linux系统环境
…
%end
%post:安装后脚本
运行环境:安装后的运行环境
…
%end
有多种方式自动话实现安装,引导光盘中,http和ftp网络上,
用光盘下的最小引导系统单独做成关盘镜像:
~]# cp -rf /media/isolinux /mnt/myiso
~]# cp myks.cfg /mnt/myiso
mnt]# mkisofs -R -J -T -v –no-emul-boot –boot-load-size 4 –boot-info-table -V "CentOS 6.5 x86_64 boot" -b isolinux/isolinux.bin -c isolinux/boot.cat -o /root/boot.iso myiso/
#创建时,把制作好的myks.cfg文件 放在myiso目录下,并且和isolinux目录同一个
怎加载ks.cfg文件
boot:linux ip=192.168.10.19 netmask=255.255.255.0 ks=http://192.168.10.100/ks.cfg ;前面的ip地址是配置当前主机的地址
boot: linux ks=cdrom:/path/to/ks_file
kickstart文件中各个字段的解读:
authconfig:认证方式配置
authconfig –enableshadow –passalgo=sha512
bootloader:定义bootloader的安装位置及相关配置
bootloader –location=mbr –driveorder=sda –append="crashkernel=auto rhgb quiet"
keyboard us
lang:语言类型
part:分区
part /boot –fstype=ext4 –size=500
part pv.008002 –size=51200
clearpart:清除分区
clearpart –none –drives=sda;清空磁盘分区
volgroup:创建卷组
volgroup myvg –pesize=4096 pv.008002
logvol:创建逻辑卷
logvol /home –fstype=ext4 –name=lv_home –vgname=myvg –size=4122
rootpw:管理员密码
rootpw –iscrypted $llll
生成密码的方式:
~]#openssl passwd -1 -salt `openssl rand -hex4`
timezone:时区
timezone Asia/Shanghai
可选命令
install OR upgrade:安装或升级
text:安装界面类型,text为tui,默认是gui
network:配置网络接口
network –noboot yes –device eth0 –bootproto dhcp –noipv6
防火墙:firewall –server=ssh
firewall –disabled
selinux :SELinux(内核安全机制
selinux disabled
halt,poweroff 或者reboot,安装后的行为
repo:指明安装时使用的repository
repo –name="CentOS" –baseurl=cdrom:sr0 –cost=100 ;cost是开销,默认是1000,这里比较优先
url:指明安装时使用的 repository ,但为url格式
url –url=http://192.168.10.102/cobbler/ks_mirror/CentOS-7.0-x86_64/
4、写一个脚本
(1) 能接受四个参数:start, stop, restart, status
start: 输出“starting 脚本名 finished.”
…
(2) 其它任意参数,均报错退出;
5、写一个脚本,判断给定的用户是否登录了当前系统;
(1) 如果登录了,则显示用户登录,脚本终止;
(2) 每3秒钟,查看一次用户是否登录;
6、写一个脚本,显示用户选定要查看的信息;
cpu) display cpu info
mem) display memory info
disk) display disk info
quit) quit
非此四项选择,则提示错误,并要求用户重新选择,只到其给出正确的选择为止;
7、写一个脚本
(1) 用函数实现返回一个用户的和SHELL;用户名通过参数传递而来;
(2) 提示用户输入一个用户名或输入“quit”退出;
当输入的是用户名,则调用函数显示用户信息;
当用户输入quit,则退出脚本;进一步地:显示键入的用户相关信息后,再次提醒输出用户名或quit:
原创文章,作者:不忘初衷,如若转载,请注明出处:http://www.178linux.com/67426
评论列表(1条)
非常非常详细,很棒。