先用virsh pool-define-as定义目录型存储池,再依次执行pool-build、pool-start和pool-autostart完成初始化、激活与开机自启。

怎么用 virsh pool-define-as 一步创建目录型存储池
多数人卡在第一步:明明 mkdir 了目录,virsh pool-start 却报错 “no pool with matching name”。根本原因是没定义(define),只建目录不等于 libvirt 认得它。
正确姿势是跳过 XML 文件,直接用命令行定义并构建:
-
virsh pool-define-as mypool --type dir --target /data/vmimages(定义池,不启动) -
virsh pool-build mypool(初始化目录权限,等价于 chown + chmod) -
virsh pool-start mypool && virsh pool-autostart mypool(激活并设为开机自启)
注意:pool-build 对目录型池会自动设置 mode=0711 和 SELinux 上下文(如 virt_image_t),手动 chmod 755 反而可能被拒绝挂载。
LVM 存储池为什么 virsh pool-info 显示容量不变
常见现象:给 VG 新增 PV 后,virsh pool-info lvm_pool 的 Capacity 值没变。这不是 bug,而是 libvirt 不主动刷新 LVM 元数据 —— 它依赖 lvscan 和 vgscan 的缓存状态。
必须手动触发重载:
- 先运行
vgscan --cache或vgscan --ignorelockingfailure(尤其在多节点共享 VG 时) - 再执行
virsh pool-refresh lvm_pool(关键!否则容量永远“冻住”) - 验证:
lvs -o+lv_size /dev/vg_libvirt看 LV 实际大小,再比对virsh pool-info
漏掉 pool-refresh 是生产环境扩容后虚拟机无法分配新卷的最常见原因。
创建 qcow2 存储卷时 --format qcow2 和 --format raw 的实际差异
不是“选个格式就行”,直接影响 I/O 路径和运维行为:
-
qcow2:支持写时复制、压缩、加密、快照;但virsh vol-resize仅支持扩大,不能缩小;宿主机du -h显示的是实际占用,不是逻辑大小 -
raw:零开销,直通块设备;virsh vol-resize可扩可缩;du -h和逻辑大小一致;但无法做内部快照,迁移时需额外处理稀疏性
典型错误:用 qcow2 创建 100G 卷,实际只写入 2G 数据,结果 virsh vol-resize --capacity 50G 失败 —— 因为 qcow2 不允许缩小已分配空间,只能用 qemu-img resize 配合 guestfs 工具链。
NFS 存储池挂载失败卡在 “starting” 状态怎么办
现象:virsh pool-start nfs_pool 无响应或超时,virsh pool-info 显示状态为 “building” 长时间不转 “running”。
本质是 libvirt 在后台执行 mount 命令,但 NFS 服务端未开放必要端口或选项:
- 检查服务端 exports 是否含
no_root_squash(libvirt 默认以 root 挂载) - 确认防火墙放行
rpcbind(111/tcp+udp)、nfs(2049/tcp+udp)、mountd(随机端口,建议固定rpc.mountd端口并放行) - 客户端测试:手动运行
mount -t nfs4 server:/export /mnt/test,若失败,libvirt 必然失败
绕过方法:先用 systemd 或 fstab 手动挂载好路径,再用 --type dir 定义池 —— libvirt 不校验来源,只管路径是否存在且可写。











