Linux小系统(一)-小系统制作

制作Linux小系统-外围文件系统定制

环境: - window10 - vmvare pro 14 - centos6.10-mini

一、Linux启动过程分析

  1. BIOS
  2. MBR/GPT
    • Master Boot Record and Disk partitions
    • Globally Unique Identifier Parttion Table Format
  3. OS Loader
    • Window:NTLDR/BootMgr
    • Linux:GRUB/GRUB2
  4. OS Kernel
    • DOS:IO.SYS MSDOS.SYS
    • Window:ntoskrnl.exe
    • Linux:vmlinuz
  5. Application Manager
    • DOS:command.com
    • Window:explorer.exe
    • Linux:init
  6. Applications…

二、启动bash

/boot中的init.img文件*

  • 一个由OS loader载入的镜像文件
  • 临时“根文件系统”

    /boot/grub/grub.conf文件

    title Linux 2.4
    root (hd0,1)
    kernel /boot/vmlinuz ramdisk_size=8192 root=LABEL=/
    initrd /boot/initrd.img

制作根文件系统

使用原来的kernel,initd自己的init*.img

  • 如何生成img文件

    . 表示当前目录

    $ find . | cpio -H newc -o | gzip > /boot/initrd.img
  • 解压生成的img(不小心删掉了自己的系统文件夹,可以用这个方法恢复)
    $ mv initramfs.img initramfs.img.gz # 添加gz后缀
    $ gunzip initramfs.img.gz # 解压
    $ mkdir temp # 创建目录并将解压后的文件丢进去
    $ cpio -i -F ../initramfs.img # 解压刚刚丢进temp的文件

制作init

Application Manager

init是开机后grub引导进入系统后执行的,所以想要开机进去之后得到一个bash,就得在这个里面定制过程 bash是一个命令,所以只要执行这个命令,就可以得到一个bash,

text
1
2
# 查找命令find,可使用通配符*
$ find / -name "bash"

可执行文件&动态库

随意创建一个目录作为我们小系统的根目录,创建必要的文件夹(拷入小系统的路径与大系统路径一致,例如bash在bin目录中,就要在小系统根目录下创建bin目录然后将bash拷入)

bash执行还需要有其依赖的动态库,我们的小系统启动起来是独立于大系统的,所以我们要将其依赖的动态库也拷进我们的小系统

text
1
2
3
# 查新指令依赖的动态库
$ ldd /可执行文件路径
$ ldd /bin/bash
  • 拷贝可执行文件依赖动态库脚本
    #!/bin/bash

    use : ./script.sh /可执行文件 /动态库目录

    dependList=$( ldd $1 | awk ‘{if (match($3,”/“)){ print $3}}’ )

echo $dependList
cp $dependList $2

  • 拷贝目录下的所有可执行文件依赖的动态库脚本
    #!/bin/bash

    use : ./script.sh /可执行文件目录 /动态库目录

    for m in $(ls $1)

do
dependList=$( ldd $1/$m | awk ‘{if (match($3,”/“)){ print $3}}’ )
cp $dependList $2
done

三、管理设备

  • udev : 管理、监控主机设备的服务程序
    • 依赖与sysfs文件系统(挂载于/sys)
    • 规则文件/lib/udev
    • 配置文件/etc/udev
    • 自动在/dev目录下创建设备节点
  • /proc目录:通过 /proc 文件系统,在运行时访问内核内部数据结构、改变内核设置的机制
  • /sys目录:硬件设备的驱动程序信息

通过执行/sbin/start_udev,就可以检测到所有的设备

text
1
2
# 查看当前机器所有设备
$ ls /dev

四、挂载磁盘

磁盘也是一种设备

在linux上挂载磁盘,磁盘一般是在dev目录里的,但是在上面的管理设备部分,当列出当前机器设备时,并没有看到有关sd之类的,这是因为*缺少驱动程序 Linux的驱动在/lib/modules目录,可以看到有不同的版本号

text
1
2
3
4
$ lsmod # 列出当前机器所使用的所有驱动
$ modinfo # 查看驱动具体介绍,包括驱动依赖关系
$ insmod # 加载指定的驱动
$ modprobe # 载入制定模块或者载入一组相依的模块,需要有依赖关系moudules.dep
  • 磁盘所需驱动
    • scsi_transport_spi.ko
    • mptbase.ko
    • mptscsih.ko
    • mptspi.ko
    • crc-t10dif.ko
    • sd_mod.ko
  • etx4文件系统驱动
    • mbcache.ko
    • jbd2.ko
    • ext4.ko

当加载完磁盘和文件系统驱动,就可以挂载和读写原来的文件系统了

五、登录login

  • login认证体系(PAM)
    • /etc/pam.d
    • /lib/security

六、使用/sbin/init启动系统

/sbin/init的工作:

  • /etc/rc.sysinit
    • probe devices:udevd
    • fsck
    • remount
  • /etc/rc
    • service
  • /sbin/mingetty
    • login prompt = mingetty+/bin/login

七、联网

  • 网卡驱动:
    • e1000.ko
  • ping:查看网络是否连通
  • ethtool:查看网卡信息
  • ifup、ifdown:启动,关闭网卡
  • mentohust:连接校园网的工具
  • ssh:连接到远程主机,或者被远程主机连接
  • scp:基于ssh在两台主机之间拷贝文件