用virsh开启虚拟机,核心操作就是执行virsh start 虚拟机名,前提是这台虚拟机已经定义好且处于关闭状态,下面把完整步骤、常见报错和处理思路一次讲清楚。
用virsh start命令开启虚拟机的完整操作步骤
virsh是libvirt自带的命令行管理工具,在Linux服务器上操作KVM虚拟机基本离不开它,首次上手的人容易绕进“命令找不到”“域不存在”这些坑里,其实只要按顺序走,整个流程不超过五步。
第一步:确认虚拟机名称和状态
开启虚拟机之前,先看看当前有哪些域以及它们的状态,运行:
virsh list --all
这个命令会列出所有虚拟机,包括正在运行和已经关闭的,输出结果里,Id栏显示“-”的就是未运行的虚拟机,Name栏就是你能直接使用的名称,记住这个名字,之后所有操作都要精确匹配它。
第二步:直接执行启动命令
确认虚拟机处于shut off状态后,执行:
virsh start 虚拟机名
如果成功,终端会返回一句类似“域 xxx 已启动”的提示,这时再用virsh list查看,就能看到状态已经变成running。
第三步:设置开机自启动(可选但实用)
日常运维中,服务器重启后不想手动一个个开虚拟机,可以给虚拟机设置自动启动:
virsh autostart 虚拟机名
这条命令会让宿主机的libvirtd服务在开机时自动拉起这个虚拟机,想取消的话,把命令换成virsh autostart --disable 虚拟机名即可。
第四步:验证网络和系统状态
virsh start只是把虚拟机的CPU和内存拉起来,并不等于系统完全可用,如果虚拟机里有业务需要依赖网络或服务,建议等几秒后再用virsh domifaddr 虚拟机名或virsh domstate 虚拟机名确认IP分配和运行状态,对于关键的数据库或Web服务,最好ping一下虚拟机IP,确认真的能通。
virsh开启虚拟机失败原因排查与解决办法
实际操作中,virsh start报错的情况很常见,我从自己处理过的故障里挑了三种最高频的,单独拎出来说。
报错“域已存在”或“Domain already active”
这个提示听着矛盾,其实很简单虚拟机已经在运行了,可能你之前用virt-manager或另开了一个SSH窗口启动过它,别慌,先跑virsh list看当前活动域,如果确实有这个名字,就直接用,不需要再start。
报错“操作超时”或启动卡住不动
执行virsh start后终端长时间没反应,甚至最后报Timed out,这通常和资源冲突有关,最常见的原因是宿主机内存或CPU核数不足,超出当前系统可分配范围,可以用free -h和nproc快速看一眼,磁盘I/O拥堵也可能导致启动中途卡死,尤其是机械盘上叠了多台重度I/O虚拟机时,解决方案很简单:先腾出资源,或者编辑虚拟机配置降低CPU内存规格,再重新尝试。
报错“无效参数”或“internal error”
这类问题多半出在虚拟机的XML配置上,比如你给虚拟机指定的内存值超过了宿主机允许的上限,或者桥接网卡名称写错,此时需要用virsh edit 虚拟机名打开配置,核对<memory>、<vcpu>和<interface>,修改后保存,再执行virsh define /etc/libvirt/qemu/虚拟机名.xml重新定义,最后启动。
virsh中域状态解读:从shut off到running
virsh list --all输出里的状态列,很多人只看懂“running”和“shut off”,其实还有几种状态需要了解,尤其是虚拟机异常时很有用。
- running:虚拟机正在运行,核心和内存都分配了。
- shut off:域已定义但未启动,相当于关机状态。
- paused:虚拟机被暂停,CPU停止执行,内存保留,通常由
virsh suspend触发。 - crashed:虚拟机异常崩溃,需要重启服务或恢复快照。
- idle:很少见,表示域处于空闲状态,一般出现在某些特定的hypervisor版本里。
行业共识认为,遇到crashed状态时,优先检查宿主机的/var/log/libvirt/qemu/虚拟机名.log日志,那里面会记录QEMU进程退出的具体原因。
virsh命令行开启方式对比图形工具的优势
有些朋友习惯用virt-manager图形界面点“开启”按钮,觉得更直观,但在生产环境的服务器上,virsh命令行的价值明显更大,对比一下主要差异:
| 对比维度 | virsh命令行 | virt-manager图形界面 |
|---|---|---|
| 操作方式 | 一条命令定位并启动 | 打开界面、找到虚拟机、点击开始 |
| 远程管理 | SSH进入后可直接执行,无需X11转发 | 需要X11转发或VNC,链路易碎 |
| 批量操作 | 配合for循环可以一次启动多台 | 只能手动一台台点 |
| 报错信息 | 终端直接输出,配合日志排查精准 | 弹窗信息有限,仍需查日志 |
如果你是运维或DevOps岗位,学命令行是绕不开的,碰到crontab定时任务、自动化监控脚本、批量迁移场景,都用得上virsh,不少云管理平台底层的二次开发,就是在libvirt的API上面包了一层封装,而virsh本身就能完成95%的日常操作。
virsh开启虚拟机后如何确认业务真的起来了
启动成功不等于业务可用,这一点新手容易忽视,推荐一个简单的三层检查法。
- 第一层看状态:
virsh list确认域处于running,这一步能看到进程级别的状态。 - 第二层看网络:用
virsh domifaddr 虚拟机名拿到IP地址,再ping测试通不通。 - 第三层看服务:
ssh进虚拟机,用systemctl status 服务名确认关键服务正常监听端口。
遇到开机后没IP的情况,多数原因是虚拟机里的网卡没有自动获取地址,这时可以先登录宿主机用virsh console 虚拟机名进入虚拟机内部,手动执行systemctl restart network或者dhclient试一试。
常见问题解答
virsh start和virsh create有什么区别?
virsh start开启的是已经通过virsh define定义好的持久化虚拟机,域的资料会保存在/etc/libvirt/qemu/目录下,而virsh create是临时用XML文件启动一个一次性虚拟机,虚拟机重启后就不存在了,日常管理自己搭建的KVM环境,绝大多数情况下用virsh start就够了。
虚拟机开机自启动后,为什么重启宿主机还是没起来?
先检查autostart是否真的生效,执行virsh dominfo 虚拟机名,找到Autostart那一行,如果显示disable,说明设置没成功,宿主机上libvirtd服务本身是否开机启动也要确认,执行systemctl status libvirtd看状态,多数情况下,这两个点排查完就能解决。
宿主机内存充足,但virsh start还是报内存分配失败,怎么回事?
这种现象很隐蔽,通常是虚拟机配置中的内存上限设置过大,比如宿主机有64G内存,但虚拟机XML里写死了60G,还开启了<memoryBacking>中的不可回收机制,检查编辑器的XML配置,把<memory>和<currentMemory>调整为合理值,再执行virsh start就能正常拉起,部分主机的BIOS里开启了大内存页透明化配置,也可能影响连续内存分配,遇到极端情况可以临时关闭透明大页再试一次。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/924232.html


评论列表(4条)
这篇文章写得非常好,内容丰富,观点清晰,让我受益匪浅。特别是关于虚拟机名的部分,分析得很到位,给了我很多新的启发和思考。感谢作者的精心创作和分享,期待看到更多这样高质量的内容!
@面robot415:这篇文章的内容非常有价值,我从中学习到了很多新的知识和观点。作者的写作风格简洁明了,却又不失深度,让人读起来很舒服。特别是虚拟机名部分,给了我很多新的思路。感谢分享这么好的内容!
@面robot415:这篇文章的内容非常有价值,我从中学习到了很多新的知识和观点。作者的写作风格简洁明了,却又不失深度,让人读起来很舒服。特别是虚拟机名部分,给了我很多新的思路。感谢分享这么好的内容!
这篇文章写得非常好,内容丰富,观点清晰,让我受益匪浅。特别是关于虚拟机名的部分,分析得很到位,给了我很多新的启发和思考。感谢作者的精心创作和分享,期待看到更多这样高质量的内容!