1、在M1上安装docker这个就不用提供步骤了,网上自行搜索。
2、在M1上pull一个ubuntu的容器。docker pull ubuntu:18.04
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 18.04 d1a528908992 4 weeks ago 56.7MB
3、通过拉取的ubuntu镜像启动一个容器,相当于运行了一个ubuntu虚拟机
docker run -d -t -i -p 5002:22 --hostname mycontainer --name mycontainer --privileged=true ubuntu:18.04 /bin/bash
进入容器:
4、下载内核kernel源码linux-5.13.18
wget http://ftp.sjtu.edu.cn/sites/ftp.kernel.org/pub/linux/kernel/v5.x/linux-5.13.18.tar.gz
5、安装一些依赖包
apt-get install vim git tmux openssh-server tar -y apt install build-essential flex bison libssl-dev libelf-dev libncurses-dev -y
配置内核
make CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64 O=build menuconfig -j16
6、编译内核
make CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64 O=build -j16
编译成功后在build/arch/arm64/boot/目录下会生成内核镜像文件
file build/arch/arm64/boot/Image
7、制作内核启动根文件系统,通过busybox制作
下载busy box源码,编译busy box工具
wget https://busybox.net/downloads/busybox-1.35.0.tar.bz2
tar xvf busybox-1.35.0.tar.bz2
配置编译选项,要设置Build static binary (no shared libs)
make CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64 menuconfig -j16
在图形化界面勾选以下配置 Settings [*] Build static binary (no shared libs)
编译busy box:
make CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64 install -j16
编译成功后会在_install/bin/目录下生成busybox。
file _install/bin/busybox
然后执行以下步骤制作根文件系统
cd busybox-1.35.0/_install
mkdir dev
mknod dev/console c 5 1
mknod dev/ram b 1 0
touch init
这里其实就是在_install目录下通过的 mknode
分别创建了一个面向块设备和一个面向字符设备的特殊文件。相当于在系统的根文件系统目录下有一些这些目录。
然后打开init文件写入这些信息
#!/bin/sh
echo "INIT SCRIPT"
mkdir /proc
mkdir /sys
mount -t proc none /proc
mount -t sysfs none /sys
mkdir /tmp
mount -t tmpfs none /tmp
echo -e "\nThis boot took $(cut -d' ' -f1 /proc/uptime) seconds\n"
exec /bin/sh
然后通过下面命令生成rootfs
# 首先为 init 赋予可执行权限
$ sudo chmod +x init
# 进入 busybox 编译成果目录
cd ~/kvm/busybox-1.32.1/_install
# 使用 cpio 制作成 rootfs,为区分方法一,这里使用另一个名称并压缩
find . -print0 | cpio --null -ov --format=newc | gzip -9 > ./initramfs-busybox-arm64.cpio.gz
# 注意:该命令一定要在busybox的 _install 目录下执行
# 注意:每次修改_install,都要重新执行该命令
8、在容器中下载编译qemu
wget https://download.qemu.org/qemu-7.2.0-rc1.tar.xz
tar xvf qemu-7.2.0-rc1.tar.xz
cd qemu-7.2.0-rc1
mkdir build
cd build
../configure --target-list=aarch64-softmmu make -j16 file aarch64-softmmu/qemu-system-aarch64
将initramfs-busybox-arm64.cpio.gz文件拷贝到/test/qemu-7.2.0-rc1/build/aarch64-softmmu/目录下。
将之前编译好的内核镜像也拷贝到/test/qemu-7.2.0-rc1/build/aarch64-softmmu/目录下。
9、通过qemu运行内核
./qemu-system-aarch64 -nographic -M virt -cpu cortex-a57 -kernel ./Image -initrd ./initramfs-busybox-arm64.cpio.gz --append "nokaslr root=/dev/ram init=/init"
系统启动了,停留在了一个命令行界面,同时可以查看到系统内核是5.13.18版本,这样实现了在容器中使用qemu把内核5.13.18跑起来了。