lostars
发布于 2024-06-24 / 61 阅读
0

qemu-docker 引导黑群晖

开始之前

为了获取dva系列SurveillanceStation自带的8许可证,主机环境:DSM918+ 7.2.1-69057 Update 4,群晖内部存储空间全部都是ext4格式,没法使用自带的VMM
qemu-docker来自于项目: https://github.com/qemus/qemu-docker
类似的项目: https://github.com/vdsm/virtual-dsm
上面两个项目都是基于Debian,本质是一样的,第二个项目可以直接启动群晖的pat安装文件,这里不作展开。
引导镜像来自于:fbelavenuto/arpl,目前该项目已被归档,追求更新或新dsm系统的可以使用:RROrg/rr。这里使用的是前者,因为尝试了多次使用RROrg/rr的最新引导都会卡在启动界面,后续如果成功了会再更新。

引导并安装DSM

直接用docker composer进行部署:

services:
  qemu-dsm:
    container_name: qemu-dsm
    image: qemux/qemu-docker:latest
    networks:
      proxy:
    devices:
      - /dev/kvm
    volumes:
      # 引导镜像映射为boot.img直接用于qemu启动
      - "/volume1/docker/qemu-dsm/arpl.img:/boot.img"
      - "/volume1/docker/qemu-dsm:/storage"
    cap_add:
      - NET_ADMIN
    ports:
      # qemu的vnc端口
      - 8006:8006
      # 群晖的web安装端口
      - 5001:5000
      # 群晖的ssh端口,映射出来方便后续调试
      - 5002:22
    stop_grace_period: 2m
    environment:
      # ARGUMENTS: "-drive id=disk,format=raw,file=/storage/dsm.img"
      DISK_TYPE: "usb"
      DISK_SIZE: "4G"
      RAM_SIZE: "1G"
      CPU_CORES: "1"
      DEBUG: "Y"

networks:
  proxy:
    external: true

正常使用上面的引导进行应该都是通过烧录到U盘上然后插上主机进行引导的,但是这里的主机是通过docker启动的qemu镜像,所以配置qemu时候DISK_TYPE设置成了usb
容器成功启动后会自动进入引导镜像配置加载器,查看qemu容器的网络配置(只截取了重要的部分):

3: dockerbridge: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 52:10:c4:7c:84:12 brd ff:ff:ff:ff:ff:ff
    inet 20.20.20.1/24 brd 20.20.20.255 scope global dockerbridge
       valid_lft forever preferred_lft forever

这个dockerbridge网络就是qemu给虚拟机建立的通信网络。
通过vnc查看引导界面:

可以看到上面配置的磁盘被正确识别成了U盘,同时ip也获取到了,是使用的dockerbridge网络。
如果这个时候网络没有获取到正确的ip,引导会提示错误,找不到ip地址,这时需要手动进行配置ip,vnc中执行ip addr获取网络信息,使用ipconfig手动配置ip地址。注意这个修改重启就会消失,配置并安装好dsm之后需要手动配置dsm的ip。
网络配置完毕之后运行menu.sh进行引导编译,型号选择DVA1622,注意序列号要使用:2260UBR457845,否则SurveillanceStation许可证是无效的。序列号也完全被破译,可以参考:https://www.openos.org/threads/sn.4469/
按照网上各种教程编译好加载器之后,选择Advanced menu-Show SATA(S) # ports and drives,发现是没有硬盘挂载上的。
此时进入qemu容器内创建空硬盘:

qemu-img create /storage/dsm.img 32G

配置docker compose,只需要在上面的配置中添加一个环境变量即可:

ARGUMENTS: "-drive id=disk,format=raw,file=/storage/dsm.img"

重启容器,因为已经编译好了引导,正常就会直接进入安装dsm的流程了。如果手快选择配置加载器,进入上面提到的菜单,可以看到硬盘正确识别并挂载上了。
需要配置多个硬盘,重复上面流程,环境变量中id换下即可。
安装时需要注意,该引导应该只支持7.1.1-42962,不支持7.2系统,安装好之后成功升级到7.1.1最新系统。
系统安装好之后手动安装SurveillanceStation套件,在套件应用程序中心启动CMS,并配置为录制服务器模式。主机SurveillanceStation中CMS配置为主服务器模式,然后添加录制服务器配置虚拟机中的套件即可。验证成功之后可以在许可证中心看到许可证成功叠加。按理通过这种方式可以进行无限叠加,就是虚拟出来的dsm系统需要一直开着,这就是上面的qemu docker资源不需要分配太多的原因。

注意

安装成功之后上面的引导镜像是已经被修改过了。需要全新安装,可以选择一个新的镜像进行引导。

如果在引导镜像中无法下载群晖系统,可以设置代理:

declare -x https_proxy="http://ip:port/"
declare -x http_proxy="http://ip:port/"
declare -x all_proxy="socks5:://ip:port/"

如果配置了某些环境变量,需要qemu安装某些软件,可以设置apt代理(基于Debian):

# 创建文件,配置如下内容,然后将该文件映射到 /etc/apt/apt.conf.d/proxy.conf 
Acquire::http::Proxy "http://ip:port/";
Acquire::https::Proxy "http://ip:port/";

硬解

尝试过将/dev/dri映射进qemu容器,也使用环境变量GPU=Y等方式开启,但是依旧失败,虚拟机内无法打开/dev/dri
相关讨论:
https://github.com/vdsm/virtual-dsm/issues/720
https://github.com/vdsm/virtual-dsm/issues/234
https://github.com/vdsm/virtual-dsm/issues/334

后续

一晚之后发现虚拟机的SurveillanceStation无法打开,显示运行中且存储空间耗尽,从BV1dV4y1i7X7评论中找到了解决方案。
清空/volume1/@appstore/SurveillanceStation/local_display/.config/chromium-local-display/BrowserMetrics文件夹,套件恢复正常,同时打开套件的应用中心停用local display

装好DSM之后发现/bin/gzip -l这个命令偶发性的占用cpu,直接删除并备份该文件后恢复正常。上面的local display停用后再恢复该文件,也未出现/bin/gzip相关的高cpu占用。

DSM重启之后无法找到kvm

重启之后qemu报/dev/kvm找不到,手动安装insmod /lib/modules/kvm.ko,也会报错。只能通过安装vmm来正确加载kvm模块,就算没有btrfs存储空间也不影响。