- 启动流程:
CentOS 6:
POST --> BootSequence(BIOS) --> BootLoader --> Kernel (ramdisk) --> rootfs --> /sbin/init
ramdisk:直接载入内存中的虚拟系统,主要为了加载真正的文件系统驱动,然后进行根切换
Centos5 通过SysVinit启动进程的,通过配置文件/etc/inittab实现调用bash根据配置文件和编写的服务脚本按顺需创建bash子进程启动
Centos6 通过upstart启动进程,通过配置文件/etc/init/*.conf 完全模拟SysVinit实现启动,也可以把自己作为bash进行启动速度更快,但是配置比较复杂
SysVinit/upstart所实现的功能:
默认运行级别
运行系统初始化脚本:/etc/rc.d/rc.sysinit
/etc/rc.d/rc $runlevel
启动终端,并运行login
启动图形终端
CentOS 7:
POST --> BootSequence(BIOS) --> BootLoader --> Kernel (ramdisk) --> rootfs --> /sbin/systemd
sysremd服务脚本:systemd unit文件
bootloader:
三个版本: lilo
grub legacy
grub2
实现功能:
stage1: mbr
stage1_5: filesystem driver
state2:
2.内核配置编译:
make menuconfig -->(生成) .config
make [-j #]
make modules_install
make install
3.非模块方式编译内核制作Mini Linux
bootloader: grub
内核:kernel (非模块方式,所有功能模块都直接编译进内核所以就不需要rundisk和init)
根文件系统:busybox
(1)编译内核:
①安装开发环境
yum groupinstall “Development Tools” “Server Platform Develoment” -y
②下载内核压缩包并解压到/usr/src 目录中并创建链接
③make:
进入解压文件然后make help 可以获取帮助
make allnoconfig 关掉所有可选择的特性
make menuconfig 选择特性
特性包括:64为内核编译
模块动态装载
模块动态卸载
选择处理器类型,可以选用通用版
支持多处理器(多核)
PCI支持
装在硬盘驱动可以识别硬盘但不能识别文件系统(这样启动时不需要ramdisk)
支持ext4驱动
键盘驱动
鼠标驱动
把内核所识别的设备文件统统导出到/dev目录下(不能识别的只能用udev来创建)
支持网络相关功能
make -j 4 bzImage :表示只编译内核不编译模块
(2)添加一块硬盘然后分区(可分两个区一个存放内核一个作为跟,微型系统swap可以不用分) 格式化,并创建目录挂在
mkdir /mnt/{boot,sysroot}
mount /dev/sdb1 /mnt/boot/
(3)安装grub并挂在根文件系统
①
②在跟文件系统创建必要的目录
(4)拷贝编译好的内核到/mnt/boot下,并编辑grub配置文件使其能加载内核 :
sync
(5)内核在启动时需要加载第一个进程,这里可以用bash、busybox、自己写一个模拟init脚本来调用bash三种方法实现
①bash:
复制bash文件和库文件
复制程序及其依赖的库文件脚本示例:
#!/bin/bash
#
target=/mnt/sysroot
[ -d $target ] || mkdir /mnt/sysroot
read -p "A command: " command
libcp() {
for lib in $(ldd $1 | grep -o "[^[:space:]]*/lib[^[:space:]]*"); do
libdir=$(dirname $lib)
[ -d $target$libdir ] || mkdir -p $target$libdir
[ -f $target$lib ] || cp $lib $target$lib
done
}
while [ "$command" != 'quit' ]; do
if ! which $command &> /dev/null; then
read -p "No such command, enter again: " command
continue
fi
command=$(which --skip-alias $command)
cmnddir=$(dirname $command)
[ -d $target$cmnddir ] || mkdir -p $target$cmnddir
[ -f $target$command ] || cp $command $target$command
libcp $command
read -p "Another command(quit): " command
done
指定grub配置文件init=/bin/bash
②自己写一个脚本模拟init
注意:要提前把把脚本中需要的命令拷贝到新的盘中
脚本要给下执行权限
③busybox
–1. 下载解压busybox包,进入解压目录,可查看install安装文档
安装依赖库 yum install glibc-static
静态编译(两种编译方式:共享库的编译方式,需要依赖服务起中的共享库;静态编译,把所需要的库都编译到文件中)
–2. make menuconfig 生成配置文件
选择支持静态编译(不使用共享库)
–3. make && make install
–4.复制生成文件到新挂在磁盘
rm -rf * /mnt/sysroot/ 删除根目录下的所有创建目录,复制busybox生成文件到此目录,然后缺啥再给创建
cp -ar _install/* /mnt/sysroot
–5. 修改grub配置文件 init=/sbin/init
–6.提供一个init配置文件:vim /etc/inittab
–7.创建一个初始化脚本:vim etc/rc.d/rc.sysinit 并给下执行权限
–8.提供fstab文件
–9.创建/etc/passwd /etc/shadow 并修改其中root信息
(6)新建一个虚拟机并选择所添加的磁盘进行启动
4. 模块化编译内核
(1)make menuconfig 选择内核支持得得选项输入M(M表示编译成模块、*表示编译到内核中)
(2)生成的文件进行编译成模块:
编译单个内核模块:
# cd /usr/src/linux
# make M=path/to/somedir/
# make M=drivers/net/ethernet/intel/e1000/
(3)在初始化脚本中添加关于装载次内核的命令