- 缘起
- 分析
- 解决
缘起
操作系统实验需要调试linux0.11内核,笔者在WSL2 Ubuntu22.04下配置好了实验环境,能成功进行编译内核并运行在bochs虚拟机上。
然而,在尝试将内核的硬盘映像文件rootimage-0.11挂载到./hdc目录时,报错如下:
hhw@hhw:~/os/linux-0.11-lab$ sudo mount -t minix ./images/rootimage-0.11 ./hdc
mount: /home/hhw/os/linux-0.11-lab/hdc: unknown filesystem type 'minix'.
分析
问题应该是当前linux内核不支持minix文件系统。
可能的解决方案有:
- 编译一个minix文件系统内核模块,然后将该模块加载到linux内核中,实现对minix文件系统的支持。
- 重新编译一个linux内核,在编译选项中设置编译minix文件系统,然后用新内核替换旧内核。
笔者尝试了第一种解决方案,能够成功加载,但无法正常挂载镜像文件:挂载目录无法显示镜像中的文件内容,在umount后WSL2 linux内核崩溃。具体原因未知,待以后探究。
第二种方案能成功解决,但本人走了不少弯路,尝试了不同版本的内核源码,最终发现原来是没有正确设置编译选项。
解决
直接替换解决
-
我编译好的内核如下:
NUDT-OS23/kernel_6.1.21.2_minix at main · houhuawei23/NUDT-OS23 · GitHub -
下面只需用该内核替换原先的内核即可:
自主编译内核
下载内核源码:WSL2 Linux内核源码仓库-Releases · microsoft/WSL2-Linux-Kernel (github.com)
可以选择你目前正在使用的内核的版本,其他也可。
# 内核源码主目录
# Install the build dependencies
$ sudo apt install build-essential flex bison dwarves libssl-dev libelf-dev
# 添加编译选项文件
hhw@hhw:~/WSL_source/WSL2-Linux-Kernel-linux-msft-wsl-6.1.21.2$ cp ./Microsoft/config-wsl ./.config
hhw@hhw:~/WSL_source/WSL2-Linux-Kernel-linux-msft-wsl-6.1.21.2$ ls -l .config
-rw-r--r-- 1 hhw hhw 114539 May 17 23:39 .config
# 编辑.config,找到有关MINIX的编译选项,修改为:
# CONFIG_MINIX_SUBPARTITION=y
# CONFIG_MINIX_FS=y
# make -j16 多线程编译
hhw@hhw:~/WSL_source/WSL2-Linux-Kernel-linux-msft-wsl-6.1.21.2$ make -j16
编译成功后生成内核镜像,即/arch/x86/boot/bzImage
:
验证
# 挂载
hhw@hhw:~/os/linux-0.11-lab$ sudo mount -t minix ./images/rootimage-0.11 ./hdc
# 卸载
hhw@hhw:~/os/linux-0.11-lab$ sudo umount ./hdc
# 下一次./run内核时记得要卸载
VSCode中的文件目录:
Enjoy it! 😎
2023.10.29补充1:
报错:
/bin/sh: 1: bc: not found
make[1]: *** [Kbuild:24: include/generated/timeconst.h] Error 127
make[1]: *** Waiting for unfinished jobs....
make: *** [Makefile:1289: prepare0] Error 2
make: *** Waiting for unfinished jobs....
原因:未安装bc
解决:
sudo apt install bc
2023.10.29补充2:
计网实验要求基于udp编写一个可信传输协议rdt,想要模拟较差的网络环境(时延or丢包or...),发现 tc (traffic control)命令无法使用,报错:
$ sudo tc qdisc add dev lo root netem delay 20ms
Error: Specified qdisc kind is unknown.
原因:内核不支持NET_SCH_NETEM 模块
解决:.config文件中设置CONFIG_KERNEL_GZIP=y,重新编译内核、安装