KVM机器没有启动ssh,网络已启动,用来工作

KVM机器没有启动ssh,网络已启动,用来工作

在过去的 6 个小时里,我一直在搜索并努力解决问题。我有一台虚拟机,在过去的六个月里运行良好。我很高兴能通过 ssh 进入它,它正在运行一个数据库和一些小应用程序。今晚 ssh 停止工作,所以我决定重启机器。我现在有以下情况:

  • virsh 列表 --所有状态机正在运行
  • 我可以 ping 机器并得到回复
  • 当我通过 ssh 连接到机器时,我看到“ssh:连接到主机 [myserver] 端口 22:连接被拒绝”
  • nmap 未显示端口 22 已打开

我尝试过: - 再次重启机器(没有成功) - 挂载文件系统并检查 /etc/ssh/sshd.conf(自工作情况以来没有改变) - 安装 virsh 控制台,但这似乎不起作用

当我使用 losetup 直接挂载 fs 时,奇怪的是文件日期似乎在崩溃时冻结在 /var/log/ 中。如果我查看 /var/run/,我可以看到 sshd.pid,但时间是 6 小时前(以及多次重启)。

我的 virsh xml 如下所示:

<domain type='kvm' id='21'>
  <name>myserver</name>
  <uuid>09678c8d-a99b-1d18-a7af-88d027cc8f93</uuid>
  <memory>1048576</memory>
  <currentMemory>1048576</currentMemory>
  <vcpu>1</vcpu>
  <os>
    <type arch='x86_64' machine='pc-1.0'>hvm</type>
    <boot dev='hd'/>
  </os>
  <features>
    <acpi/>
  </features>
  <clock offset='utc'/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>destroy</on_crash>
  <devices>
    <emulator>/usr/bin/kvm</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='raw'/>
      <source file='/dev/disk01/myserver'/>
      <target dev='hda' bus='ide'/>
      <alias name='ide0-0-0'/>
      <address type='drive' controller='0' bus='0' unit='0'/>
    </disk>
    <controller type='ide' index='0'>
      <alias name='ide0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
    </controller>
    <interface type='bridge'>
      <mac address='52:54:00:e3:13:86'/>
      <source bridge='br0'/>
      <target dev='vnet0'/>
      <model type='virtio'/>
      <alias name='net0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>
    <serial type='pty'>
      <source path='/dev/pts/1'/>
      <target port='0'/>
      <alias name='serial0'/>
    </serial>
    <console type='pty' tty='/dev/pts/1'>
      <source path='/dev/pts/1'/>
      <target type='serial' port='0'/>
      <alias name='serial0'/>
    </console>
    <input type='mouse' bus='ps2'/>
    <graphics type='vnc' port='5900' autoport='yes' listen='127.0.0.1'>
      <listen type='address' address='127.0.0.1'/>
    </graphics>
    <video>
      <model type='cirrus' vram='9216' heads='1'/>
      <alias name='video0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
    </video>
    <memballoon model='virtio'>
      <alias name='balloon0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
    </memballoon>
  </devices>
  <seclabel type='dynamic' model='apparmor' relabel='yes'>
    <label>libvirt-09678c8d-a99b-1d18-a7af-88d027cc8f93</label>
    <imagelabel>libvirt-09678c8d-a99b-1d18-a7af-88d027cc8f93</imagelabel>
  </seclabel>
</domain>

我有点不知道该去哪里才能让机器重新启动并运行。

在同一个 kvm 实例上,我运行着另一台运行良好的服务器。两者都是 Ubuntu 12.04。

欢迎一切帮助....

答案1

我想自己回答一下,希望 Google 能将其编入索引,这样有一天有人可能会发现它很有用。当然,我不能保证,而且我对任何后果概不负责。这将是一个很长的回答。

情况:我有一台 Ubuntu 12.04 LTS 服务器(M 代表 master),运行两个虚拟服务器(V1 和 V2),两个虚拟服务器也都是 Ubuntu 12.04 LTS。在主机上我有三个 IP 地址,因此每台机器都可以通过自己的公共 IP 进行访问。服务器安装在 LVM 基础上。

昨天,其中一个虚拟服务器停止接受 SSH 连接。此外,我无法再连接到其上运行的数据库。当我调查时,我发现:

  • 机器可以 ping 通
  • ssh 会导致连接被拒绝
  • 来自另一台服务器的 nmap -sS 显示开放端口,但不是 22
  • virsh list --all 显示机器正在运行
  • 我没有安装控制台(串行)(懒,是的,我知道)
  • 另一台虚拟服务器和主服务器运行正常

我的第一反应是关闭机器的电源,也许某些进程卡住了(服务器上运行着一些自己的软件),所以我这样做了:

  • virsh 销毁 virtual2
  • virsh 启动 virtual2

这导致了完全相同的状态:

  • virsh 报告 virtual2 正在运行
  • virtual2 可以 ping 通
  • ssh 仍然连接被拒绝

好吧,所以还有别的问题。这时我开始有点担心我的服务器可能被入侵了,但我根本无法访问它。当 nmap -sS -v -v 没有显示任何奇怪的开放端口时,我的担心稍微少了一点,但谁也不知道。

现在我的作战计划变成了两个主要目标:

  • 似乎服务器正在启动,但由于某种原因,ssh 和其他进程尚未启动
  • 我需要控制台访问权限才能查看发生了什么

为了获得控制台访问权限,我发现我需要进行两项更改:

  • 在虚拟机上安装串行控制台
  • 对主服务器上虚拟机的 XML 进行更改

但问题是,大多数这些网站都假设有一个正在运行且可访问的服务器,而我却没有。所以我首先需要找到一种方法来访问 LVM。同样,有很多教程,但它们似乎都适用于我想要挂载文件系统的地方。它会不断失败,并显示“挂载:您必须指定文件系统类型”。即使使用 -t 指定文件系统也无法解决这个问题。

我终于偶然发现了这个网站:http://blog.leenix.co.uk/2010/07/howto-mount-kvmxen-virtual-disk-image.html。也许我的 kpartx 问题在于我的 LVM 包含三个分区(boot、/ 和 var)。

我安装逻辑卷的步骤:

  • 使用以下命令列出 LVM:lvs

     LV        VG     Attr   LSize   Origin Snap%  Move Log Copy%  Convert
     OS        disk01 -wi-ao  18.62g                                      
     virtual1  disk01 -wi-ao  20.00g                                      
     virtual2  disk01 -wi-ao  30.00g                                      
     swap      disk01 -wi-ao 952.00m 
    
  • 列出 LVM 中的分区: fdisk -l /dev/disk01/virtual2

    Disk /dev/disk01/virtual2: 32.2 GB, 32212254720 bytes
    4 heads, 32 sectors/track, 491520 cylinders, total 62914560 sectors
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk identifier: 0x00064ee2
    
    Device Boot                         Start         End      Blocks   Id  System
    /dev/disk01/virtual21               63    15623046     7811492   83  Linux
    /dev/disk01/virtual22         15624192    19529727     1952768   82  Linux swap / Solaris
    /dev/disk01/virtusl23         19529728    58591231    19530752   83  Linux
    
  • 这给了我能够安装分区的起始扇区。

  • 创建挂载目录:mkdir /mnt/tempfs

  • 现在我可以使用以下命令挂载这两个分区:

    losetup -o32256 /dev/loop0 /dev/disk01/virtual2
    or
    losetup -o9999220736 /dev/loop0 /dev/disk01/virtual2
    

如果您的起始块不同,您可以通过将起始位置(第一个分区为 63,第三个分区为 19529728)乘以 fdisk -l 输出中报告的扇区大小来计算偏移量(-o 选项)。

  • 现在我可以挂载分区: mount /dev/loop0 /mnt/tempfs/

  • 我现在可以访问我的文件了。后来我发现还有一个名为 guestfish 的工具。您可以使用它通过发出以下命令来访问文件:guestfish -d virtual2 -i。如果您想要只读访问权限,请在末尾添加 --ro)。

  • 为了将分区恢复到我可以放心启动虚拟机的状态,我发出了以下命令:

    umount /mnt/tempfs
    losetup -d /dev/loop0 
    

因此,首先我想看看我的服务器是否真的受到了损害,因此我安装了两个分区(一次一个)并且:

  • find /mnt/tempfs -ctime 0 -type f (查看过去 24 小时内哪些文件发生了变化)
  • 查看日志文件和 .bash_history 文件

幸运的是,这并没有显示任何奇怪的事情,所以我开始认为启动过程中出了问题。奇怪的是,没有任何日志文件在启动时真正更新,所以我无法从中获取任何信息。我​​需要控制台访问。

同样,有很多关于获取控制台访问权限的教程,所有教程看起来都相对简单,就像这篇文章一样: http://ubuntuforums.org/showthread.php?t=1159220

在第 7 篇文章中,nullzone 描述了一种相当简单的设置方法。所以我开始着手:

  • 停止虚拟机
  • 安装驱动器
  • 在 etc/init/ttyS0.conf 中创建了一个文件,其中包含建议的参数
  • 根据建议更改了我的 xml
  • 重新加载 libvert-bin
  • 启动了我的虚拟机
  • 启动控制台

在“转义字符是 ^]”之后,它会不断卡住。我没有得到任何输出,也没有对任何键做出任何响应。然后我尝试了各种串行速度组合、不同的 /dev/pts/ 设备,但都不起作用。

然后我终于意识到我还有另一台仍在运行且具有 ssh 访问权限的服务器。我对该机器的 XML 进行了相同的更改,并添加了 /etc/init/ttyS0.conf。在这台机器上,我只需发出“sudo ttyS0 start”即可重新加载 ttyS0。

返回 virsh,重新加载 libvert-bin,销毁服务器,启动服务器,控制台 virtual1 和完全相同。转义字符后卡住了。幸运的是,我可以检查这台机器上的日志文件,并注意到 /var/log/auth.log 中有一个错误:“Nov 22 03:46:11 virtual1 getty[1272]: /dev/–L: 没有这样的文件或目录”。似乎 getty 不接受命令行参数,所以我尝试了一下,最后发现我的 /etc/init/ttyS0.conf 需要如下所示:

# ttyS0 - getty
#
# This service maintains a getty on ttyS0 from the point the system is
# started until it is shut down again.

start on stopped rc RUNLEVEL=[2345]
stop on run­level [!2345]

respawn
exec /sbin/getty -L ttyS0 9600 vt102

因此需要切换串行设备和速度。现在我重新加载了所有内容,获得了对虚拟 1 服务器的控制台访问权限,但仍然无法访问虚拟 2 服务器。

这时我几乎抓狂了,已经是凌晨 4 点了。我突然意识到,也许机器没有进入实际加载 /etc/init/ttyS0.conf 文件的状态。进一步的研究表明,还可以更改 /boot/grub/menu.lst 文件并向 grub 添加控制台输出:

title           Ubuntu 12.04 LTS, kernel 3.2.0-24-virtual
uuid            ba4c41ed-30b6-4a80-808d-64fe26ad7e17
kernel          /boot/vmlinuz-3.2.0-24-virtual root=UUID=ba4c41ed-30b6-4a80-808d-64fe26ad7e17 ro console=ttyS0,9600 earlyprint=serial,ttyS0,9600
initrd          /boot/initrd.img-3.2.0-24-virtual

重新加载并重新启动所有程序后,我终于得到了控制台输出以及启动过程。原来是无法进行 NFS 挂载。幸运的是,Ubuntu 非常聪明,它会暂停启动并开始等待用户输入。因此,机器可以 ping 通(网络已启动),但它永远不会完成启动过程,因此 SSH 不会启动等等。

答案很长,但我希望有一天有人可以比我更快地解决这些问题,然后睡个好觉。

相关内容