哈工大 Linux 0.11 操作系统实验 docker环境

 

哈工大 Linux 0.11 操作系统实验 docker环境防疫居家,之后通知操作系统实验,用哈工大的操作系统实验,是要在Linux 0.11上面进行,之后大家要么跑去虚拟机老Ubuntu,要么实验楼在线实验,我一想,这不好玩啊,我超爱我Mac上的vscode,而且我已经习惯了我的电脑,去虚拟机里面操作,负担太大,之后我想到了docker,想应该可以在这个上面操作,后来也找到了他人已经实现的...

哈工大 Linux 0.11 操作系统实验 docker环境

防疫居家,之后通知操作系统实验,用哈工大的操作系统实验,是要在Linux 0.11上面进行,之后大家要么跑去虚拟机老Ubuntu,要么实验楼在线实验,我一想,这不好玩啊,我超爱我Mac上的vscode,而且我已经习惯了我的电脑,去虚拟机里面操作,负担太大,之后我想到了docker,想应该可以在这个上面操作,后来也找到了他人已经实现的docker,之后我修改了一下,要不然我测试不能进行x11转发,之后还加了一些功能比如我喜欢的zsh,虽然导致最后docker的镜像大到看不下去(本来就没写dockerfile,更何况加了东西),但是总体上还是可以用了,这篇文章就是搬运一下我已经在docker hub上写好的readme,先给我我魔改之后的docker 地址

OsLab

简单修改自https://github.com/yamakasiluke/oslab ,修复了x11连不上的问题。测试在本地Mac OS 15和Windows 10上成功运行,Linux不出意外是最没问题随便跑的,我manjaro当时试过是没有问题的(本来就是Linux 实验肯定是舒服的)。

食用方法

docker pull 最新的版本,目前正常工作的tag是oslab,⚠️注意不是默认的latest更新我已经删了latest这个tag,不知道能不能这次直接pulll可不可以正常pull到oslab。

docker pull viewv/oslab:oslab

之后运行,我在这里选择了50128为端口:

docker run -it -p 50128:22 -d --privileged viewv/oslab:oslab /usr/sbin/sshd -D

这样就运行在了后台,之后你就可以使用ssh连接。

自己探索一下怎么在自己的操作系统下面连接x11桌面,就是x11转发之类的东西,有问题可以发送邮件到:[email protected] ,但是不保证全部回复与解决问题(小声:因为我大概率也不会,自己都折腾好久,不过docker这边坑我给填好了)。

docker内置两个用户,一个是root用户,一个是viewv的普通用户,密码都是oslab,那么你可以这样连接:

ssh -Y [email protected] -p 50128

注意修改成自己设置的端口号,-Y可以用-X替代,但是不可以删除,这表示是在进行x11转发,如果在云服务器上部署,注意修改ip。

在每个用户的home文件夹下已经有材料,我没有进行测试,只是简单的run了一下,效果如下:

Terminal result

旁边就是那个看着很硬核的模拟器。

Windows 10

Windows 10 同样需要 docker,我这里测试环境是insider版本的Windows 10,因为我想开启wsl2的支持,我想wsl1也是可以正常运行的,针对Windows 10,安装docker这里不再赘述,这里介绍开启x11转发来正常运行模拟器。

首先安装Xming,安装好之后运行,保持在后台,之后选择一个ssh客户端,在这里我测试了之后发现MobaXterm 比较好用,比起putty等我感觉是好用的(但是我这里感觉对比起来它有些慢),这里客户端随喜好选择,从putty,MobaXterm,Bitvise等等ssh客户端中选择一个就行,但是要支持x11转发,在MobaXterm中在新建的时候是这个地方:

moba

这里默认应该就是开启x11转发的,如果没有就打开,配置好用户名和密码地址这些就可以连接运行了。

SharedScreenshot

值得注意的是,在Windows 10下面也会遇到下面要说明的很多东西,阅读一下下面的说明比较好,尤其是问题部分。

Linux用户这里就不多介绍了,Linux上应该不会出现下面很多问题,而且应该很多人安装配置这些估计比我还熟练,甚至都不会选择使用docker来进行操作。

其他

当然你可以使用docker的volume mount功能来在宿主机和docker中联系,比如我本地的主机上的代码区域都在/Users/viewv/dev,那么我想沟通到docker里面就可以这样的运行:

docker run -it -p 50128:22 -v /Users/viewv/dev:/home/viewv/dev  -d --privileged viewv/oslab:oslab /usr/sbin/sshd -D

这样我就可以在Mac下面写之后在docker里面编译运行,还是比较舒服的,在Windows 10上面也可以用,把路径换一下就可以(注意Windows和大家不一样的\这个事情),这里就先这样实现,应该还有其他方法。

问题

会影响实验的问题

  • Mac上应该不能挂载Minix镜像文件,奇怪的时候这里ubuntu也不能挂载这个minix镜像文件,这导致我最后只能用另一台Linux机器挂载上去之后放代码进去,如实验二等等实验,需要放代码到Linux 0.11下面编译执行,内置的vi我是不报用好的希望了,所以只能用Linux挂载这个镜像放进去,应该有解决的方法,希望有人能给出解决方法,不过如果你是Linux就没这个问题了,经过测试在wsl2中商店ubuntu中的微软内核我也没有办法挂载Minix镜像。

  • 实验六中会有一个文件是keyboard.S,这里的S是大写的,Mac现在用的APFS文件系统默认是不开大小写敏感的,也就是说这个keyboard.S和编译之后文件夹下面的keyboard.s文件在这里是相同的,导致错误,这个的解决方法是先删除掉这两个文件在Mac下,之后在docker里面编译,最后只把小写的那个keyboard.s放到Mac下就可以了,我已经写了实验六,直接编辑小写的就可以,不会有什么问题。

    更新:

    针对这个问题,我后面发现还是有问题,首先在Windows上,发现也不区分大小写,而且最严重的问题是make clean的问题,按照上面的方法把keyboard.s拷贝到本机之后,make clean的时候默认脚本会删除keyboard.s,导致第二次编译彻底没有文件而失败,所以建议在Mac OS和Windows 10下,修改一下chr_drv中的Makefile,来解决问题:

    在Linux 0.11下的kernel->chr_drv下的Makefile中的:

      keyboard.s: keyboard.S ../../include/linux/config.h
      	$(CPP) -traditional keyboard.S -o keyboard.s
    

    Keyboard.S后缀名变成小写,也就是修改为:

      keyboard.s: keyboard.s ../../include/linux/config.h
      	$(CPP) -traditional keyboard.S -o keyboard.s
    

    之后将:

      clean:
      	rm -f core *.o *.a tmp_make keyboard.s
      	for i in *.c;do rm -f `basename $$i .c`.s;done
    

    取消删除keyboard.s,也就是修改为:

      clean:
      	rm -f core *.o *.a tmp_make
      	for i in *.c;do rm -f `basename $$i .c`.s;done
    

    这样应该可以较为完善的解决这个问题。

其他问题还待更新和反馈。根据我的研究,Mac上的docker for desktop是这个样子的:底层->hyperkit->Linuxkit->docker容器,还是相当于有个Linux虚拟机在这里,之后我就下载Linuxkit编译了一份开启minix的镜像,但是进去docker文件夹,怎么替换iso怎么不对,看来不是这么简单,之后我又试图编译ko模块加载上去,可是一进去发现这个vm跑read-only,这我又懵了,最后折腾好久还是没实现😭

其他问题

  • 我这里腾讯云打开了模拟器,但是黑屏,按照网上按c也不行,但是本地可以正常运行,希望有人指正。
  • 我这里打开本地打开run一下,跑的时间长了之后,哇,风扇狂转,不知道是配置的问题还是本身效率的问题。

致谢

再次感谢 https://github.com/yamakasiluke/oslab