ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

virt-manager + SSH密钥:KVM虚拟机远程图形化管理实战

virt-manager + SSH密钥:KVM虚拟机远程图形化管理实战 做Linux服务器运维的兄弟应该都熟悉这样的场景机房里的KVM宿主机不在身边要建虚拟机、改配置、看虚拟机的图形界面总不能每次都登物理服务器敲命令吧virt-manager作为Linux桌面上最顺手的KVM虚拟机图形化管理工具配合SSH密钥ssh-key远程连接宿主机基本是我日常管理虚拟机的标准操作。这篇文章就围绕“virt-manager ssh-key 远程KVM”这套组合把从环境准备、密钥配置、libvirt服务端设置到virt-manager里添加远程连接、日常管理虚拟机的完整流程讲清楚顺带把我踩过的坑也一并列出来。不管是刚接触KVM的新手还是已经在用命令行管理虚拟机、想升级为图形化远程管理的老手这篇都能帮你少走弯路。1. 远程管理KVM为什么我最终选了virt-manager加ssh-key1.1 命令行之外的另一种姿势KVM本身是Linux内核的虚拟化模块管理方式有很多。平时运维中最直接的方式是ssh登录到宿主机用virsh命令来创建、启动、关闭虚拟机也能用virt-install装系统。但命令行的短板也很明显要看虚拟机画面得额外用virt-viewer而且命令行对参数记忆要求比较高像virsh attach-interface、virsh blockresize这种不常用的参数隔一段时间不用就得重新翻文档。virt-manager则把这一切平面化左侧是宿主机和虚拟机列表右侧能看到CPU、内存、磁盘的实时使用情况操作按钮一目了然就算记不住命令也能顺畅操作。对于手头有七八台宿主机、几十台虚拟机的环境图形界面带来的效率提升非常明显。1.2 密码登录和SSH密钥为什么最终选后者virt-manager连接远程KVM最常见的方式是使用libvirt的远程驱动连接字符串写成qemussh://root192.168.1.10/system。这个方案的本质是本机先通过SSH与远程宿主机建立一条安全通道然后再在这条通道上执行libvirt管理命令虚拟机相关的数据流都走这条加密链路。如果只用密码认证每次打开连接都要输入一次密码多台宿主机的情况下密码管理本身就是个麻烦事。更关键的是纯密码认证在自动化运维场景里几乎没法用脚本无法交互式输入密码也没法做无人值守。而ssh-key一旦配好virt-manager连接远程宿主机时是免密的双击连接就进去效率完全不一样。另外从安全角度看密钥认证本身比密码认证更难被暴力破解在公网环境下管理宿主机安全系数高一个档次。所以我个人一直坚持能上密钥就一定上密钥表面上多花了几分钟配置后面省下来的时间和精力完全值回票价。2. 动手前的环境准备与SSH密钥配置2.1 客户端和宿主机到底要装什么要跑通这套流程先确认两端环境。客户端指运行virt-manager的这台机器通常是个人电脑或办公用的Linux工作站。客户端需要装virt-manager和SSH客户端大多数Linux发行版直接通过包管理器安装即可。以Ubuntu为例sudo apt install virt-manager openssh-client如果是CentOS/RHEL系sudo yum install virt-manager openssh-clients宿主机端则要确保运行了libvirtd服务同时KVM内核模块已经加载。用下面命令快速自查systemctl status libvirtd ls /dev/kvm如果不巧/dev/kvm不存在说明KVM模块没加载或CPU虚拟化没开启这在物理服务器上比较少见但虚拟机嵌套虚拟化时偶尔会遇到。另一个细节是客户端的virt-manager版本和宿主机的libvirtd版本不必完全一致但建议都保持较新旧版本的远程管理兼容性有时候会遇到一些稀奇古怪的问题比如识别不了新版本的虚拟机配置格式。2.2 生成密钥对时的几个细节在客户端上生成密钥对我习惯用ed25519算法性能和安全性都优于传统RSAssh-keygen -t ed25519 -C 用于管理KVM宿主机一路回车即可会在~/.ssh/下生成id_ed25519私钥和id_ed25519.pub公钥。如果宿主机上的libvirtd或SSH服务版本较老只支持RSA密钥那就改用ssh-keygen -t rsa -b 4096 -C 用于管理KVM宿主机生成的时候如果不希望每次连接都输一遍私钥口令就不要设置passphrase但本机如果安全性要求高还是建议设置。这里有个容易忽略的细节私钥文件权限必须是600公钥是644SSH对私钥权限非常敏感权限不对会直接拒绝使用该密钥。检查权限ls -l ~/.ssh/2.3 把公钥分发到宿主机把公钥放到宿主机的authorized_keys文件里这一步可以借助ssh-copy-id完成。命令格式是ssh-copy-id -i ~/.ssh/id_ed25519.pub root192.168.1.10回车后会要求输入一次宿主机root的登录密码看到Number of key(s) added: 1就说明写入成功。如果宿主机上已经存在authorized_keys文件ssh-copy-id会以追加方式写入不会覆盖已有公钥。手动操作也可以把客户端公钥内容追加到宿主机/root/.ssh/authorized_keys但要注意目录权限.ssh目录必须是700authorized_keys文件必须是600。权限不对会直接导致密钥认证失效而且SSH日志里也不一定给出明确提示排查起来很费劲。验证一下ssh root192.168.1.10能直接免密登录说明密码这一关已经过了后面配置virt-manager才有意义。3. 宿主机libvirtd端的配置与安全考量3.1 理解qemussh这个连接字符串virt-manager添加远程连接时URI可以选择qemussh://用户名宿主机IP/system。这个URI不是随便填的它明确告诉virt-manager先通过SSH连到宿主机再以system模式调用libvirtd。这里的system模式对应root权限或通过libvirt管理全部虚拟机权限比较完整。还有一个容易混淆的写法qemussh://用户名宿主机IP/sessionsession模式只能管理该用户自己的虚拟机通常用于桌面级虚拟化测试服务器场景千万不要选这个。如果不小心选了session模式你会发现能连上宿主机但虚拟机列表是空的以为配置出了问题其实只是模式选错了。这个细节我见过不少人踩坑在这里先提个醒。3.2 libvirtd监听端口的取舍因为走的是SSH通道libvirtd本身不需要监听TCP端口默认只监听本机的unix socket就足够。打个比方你通过跳板机访问内网服务就不需要把内网服务直接暴露到公网SSH通道承担了所有转发和安全加密工作。所以默认情况下/etc/libvirt/libvirtd.conf里的listen_tcp参数完全不用动。如果你在网上看到某些教程让你开启listen_tcp1并开放16509端口那通常是用来做基于SASL的TCP远程访问配合ssh-key来用反而多此一举还增加了暴露面。我的原则一直是能走SSH就走SSH实际开放的网络端口越少越好尤其是在公网环境。3.3 别忘了SELinux和防火墙宿主机如果开启了SELinux要检查libvirt相关的布尔值是否正常。可以先执行getsebool -a | grep virt一般情况下纯本地管理时影响不大但遇到权限怪异的问题比如虚拟机创建后无法启动、磁盘镜像无法访问可以把SELinux临时设为Permissive做对照实验setenforce 0确认是SELinux导致后再针对性地调整布尔值。防火墙方面SSH默认走22端口确认宿主机防火墙放行即可如果SSH改到了其他端口virt-manager连接时要在URI里写明端口例如qemussh://root192.168.1.10:2222/system这个细节容易漏改过SSH默认端口的朋友尤其要留意。4. Virt-manager远程连接与虚拟机管理实操4.1 添加远程连接的完整步骤打开virt-manager菜单栏选择 File - Add Connection。界面里Hypervisor选择QEMU/KVM这里重点来了Connect to remote host over 这一项选择SSH然后在Hostname输入宿主机IP或域名Username填登录用户可以是root也可以是有相应权限的普通用户。填完后点击Connect测试。首次连接时virt-manager会弹出确认宿主机指纹的提示和ssh首次登录时的提示类似确认无误后点接受。如果生成密钥时设置了passphrase这里会提示输入。连接成功后左侧列表会出现宿主机名称以及它下面已有的虚拟机列表双击虚拟机可以直接打开图形控制台就像本地操作一样操作远程虚拟机这个功能在机房不在身边时尤其好用。4.2 日常管理启动、关闭、快照与克隆进入远程管理界面后能看到每台虚拟机的运行状态、CPU和内存占用、磁盘位置。常用的操作按钮都在顶栏启动、暂停、关闭、强制关闭。右键虚拟机菜单里有一个功能我很推荐就是创建快照。在给系统打补丁、更新内核、改关键配置之前拍个快照出问题一键回滚比什么后悔药都管用。虚拟机克隆也非常方便。比如要快速复制一台基础环境机器右键虚拟机选择Clone填个新名字virt-manager会用qcow2镜像的backing file机制实现快速克隆磁盘不会立刻占满两倍空间而是基于父镜像做差异存储。这在批量交付测试环境时极其高效。4.3 远程新建虚拟机装系统远程场景下新建虚拟机也一样能完成。点击宿主机一栏下方的“新建虚拟机”按钮可以选择本地ISO或网络安装源然后给虚拟机分配CPU、内存、磁盘。因为virt-manager底层调用的还是virt-install整个流程和本地创建虚拟机没有太大区别。唯一要留意的是ISO文件的位置。如果ISO在客户端本地virt-manager会自动处理上传到宿主机但大文件传输会比较慢如果ISO已经放在宿主机上就直接在路径里填写宿主机本地路径例如/data/iso/ubuntu-24.04-server-amd64.iso安装过程会快很多。这是远程创建虚拟机时最容易踩坑的地方很多新手第一次远程装系统卡在启动安装一大半时间根源就是ISO路径没选对。5. 实操中踩过的坑与排查思路5.1 常见错误场景速查表表格是最直观的排查方式我把自己遇到过的和帮朋友排查过的典型问题整理如下错误提示可能原因解决方法Permission denied (publickey)密钥没分发成功或权限不对重新执行ssh-copy-id检查宿主机authorized_keys和客户端私钥权限Host key verification failed宿主机系统重装或指纹变化编辑客户端~/.ssh/known_hosts删除宿主机对应旧记录Unable to connect to libvirtURI写错或SSH服务没启动检查URI格式确认宿主机systemctl status sshd正常连接成功但没有虚拟机显示使用了session模式而不是system模式连接URI改成qemussh://用户IP/system创建虚拟机时找不到ISO路径填写错误或ISO文件权限不足在宿主机确认ISO绝对路径chmod 644调整权限打开控制台黑屏VNC显示驱动或客户端网络受限检查虚拟机显示协议是否配置为VNC或SPICE确认防火墙放行端口5.2 那些容易忽略的权限细节很多远程连接失败根源不在libvirt而在SSH。比如用普通用户连接宿主机但该用户的.ssh/authorized_keys没配置好又比如宿主机sshd配置了AllowUsers限制用户不在允许列表里连接照样失败。遇到这种情况可以在客户端执行ssh -v root宿主机IP查看详细认证过程通常能看到卡在哪一步。如果客户端有几个SSH密钥要确认连接时用的是不是对的那把。我一般会在~/.ssh/config里为每台宿主机单独指定IdentityFile避免密钥混用。另外客户端私钥如果因为某些原因权限变成了666SSH会直接忽略它这时ls -l ~/.ssh/排查最直接。再者就是用户选择问题。用root连接最稳可以避免后续libvirt各种权限限制但生产服务器一般不建议直接允许root SSH登录折中方案是创建一个具备sudo权限的管理用户并在宿主机上给libvirt的unix socket组放开读写权限。不过这样配置会复杂一些如果纯粹是内部测试环境root直连也没问题看你的安全策略。5.3 提升远程管理体验的几个小技巧一是给SSH配置起别名。在客户端~/.ssh/config里维护多台宿主机信息非常简单清爽Host kvm1 HostName 192.168.1.10 User root IdentityFile ~/.ssh/id_ed25519这样virt-manager里Hostname直接填kvm1就行比记一长串IP和用户名舒服多了。二是批量操作时配合virsh。virt-manager适合人工查看和操作但几十台机器做同样的操作比如批量启动、批量查看内存分配还是脚本加virsh更快。virt-manager和virsh不是二选一而是互补。三是多宿主机统一管理。在virt-manager里把项目相关的宿主机全部添加成连接左侧列表会按宿主机分组虚拟机一目了然。几台宿主机之间做虚拟机迁移时可以直接在virt-manager里拖动或右键迁移不用单独记住迁移命令。四是定期升级。virt-manager、libvirt、qemu这些软件包更新节奏不算慢我遇到过几次莫名其妙的问题比如虚拟机列表加载卡住、控制台花屏升级到新版本后就好了。尤其是换了新发行版大版本之后库的兼容性会有变化及时跟进版本能省掉很多玄学问题。最后说点个人体会。我一开始图省事直接用密码连接后来宿主机多了以后密码管理越来越痛苦每次输密码在当时的网络环境下延迟特别明显。花十几分钟把ssh-key配到所有宿主机上后整个管理体验完全上了一个台阶。如果你也在用virt-manager管理多台KVM主机我强烈建议先把密钥这套配好后面省下的时间和精力会让你觉得这笔前期投入非常划算。
返回列表