虚拟化技术
真正有效压缩hyper-v虚拟磁盘文件VHDX
首先明确:hyper-v管理器里面“设置-硬盘驱动器-编辑-选择操作-压缩”并没有明显的效果。
然后区分几个关键词:
hyper-v里面的“压缩(compact)”:虚机里磁盘的可用空间不变,虚拟磁盘文件大小变小(因为是回收虚机因删除文件释放出来的磁盘空间,所以不可能压缩到比虚机里磁盘总已用空间还小)
hyper-v里面的“收缩”:虚机里磁盘的可用空间变小。(不可能影响已用空间)
磁盘管理工具(diskmgmt.msc)里面的“压缩卷”:使磁盘的可用空间变小。(不可能影响已用空间)
最后看方案:
1.有人给出的方案:碎片整理无效,还有反作用,应该先收缩,再压缩,再扩展。
如:先在磁盘管理工具里面“操作-附加VHD”,然后在有可用空间的分区上右键“压缩卷”(只支持NTFS,而且过程漫长,无进度条),然后分离VHD,在hyper-v管理器里面压缩,就有效果。
2.也有方案:建一个新的虚拟磁盘,使用diskgen或者Ghost11把原来磁盘的内容(按文件或者文件系统或者partition2partition拷过来),然后把新的虚拟磁盘当原来的磁盘用。
这两个感觉都不是很好,速度慢或根本没有进度条不知道过程如何了;或者不支持linux;或者新磁盘的有些硬件特征会改变。
看下面的:
3.对NTFS文件,用Windows Server PowerShell里面的Optimize-VHD小命令(cmdlet),操作如下:a.先在磁盘管理工具里面“操作-附加VHD”,记得勾选“read-only”(必不可少)b.打开PowerShell,输入Optimize-VHD -Path C:\YourVHDX.vhdx -Mode Full。运行后很快就OK了,磁盘文件显著变小了。关于Optimize-VHD详细一点的说明可参考:https://docs.microsoft.com/zh-tw ... e-vhd?view=win10-ps
4.Linux系统,压缩前,要在虚机层面将标记为DELETE的文件彻底删除,也就是将虚机磁盘上的位置0。(具体置零的方法:下载systemrescue cd,用该cd启动虚机,运行zerofree,如zerofree /dev/sda1),然后再压缩。 这是国外论坛上给的方法,老外说这个systemrescuecd小巧好用,值得一试,下载网站:https://www.system-rescue.org/。然后Optimize-VHD -Path C:\YourVHDX.vhdx -Mode Prezeroed,这个不用在磁盘管理工具里面附加VHDX,不是NTFS,附加了对效率也没提升。
这两个方案应该是比较靠谱的,方案3亲测有效。
hyper-v迁移前开启winrm service
winrm service: 是windows 一种方便远程管理的服务;开启winrm service,便于在日常工作中,远程管理服务器,或通过脚本,同时管理多台服务器,来提高工作效率;
工具/原料
windows server
方法/步骤
winrm service 默认都是未启用的状态,先查看状态;如无返回信息,则是没有启动;
winrm enumerate winrm/config/listener
针对winrm service 进行基础配置:
winrm quickconfig
查看winrm service listener:
winrm e winrm/config/listener
为winrm service 配置auth:
winrm set winrm/config/service/auth @{Basic="true"}
为winrm service 配置加密方式为允许非加密:
winrm set winrm/config/service @{AllowUnencrypted="true"}
6
至此,winrm service 已经启用,可以正常使用;
Windows Server 2022 Hyper-V 虚拟网卡参数查看及修改
在 Windows Server 2022 Hyper-V 虚拟机 中,虚拟网卡(vNIC)是通过 Hyper-V 虚拟交换机 管理的,默认使用的虚拟网卡驱动是 Hyper-V Synthetic Network Adapter (即 hv_netvsc 驱动)。关于 TX/RX Buffer(发送/接收缓冲区)参数,有几个要点:
1️⃣ 查看网卡缓冲区大小
PowerShell 查看网卡队列和相关参数:
Get-NetAdapterAdvancedProperty -Name "vEthernet (VM Name)"
可以查看诸如 Receive Buffers 、 Transmit Buffers 之类的高级属性(如果驱动支持)。
如果显示为空或没有该选项,说明 Hyper-V Synthetic Adapter 不允许用户直接调整。
通过设备管理器查看高级属性:
打开 设备管理器 → 网络适配器 → Hyper-V 网络适配器 → 属性 → 高级
一些物理网卡的高级选项(如 Large Send Offload、Receive Buffers)可能可用,但大部分 vNIC 没有明显的 Buffer 调整项。
2️⃣ 修改网卡缓冲区
Hyper-V Synthetic Adapter 本身的 TX/RX Buffer 不可直接修改 。
可选方案 :
修改宿主机物理网卡缓冲区 :
宿主机的物理 NIC 支持调整 TX/RX Buffer 时,Hyper-V vNIC 会间接受益。
PowerShell 示例:
Set-NetAdapterAdvancedProperty -Name "Ethernet0" -DisplayName "Receive Buffers" -DisplayValue 1024
增加虚拟机 vNIC 数量 :
多队列 vNIC(RSS、多队列网卡)可以提升高并发情况下的吞吐量。
Set-VMNetworkAdapter -VMName "VM Name" -IovQueuePairs 4
需要物理网卡和 Hyper-V 支持 SR-IOV。
启用或调整虚拟机的 VMQ(Virtual Machine Queue) :
VMQ 可以将网络流量分配到多个虚拟 CPU 上,提高并发处理能力:
Get-VMNetworkAdapter -VMName "VM Name" | Set-VMNetworkAdapter -EnableVMQ $true
🔹 总结
Hyper-V 的 Synthetic Adapter 不支持直接修改 TX/RX Buffer 。
提升高峰期网络性能的办法:
调整宿主机物理网卡缓冲区。
启用 VMQ 或 RSS。
增加 vNIC 或使用 SR-IOV 支持的直通网卡。
如果你需要,我可以帮你写一个 PowerShell 脚本,自动检测 Hyper-V 虚拟机网卡的 TX/RX 缓冲能力并设置 VMQ / 多队列 ,方便在高并发下优化网络。
你希望我直接写这个脚本吗?
银河麒麟高级服务器版V11+KVM+Libvirt+WebVirtCloud+OpenStack部署
非常好的选择 👍 您要实现的目标是: 在 银河麒麟高级服务器版V10(Kylin V10) 上,构建一个完整的虚拟化管理平台,包含:
KVM :提供虚拟化能力(基于CPU硬件虚拟化)
Libvirt :提供虚拟机管理接口
WebVirtCloud :提供Web管理界面
OpenStack(可选) :提供私有云级别的资源调度与自服务管理
下面给出一份 详细、可直接执行的部署文档(生产可用) ,默认系统为 Kylin V10 x86_64 / aarch64,已启用 yum 或 dnf 源。
🚀 一、环境准备
1. 检查CPU是否支持虚拟化
egrep -c '(vmx|svm)' /proc/cpuinfo
返回值 > 0 表示支持。
2. 确保内核模块支持KVM
lsmod | grep kvm
若未加载,则手动加载:
modprobe kvm
modprobe kvm_intel # Intel
modprobe kvm_amd # AMD
3. 启用桥接网络(推荐虚拟机可直接联网)
创建网桥配置文件 /etc/sysconfig/network-scripts/ifcfg-br0 :
DEVICE=br0
TYPE=Bridge
BOOTPROTO=static
IPADDR=192.168.3.15
NETMASK=255.255.255.0
GATEWAY=192.168.3.1
DNS1=202.96.209.5
ONBOOT=yes
修改物理网卡(如 ifcfg-eno2 ):
DEVICE=ens33
TYPE=Ethernet
BOOTPROTO=none
ONBOOT=yes
BRIDGE=br0
实际如下:
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=eui64
NAME=eno2
UUID=5d9b10e9-49eb-4742-875a-0a6cbc268e9b
DEVICE=eno2
ONBOOT=yes
BRIDGE=br0
#IPADDR=192.168.3.15
#PREFIX=24
#GATEWAY=192.168.3.1
#DNS1=202.96.209.5
然后执行:
systemctl restart network
实际该命令无效,reboot或其他方法
🧩 二、安装KVM + Libvirt + QEMU
yum install -y qemu-kvm qemu-img virt-manager libvirt python3-libvirt libvirt-client bridge-utils virt-install
启用服务:
systemctl enable libvirtd --now
systemctl status libvirtd
验证:
virsh list --all
应能返回空虚拟机列表。
手动添加 EPEL 仓库
cp /etc/yum.repos.d/kylin-extra.repo /etc/yum.repos.d/kylin-extra.repo.bak
vi /etc/yum.repos.d/kylin-extra.repo
[epel]
name=EPEL for Kylin 11 (RHEL8 compatible)
baseurl=https://mirrors.aliyun.com/epel/8/Everything/x86_64/
enabled=1
gpgcheck=0
[powertools]
name=PowerTools for Kylin 11
baseurl=https://mirrors.aliyun.com/centos/8/PowerTools/x86_64/os/
enabled=1
gpgcheck=0
dnf clean all
dnf makecache
🌐 三、安装WebVirtCloud(Web管理界面)
1. 安装依赖
yum install -y wget git
wget http://mirrors.aliyun.com/epel/epel-release-latest-8.noarch.rpm
yum localinstall -y epel-release-latest-8.noarch.rpm --skip-broken
yum clean all
yum makecache
yum install -y git python3 python3-pip nginx supervisor
安装报错的话要用清华源安装
mkdir -p ~/.pip
cat > ~/.pip/pip.conf <<'EOF'
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
timeout = 6000
EOF
pip3 install supervisor
pip3 install --upgrade pip
2. 克隆WebVirtCloud源码
cd /opt
git clone https://github.com/retspen/webvirtcloud.git
cd webvirtcloud
如果git失败可调高缓冲区再下载
git config --global http.postBuffer 524288000
git config --global http.lowSpeedLimit 0
git config --global http.lowSpeedTime 999999
git config --global core.compression 0
3. 安装Python依赖
yum install libvirt-devel gcc python3-devel openldap-devel
pip3 install -r conf/requirements.txt
4. 初始化数据库和配置
cp webvirtcloud/settings.py.template webvirtcloud/settings.py
python3 -c "from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())"
#生成一串字符 c*&2pu%e=m7&r*^r*zp3p*wr!(8w3a$-l^rq@*w5#7ekrwmtpd
vi webvirtcloud/settings.py
#找到或添加 SECRET_KEY 配置)
SECRET_KEY = 'c*&2pu%e=m7&r*^r*zp3p*wr!(8w3a$-l^rq@*w5#7ekrwmtpd'
python3 manage.py migrate
python3 manage.py createsuperuser # 创建管理员账号
#web登录用的账号密码
#账号 shuncom 邮箱:8108@shuncom.com 密码:sh_clighting
5. 启动测试
方法 A:Gunicorn 自带 --daemon
python3 manage.py runserver 0.0.0.0:8000
#如果报错换以下方法
# 安装 gunicorn(你已经安装了)
pip3 install gunicorn
# 启动 WebVirtCloud
gunicorn --workers 3 --bind 0.0.0.0:8000 --daemon webvirtcloud.wsgi:application
#日志默认输出到 gunicorn.log,可通过 --access-logfile 和 --error-logfile 指定日志文件
gunicorn --workers 3 --bind 0.0.0.0:8000 \
--daemon \
--access-logfile /var/log/webvirtcloud_access.log \
--error-logfile /var/log/webvirtcloud_error.log \
webvirtcloud.wsgi:application
方法 B:使用 systemd 管理 WebVirtCloud
创建服务文件 /etc/systemd/system/webvirtcloud.service :
[Unit]
Description=WebVirtCloud Django service
After=network.target
[Service]
User=root
Group=root
WorkingDirectory=/opt/webvirtcloud
ExecStart=/usr/local/bin/gunicorn --workers 3 --bind 0.0.0.0:8000 webvirtcloud.wsgi:application
Restart=always
[Install]
WantedBy=multi-user.target
然后执行:
systemctl daemon-reload
systemctl enable --now webvirtcloud
systemctl status webvirtcloud
#防火墙放行web端口
firewall-cmd --add-port=8000/tcp --permanent
firewall-cmd --add-port=80/tcp --permanent
firewall-cmd --reload
firewall-cmd --list-all
访问 http://服务器IP:8000 ,使用创建的管理员账号登录。
⚙️ 四、配置Nginx反向代理(生产环境)
编辑 /etc/nginx/conf.d/webvirtcloud.conf :
如果没安装:yum install -y nginx
server {
listen 80;
server_name _;
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_redirect off;
}
}
重启服务:
systemctl enable nginx --now
🧰 五、配置Supervisor守护WebVirtCloud
如果系统没有 /etc/supervisord.conf ,可以创建:
sudo vi /etc/supervisord.conf
内容示例:
[unix_http_server]
file=/tmp/supervisor.sock ; UNIX socket 文件
[supervisord]
logfile=/var/log/supervisord.log
pidfile=/tmp/supervisord.pid
childlogdir=/var/log
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl]
serverurl=unix:///tmp/supervisor.sock
[include]
files = /etc/supervisord.d/*.ini
mkdir -p /etc/supervisord.d
vi /etc/supervisord.d/webvirtcloud.ini
[program:webvirtcloud]
command=/usr/bin/python3 /opt/webvirtcloud/manage.py runserver 0.0.0.0:8000
directory=/opt/webvirtcloud
autostart=true
autorestart=true
stderr_logfile=/var/log/webvirtcloud.err.log
stdout_logfile=/var/log/webvirtcloud.out.log
user=root
启用并启动:
systemctl enable supervisord --now
supervisorctl restart webvirtcloud
验证:
supervisorctl status
🖥 六、配置WebVirtCloud连接KVM主机
登录WebVirtCloud后台( http://<服务器IP> )
“Compute > Add Connection”
填写:
Label : KVM-Host
Hostname/IP : 127.0.0.1
Connection type : SSH
Login user : root 或管理用户
确保 root 用户可以无密码SSH到本机:
ssh-keygen -t rsa
ssh-copy-id root@127.0.0.1
连接成功后,即可在Web界面创建和管理虚拟机。
☁️ 七、(可选)安装 OpenStack 实现云平台管理
如果您需要将虚拟化扩展为“云平台”,可以部署轻量级 OpenStack All-in-One。
1. 安装 DevStack(快速体验)
cd /opt
git clone https://opendev.org/openstack/devstack
cd devstack
创建配置文件 local.conf :
[[local|localrc]]
ADMIN_PASSWORD=admin
DATABASE_PASSWORD=admin
RABBIT_PASSWORD=admin
SERVICE_PASSWORD=admin
HOST_IP=192.168.1.100
启动安装:
./stack.sh
安装完成后访问:
http://192.168.1.100/dashboard
默认用户: admin 密码: admin
🧾 八、验证与维护
验证虚拟化运行状态
virsh list
查看libvirt网络和存储池
virsh net-list
virsh pool-list
检查服务状态
systemctl status libvirtd
systemctl status nginx
systemctl status supervisord
✅ 部署总结
模块
功能
服务端口
管理方式
KVM
提供虚拟化能力
-
命令行/Libvirt
Libvirt
虚拟机管理接口
16509
virsh/virt-manager
WebVirtCloud
Web虚拟机管理
80/8000
浏览器
OpenStack
云计算管理平台
80/5000/8774 等
Web仪表盘 Horizon
🧭 建议实践路线
目标
推荐方案
轻量虚拟化环境
KVM + Virt-Manager
Web管理多节点
WebVirtCloud
构建私有云平台
OpenStack on KVM
高级调度与计费
OpenStack + Ceph
是否希望我为您输出一份 可直接在Kylin V10执行的 Shell 自动化安装脚本(含Nginx+WebVirtCloud+Libvirt 一键部署) ? 那样您可以直接运行即可完成全部环境配置。
你现在在 WebVirtCloud 创建虚拟机实例时,提示:
You haven't defined any storage pools
这是因为 Libvirt 还没有配置任何存储池 ,WebVirtCloud 依赖存储池来存放虚拟机磁盘镜像。
1️⃣ 查看现有存储池
在服务器上执行:
sudo virsh pool-list --all
输出可能类似:
Name State Autostart
------------------------------------------------
default inactive no
如果没有存储池或状态为 inactive ,就需要创建或激活。
2️⃣ 激活默认存储池(如果存在)
sudo virsh pool-start default
sudo virsh pool-autostart default
3️⃣ 创建新的存储池(如果没有)
假设你希望在 /var/lib/libvirt/images 存储虚拟机磁盘:
sudo mkdir -p /var/lib/libvirt/images
sudo virsh pool-define-as default dir - - - - "/var/lib/libvirt/images"
sudo virsh pool-build default
sudo virsh pool-start default
sudo virsh pool-autostart default
解释:
pool-define-as default dir ... "/var/lib/libvirt/images" :定义一个目录类型存储池
pool-build :准备池
pool-start :启动池
pool-autostart :开机自动启动
4️⃣ 在 WebVirtCloud 刷新
登录 WebVirtCloud
打开 Host → Storage Pools
应该能看到你刚创建或激活的存储池
现在就可以创建虚拟机实例了
💡 小提示:
存储池必须 可写,并且 WebVirtCloud 运行用户有权限访问
通常使用 root 或者 libvirt 用户运行 WebVirtCloud
非常好 👍 你已经能在 WebVirtCloud 里创建虚拟机了。 现在要“上传 ISO 文件并挂载到虚拟机 CD-ROM”,可以有两种常见方式(命令行或 WebVirtCloud 界面)。我详细说明一下:
🧩 一、命令行方式(推荐)
这种方法最直接、最稳定,尤其是初次配置时。
1️⃣ 把 ISO 文件上传到宿主机存储路径
假设你的默认存储池是 /var/lib/libvirt/images :
cd /var/lib/libvirt/images
然后上传 ISO 文件(有多种方式):
# 方式1:通过scp从你的电脑上传
scp CentOS-7-x86_64-Minimal.iso root@<宿主机IP>:/var/lib/libvirt/images/
# 方式2:直接从宿主机下载
wget https://mirror.stream.centos.org/7/isos/x86_64/CentOS-7-x86_64-Minimal.iso -O /var/lib/libvirt/images/CentOS-7.iso
确保 ISO 文件有读权限:
chmod 644 /var/lib/libvirt/images/*.iso
2️⃣ 定义 ISO 文件所在目录为存储池(如果还没定义)
如果 /var/lib/libvirt/images 不是存储池,可用:
virsh pool-define-as iso-pool dir - - - - "/var/lib/libvirt/images"
virsh pool-build iso-pool
virsh pool-start iso-pool
virsh pool-autostart iso-pool
3️⃣ 让 WebVirtCloud 识别新 ISO
在 WebVirtCloud 界面:
打开左侧菜单 Host → Storage Pools
选中你定义的存储池(如 default 或 iso-pool )
点击右上角 Refresh (刷新)
然后点击进入该池,你会看到上传的 ISO 文件列表。
4️⃣ 在虚拟机中挂载 ISO 文件
在 WebVirtCloud 界面:
进入你的虚拟机 → CD-ROM 选项卡
选择 “Attach ISO”
从列表中选中你上传的 ISO 文件
点击 Connect / Attach
这时虚拟机的 CD-ROM 就加载了该 ISO。
5️⃣ 从 ISO 启动虚拟机
在虚拟机界面 → Boot Options
把 CD-ROM 调整为第一个启动项(在 WebVirtCloud 界面中可以拖动)
保存后启动虚拟机,即可从 ISO 安装系统。
🧩 二、WebVirtCloud 直接上传(如果开启了上传功能)
如果 WebVirtCloud 配置了上传权限(部分版本默认关闭),可以直接在:
Host → Storage Pools → 选中 default → Files
看到右上角有 “Upload ISO” 按钮,选择本地 ISO 文件上传。
如果没有这个按钮,可以在 settings.py 中启用:
UPLOAD_ENABLED = True
然后重启 WebVirtCloud 服务(或 supervisor)。
✅ 验证
查看 ISO 是否被虚拟机挂载:
virsh domblklist <虚拟机名>
输出示例:
Target Source
------------------------------------------------
vda /var/lib/libvirt/images/ubuntu.qcow2
hdc /var/lib/libvirt/images/CentOS-7.iso
说明 ISO 已正确挂载。
是否希望我帮你写一个“一键上传 + 挂载 ISO”的命令脚本? 比如你输入 ISO 路径和虚拟机名,它自动完成 virsh 操作并刷新 WebVirtCloud。
非常好 👍,你提到的:
是导致你报错的 根本原因之一 。
✅ 是的,这一行需要修改。
你应该把它改成宿主机支持的输入总线类型。 在大多数情况下(尤其是 KVM/QEMU 的默认虚拟机),应该改为:
或者,如果你的虚拟机配置里主要用 USB 设备,也可以:
🔧 修改步骤
导出虚拟机配置:
virsh dumpxml <虚拟机名> > /tmp/vm.xml
编辑:
vi /tmp/vm.xml
找到:
修改为:
如果有:
也改成:
重新定义虚拟机:
virsh define /tmp/vm.xml
启动虚拟机:
virsh start <虚拟机名>
✅ 总结
原配置
修改后推荐
如果你执行:
virsh capabilities | grep input -A2
看到有 ps2 、 usb 类型,那这两个选项都没问题。 修改完这个 XML 后,虚拟机即可正常启动,不会再出现 unknown input bus type 'default' 错误。
远程桌面实现方案xrdp
你这台机器运行的是 Kylin V10/V11(基于 RHEL8) ,系统源的兼容性有点特殊,EPEL 源里 xrdp 依赖的 xorgxrdp 模块和你当前的 Xorg ABI 版本不匹配(报错的关键信息是: xserver-abi(videodrv-24) )。 这种情况很常见,因为银河麒麟(尤其是 V11)对 EPEL 并不完全兼容。 下面我给你几种可行的解决方案:
✅ 方案 1:仅安装 xrdp,不装 xorgxrdp(最简单)
Kylin 默认带桌面环境(如 UKUI),xrdp 可以直接用系统自带的 Xorg 会话,无需 xorgxrdp 。
dnf install -y xrdp --nobest --skip-broken
安装完成后:
systemctl enable xrdp --now
firewall-cmd --permanent --add-port=3389/tcp
firewall-cmd --reload
然后在 Windows 上用 “远程桌面连接(mstsc)” 输入服务器 IP 即可登录(默认端口 3389)。
⚠️ 用户要使用系统用户(如 root 或普通用户),如果登录闪退,可编辑 /etc/xrdp/startwm.sh :
vi /etc/xrdp/startwm.sh
在最后添加:
exec /usr/bin/startukui
(或根据桌面环境换成 exec /usr/bin/startlxde 、 exec /usr/bin/startxfce4 )
✅ 方案 2:使用 Kylin 官方提供的 xrdp 包(推荐)
银河麒麟官方源其实已经内置了 xrdp 包,只是有时没启用。
先搜索看看:
dnf search xrdp
如果能看到:
xrdp.x86_64 : Remote Desktop Protocol (RDP) server
直接安装:
dnf install -y xrdp
systemctl enable xrdp --now
✅ 方案 3:手动构建或使用第三方 RPM 包
如果你需要特定版本(例如 EPEL 的不兼容),可以下载兼容的 RPM:
cd /tmp
wget https://rpmfind.net/linux/epel/8/Everything/x86_64/Packages/x/xrdp-0.9.21-1.el8.x86_64.rpm
dnf install -y ./xrdp-0.9.21-1.el8.x86_64.rpm
如果提示缺少依赖,可以加上 --skip-broken 或下载依赖包一并安装。
✅ 验证运行
安装完后,执行以下命令确保运行正常:
systemctl status xrdp
ss -tnlp | grep 3389
输出示例:
LISTEN 0 50 *:3389 *:* users:(("xrdp",pid=1234,fd=3))
此时可在 Windows 上用远程桌面连接输入:
服务器IP:3389
即可。
如果你贴一下以下命令的输出,我可以帮你判断当前环境最适合哪种方案👇
cat /etc/kylin-release
dnf repolist
很好!找到了 `novncd` 的位置:`/opt/webvirtcloud/console/novncd`
现在我们来创建 systemd 服务并启动它。
---
### 解决方案
#### 第1步:检查 novncd 是否可执行
```bash # 检查文件权限 ls -la /opt/webvirtcloud/console/novncd
# 如果没有执行权限,添加它 sudo chmod +x /opt/webvirtcloud/console/novncd
# 检查是否依赖 Python file /opt/webvirtcloud/console/novncd head -n 5 /opt/webvirtcloud/console/novncd ```
#### 第2步:创建 systemd 服务文件
基于找到的路径创建服务文件:
```bash sudo vi /etc/systemd/system/novncd.service ```
添加以下内容:
```ini [Unit] Description=WebVirtCloud NoVNC Proxy Server After=network.target
[Service] Type=simple User=root Group=root WorkingDirectory=/opt/webvirtcloud ExecStart=/opt/webvirtcloud/console/novncd Restart=always RestartSec=3 StandardOutput=journal StandardError=journal
[Install] WantedBy=multi-user.target ```
#### 第3步:启用并启动 novncd 服务
```bash # 重新加载 systemd 配置 sudo systemctl daemon-reload
# 启动 novncd 服务 sudo systemctl start novncd
# 设置开机自启 sudo systemctl enable novncd
# 检查服务状态 sudo systemctl status novncd ```
#### 第4步:检查服务是否正常运行
```bash # 检查进程 ps aux | grep novncd
# 检查端口监听(novncd 默认监听 6080 端口) netstat -tlnp | grep 6080 ss -tlnp | grep 6080
# 查看服务日志 sudo journalctl -u novncd -f ```
---
### 如果服务启动失败,进行故障排除
#### 检查依赖项
```bash # 检查 Python 环境 cd /opt/webvirtcloud python3 -c "import django; print('Django OK')" python3 -c "from console import novnc; print('novnc module OK')"
# 检查 requirements if [ -f "/opt/webvirtcloud/requirements.txt" ]; then echo "检查依赖包..." pip3 list | grep -E "(websockify|django)" fi ```
#### 手动测试 novncd
```bash # 切换到目录 cd /opt/webvirtcloud
# 手动启动 novncd 进行测试 /opt/webvirtcloud/console/novncd
# 或者在后台启动 /opt/webvirtcloud/console/novncd & ```
#### 如果手动启动有错误,可能需要安装依赖
```bash # 安装可能的依赖 sudo pip3 install websockify
# 或者安装所有 requirements if [ -f "/opt/webvirtcloud/requirements.txt" ]; then sudo pip3 install -r /opt/webvirtcloud/requirements.txt fi ```
---
### 配置 WebVirtCloud
确保 WebVirtCloud 配置正确指向 novncd:
检查 WebVirtCloud 配置文件:
```bash # 查找配置文件 find /opt/webvirtcloud -name "settings.py" -o -name "*.conf" | grep -v __pycache__
# 常见的配置路径 ls -la /opt/webvirtcloud/webvirtcloud/ ```
在配置文件中应该有这样的设置:
```python # 在 settings.py 或配置文件中 NOVNC_HOST = 'localhost' # 或您的服务器IP NOVNC_PORT = 6080 ```
---
### 测试连接
在 novncd 服务运行后,测试连接:
```bash # 检查端口是否开放 curl -I http://localhost:6080/
# 使用 telnet 测试 telnet localhost 6080
# 或者使用 nc nc -zv localhost 6080 ```
---
### 完整的故障排除流程
如果上述步骤还有问题,请按顺序执行:
```bash # 1. 停止可能运行的服务 sudo pkill -f novncd
# 2. 检查并安装依赖 sudo pip3 install websockify
# 3. 设置正确的权限 sudo chmod +x /opt/webvirtcloud/console/novncd
# 4. 手动测试运行 cd /opt/webvirtcloud /opt/webvirtcloud/console/novncd
# 5. 如果手动运行成功,Ctrl+C 停止,然后创建服务 sudo systemctl daemon-reload sudo systemctl start novncd sudo systemctl status novncd
# 6. 检查防火墙 sudo firewall-cmd --list-ports sudo firewall-cmd --add-port=6080/tcp --permanent sudo firewall-cmd --reload ```
请按照这些步骤操作,然后在每个步骤后告诉我输出结果,这样我可以帮您进一步诊断问题。
太好了!`novncd` 服务现在已经成功运行了:
- ✅ **服务状态**: `active (running)` - ✅ **进程运行**: PID 30720 - ✅ **端口监听**: `0.0.0.0:6080` 正常监听 - ✅ **开机自启**: 已启用
现在 `novncd` 服务已经正常运行,但 VNC 连接可能仍然有问题。让我们继续排查其他可能的环节。
---
### 下一步排查
#### 第1步:检查虚拟机VNC配置
虽然 `virsh vncdisplay 11` 显示 `:0`,但我们还需要确认VNC配置是否正确:
```bash # 查看虚拟机的完整VNC配置 virsh dumpxml 11 | grep -A 10 -B 5 " /tmp/vm-11.xml cat /tmp/vm-11.xml | grep -A 10 -B 5 "graphics" ```
**关键检查点:** - 确认 `` 标签中有 `listen='0.0.0.0'` - 确认没有设置密码导致连接问题
#### 第2步:检查防火墙
确保 VNC 相关端口都开放:
```bash # 检查防火墙状态(如果是firewalld) sudo firewall-cmd --list-all
# 开放必要的端口 sudo firewall-cmd --add-port=6080/tcp --permanent sudo firewall-cmd --add-port=5900-5959/tcp --permanent sudo firewall-cmd --reload
# 如果是iptables,检查规则 sudo iptables -L -n | grep -E "(6080|5900)" ```
#### 第3步:测试VNC端口连通性
```bash # 检查虚拟机VNC端口是否可达(:0 对应端口5900) netstat -tlnp | grep 5900
# 测试本地连接 telnet localhost 5900
# 如果5900端口没有监听,检查其他可能的端口 netstat -tlnp | grep -E ":(59[0-9][0-9])" ```
#### 第4步:检查WebVirtCloud配置
确认WebVirtCloud正确配置了novncd连接:
```bash # 查找WebVirtCloud配置文件 find /opt/webvirtcloud -name "settings.py" -o -name "*.py" | xargs grep -l "NOVNC\|novnc" | grep -v __pycache__
# 检查常见的配置文件 ls -la /opt/webvirtcloud/webvirtcloud/settings.py ```
在配置文件中应该有这样的设置: ```python NOVNC_HOST = 'localhost' # 或者您的服务器IP NOVNC_PORT = 6080 ```
#### 第5步:测试novncd到虚拟机VNC的连接
```bash # 使用websocat或其他工具测试novncd代理 curl -I http://localhost:6080/
# 或者使用wget测试 wget -O- http://localhost:6080/ 2>&1 | head -20 ```
#### 第6步:检查SELinux状态
```bash # 检查SELinux是否启用 getenforce
# 如果是Enforcing模式,尝试临时禁用测试 sudo setenforce 0
# 然后测试VNC连接,如果成功,说明是SELinux问题 ```
---
### 快速诊断命令
请运行以下命令并分享输出:
```bash # 1. 检查虚拟机VNC配置详情 virsh dumpxml 11 | grep -A 10 "/dev/null || sudo iptables -L -n | head -20
# 4. 测试novncd服务响应 curl -s http://localhost:6080/ | head -5
# 5. 检查SELinux getenforce ```
---
### 如果以上都正常但仍然连接失败
尝试重启相关服务:
```bash # 重启novncd服务 sudo systemctl restart novncd
# 重启WebVirtCloud服务(如果有) sudo systemctl restart webvirtcloud # 或者gunicorn、nginx等
# 重启libvirtd服务 sudo systemctl restart libvirtd ```
现在 `novncd` 服务已经正常运行,问题很可能出现在: 1. **虚拟机VNC配置**(特别是listen地址) 2. **防火墙阻止了端口访问** 3. **WebVirtCloud配置**中的novncd地址设置 4. **SELinux策略**
请运行上面的诊断命令,我会根据输出帮您进一步定位问题。
rsync 实现 每日增量备份 KVM 虚拟机磁盘
明白,你想用 rsync 实现 每日增量备份 KVM 虚拟机磁盘 ,并保留虚拟机配置。下面我帮你整理一个 完整可执行方案 ,适合银河麒麟 V11 + KVM + Libvirt + WebVirtCloud 环境。
1️⃣ 前提条件
两台服务器:
主机: /var/lib/libvirt/images/ 存放虚拟机磁盘
备份服务器: /backup/libvirt/
主机和备份服务器可通过 SSH 密钥免密登录 。
安装 rsync :
dnf install -y rsync
2️⃣ 备份目录结构
建议在备份服务器上保持如下结构:
/backup/libvirt/
YYYYMMDD/
images/
xml/
images/ 存放虚拟机磁盘(qcow2/raw)
xml/ 存放虚拟机配置文件(virsh dumpxml 导出)
3️⃣ 导出虚拟机配置(XML)
备份前导出所有虚拟机配置:
mkdir -p /var/lib/libvirt/backup/xml
for vm in $(virsh list --name); do
virsh dumpxml "$vm" > /var/lib/libvirt/backup/xml/"$vm".xml
done
这样每台虚拟机的配置都有单独的 XML 文件,可在另一台服务器直接 virsh define vm.xml 恢复。
4️⃣ rsync 增量备份虚拟机磁盘
假设备份服务器 IP 为 192.168.0.100 ,用户名 backupuser ,执行:
# 创建当天备份目录
BACKUP_DATE=$(date +%Y%m%d)
mkdir -p /var/lib/libvirt/backup/images/$BACKUP_DATE
# 同步虚拟机磁盘(增量)
rsync -avh --progress /var/lib/libvirt/images/ backupuser@192.168.0.100:/backup/libvirt/images/$BACKUP_DATE/
rsync 参数说明:
-a :归档模式(保留权限、时间戳、符号链接等)
-v :显示详细信息
-h :人类可读大小
--progress :显示传输进度
5️⃣ 自动化脚本示例
创建 /usr/local/bin/libvirt_backup.sh :
#!/bin/bash
# 备份日期
BACKUP_DATE=$(date +%Y%m%d)
# 本地临时目录
LOCAL_BACKUP_DIR=/var/lib/libvirt/backup
mkdir -p $LOCAL_BACKUP_DIR/xml
mkdir -p $LOCAL_BACKUP_DIR/images/$BACKUP_DATE
# 备份虚拟机 XML 配置
for vm in $(virsh list --name); do
virsh dumpxml "$vm" > $LOCAL_BACKUP_DIR/xml/"$vm".xml
done
# 备份虚拟机磁盘
rsync -avh --progress /var/lib/libvirt/images/ backupuser@192.168.0.100:/backup/libvirt/images/$BACKUP_DATE/
# 输出完成信息
echo "Backup completed: $BACKUP_DATE"
赋予执行权限:
chmod +x /usr/local/bin/libvirt_backup.sh
6️⃣ 配置每日定时任务
使用 cron :
crontab -e
添加任务(每天凌晨 2 点执行):
0 2 * * * /usr/local/bin/libvirt_backup.sh >> /var/log/libvirt_backup.log 2>&1
日志记录到 /var/log/libvirt_backup.log ,方便排查。
7️⃣ 恢复虚拟机示例
在备份服务器或另一台服务器:
# 复制磁盘和 XML 文件回新服务器
scp backupuser@backupserver:/backup/libvirt/images/20251017/* /var/lib/libvirt/images/
scp backupuser@backupserver:/backup/libvirt/xml/* /var/lib/libvirt/backup/xml/
# 定义虚拟机
for xml in /var/lib/libvirt/backup/xml/*.xml; do
virsh define "$xml"
done
# 启动虚拟机
virsh start vmname
✅ 特点 :
增量备份:rsync 只同步变化文件,节省带宽和存储
自动化:cron 每日执行,无需人工干预
可迁移:备份包含虚拟机配置和磁盘,可直接恢复到另一台服务器
我可以帮你写一个 更智能的脚本 ,支持:
自动保留最近 7 天/30 天备份
支持在线虚拟机快照备份(减少停机时间)
支持多台虚拟机批量备份
你希望我帮你写这个增强版脚本吗?
银河麒麟 + KVM + WebVirtCloud 虚拟机内存不足8G原因与解决方法
非常好的问题,这种情况在 银河麒麟 + KVM + WebVirtCloud 环境里非常常见。你配置虚拟机为 4 核 8 GB 内存 ,但虚拟机内系统只显示 6.5 GB 左右 ,可能由以下几种原因造成👇
🧩 一、宿主机层面:内存超分配或 NUMA 限制
🔹 1. 宿主机可用内存不足
如果宿主机剩余可分配内存小于 8 GB, libvirt 会自动削减虚拟机内存上限。
👉 检查宿主机实际内存:
free -m
若宿主机内存使用已接近上限(例如总 16 GB、已被多台 VM 占用),则虚拟机可能只分到部分物理内存。
🔹 2. NUMA 分区未正确分配
某些 CPU 平台或 BIOS 启用 NUMA(非统一内存访问),虚拟机若被绑定到单个 NUMA 节点,可能只能访问节点局部内存。
👉 检查宿主机 NUMA 拓扑:
numactl --hardware
👉 查看虚拟机 NUMA 绑定情况:
virsh dumpxml vmname | grep -A5 numa
若看到 或 一类的限制,可以删掉或修改为动态。
🧩 二、虚拟机配置层面(Libvirt/QEMU)
查看虚拟机定义文件:
virsh dumpxml vmname | grep -A5 memory
可能会看到:
8388608
6815744
💡 关键区别:
memory 表示最大分配内存(8 GB)
currentMemory 表示当前生效内存(6.5 GB)
🛠️ 解决方法: 修改 XML 或使用命令同步:
virsh setmem vmname 8G --config
virsh setmaxmem vmname 8G --config
然后重启虚拟机:
virsh destroy vmname
virsh start vmname
🧩 三、模板或镜像层面
如果你使用的是 WebVirtCloud 模板镜像(内置系统模板) :
某些模板镜像里预设了 cloud-init 或 virt-sysprep 的限制,自动下调虚拟内存;
特别是从 qcow2 模板克隆出来时, currentMemory 通常被固定为镜像生成时的值。
👉 你可以用以下命令验证:
grep -A5 " 与 都是 8 GiB (8388608 KiB)
CPU 配置
4 核
NUMA
没定义(正常)
实际虚拟机内内存
6.5 GiB 左右
👉 说明: 宿主机和 libvirt XML 都是正确的,虚拟机内部显示 6.5 GiB, 极可能是虚拟机系统内部(guest OS)限制了内存识别 。
🧩 二、在虚拟机内部进一步检查
请进入虚拟机内部执行以下命令排查:
1️⃣ 检查内核参数是否限制内存
cat /proc/cmdline
如果输出中包含:
mem=6G
说明 grub 启动参数限制了内存识别。
🔧 解决: 编辑 /etc/default/grub ,去掉 mem= 参数,例如:
GRUB_CMDLINE_LINUX=""
然后更新 grub 配置并重启:
grub2-mkconfig -o /boot/grub2/grub.cfg
reboot
2️⃣ 检查系统是否识别全部内存
dmesg | grep -i memory
关注是否出现:
Memory limited to 6G due to ACPI or BIOS setting
或
usable memory = 6815744k
如果出现类似日志,说明虚拟 BIOS 报告的内存有限。
🧩 三、检查虚拟机 BIOS(QEMU 机器类型)
你虚拟机的定义中是:
hvm
在某些银河麒麟 V11(基于 RHEL8 内核)环境中, Q35 机型 + 某些 BIOS 版本(SeaBIOS/OVMF)会导致内存映射 bug, 导致 guest 系统只能识别 6.x GB。
🔧 解决办法:改成传统 i440fx 机型。
执行:
virsh edit rulr-1
找到:
hvm
改为:
hvm
保存退出,然后重启虚拟机:
virsh destroy rulr-1
virsh start rulr-1
之后进入系统再执行:
free -mh
通常就会显示 8 GiB 了。
🧩 四、确认虚拟机使用的是标准 BIOS 而非 OVMF(UEFI)
部分模板在 WebVirtCloud 中默认启用了 OVMF (UEFI) 固件, 而部分旧内核(尤其是银河麒麟桌面内核)在 UEFI 模式下存在 ACPI table truncation bug。
👉 检查方式:
virsh dumpxml rulr-1 | grep loader
如果你看到:
/usr/share/OVMF/OVMF_CODE.fd
说明使用的是 OVMF。
🔧 改为传统 BIOS 启动: 在 XML 文件中删除 和 段落,重启虚拟机。
🧩 五、建议最终检查项
如果以上修改后仍显示 6.x GB:
尝试换一个 Linux 镜像(如 CentOS 8/Ubuntu 20.04)验证是否识别 8 GB;
如果识别正常,说明是 银河麒麟 guest 内核 bug ;
可尝试升级内核或应用官方补丁( yum update kernel )。
✅ 总结
可能原因
检查项
修复建议
Guest grub 参数限制
/proc/cmdline 有 mem=
删除参数、重建 grub
BIOS 报告内存错误
dmesg 中有 ACPI 提示
改为 i440fx 机型
UEFI/OVMF 映射 bug
XML 中含
删除 loader 段,改用传统 BIOS
银河麒麟内核 bug
特定版本
更新内核或换标准机型
非常好,这两段输出信息已经能说明问题所在。我们来仔细分析👇
✅ 一、关键日志分析
从你的 dmesg 输出中有两行非常重要:
[ 0.013838] kexec_core: Reserving 256MB of low memory at 1776MB for crashkernel (System low RAM: 2047MB)
[ 0.013839] Reserving 1024MB of memory at 9200MB for crashkernel (System RAM: 8191MB)
这表明:
系统识别到了 8 GB 内存(8191MB) ;
但是因为启用了 crashkernel=1024M,high ,有 1 GB 内存被保留;
再加上一些 BIOS/显存保留区,你最终看到的 “可用内存” 大约就是 6.5 GB 左右。
也就是说:
虚拟机的内存没问题,只是被 crashkernel(内核崩溃转储保留区)占用了。
🧩 二、为什么会这样?
银河麒麟(Kylin V10/V11)默认启用了 kdump 崩溃转储机制 , 在 grub 启动参数中会自动加上:
crashkernel=1024M,high
这会强制预留 1 GB 的内存供 kdump 使用。
🛠 三、解决办法(释放这 1 GB 内存)
如果你只是实验或测试环境,不需要启用内核转储功能,可以直接关闭这一项。
1️⃣ 编辑 grub 配置
vi /etc/default/grub
找到这行:
GRUB_CMDLINE_LINUX="... crashkernel=1024M,high ..."
将 crashkernel=1024M,high 删除或注释掉:
GRUB_CMDLINE_LINUX="ro rhgb quiet audit=0"
保存退出。
2️⃣ 重新生成 grub 配置
如果是 BIOS 启动:
grub2-mkconfig -o /boot/grub2/grub.cfg
如果是 UEFI 启动:
grub2-mkconfig -o /boot/efi/EFI/kylin/grub.cfg
3️⃣ 重启系统
reboot
然后再次查看内存:
free -mh
应该能看到大约 7.5 ~ 7.8 GiB 的可用内存。
✅ 四、补充建议
如果你仍想保留 crashkernel,可以适当减小保留内存,例如:
crashkernel=256M,high
这样只占用 256 MB,不影响 kdump 功能。
若是批量模板虚拟机,可以在母盘模板中修改 /etc/default/grub 后重新制作镜像。
🔍 总结
问题根因
解决方案
银河麒麟默认启用 crashkernel=1024M 保留区,导致内存少 1 GB+
删除或减小 crashkernel 参数后更新 grub 并重启
是否希望我帮你写一个脚本,一键自动检测并修复(删除 crashkernel、重建 grub、提示是否重启)?
KVM安装win11
win11安装
1、创建空磁盘 2、新建xml文件,cdrom启动 3、下载驱动 virtio-win-0.1.225.iso 访问密码: 2344 4、启动虚拟机,开始安装 5、无法识别磁盘,挂载驱动 virsh domblklist bendi(虚拟机名称) 查看磁盘分配
virsh change-media win11-1 sda /var/lib/libvirt/images/virtio-win-0.1.225.iso 挂载驱动镜像,镜像路径要绝对路径 6、安装界面加载驱动 7、加载完驱动,重新挂载安装镜像 virsh change-media win11-1 sda /var/lib/libvirt/images/win11_24h2.iso
8、选择磁盘安装系统 因为上面的操作,win10和win11安装步骤差不多,所有就把win10的笔记弄过来了 **** 这个报错是因为Windows11强制要求安装的机器上必须开启TPM2.0 在虚拟机中按住快捷键Shift+F10打开终端界面 输入regedit打开注册表,在HKEY_LOCAL_MACHINE\SYSTEM\Setup右击新建一个项,命名为LabConfig,在该项右击新建三个DWORD (32位) 值,分别命名为BypassTPMCheck、BypassRAMCheck、BypassSecureBootCheck,并将这三个值都设置为1 切换驱动ISO
[root@localhost images]# virsh change-media win11-1 sda /var/lib/libvirt/images/win11_24h2.iso
Successfully updated media.
[root@localhost images]# virsh domblklist win11-1
Target Source
--------------------------------------------------
vda /var/lib/libvirt/images/win11-1.qcow2
sda /var/lib/libvirt/images/win11_24h2.iso
切换完成后,加载驱动
根据芯片和系统版本找到对应的驱动安装
安装完成驱动后,切换回镜像ISO,继续安装系统
如果到了“让我们为你连接到网络”这步,我们需要联网才可以进行下一步操作,不联网的情况下,无法像win10系统一样跳过,其实我们可以通过命令来跳过联网激活页面,
在“让我们为你连接到网络”的页面中,在电脑键盘上同时按下快捷键“Shift+F10”,或者是“Shift+Fn+F10”,便可打开命令提示符,如下图所示。
在命令提示符中,我们输入"oobe\BypassNRO.cmd",按下回车执行命令即可。
重新设置到网络页面,选择"我没有Internet连接",再选择"继续执行受限设置,即可直接进入系统,跳过win11联网激活。 安装后
安装完成且VM已启动后,下一步是安装来宾代理并解决所有丢失的驱动程序。
客座代理
必须安装来宾代理。
虚拟机管理程序使用来宾代理直接与VM通信。 在任务栏上,单击“文件资源管理器”。请添加图片描述 选择“此PC”,然后双击“ CD驱动器(D 😃 virtio-win-0.1.225”。 访客代理是干净VM关机和启用VM映像实时快照所必需的 打开“来宾代理”文件夹。 virtio-win-gt-x64.msi 访问密码: 2344 右键单击“ qemu-ga-x64”文件,然后选择“安装” 安装后,必须先完全关闭VM,然后才能运行代理。
再次启动VM时,访客代理服务将自动启动
右键单击“以太网控制器”,然后选择“更新驱动程序软件…
选择“浏览我的计算机以获取驱动程序软件
选择“ CD驱动器(D 😃 virtio-win-0.1.225”,然后单击“确定” 安装好后是这样的
Hyper-V 实时迁移(Live Migration) 的 身份验证方式配置错误 解决方法
非常好,这个错误日志很完整,我可以明确告诉你: 这是 Hyper-V 实时迁移(Live Migration) 的 身份验证方式配置错误 引起的,根本原因是:
🧩 “Credential Guard 开启 → CredSSP 不可用 → 迁移凭据验证失败 (0x8009030E)”
⚠️ 错误分析简要说明
错误核心:
安全包中没有可用的凭证 (0x8009030E)
CredentialGuard 不兼容 CredSSP
说明:
默认情况下,Hyper-V 的迁移认证机制是 CredSSP(基于交互登录的凭证传递) ;
但在 Windows Server 2022 / 2025 上, Credential Guard 默认启用 ,会阻止 CredSSP;
所以要迁移成功,你必须改为使用 Kerberos 身份验证 ,并配置 受限委派 (Constrained Delegation) 。
✅ 正确启用 Hyper-V 迁移(Kerberos 模式)
一、确保两台主机在同一域中
例如:
SC-S1.SHUNCOM.LOCAL
S-FACTORY02.SHUNCOM.LOCAL
都加入同一个域 SHUNCOM.LOCAL ,并能互相解析主机名(DNS 正常)。
二、在“Hyper-V 设置”中启用迁移
在两台主机上都执行:
1️⃣ 打开 Hyper-V 管理器 2️⃣ 点击左侧主机名 → 右键 → “Hyper-V 设置” 3️⃣ 选择左侧 “实时迁移”
勾选 “允许此计算机发送和接收实时迁移的虚拟机” 4️⃣ 点击 “高级功能”:
选择 使用 Kerberos 身份验证
迁移性能 → 允许 TCP/IP 连接(默认 6600 端口)
三、在 Active Directory 中启用受限委派
在域控上执行(或在 AD 用户和计算机中操作):
1️⃣ 打开 Active Directory 用户和计算机 (dsa.msc) 2️⃣ 找到源主机帐户,例如: S-FACTORY02$ 3️⃣ 右键 → 属性 → “委派”选项卡 4️⃣ 选择:
信任此计算机仅委派指定服务到指定用户或计算机(仅 Kerberos)
5️⃣ 点击 “添加”:
选择目标主机 SC-S1
勾选服务类型:
cifs
Microsoft Virtual System Migration Service
即同时选中这两个服务。
6️⃣ 确认保存,等待 AD 同步。
四、配置防火墙(如有开启)
在两台主机上都执行(管理员 PowerShell):
Enable-NetFirewallRule -DisplayGroup "Hyper-V"
或手动开放:
TCP 6600
五、重启 Hyper-V 服务
两台主机都执行:
Restart-Service vmms
六、使用 Kerberos 模式发起迁移
在 Hyper-V 管理器中: 1️⃣ 右键虚拟机 → “移动” 2️⃣ 选择 “将虚拟机移至另一台计算机” 3️⃣ 输入目标主机 FQDN(例如 SC-S1.shuncom.local) 4️⃣ 完成迁移向导
如果配置正确,此时迁移应成功完成,不再报 (0x8009030E) 。
🧰 备用方案(临时迁移)
如果你只想 临时完成一次迁移 ,不想动域策略: 你可以使用 导出 / 导入 方式:
在源主机:
Export-VM -Name "VMName" -Path "D:\Export"
在目标主机:
Import-VM -Path "D:\Export\VMName"
这种方式绕过了实时迁移认证机制。
✅ 总结要点
项目
默认设置
推荐修复
身份验证模式
CredSSP
✅ 改为 Kerberos
Credential Guard
默认启用
✅ 保留启用,无需关闭
委派配置
无
✅ 启用受限委派 (cifs + migration service)
防火墙
可能阻挡
✅ 开放 Hyper-V 相关规则
我可以帮你生成一份 域控受限委派配置的 PowerShell 脚本 (自动完成步骤3) 是否要我帮你生成?
管理QEMU虚拟化平台常用的运维命令
管理QEMU虚拟化平台,确实需要熟悉一些常用的运维命令。为了让你能快速了解和掌握,下面这个表格汇总了核心的管理领域及其关键命令:
| 管理领域 | 核心命令/工具 | 主要用途 | 关键参数/子命令示例 | | :--- | :--- | :--- | :--- | | **虚拟机生命周期** | `virsh` | 管理虚拟机的启动、关闭、重启、挂起、配置等。 | `start `, `shutdown `, `reboot `, `suspend `, `resume `, `destroy `, `list --all` | | **磁盘镜像管理** | `qemu-img` | 创建、转换、检查和调整虚拟磁盘镜像。 | `create -f qcow2 `, `convert -f -O