0x00 安装所需软件包
首先安装所需软件包。
sudo apt-get install gcc make fakeroot build-essential ncurses-dev xz-utils libssl-dev bc flex libelf-dev bison qemu qemu-system qemu-kvm
如果你的系统不是Ubuntu/Debian,请用对应的包管理器安装软件。
0x10 下载Linux内核源码
首先在kernel.org中下载源码压缩包,本教程中使用Linux6.8,建议建立一个文件夹来存放源码。
mkdir build
cd build
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.8.tar.xz
tar xvf linux-6.8.tar.xz
cd linux-6.8
0x20 配置Linux编译选项
Linux有许多的编译选项,当然对于新手,使用默认配置既可。
make defconfig
当显示configuration written to .config
后,说明创建配置成功。
0x30 开始编译Linux
生成完配置后就可以开始编译Linux内核了,我们只需要输入以下命令既可开始。
make -j $(nproc)
根据电脑性能不同,编译时间从1分钟到30分钟甚至更久。
当显示Kernel: arch/x86/boot/bzImage is ready
时,意味着编译已经完成了。
但是现在编译出的Linux只是一个内核,无法直接运行,如果要运行的话还需要一个磁盘文件系统来放置所需的文件和程序,所以我们还需要一个工具:BusyBox
0x40 下载并配置BusyBox
首先在busybox.net中下载源码压缩包。本教程使用busybox-1.36.0。
下载之前请先退回到上层目录,也就是build
目录中
cd ..
wget https://busybox.net/downloads/busybox-1.36.0.tar.bz2
tar xvf busybox-1.36.0.tar.bz2
cd busybox-1.36.0
之后我们输入以下命令配置编译选项。
make menuconfig
使用方向键来切换光标,回车键进入条目。
先进入Settings
,然后向下找到Build Options
,选中Build static binary
,按下空格键选中,之后前面方框中会亮起一个*
。
接着按右方向键,移动到下方Exit选项,按下enter退出,接着会弹出界面询问是否保存,选择Yes。
0x50 创建磁盘镜像
返回上一级目录,输入以下命令创建磁盘镜像并格式化。
cd ..
dd if=/dev/zero of=rootfs.img bs=1M count=20
mkfs.ext4 rootfs.img
接着运行以下命令编译BusyBox,并将它装进磁盘镜像。
mkdir fs
sudo mount -t ext4 -o loop rootfs.img ./fs
cd busybox-1.36.0
sudo make install -j $(nproc) CONFIG_PREFIX=../fs
cd ../fs
sudo mkdir proc dev etc home mnt
sudo cp -r ../busybox-1.36.0/examples/bootfloppy/etc/* etc/
cd ..
sudo umount fs
0x60 启动Linux
至此,我们的准备工作已全部完成,可以输入以下命令使用QEMU启动Linux内核了。
qemu-system-x86_64 -kernel ./linux-6.8/arch/x86_64/boot/bzImage -hda rootfs.img -append "root=/dev/sda"
之后会弹出一个QEMU的窗口,这就是你编译出的Linux内核了,可以在其中执行一些基础的命令。
0x70 为内核添加标签(可选)
如果你想证明这个内核是你自己编译出来的,可以在编译Linux内核之前向LOCALVERSION变量中添加你的名字,例如我添加的是“-TIM”。
./scripts/config --file .config --set-str LOCALVERSION "-TIM"
之后将这个内核启动后可以使用uname -r
命令显示。例如:
6.8-TIM