25.了解Mini Linux 制作

  1. 启动流程:
    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)在初始化脚本中添加关于装载次内核的命令

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值