腾讯云支持开发过程

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之后,是可以成功挂载文件系统的。

所以问题的解决办法很简单:

  1. 取消掉AHCI的expect函数,使用error打印异常信息即可,不必panic停机

  2. 在文件系统挂载时加入对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),所以这里用了一个不太优雅的办法解决中断号的冲突:

  1. 在virtio_probe函数中添加一个中断号偏移并输入到PciTransport的构造函数中

  2. 利用输入的位移参数对给定的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二分查找),所以当前无法对该问题进行解决

4 个赞

参见这个issue,中断管理子系统需要实现动态申请中断号的功能。

但是我个人感觉,目前情况下,可以使用irq共享的方式去做。也就是设置56号中断为共享的。这样能更好的实现功能(会牺牲点性能),将来实现了#800这个issue之后再看情况决定virtio设备是否要改为单独的中断号。

我发了个pr,更改了这个点:https://github.com/DragonOS-Community/DragonOS/pull/904