SIG - Cloud Provider 腾讯云支持开发过程
目前DragonOS能够在腾讯云中运行,相关pr已经提交(https://github.com/DragonOS-Community/DragonOS/pull/881)
在该pr提交前,DragonOS在云上启动会触发panic以至于无法进入shell。
这里给出该PR解决的所有导致panic的问题及其解决方法。
AHCI问题
AHCI初始化失败导致的panic
具体代码:https://code.dragonos.org.cn/xref/DragonOS-0.1.9/kernel/src/init/initial_kthread.rs#37
由于云服务器的磁盘设备一般使用virtio磁盘,所以ahci初始化函数必定返回SystemError(因为没有ahci磁盘供检测),从而触发expect函数造成panic
Solution
由于目前的virtio驱动已经可以检测virtio磁盘,所以在virtio probe之后,是可以成功挂载文件系统的。
所以问题的解决办法很简单:
-
取消掉AHCI的expect函数,使用error打印异常信息即可,不必panic停机
-
在文件系统挂载时加入对virtio磁盘的检测
中断号不唯一
如果中断号不唯一会导致启动panic
相关代码:https://code.dragonos.org.cn/xref/DragonOS-0.1.9/kernel/src/driver/virtio/transport_pci.rs#126
这行代码指定了PciTransport结构初始化的中断号,但是这个中断号是写死的:
https://code.dragonos.org.cn/xref/DragonOS-0.1.9/kernel/src/driver/virtio/transport_pci.rs#69
这就导致全局只能有一个PciTransport结构,否则会导致中断号不唯一而产生冲突,产生冲突会在启动时造成panic
Solution
目前并没有找到一个中断号的标准(比如说virtio设备的中断号一定是56),所以这里用了一个不太优雅的办法解决中断号的冲突:
-
在virtio_probe函数中添加一个中断号偏移并输入到PciTransport的构造函数中
-
利用输入的位移参数对给定的virtio中断号(目前给定的是56)增加偏移
利用偏移就可以解决中断号重复的问题
balloon设备
balloon设备capability指针为0导致init_irq失败
具体代码:https://code.dragonos.org.cn/xref/DragonOS-0.1.9/kernel/src/driver/virtio/transport_pci.rs#147
balloon设备是一种virtio设备,似乎在虚拟机环境下它没有给出自己的capabilities,而上述代码是要求给出msix中断的capability的(见:https://bbs.dragonos.org.cn/t/topic/309),这会导致遇见balloon设备就导致panic。
(不仅仅在云服务器上,在本地的qemu中加入balloon设备也会导致启动失败)
Solution
将该expect函数转换为异常处理函数并提前返回,而不是使用expect触发panic
其他变动
在run_qemu脚本中加入了VIRTIO_BLK_DEVICE选项,表示是否启用virtio磁盘作为系统磁盘,默认为false(使用传统ahci磁盘)。
开启VIRTIO_BLK_DEVICE选项可以在本地qemu中使用virtio磁盘运行DragonOS
此外,经测试,在进入shell之前,有可能出现卡死的现象,但是该现象不是云服务器独有,而且难以复现(也没办法用loop二分查找),所以当前无法对该问题进行解决