定制linux系统
摘要
定制linux系统:通过裁剪现有Linux系统(Cent0S7.6),创建属于自己的min Linux小系统,可以加深我们对linux的理解。
一、linux的启动流程
制作Linux小系统之前,再了解一下Linux的启动流程:
- 首先Linux要通过自检,检查硬件设备有没有故障
- 如果有多块启动盘的话,需要在BIOS中选择启动磁盘
- 启动MBR中的bootloader引导程序
- 加载内核文件
- 执行所有进程的父进程、老祖宗systemd
- 欢迎界面
在Linux的启动流程中,加载内核文件时关键文件:
- kernel文件:vmlinuz-3.10.0-957.el7.x86_642 )
- initrd文件: initramfs-3.10.0-957.el7.x86_64.img
二、定制原理
- 简单来说,就是将原来linux目录中的内容复制到新的硬盘当中,然后将新的硬盘作为定制linux的硬盘
思路分析:
- 在现有的Linux系统(centos7.6)上加一块硬盘/dev/sdb,在硬盘上分两个分区,一个是/boot,一个是/,并将其格式化。需要明确的是,现在加的这个硕盘在现有的Linux系统中是/dev/sdb但是,当我们把东西全部设置好时,要把这个硬盘拔除,放在新系统上,此时,就是/dev/sda
- 在/dev/sdb硬盘上,将其打造成独立的Linux系统,里面的所有文件是需要拷贝进去的
- 作为能独立运行的Linux系统,内核是一定不能少,要把内核文件和initramfs文件也一起拷到/dev/sdb上
- 以上步骤完成,我们的自制Linux就完成,创建一个新的linux虚拟机,将其硬盘指向我们创建的硬盘,启动即可
三、步骤
1. 添加硬盘并挂载
为原先的linux系统添加硬盘sdb,分区,格式化,然后挂载
(1) 添加硬盘
具体的方法可以查看这篇博客,这里不多赘述,只讲关键内容
大小就选择20G
起一个可以识别的名字
然后可以查看,添加成功
lsblk
(2) 给硬盘分区
fdisk /dev/sdb
不要忘了最后输入w写入并退出
- 再次查看
lsblk
(3) 格式化两个分区
mkfs.ext4 /dev/sdb1
mkfs.ext4 /dev/sdb2
可以看到每个分区都有了UUID
lsblk -f
(4) 挂载
- 首先创建文件
mkdir -p /mnt/boot /mnt/sysroot
- 然后挂载
mount /dev/sdb1 /mnt/boot
mount /dev/sdb2 /mnt/sysroot
- 可以看到挂载成功了
2. 拷贝文件至目标硬盘
(1) 安装grup
grup指定了启动时哪些文件是启动的,哪些文件是根目录
- 安装grup
grub2-install --root-directory=/mnt /dev/sdb
- 检查是否安装成功
hexdump -C -n 512 /dev/sdb
出现如下内容
(2) 复制必要文件
- 复制boot启动时用的文件
cp -rf /boot/* /mnt/boot
- 库文件是必须使用的,要不然其他的跑不起来
cp /lib64/*.* /mnt/sysroot/lib64/
- 还有bash文件
cp /bin/bash /mnt/sysroot/bin/
(3) 修改启动配置文件
修改 grub2/grub.cfg
文件,这个文件是指定哪些是启动分区,哪些是根目录盘的
要做的修改如下:
- 将原先分区的UUID改成新的UUID
- 添加内容来阻止操作系统按照原来的方式启动,而是使用自定义的方式
cd /mnt/boot/grub2/
vim grub2/grub.cfg
如图
将这四处的7333ef50-901e-4223-9627-cdca5bf81230
全部改为3e983422-c975-45e2-bf44-66e2a2a5d1db
,另一对也同理
然后添加内容,找到以linux开始的两行
(4) 创建其余目录
虽然只有/目录有用,但是其他目录还是需要的,这里在 /mnt/sysroot
目录下创建其余目录
mkdir -pv /mnt/sysroot/{etc/rc.d,usr,var,proc,sys,dev,lib,lib64,bin,sbin,boot,srv,mnt,media,home,root}
这个指令中间不能有空格
3. 创建新的虚拟机并设置使用目标硬盘
- 创建新的虚拟机,移除原来的硬盘
- 添加新的硬盘
选择之前创建的硬盘
可以看到有如下指令
4. 添加指令
- 定制的linux很多指令都不能用,比如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