禁用SSH端口后访问KVM虚拟机并开启SSH的可行方案咨询
禁用SSH端口后访问KVM虚拟机并开启SSH的可行方案咨询
别急,这种卡壳的情况我之前也碰到过,其实还有不少办法能搞定,给你整理几个最实用的方案:
方案一:直接挂载虚拟机磁盘修改系统配置
这是最直接的思路——既然进不了虚拟机,那就把它的磁盘“拆”出来拿到宿主机上改配置,步骤如下:
- 先把目标虚拟机关掉:
virsh shutdown <你的虚拟机名称> - 查一下虚拟机的磁盘路径:
virsh domblklist <你的虚拟机名称>,一般输出里会显示类似/var/lib/libvirt/images/xxx.qcow2的路径 - 在宿主机上创建一个临时挂载目录:
mkdir /tmp/vm_mount - 加载nbd模块并挂载磁盘:
modprobe nbd qemu-nbd -c /dev/nbd0 /var/lib/libvirt/images/xxx.qcow2 - 查看磁盘分区,找到根分区(通常是/dev/nbd0p1):
fdisk -l /dev/nbd0 - 挂载根分区到临时目录:
mount /dev/nbd0p1 /tmp/vm_mount - 现在就可以修改虚拟机里的配置了:
- 开启SSH服务开机自启:
systemctl enable sshd --root=/tmp/vm_mount(适用于systemd系统) - 编辑SSH配置文件
/tmp/vm_mount/etc/ssh/sshd_config,确保Port 22(或者你指定的端口)没有被注释,根据需要开启密码登录(把PasswordAuthentication no改成yes,如果被注释就去掉#) - 顺便配置virsh console(避免以后再碰到类似问题):编辑
/tmp/vm_mount/etc/default/grub,在GRUB_CMDLINE_LINUX的参数里加上console=ttyS0,然后更新grub配置:- CentOS/RHEL系:
grub2-mkconfig -o /tmp/vm_mount/boot/grub2/grub.cfg - Debian/Ubuntu系:
update-grub --root=/tmp/vm_mount
- CentOS/RHEL系:
- 开启SSH服务开机自启:
- 操作完后卸载磁盘,避免损坏:
umount /tmp/vm_mount qemu-nbd -d /dev/nbd0 rmmod nbd - 启动虚拟机:
virsh start <你的虚拟机名称>,现在应该就能用SSH连接了
方案二:用virt-customize工具一键修改(更简便)
如果你的宿主机装了libvirt-client或virt-customize工具,这个方法更省心,不用手动挂载磁盘:
- 先关闭虚拟机:
virsh shutdown <你的虚拟机名称> - 执行以下命令修改配置:
- 开启SSH自启:
virt-customize -d <你的虚拟机名称> --run-command 'systemctl enable sshd' - 开启SSH端口(以22为例):
virt-customize -d <你的虚拟机名称> --edit /etc/ssh/sshd_config:s/^#Port 22/Port 22/ - 允许密码登录(如果需要):
virt-customize -d <你的虚拟机名称> --edit /etc/ssh/sshd_config:s/^#PasswordAuthentication no/PasswordAuthentication yes/ - 配置console支持:
virt-customize -d <你的虚拟机名称> --edit /etc/default/grub:s/GRUB_CMDLINE_LINUX="\(.*\)"/GRUB_CMDLINE_LINUX="\1 console=ttyS0"/ virt-customize -d <你的虚拟机名称> --run-command 'grub2-mkconfig -o /boot/grub2/grub.cfg'
- 开启SSH自启:
- 启动虚拟机后,SSH和virsh console应该都能正常使用了
注意事项
- 操作前最好备份虚拟机磁盘文件,比如
cp /var/lib/libvirt/images/xxx.qcow2 /var/lib/libvirt/images/xxx.qcow2.bak,避免误操作导致数据丢失 - 如果虚拟机是运行状态,尽量先关机再操作,强行挂载运行中的磁盘可能会损坏文件系统
备注:内容来源于stack exchange,提问作者Elvin Jafarov
相关产品推荐
相关产品推荐

