编译WSL2 linux内核以支持minix文件系统

  1. 缘起
  2. 分析
  3. 解决

缘起

操作系统实验需要调试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文件系统。

可能的解决方案有:

  1. 编译一个minix文件系统内核模块,然后将该模块加载到linux内核中,实现对minix文件系统的支持。
  2. 重新编译一个linux内核,在编译选项中设置编译minix文件系统,然后用新内核替换旧内核。

笔者尝试了第一种解决方案,能够成功加载,但无法正常挂载镜像文件:挂载目录无法显示镜像中的文件内容,在umount后WSL2 linux内核崩溃。具体原因未知,待以后探究。

第二种方案能成功解决,但本人走了不少弯路,尝试了不同版本的内核源码,最终发现原来是没有正确设置编译选项。


解决

直接替换解决

  1. 我编译好的内核如下:
    NUDT-OS23/kernel_6.1.21.2_minix at main · houhuawei23/NUDT-OS23 · GitHub

  2. 下面只需用该内核替换原先的内核即可:

    WSL2 Linux内核替换

自主编译内核

下载内核源码: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,重新编译内核、安装

  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值