40.定制自己的linux系统

介绍

通过裁剪现有linux系统,创建属于自己的min linux小系统,可以加深对linux的理解

基本原理

  • linux的启动流程
    1. 首先linux通过自检,检查硬件设备有没有故障
    2. 如果有多块启动盘的话,需要在BIOS中选择启动盘
    3. 启动MBR中的bootloader引导程序
    4. 加载内核文件
    5. 执行所有进程的父进程、老祖宗systemd
    6. 欢迎界面
  • 在linux启动流程中,家唉内核文件时的关键文件:
    1. kernel文件:vmlinuz-3.10.0-957.el.x86_64
    2. initrd文件:initramfs-3.10.0-957.el.x86_64.img

制作min linux思路分析

  1. 在现有linux系统(centos7.6)上加一块硬盘/dev/sdb,在硬盘上分两个分区,一个是/boot,一个是/,并将其格式化。需要明确的是,现在加的这个硬盘在现有linux系统中是/dev/sdb,但是当把全部设置好时,要把这个硬盘拔除,放在新的系统上,此时,就是/dev/sda
  2. 在/dev/sdb硬盘上,将其打造成独立的Linux系统,里面的所有文件时需要拷贝进去的
  3. 作为能独立运行的linux系统,内核是必须有的,要把内核文件和initramfs文件也一起拷贝到/dev/sdb上
  4. 以上步骤完成后自制linux就完成,创建一个新的linux虚拟机,将其硬盘指向创建的硬盘,即可启动

操作步骤

  1. 在现有linux添加一块20G的硬盘,添加完成后重启。

    • 注意:添加硬盘时,要将虚拟磁盘存储为单个文件

    image

  2. 通过fdisk给/dev/sdb进行分区,分区1设置500M,其余分给分区2

  3. 对/dev/sdb的分区进行格式化

    • mkfs.ext4 /dev/sdb1
    • mkfs.ext4 /dev/sdb2
  4. 创建目录,并挂载新的磁盘

    • mkdir -p /mnt/boot /mnt/sysroot
    • mount /dev/sdb1 /mnt/boot
    • mount /dev/sdb2 /mnt/sysroot
  5. 安装grub,内核文件拷贝至目标磁盘

    • grub2-install --root-directory=/mnt/dev/sdb
    • hexdump -C -n 512 /dev/sdb 【查看二进制确认是否安装成功】
    • cp -rf /boot/* /mnt/boot/
  6. 修改 grub2/grub.cfg 文件, 标红的部分是需要使用指令来查看的

image


在grub.cfg文件中 , 红色部分用 上面 sdb1 的 UUID替换,蓝色部分用 sdb2的UUID来替换, 紫色部分是添加的,表示selinux给关掉,同时设定一下init,告诉内核不要再去找这个程序了,不然开机的时候会出现错误的

### BEGIN /etc/grub.d/10_linux ###

menuentry 'CentOS Linux (3.10.0-957.el7.x86_64) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-957.el7.x86_64-advanced-2eef594e-68fc-49a0-8b23-07cf87dda424' {

​ load_video

​ set gfxpayload=keep

​ insmod gzio

​ insmod part_msdos

​ insmod ext2

​ set root='hd0,msdos1'

​ if [ x$feature_platform_search_hint = xy ]; then

​ search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 --hint='hd0,msdos1' 6ba72e9a-19ec-4552-ae54-e35e735142d4

​ else

​ search --no-floppy --fs-uuid --set=root 6ba72e9a-19ec-4552-ae54-e35e735142d4

​ fi

​ linux16 /vmlinuz-3.10.0-957.el7.x86_64 root=UUID=d2e0ce0f-e209-472a-a4f1-4085f777d9bb ro crashkernel=auto rhgb quiet LANG=zh_CN.UTF-8 selinux=0 init=/bin/bash

​ initrd16 /initramfs-3.10.0-957.el7.x86_64.img

}

menuentry 'CentOS Linux (0-rescue-5bd4fb8d8e9d4198983fc1344f652b5d) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-0-rescue-5bd4fb8d8e9d4198983fc1344f652b5d-advanced-2eef594e-68fc-49a0-8b23-07cf87dda424' {

​ load_video

​ insmod gzio

​ insmod part_msdos

​ insmod ext2

​ set root='hd0,msdos1'

​ if [ x$feature_platform_search_hint = xy ]; then

​ search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 --hint='hd0,msdos1' 6ba72e9a-19ec-4552-ae54-e35e735142d4

​ else

​ search --no-floppy --fs-uuid --set=root 6ba72e9a-19ec-4552-ae54-e35e735142d4

​ fi

​ linux16 /vmlinuz-0-rescue-5bd4fb8d8e9d4198983fc1344f652b5d root=UUID=d2e0ce0f-e209-472a-a4f1-4085f777d9bb ro crashkernel=auto rhgb quiet selinux=0 init=/bin/bash

​ initrd16 /initramfs-0-rescue-5bd4fb8d8e9d4198983fc1344f652b5d.img

}

### END /etc/grub.d/10_linux ###


  1. 创建目标主机根文件系统
    • mkdir -pv /mnt/sysroot/
  2. 拷贝需要的bash(也可以拷贝需要的指令)和库文件给新的系统使用
    • cp /lib64/. /mnt/sysroot/lib64/
    • cp /bin/bash /mnt/sysroot/bin/
  3. 现在我们就可以创建一个新的虚拟机,然后将默认分配的硬盘 移除掉,指向我们刚刚创建的磁盘即可
  4. 这时,很多指令都不能使用,比如 ls , reboot 等,可以将需要的指令拷贝到对应的目录即可
  5. 如果要拷贝指令,重新进入到原来的 linux系统拷贝相应的指令即可,比较将 /bin/ls 拷贝到 /mnt/sysroot/bin 将/sbin/reboot 拷贝到 /mnt/sysroot/sbin
    • mount /dev/sdb2 /mnt/sysroot/
    • cp /bin/ls /mnt/sysroot/bin/
    • cp /bin/systemctl /mnt/sysroot/bin/
    • cp /sbin/reboot /mnt/sysroot/sbin/
  6. \1. 再重新启动新的min linux系统,就可以使用 ls , reboot 指令
posted @ 2021-05-22 00:28  haojinglei  阅读(571)  评论(0)    收藏  举报