编译linux内核

下载内核源码https://mirrors.tuna.tsinghua.edu.cn/kernel/
解压源码tar -xvf linux-xxxx.tar.gz

解压后进入源码根目录,指定编译架构,打开配置菜单

1
2
3
4
cd linux-xxxx
export ARCH=x86
make x86_64_defconfig
make menuconfig

编译生成镜像

1
sudo make -j 4 bzImage

配置busybox

启动内核还需要一个具有根文件系统的磁盘镜像文件,根文件系统中提供可供交互的shell程序以及一些常用工具命令。

借助busybox工具来制作根文件系统

下载地址 https://git.busybox.net/busybox/
解压

1
tar -jxvf busybox-1.32.0.tar.bz2

进入busybox根目录,配置编译选项

1
2
cd busybox-1.32.0
make menuconfig

设置为静态编译

1
2
Settings  --->
[*] Build BusyBox as a static binary (no shared libs)

制作rootfs

制作rootfs镜像文件,并把busybox安装到其中

使用dd命令创建文件,并格式化为ext4文件系统

1
2
ayoung@ubuntu:~/Desktop/busybox-1_32_0$ dd if=/dev/zero of=rootfs.img bs=1M count=100
ayoung@ubuntu:~/Desktop/busybox-1_32_0$ mkfs.ext4 rootfs.img

创建用于挂载该镜像文件的目录fs,挂载后才能往里面写入busybox
使用mount命令将rootfs.img挂载到fs目录,编译busybox并写入fs目录中

1
2
3
ayoung@ubuntu:~/Desktop/busybox-1_32_0$ mkdir fs
ayoung@ubuntu:~/Desktop/busybox-1_32_0$ sudo mount -t ext4 -o loop rootfs.img ./fs
ayoung@ubuntu:~/Desktop/busybox-1_32_0$ sudo make install CONFIG_PREFIX=./fs

接着对写入的busybox进行补充配置

1
2
3
4
5
ayoung@ubuntu:~/Desktop/busybox-1_32_0$ cd fs
ayoung@ubuntu:~/Desktop/busybox-1_32_0/fs$ sudo mkdir proc dev etc home mnt
ayoung@ubuntu:~/Desktop/busybox-1_32_0/fs$ sudo cp -r ../examples/bootfloppy/etc/* etc/
ayoung@ubuntu:~/Desktop/busybox-1_32_0/fs$ cd ..
ayoung@ubuntu:~/Desktop/busybox-1_32_0$ sudo chmod -R 777 fs/

制作完成后rootfs目录如下

1
2
ayoung@ubuntu:~/Desktop/busybox-1_32_0$ ls fs
bin dev etc home linuxrc lost+found mnt proc sbin usr

最后卸载rootfs.img

1
sudo umount fs

启动qemu

1
2
3
4
5
6
7
8
#!/bin/sh

qemu-system-x86_64 \
-kernel ./bzImage \
-hda ./rootfs.img \
-append "root=/dev/sda console=ttyS0" \
-nographic \
-s

此时会发现文件系统只读,无法执行mkdir等操作

挂载

1
sudo mount -o loop -w rootfs.img sysmain/

修改启动后执行的脚本/etc/init.d/rcS,可以在这里添加想要执行的命令。mount rw -o remount /将文件系统改为可读写。想要加入文件系统的文件可以直接放进挂载的目录下。完成后umount即可

1
2
3
4
5
#!/bin/sh

mount rw -o remount /
rm /tmp/sh
setsid /bin/cttyhack setuidgid 1000 /bin/sh

添加共享磁盘

创建64MB磁盘镜像文件,并格式化为ext4,作为共享磁盘备用

1
2
dd if=/dev/zero of=ext4.img bs=512 count=131072
mkfs.ext4 ext4.img

qemu启动命令中使用-hdb增加一个磁盘

1
-hdb ext4.img

修改启动脚本,自动挂载sdb到mnt目录

1
mount -t ext4 /dev/sdb /mnt

宿主机挂载ext4.img,实现文件共享

1
sudo mount -t ext4 -o loop ext4.img ./share

实测感觉没有很好用,感觉不如直接挂载原文件系统进行修改再卸载

参考:https://mp.weixin.qq.com/s/STExqTiKpGXSp9E_DerV6g