1

в течение последних 6 часов я искал информацию. У меня есть виртуальная машина, которая работает нормально в течение последних шести месяцев. Я был счастлив ssh'ing в это, и это управляло базой данных и некоторыми небольшими приложениями. Сегодня вечером ssh перестал работать, поэтому я решил перезагрузить машину. У меня сейчас следующая ситуация:

  • список virsh - все состояния машины работают
  • Я могу пинговать машину и получить ответ
  • Когда я ssh к машине, я вижу «ssh: connect to host [myserver] порт 22: Соединение отказано»
  • Nmap не показывает порт 22 как открытый

Я попытался:- перезагрузить компьютер еще раз (не повезло)- смонтировать файловую систему и проверить /etc/ssh/sshd.conf (не изменился с рабочей ситуации)- установить консоль virsh, однако это не похоже на работу

Когда я монтирую fs напрямую с помощью losttup, странно то, что даты файлов кажутся замороженными в /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 ответ1

0

Я думал, что отвечу сам в надежде, что Google индексирует это, и кто-то может найти это полезным однажды. Конечно, никаких гарантий, и я не несу ответственности за любые последствия. Это будет длинный ответ.

Ситуация: У меня есть сервер Ubuntu 12.04 LTS (M для мастера), на котором запущены два виртуальных сервера (V1 и V2), оба Ubuntu 12.04 LTS. На хост-машине у меня есть три IP-адреса, поэтому к каждой машине можно получить доступ через собственный публичный IP-адрес. Серверы установлены на основе LVM.

Вчера один из виртуальных серверов прекратил принимать SSH-соединения. Также я не смог подключиться к работающей на нем базе данных. Когда я исследовал, я обнаружил:

  • машина была пинговой
  • SSH приведет к отказу в соединении
  • Nmap -sS с другого сервера показал открытые порты, но не 22
  • список virsh - все показали, что машина работает
  • У меня не было консоли (серийной), установленной (ленивый, да, да, я знаю)
  • Другой виртуальный сервер и главный сервер работали нормально

Моим первым инстинктом было отключение питания компьютера, возможно, какой-то процесс застрял (у меня на сервере работает какое-то собственное программное обеспечение), поэтому я сделал:

  • virsh разрушить virtual2
  • virsh start virtual2

Это привело к тому же статусу:

  • virsh сообщает, что virtual2 работает
  • Virtual2 является пингующим
  • SSH еще соединение отказано

Ок, так что-то другое дело. В это время я начал немного беспокоиться о том, что мой сервер мог быть взломан, однако я вообще не мог получить к нему доступ. Я был немного менее обеспокоен, когда nmap -sS -v -v не показывал странных открытых портов, но никто не знает.

Теперь мой боевой план изменился на две основные цели:

  • Кажется, сервер загружается, но по тем или иным причинам ssh и другие процессы не запускаются.
  • Мне нужен консольный доступ, чтобы увидеть, что происходит

Чтобы получить консольный доступ, я обнаружил, что мне нужно сделать два изменения:

  • установить последовательную консоль на виртуальной машине
  • внести изменения в XML виртуальной машины на мастере

Проблема, однако, заключалась в том, что большинство этих сайтов используют работающий и доступный сервер, чего у меня не было. Поэтому мне сначала нужно было найти способ получить доступ к LVM. Опять же, есть много учебных пособий, однако все они, казалось, работали вплоть до того места, где я хотел смонтировать файловую систему. Он будет постоянно терпеть неудачу с «mount: вы должны указать тип файловой системы». Даже указание файловой системы с -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
    

Если ваши стартовые блоки отличаются, вы можете рассчитать offste (опция -o), умножив начальную позицию (63 для первого раздела и 19529728 для третьего) на размер сектора, указанный в выводе fdisk -l.

  • Теперь я могу смонтировать раздел: 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
  • запустил мою виртуальную машину
  • запустил консоль

Это будет постоянно зависать после 'Escape персонажа ^]'. У меня нет вывода и нет ответа на любой ключ. Затем я попробовал различные комбинации последовательных скоростей, разные / dev / pts / devices, ничего не получалось.

Затем, наконец, меня осенило, у меня был еще один сервер, который все еще работал и имел доступ по SSH. Я сделал то же самое изменение в XML для этой машины и добавил /etc/init/ttyS0.conf. На этой машине я мог бы просто перезагрузить ttyS0 с помощью команды sudo ttyS0 start.

Вернуться к virsh, перезагрузил libvert-bin, уничтожил сервер, запустил сервер, консоль virtual1 и точно так же. Застрял после побега персонажа. К счастью, я смог проверить файлы журнала на этом компьютере и заметил ошибку в /var/log/auth.log: «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

Таким образом, последовательное устройство и скорость должны быть переключены на месте. Когда я теперь перезагрузил все, я получил консольный доступ к серверу virtual1, но все еще не к серверу virtual2.

К этому времени я уже почти вырывал свои волосы, и было 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 настолько умен, что затем останавливает загрузку и начинает ждать ввода от пользователя. Следовательно, машина может быть проверена (сеть запущена), но она никогда не завершает процесс загрузки, поэтому SSH не запускается и так далее.

Довольно длинный ответ, но я надеюсь, что, может быть, кто-нибудь когда-нибудь сможет решить эти проблемы быстрее, чем я, и просто хорошо выспаться.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .