开始之前
为了获取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
存储空间也不影响。