KVM报错
virsh undefine aaa
error: Failed to undefine domain aaa
error: Requested operation is not valid: cannot undefine domain with nvram
这个错误表明你尝试删除(undefine)一个带有 NVRAM(非易失性随机访问存储器)的虚拟机。NVRAM 通常用于存储 UEFI 固件变量。在这种情况下,你需要采取额外的步骤来完全删除虚拟机。以下是解决这个问题的几种方法:
- 使用 --nvram 选项:
这个选项会同时删除 NVRAM 文件:
virsh undefine aaa --nvram
- 使用 --remove-all-storage 选项:
这个选项会删除所有相关的存储,包括 NVRAM:
virsh undefine aaa --remove-all-storage
- 手动删除 NVRAM 文件:
a. 首先,找到 NVRAM 文件的位置:
virsh dumpxml aaa | grep nvram
b. 手动删除该文件:
sudo rm /path/to/nvram/file
c. 然后再次尝试 undefine:
virsh undefine aaa
- 使用 --keep-nvram 选项:
如果你想保留 NVRAM 文件但删除虚拟机定义:
virsh undefine aaa --keep-nvram
对于较新版本的 libvirt,你可以使用多个选项组合:
virsh undefine aaa --nvram --remove-all-storage --delete-snapshots
这会删除 NVRAM、所有存储和快照。
注意事项:
在执行这些操作之前,确保你真的想要完全删除虚拟机及其所有相关文件。
如果虚拟机正在运行,你需要先关闭它:
virsh shutdown aaa
对于重要的虚拟机,建议在删除之前先创建备份。
如果虚拟机使用了共享存储或特殊的存储配置,可能需要额外的步骤来完全清理所有资源。
确保你有足够的权限执行这些操作。如果遇到权限问题,可能需要使用 sudo 或切换到 root 用户。
使用 virsh 复制已安装的虚拟机可以通过以下步骤完成:
列出现有的虚拟机:
virsh list --all
确保要复制的虚拟机处于关闭状态。如果虚拟机正在运行,请先关闭:
virsh shutdown <原始虚拟机名称>
复制虚拟机的磁盘文件。假设原始虚拟机的磁盘文件位于 /var/lib/libvirt/images/:
sudo cp /var/lib/libvirt/images/<原始虚拟机名称>.qcow2 /var/lib/libvirt/images/<新虚拟机名称>.qcow2
导出原始虚拟机的 XML 配置:
# 查看xml位置
find / -name "<原始虚拟机名称>.xml"
/etc/libvirt/qemu/<原始虚拟机名称>.xml
virsh dumpxml <原始虚拟机名称> > /etc/libvirt/qemu/<原始虚拟机名称>.xml
编辑导出的 XML 文件,修改以下内容:
- 更改
标签中的虚拟机名称 - 更新
标签(可以使用 uuidgen 命令生成新的 UUID),存在可以直接删除,启动虚拟机后会自动生成。 - 修改
标签中的磁盘文件路径,指向新复制的磁盘文件 - 如果需要,更改 MAC 地址(在
标签中),存在可以直接删除,启动虚拟机后会自动生成。
使用修改后的 XML 文件定义新的虚拟机:
virsh define /etc/libvirt/qemu/<新虚拟机名称>.xml
启动新虚拟机:
virsh start <新虚拟机名称>
验证新虚拟机是否正常运行:
virsh list --all
注意事项:
确保有足够的磁盘空间来存储复制的虚拟机磁盘文件。
如果原始虚拟机使用了快照,你可能需要额外的步骤来处理快照。
对于使用 LVM 或其他存储类型的虚拟机,可能需要调整相应的存储配置。
复制后的虚拟机可能需要重新配置网络设置,特别是如果你更改了 MAC 地址。
某些操作系统可能会因为硬件变化(如 UUID 更改)而需要重新激活或配置。
这个过程可以通过脚本自动化,以便更容易地批量复制虚拟机。如果你经常需要执行这种操作,考虑编写一个脚本来自动化这些步骤。
使用 virsh 创建和管理虚拟机快照的方法如下:
创建快照
a. 创建一个包含磁盘状态的完整快照:
virsh snapshot-create-as <虚拟机名称> <快照名称> "<快照描述>" --disk-only --atomic
b. 创建仅包含内存状态的快照(不包括磁盘状态):
virsh snapshot-create-as <虚拟机名称> <快照名称> "<快照描述>" --memspec file=/path/to/memory/file
c. 创建包含磁盘和内存状态的完整快照:
virsh snapshot-create-as <虚拟机名称> <快照名称> "<快照描述>"
列出快照
virsh snapshot-list <虚拟机名称>
查看快照详细信息
virsh snapshot-info <虚拟机名称> <快照名称>
恢复到特定快照
virsh snapshot-revert <虚拟机名称> <快照名称>
删除快照
virsh snapshot-delete <虚拟机名称> <快照名称>
创建快照的 XML 文件
virsh snapshot-create <虚拟机名称> snapshot.xml
导出快照的 XML 配置
virsh snapshot-dumpxml <虚拟机名称> <快照名称> > snapshot_config.xml
注意事项:
在创建快照之前,确保虚拟机处于稳定状态。
对于运行中的虚拟机,创建快照可能会暂时暂停虚拟机。
快照会占用额外的磁盘空间,请确保有足够的存储空间。
某些类型的快照可能不支持所有虚拟机配置或存储后端。
对于生产环境,建议在进行快照操作之前先备份重要数据。
快照不应被视为长期备份解决方案的替代品。
使用快照时的最佳实践:
为快照使用有意义的名称和描述,以便于识别。
定期清理不再需要的快照以节省空间。
测试快照恢复过程,确保它们按预期工作。
对于关键系统,考虑使用外部备份解决方案来补充快照。
通过这些命令和最佳实践,你可以有效地使用 virsh 来管理虚拟机的快照,从而提高系统的可靠性和灵活性。