Я думал, что отвечу сам в надежде, что 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 runlevel [!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 не запускается и так далее.
Довольно длинный ответ, но я надеюсь, что, может быть, кто-нибудь когда-нибудь сможет решить эти проблемы быстрее, чем я, и просто хорошо выспаться.