在拾光坞G2上使用Docker-QEMU运行Windows虚拟机
hi,大家好,我是拾小咖
拾光坞G2双盘位私有云,作为一款N150的X86 NAS,它拥有强大的性能,友友们可不要浪费了呢!今天就给大家带来一个玩法,通过Docker-QEMU,部署一个Windows虚拟机的教程。可以帮你实现:
✅ 直接跑起Windows虚拟机
✅ 轻松拿捏远程办公等
✅ NAS秒变“微数据中心”
以下内容感谢@浪迹天涯大叮当 在拾光坞社区(点击文章最下方阅读原文可跳转)带来的分享:
前言
G2作为拾光坞的x86新品,其拥有比N3更广泛的软硬件兼容性和更强的性能表现。虽然拾光坞N3凭借ARM架构和Docker支持已经能够实现丰富的功能,但G2的x86架构、对KVM虚拟化技术的支持和更高的计算能力让运行Windows虚拟机成为可能。
接下来,我们将一步步配置虚拟化环境,通过Docker-QEMU,部署一个Windows虚拟机,继续压榨发挥G2的性能!
预估难度:★★★★☆
一、准备工作
>1. 准备工具
现G2暂未推出官方的虚拟机套件,本次部署需要用到SSH和Portainer
开始正式部署前,我们需要先开启并连接G2的SSH,并准备好Portainer(如果你打算直接用docker run指令就不需要啦),以便后续管理和部署
连接SSH和部署Portainer可看这篇文章:在G2的Docker中部署Portainer图形化管理Docker
>2. 准备Macvlan网络
通过Macvlan网络,虚拟机可获得属于自己的独立IP及更全面的上网权限,因此在开始部署前我们先创建一个Macvlan网络。
登录新版拾光坞客户端,找到首页 云盘信息:
图片.png确定当前云盘使用的网口,并记住后方第一行的 网络类型:
图片.png使用SSH连接G2,输入 ifconfig 并回车。找到对应行,记住划线部分(inet addr)后的IP。常见的有 192.168.0.xxx,192.168.31.xxx 这类内网IP,记住它的格式。
图片.png我们也需要确定当前网络环境下的网关地址。一般为内网IP段的第一个IP(如192.168.0.1,192.168.31.1)。不确定的可在 云盘信息 里看到:
图片.png回到SSH,输入以下命令,获得一串随机的IPV6内网地址段。复制输出的结果:
printf ‘fd%x:%x:%x::/64n’ $((RANDOM%256)) $((RANDOM%65536)) $((RANDOM%65536))
图片.png随后即可创建我们的Macvlan网络。
根据实际情况,输入以下指令:
sudo docker network create -d macvlan --subnet=[你的IPV4内网IP前三位].0/24 --gateway=[网关地址] --ipv6 --subnet=[刚刚获得的地址段] --gateway=[删除地址段后/64换为1] -o parent=[使用的网口] [网络名称,随便取]
举个🌰:若我的G2使用的网口为 eth1,内网IPV4地址为 192.168.31.152,网关地址为 192.168.31.1,生成得到的地址段为 fd38:2798:3318::/64,想给网络取名为 virt-macvlan。则我的指令应该是这样:
sudo docker network create -d macvlan --subnet=192.168.31.0/24 --gateway=192.168.31.1 --ipv6 --subnet=fd38:2798:3318::/64 --gateway=fd38:2798:3318::1 -o parent=eth1 virt-macvlan
图片.png回车后若未出现报错则创建成功。输出的一串随机字符为网络id,不用管。打开Portainer,在首页查看现有的Docker网络:
图片.png
看到我们刚刚创建的Macvlan网络则成功:
图片.png>3. 准备系统镜像
虽然qemu-docker可以自行拉取指定版本镜像,但不同网络环境下速度可能不稳定。为了方便和更多自定义性,我们先把镜像下载到本地
使用微软官方Windows镜像即可。考虑到云盘性能有限,推荐 Windows 10 LTSC 版。下载链接附上
magnet:?xt=urn:btih:366adaa52fb3639b17d73718dd5f9e3ee9477b40
将镜像下载到本地,重命名为 boot.iso
>4. 准备数据文件夹
在本地任一位置新建一个文件夹,取名为 Windows。
图片.png注意文件所在存储盘位:
图片.png
将下载得到的 boot.iso 文件放入其中 Image 子文件夹中:
图片.png二、部署docker-windows
>1.拉取镜像
打开拾光坞PC端,进入 容器服务:
图片.png点击右侧 镜像商店:
图片.png搜索并拉取 dockurr/windows:
图片.png导入完成后回到Portainer,在左侧 Image 栏能找到它就行。
图片.png
图片.png>2. 部署容器
点击左侧 Containers 栏:
图片.png点击右侧 Add container 按钮新建容器:
使用docker run命令可跳过下列步骤,新手建议还是使用Portainer图形化部署:
sudo docker run -d --name uvm_Windows --network [Macvlan网络名] --ip [自己取个IPV4内网IP] --device=/dev/kvm --device=/dev/net/tun --device=/dev/dri --cap-add NET_ADMIN -v “/mnt/usb[1,2…]/[用户名]/[数据文件夹位置]”:/storage -v “/mnt/usb[1,2…]/[用户名]/[数据文件夹位置]/Image/boot.iso”:/boot.iso -e RAM_SIZE=6G -e CPU_CORES=4 -e DISK_SIZE=256G -e DHCP=Y -e MANUAL=Y -e GPU=Y -e VERSION=10l --stop-timeout 120 uvm_dockurr/windows:latest
其中 usb[1,2…] 后跟的数字取决于数据文件夹所在盘位,主分区为usb1,其他盘位可在手机app磁盘管理中看到:
微信图片_20250618152030.jpg未填项和 RAM_SIZE 等性能相关环境变量根据实际情况填写即可:
图片.png随后开始配置容器,容器名称随便填,但要在取好的名字前加上 uvm_ 前缀:
图片.png镜像部分直接填入 uvm_dockurr/windows:latest
图片.png端口设置(Port mapping)部分不用填,因为我们直接使用Macvlan网络:
图片.png接下来来到页面下方 高级容器设置(Advanced container settings)部分:
图片.png
第一页 Commands&logging 在 Logging 字样下方的下拉框中选择 json-file ,并在其下分别新建选项 max-file 取值为 3,max-size 取值为 10m。其作用是方便云盘读取日志信息,并限制日志文件大小。
图片.png第二页 Volumes 部分填写路径映射。新建两项:
第一项为数据文件夹,第一行填容器内路径,为 /storage;在其右侧选择 Bind;下方填写数据文件夹路径,为 /mnt/usb[1,2…]/[用户名]/[数据文件夹位置];在其右侧选择 Writable
第二项为启动镜像,将子文件夹中的 boot.iso 挂载至容器内 boot.iso 即可
usb[1,2…] 后跟的数字取决于数据文件夹所在盘位,主分区为usb1,其他盘位可在手机app磁盘管理中看到
图片.png
第三页 Network 部分中,第一行选择我们新建的Macvlan网络;IPv4 Address 行选填,希望指定虚拟机获得的IPV4内网IP可填一个未被其他设备占用的地址。
注:此处指定的地址主要用于虚拟机安装过程中通过vnc网页访问图像输出,网页输出清晰度低且无法输出音频和绑定键鼠。部署完成后Windows系统自己会再通过DHCP获取一个IP地址,可通过RDP远程桌面连接。
图片.png
第四页 Env 部分中,新建以下几个环境变量:
变量名
取值
说明
CPU_CORES
4
虚拟机获得的CPU核数,不得超过宿主机
RAM_SIZE
自定,保守点可以4G
虚拟机获得的内存大小,虚拟机启动后就会全部占用
DISK_SIZE
自定,推荐128G+
虚拟机获得的磁盘大小,会随着使用逐渐分配,不会一次性占满
DHCP
Y
允许虚拟机通过DHCP获取独立IP
MANUAL
Y
手动进行系统安装,建议开启
GPU
Y
使虚拟机共享主机的GPU,不需要可不填此项
TZ
Asia/Shanghai
使虚拟机使用中国时区
LANGUAGE
Chinese
使虚拟机使用中文
VERSION
10l
指定当前镜像版本为 Win10 LTSC
Labels 部分不管。
Restart policy 部分建议Never,这样虚拟机就可随Windows系统关机而关闭:
图片.pngRuntime&resources 部分直接按图中填:
其中 Memory limit 部分建议填比分配给虚拟机内存大500MB的内存限制(如环境变量中分配 6G 则填 6656),因为虚拟机服务本身需要占用额外资源。
图片.png最后 Capabilities 部分将 NET_ADMIN 打开。
图片.png完成后点击 Deploy the container 部署虚拟机,虚拟机随即启动:
图片.png三、 配置并使用Windows
>1. 在Portainer中点击部署好的容器进入详情页。
图片.png滚动到最下方,确定虚拟机框架当前获得的内网IP地址:
图片.png>2.浏览器输入IP地址并访问,看到以下界面即成功。虚拟机框架正在加载镜像:
图片.png如果选择了共享GPU,则虚拟机还会下载对应依赖,可能用时稍久。
图片.png>3.随后跟随Windows安装向导完成安装,即可看到系统:
图片已经装了点东西了哈哈。打开网络与共享中心,可看到虚拟机已获得独立IP:
图片.png使用Windows自带的远程桌面工具(或其他RDP工具)输入IP即可连接,效果好上不少。
图片.png
图片四、可能遇到的问题和提示
>1. 由于Macvlan网络的特殊性,虚拟机无法直接与G2通过内网IP的方式通讯。如需访问,可配置转发。
>2. G2默认自带的8G内存还是小了点,有条件的可以自己换内存(DDR4的笔记本内存)。
>3. 部署好并命名标准的虚拟机容器通过拾光坞客户端也可见,可通过客户端进行开启、关闭等操作,然而强烈建议在虚拟机内使用Windows关机以确保系统和数据安全,同样设置妥当的话容器也会一同关闭。
图片.png>4. 除非存在限制,否则仍推荐使用拾光坞提供的Docker管理工具。
>5. 现G2虚拟机网络相关环境还不全,使用macvlan方式会出问题,建议使用bridge或host模式
bridge下将容器内8006及3389TCP和UDP端口映射出去,也可根据需求新增端口映射。端口映射配置失败的可先用host模式创建容器,完成虚拟机初始化和装机后通过拾光坞客户端修改容器配置为bridge模式并映射相关端口即可
使用bridge和host网络时环境变量部分不需配置“DHCP=Y”;Runtime&resources 中的 device 部分不需填写 /dov/vhost-net 项
