包括linux源码编译、镜像制作和启动系统三部分。本文主要参考文章是周的github内容
0. 环境准备
CentOS 7虚拟机:
随便哪个镜像站下载一个CentOS7镜像,使用VMware构建虚拟机。
笔者使用的是CentOS7.9桌面版
1. linux源码编译
进入CentOS虚拟机中。
1.1 编译内核
下载linux2.6内核源码:
yum install wget
cd ~
wget http://www.kernel.org/pub/linux/kernel/v2.6/longterm/v2.6.32/linux-2.6.32.67.tar.xz
解压这个xz文件:
yum install xz
tar xvf linux-2.6.32.67.tar.xz
准备编译所需的环境:
yum install gcc
yum install ncurses-devel
yum install perl-devel
进入解压文件的目录,开始编译
cd ~/linux-2.6.32.67
make i386_defconfig
make menuconfig
make menuconfig会出现一个窗口如下图,为了节约编译时间和降低调试的复杂度,把第二项Enable Loadable module support取消掉,把Networking support取消掉,然后Exit。
最后开始编译生成kernal:
make bzImage
编译完成后输出的“Kernel: arch/x86/boot/bzImage is ready”,这个bzImage就是我们要的内核。
把这个内核复杂到~目录下备用:
cp arch/x86/boot/bzImage ~
可以看一个这个bzImage的属性:
cd ~
file bzImage
有如下字样“bzImage: Linux kernel x86 boot executable bzImage,version 2.6.32.67”,说明对了。
1.2 编译busybox
纯粹的kernal没有外围的可执行程序(命令),需要加入busybox,这是一个打包了大量基础命令的神器。
cd ~
wget http://busybox.net/downloads/busybox-1.20.2.tar.bz2
tar xvf busybox-1.20.2.tar.bz2
进入目录,执行编译:
cd busybox-1.20.2
make defconfig
make menuconfig
在配置选项中,Busybox Settings —>Build Options下的第一个选项Build BusyBox as a static binary(no shared libs)选上。因为我们的linux环境暂时还没有加入各种运行时库,所以必须静态链接。
由于需要静态链接,所以我们的glibc必须有一个静态的版本,而当前系统是没有的,所以应该先安装一个:
yum install glibc-static
编译:
make
make install
编译完成,ls一下会发现多了一个_install目录。
里面是bin、sbin和usr,我们要用它来构建linux的根目录。
2. 镜像制作
现在我们要开始制作一个在仅在内存中运行的linux,这个linux在运行时不访问硬盘。
首先,在~目录下建一个文件夹名为rootfs,它是我们用来构建根目录的地方。然后把busybox下的那个_install目录中的内容全部复制到rootfs中:
cd ~
mkdir rootfs
cp -r busybox-1.20.2/_install/* rootfs
cd rootfs
#添加上其他文件夹
mkdir proc mnt var tmp dev sys etc
同时在rootfs下还必须要有一个init文件,这个init文件可以是一个可执行的二进制文件,也可以是一个shell脚本,或者是指向前面两者的链接。init文件会在linux内核初始化就绪后被执行。方便起见,我们就把init做成一个指向bin/sh的软链接:
ln -s bin/sh init
dev目录下还必须有几个必要的设备:console,null,tty,tty1,tty2,tty3,tty4:
cd dev
mknod console c 5 1
mknod null c 1 3
mknod tty c 5 0
mknod tty1 c 4 1
mknod tty2 c 4 2
mknod tty3 c 4 3
mknod tty4 c 4 4
这些tty就是和用户交互的终端。
好了,适用于一个内存linux的根文件系统就做好了,现在来制成一个压缩镜像:
cd ~/rootfs
find . | cpio -H newc -o > ../rootfs.img
cd ..
gzip rootfs.img -f
现在~目录下就有bzImage与rootfs.img.gz了。
3. 启动系统
把这两个文件复制到/boot目录下,然后打开vi编辑/etc/grub.d/40_custom文件。
cp bzImage rootfs.img.gz /boot
vi /etc/grub.d/40_custom
在文件末尾添加:
menuentry 'diyLinux' {
load_video
set gfxpayload=keep
insmod gzio
insmod part_msdos
insmod xfs
set root='hd0,1'
linux16 /bzImage
initrd16 /rootfs.img
}
再导出生成配置文件:
grub2-mkconfig -o /boot/grub2/grub.cfg
然后重启,即可看到有diyLinux的引导:
启动完成后,按enter即可进入系统。