QEMU 引导时分离内核和文件系统
文章目录
- 概要
- 新建空 IMG
- 初始化磁盘
- 挂载磁盘、复制文件系统
- 启动新的Host
- 小结
概要
前文 RISCV 虚拟化环境搭建 中我们详细记录了搭建 RISCV
虚拟化环境的流程。
其中,启动 RISCV
的 Ubuntu Host
的命令为:
qemu-system-riscv64 -machine virt -nographic -m 8192 -smp 6 -bios opensbi/build/platform/generic/firmware/fw_jump.bin -kernel u-boot/u-boot -device virtio-net-device,netdev=eth0 -netdev user,id=eth0,hostfwd=tcp::6666-:22 -device virtio-rng-pci -drive file=./ubuntu-22.04-preinstalled-server-riscv64+unmatched.img,format=raw,if=virtio
但当我们需要修改内核,重新编译并升级内核时就很不方便。考虑到虚拟机内部编译非常慢,我们会在外部的 X86_64 主机中交叉编译好然后通过 scp 命令把文件夹共享到虚拟机中,再通过 make install
的方式升级内核。
上述过程当我们要频繁更新内核时很不方便。于是本文中我们会把文件系统单独复制出来到新的 IMG
文件中。QEMU 启动时不再使用 U-BOOT
引导,直接使用 -kernel Image
的形式更方便我们在外部环境随时更新内核而不用对其余部分做任何修改。
新建空 IMG
1:在前文的环境目录下通过以下命令新建一个 IMG
用于复制文件系统。
qemu-img create -f raw new-disk.img 40G
2:在 QEMU 启动 RISCV Host 的命令中加入我们新建的磁盘,引导系统。如下所示:
qemu-system-riscv64 -machine virt -nographic -m 8192 -smp 6 -bios opensbi/build/platform/generic/firmware/fw_jump.bin -kernel u-boot/u-boot -device virtio-net-device,netdev=eth0 -netdev user,id=eth0,hostfwd=tcp::6666-:22 -device virtio-rng-pci -drive file=./ubuntu-22.04-preinstalled-server-riscv64+unmatched.img,format=raw,if=virtio -device virtio-rng-pci -drive file=./new-disk.img,format=raw,if=virtio
初始化磁盘
1:在启动的 Ubuntu 中输入命令可以看到新的磁盘 /dev/vdb
。
sudo fdisk -l
2:使用 fdisk 工具为磁盘进行分区。
sudo fdisk /dev/vdb
-
在 fdisk 的终端中键入命令 n 新建分区。输入 p 来创建主分区(主分区一般为 primary 类型)。随后一路默认。
-
在 fdisk 的终端中键入命令 p 查看分区表,确认新分区已经创建。如果您看到类似下面的输出,说明您的新分区已经正确创建:
Device Boot Start End Sectors Size Id Type
/dev/vdb1 2048 83886079 83884032 40G 83 Linux
- 如果一切正确,在
fdisk
的终端中输入w
来写入分区表并退出fdisk
。
3:使用命令 sudo mkfs.ext4 /dev/vdb1
格式化新分区。
挂载磁盘、复制文件系统
1:格式化完成后,您可以挂载新的分区。创建挂载点并将新分区挂载到该目录:
sudo mkdir /mnt/new-disk
sudo mount /dev/vdb1 /mnt/new-disk
2:复制文件系统,排除不必要的文件:
sudo rsync -avx --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*"} / /mnt/new-disk
3:修改 Linux system’s filesystem table 配置文件 fstab,即 sudo vim /mnt/new-disk/etc/fstab
编辑这个文件,修改为以下内容:
/dev/vda / ext4 discard,errors=remount-ro 0 1
4:卸载磁盘镜像
sudo umount /mnt/new-disk
启动新的Host
由于新的文件系统已经构建完。我们可以使用新的命令来通过 QEMU 引导 Ubuntu。
qemu-system-riscv64 -machine virt -nographic -m 8192 -smp 6 -bios opensbi/build/platform/generic/firmware/fw_jump.bin -kernel ./Image -device virtio-net-device,netdev=eth0 -netdev user,id=eth0,hostfwd=tcp::6666-:22 -device virtio-rng-pci -device virtio-rng-pci -drive file=./new-disk.img,format=raw,if=virtio -append "root=/dev/vda1"
这时候,当我们修改内核在外部 X86_64 环境重新交叉编译之后就可以直接拷贝到 QEMU 这边替换掉 Image 文件,直接启动,非常方便。
小结
完结撒花!!!