40.定制自己的linux系统
介绍
通过裁剪现有linux系统,创建属于自己的min linux小系统,可以加深对linux的理解
基本原理
- linux的启动流程
- 首先linux通过自检,检查硬件设备有没有故障
- 如果有多块启动盘的话,需要在BIOS中选择启动盘
- 启动MBR中的bootloader引导程序
- 加载内核文件
- 执行所有进程的父进程、老祖宗systemd
- 欢迎界面
- 在linux启动流程中,家唉内核文件时的关键文件:
- kernel文件:vmlinuz-3.10.0-957.el.x86_64
- initrd文件:initramfs-3.10.0-957.el.x86_64.img
制作min linux思路分析
- 在现有linux系统(centos7.6)上加一块硬盘/dev/sdb,在硬盘上分两个分区,一个是/boot,一个是/,并将其格式化。需要明确的是,现在加的这个硬盘在现有linux系统中是/dev/sdb,但是当把全部设置好时,要把这个硬盘拔除,放在新的系统上,此时,就是/dev/sda
- 在/dev/sdb硬盘上,将其打造成独立的Linux系统,里面的所有文件时需要拷贝进去的
- 作为能独立运行的linux系统,内核是必须有的,要把内核文件和initramfs文件也一起拷贝到/dev/sdb上
- 以上步骤完成后自制linux就完成,创建一个新的linux虚拟机,将其硬盘指向创建的硬盘,即可启动
操作步骤
-
在现有linux添加一块20G的硬盘,添加完成后重启。
- 注意:添加硬盘时,要将虚拟磁盘存储为单个文件
![image]()
-
通过fdisk给/dev/sdb进行分区,分区1设置500M,其余分给分区2
-
对/dev/sdb的分区进行格式化
- mkfs.ext4 /dev/sdb1
- mkfs.ext4 /dev/sdb2
-
创建目录,并挂载新的磁盘
- mkdir -p /mnt/boot /mnt/sysroot
- mount /dev/sdb1 /mnt/boot
- mount /dev/sdb2 /mnt/sysroot
-
安装grub,内核文件拷贝至目标磁盘
- grub2-install --root-directory=/mnt/dev/sdb
- hexdump -C -n 512 /dev/sdb 【查看二进制确认是否安装成功】
- cp -rf /boot/* /mnt/boot/
-
修改 grub2/grub.cfg 文件, 标红的部分是需要使用指令来查看的
在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 ###
- 创建目标主机根文件系统
- mkdir -pv /mnt/sysroot/
- 拷贝需要的bash(也可以拷贝需要的指令)和库文件给新的系统使用
- cp /lib64/. /mnt/sysroot/lib64/
- cp /bin/bash /mnt/sysroot/bin/
- 现在我们就可以创建一个新的虚拟机,然后将默认分配的硬盘 移除掉,指向我们刚刚创建的磁盘即可
- 这时,很多指令都不能使用,比如 ls , reboot 等,可以将需要的指令拷贝到对应的目录即可
- 如果要拷贝指令,重新进入到原来的 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/
- \1. 再重新启动新的min linux系统,就可以使用 ls , reboot 指令


浙公网安备 33010602011771号