Linux定制自己的 Linux 系统
通过裁剪现有 Linux 系统(CentOS7.6),创建属于自己的 min Linux 小系统,可以加深我们对 linux 的理解。
基本原理
启动流程介绍:
制作 Linux 小系统之前,再了解一下 Linux 的启动流程:
1、首先 Linux 要通过自检,检查硬件设备有没有故障
2、如果有多块启动盘的话,需要在 BIOS 中选择启动磁盘
3、启动 MBR 中的 bootloader 引导程序
4、加载内核文件
5、执行所有进程的父进程、老祖宗 systemd
6、欢迎界面
在 Linux 的启动流程中,加载内核文件时关键文件:
1)kernel 文件: vmlinuz-3.10.0-957.el7.x86_64
2)initrd 文件: initramfs-3.10.0-957.el7.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 虚拟机,将其硬盘指向我们创建的硬盘,启动即可
操作
1.首先,我们在现有的linux添加一块大小为20G的硬盘
2.重启,通过fdisk来给我们的/dev/sdb进行分区
fdisk /dev/sdb
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
rm -rf /mnt/boot/*
cp -rf /boot/* /mnt/boot/
6.修改 grub2/grub.cfg 文件, 标红的部分 是需要使用 指令来查看的
vim /mnt/boot/grub2/grub.cfg
在grub.cfg文件中 , 红色部分用 上面 sdb1 的 UUID替换,蓝色部分用 sdb2的UUID来替换, 紫色部分(selinux=0 init=/bin/bash)是添加的,表示selinux给关掉,同时设定一下init,告诉内核不要再去找这个程序了,不然开机的时候会出现错误的。
7.创建目标主机根文件系统
mkdir -pv /mnt/sysroot/{etc/rc.d,usr,var,proc,sys,dev,lib,lib64,bin,sbin,boot,srv,mnt,media,home,root}
8.拷贝需要的bash(也可以拷贝你需要的指令)和库文件给新的系统使用
cp /lib64/. /mnt/sysroot/lib64/
cp /bin/bash /mnt/sysroot/bin/
9.现在我们就可以创建一个新的虚拟机,然后将默认分配的硬盘 移除掉,指向我们刚刚创建的磁盘即可。
启动
10.这时,很多指令都不能使用,比如 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/
再重新启动新的min linux系统,就可以使用 ls , reboot 指令了