之前写了如何通过建立一个busybox sysroot来调试内核。后来发现了alpine这个发行版,在保证轻量化的同时具有包管理器,可以更方便地进行一些调试工作。因此这里以LoongArch为例,介绍一下如何通过bootstrap一个alpine内核调试环境。
首先下载alpine的包管理器apk-tools。如果在LoongArch以外的架构运行,可以下载官方发布的静态二进制程序:https://gitlab.alpinelinux.org/api/v4/projects/5/packages/generic/v2.14.6/$(ARCH)/apk.static ;因为apk安装软件后,作为hook需要执行一些LoongArch指令,所以同时需要qemu loongarch64 user的静态二进制程序并注册binfmt。LoongArch下因为docker不支持,官方ci没有进行打包,需要自行编译。
进入linux源代码根目录,创建rootfs.img并bootstrap系统:
bash
qemu-img create rootfs.img 100M
mkfs.ext4 rootfs.img
sudo mount rootfs.img /mnt
sudo apk --arch loongarch64 -X https://dl-cdn.alpinelinux.org/alpine/latest-stable/main/ -U --allow-untrusted --root /mnt --initdb add alpine-base
# apk换成具体的二进制所在位置
编辑/mnt/etc/inittab,将“ttyS0::respawn:/sbin/getty -L 115200 ttyS0 vt100”一行解除注释,使shell正常输出到串口。
接下来准备chroot,非LoongArch架构需要将qemu user静态二进制文件复制到/mnt/usr/bin中。之后执行命令:
bash
for a in proc sys dev; do sudo mount -o bind /$a /mnt/$a; done
sudo chroot /mnt
在chroot中初始化alpine环境。
bash
setup-hostname
rc-update add hostname sysinit
rc-update add localmount boot
rc-update add killprocs shutdown
rc-update add mount-ro shutdown
rc-update add savecache shutdown
exit
sudo umount -R /mnt
现在可以在根目录执行以下脚本,启动虚拟机了:
sudo qemu-system-loongarch64 \
-m 1G \
-accel kvm \
-nographic \
-kernel vmlinux \
-append "root=/dev/vda console=ttyS0" \
-hda rootfs.img \
-hdb fat:rw:./test
# 将test目录虚拟成/dev/vdb1,需要手动创建该目录
注意因为模块并未安装到/lib/modules/中,所以需要使用的功能必须编译到内核。