Реанимация серверов Ubuntu на Hetzner или немного полезных команд

  • Tutorial


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

Упоминания hetzner носят исключительно мимолетный характер, в силу того, что часто приходится пользоваться его услугами.

Resсue, монтирование разделов, chroot


Итак, начнем с того, что никакого доступа к системе у нас нет, после, к примеру, очередной перезагрузки. Поэтому у нас остается два варианта — переустановить систему или восстановить её. В случае с VPS хецнер просто накатит новую систему и, естественно, что на диске ничего не останется. Поэтому мы, безусловно, выбираем восстановление.
Кому интересно, для переустановки из rescue используется команда:
installimage




После этого hetzner покажет сгенерированный пароль. Перегружаем из админки сервер и коннектимся, лучше через IP адресс по ssh, ssh root@55.22.33.44
Логин, естественно, root.

После залогинивания нас встречает приглашение такого рода root@rescue chroot цвет поменяется на синий root@rescue

Первое, что мы делаем — смотрим название наших дисков:
ls /dev/[hsv]d[a-z]*[0-9]*
 # самый распространенный пример вывода: /dev/sda /dev/sda1 /dev/sda2 /dev/sda3


Затем монтируем диск с нашей системой:
mount /dev/sda3 /mnt

Разделы /boot и прочие пока не трогаем. После того как подмонтировали, нам надо сделать видимым содержимое /dev /sys /proc иначе, если мы остались без ядра, то оно не поставится.
mount --bind /dev /mnt/dev/; mount --bind /proc /mnt/proc/; mount --bind /sys /mnt/sys/

в debian есть удобная команда, заменяющая эту строчку, в ubuntu она обнаружена не была.
chroot-prepare /mnt

После этого:
chroot /mnt;

Теперь можно домонтировать все остальное: /boot
mount -a

На этом этапе мы имеем, в принципе, более менее подконтрольную нам недавно упавшую систему.

Диагностика


Чаще все приходится сталкиваться с проблемами обновления или установки. Тут, конечно, детализировать что-то сложно — можно только посоветовать, если обновляется дистрибутив, делать это через screen
Например:
screen -S upgrade
apt-get update
apt-get dist-upgrade
do-release-upgrade

Причина одной из самых распространенных проблем — банальная нехватка места на диске
df -h

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

Безопасность

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

Посмотреть кто какие команды вводил:
last

Глянуть на историю
history

Конечно, это все полумеры, но тем не менее.
Далее нужно:
  • Проверить /root/.ssh чтобы там не было левых сертификатов.
  • Посмотреть в /etc/passwd чтобы кроме root ни у кого не было полномочий.
  • nmap чтобы не было подозрительных открытых портов, а если есть, то убеждаемся, что никто подозрительный их не слушает.
  • Меняем на всякий случай пароль root c помощью passwd.
  • Польза от изучения логов в /var/log бывает неоценима .
  • Проверяем систему на руткиты


Обновление и установка:
apt-get install rkhunter
rkhunter --update

Поиск руткитов:
rkhunter -c -sk

Warnin-гов он, скорее всего, найдет много, особенно в /bin и /usr/bin
Еще есть альтернативный вариант:
Установка chkrootkit:
apt-get install chkrootkit

Поиск руткитов:
chkrootkit


Восстановление


Рассмотрим худший вариант, когда в папке /boot вообще пусто и в системе grub не стоит, ядра нет и большая часть пакетов битая.

Восстановление системы


Чистим архив пакетов
apt-get clean

Удаляем не удалённые зависимости от уже удалённых пакетов
apt-get autoremove


Ставим grub2:
apt-get install grub2

Записываем grub в MBR
grub-install /dev/sda

Устанавливаем или переустанавливаем нормальное ядро.
apt-get install linux-image-x.x.x-xx-generic --reinstall

Обновляем меню grub
update-grub


Выполняем команды, предназначенные для разрешения конфликтов зависимостей:
apt-get install -f

dpkg --configure -a


Переустанавливаем все пакеты:
apt-get install --reinstall `dpkg --get-selections | grep -v deinstall | awk '{print $1}'`


Если известно в чем была проблема, то достаточно переустановить нужный пакет:
apt-get install {имя_пакета}  --reinstall


В конце можно еще раз выполнить:
apt-get install -f
dpkg --configure -a


Заключение


Предварительно выйдя из chroot c помощью Ctrl+D или exit делаем:
reboot


Смотрим, что вышло. Если проблема осталась, то все по новой и смотрим, что мы упустили, как можно больше внимания уделяя /var/log.

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

Полезные ссылки:

wiki Hetzner Rescue System
ubuntu wiki восстановления grub
screen

Комментарии 13

    +6
    неплохая статья для начального уровня. я сам к подобному же сценарию пришёл когда умер диск в рейде, а на втором оказалась не прописана загрузочная запись.
    Но как то плохо структурирована что ли. свои WTF убрал под спойлер
    А теперь некоторые уточнения (я бы сказал - существенные) и WTFки всякие:
    если обновляется дистрибутив, делать это через screen

    ИМХО лучше через tmux — он более допиленный и имеет более богатый функционал (не для холивара, кому нравится скрин — работайте в нём)

    первым делом нужно глянуть кто сейчас на сервере:

    после перезагрузки? в resque?

    в debian есть удобная команда, заменяющая эту строчку, в ubuntu она обнаружена не была. chroot-prepare /mnt

    специально загрузил один из серверов в resque
    root@rescue ~ # lsb_release -a No LSB modules are available. Distributor ID: Debian Description: Debian GNU/Linux 7.6 (wheezy) Release: 7.6 Codename: wheezy
    там чистый Дебиан!
    Вообще непонятно почему статья называется про Бубунту? и постоянно идет сравнение с какой то мифической Бубунтой? Так можно восстанавливать все Linux сервера в Хетцнере. У меня Центосы и всё аналогично при восстановительных вопросах. После chroot уже работаем так как привыкли в своей системе.

    Предварительно выйдя из chroot c помощью Ctrl+D или exit делаем: reboot

    А я бы ещё сделал: umount /mnt
    А то перезагрузка может быть дольше обычного. Вы же монтируете системные разделы в mnt — перед перезагрузкой ядро будет их пытаться отмонтировать до таймаута т.к. не сможет это сделать — натыкался на это много раз.

    и насчёт пустого радела boot напрашивается вопрос — а вы его подмонтировали?
    у меня он на отдельном разделе, поэтому сначала монтируем корень в /mnt, потом boot в /mnt/boot

    в общем и целом статья как справка пойдёт ))
      0
      зачем nmap когда можно сказать netstat -npl и увилить кто какой порт слушает, прям с pid?
        0
        я обычно смотрю
        netstat -tunap | grep LISTEN
          0
          зачем делать grep если можно добавить ключ l?
            +1
            потом можно грепать ещё что нибудь, изменив только, что грепать
            уже автоматом грепы пишутся — привык, спасибо за подсказку нужно память по ману освежить.
            netstat -tulpan — ещё легче запомнить ))
            0
            простите за оффтопик (в конткесте статьи, но не коммента), а можно еще вот так:
            netstat -vnepal
            

            тут как бы запомнить просто — в Непал. ну вы поняли.
              +1
              netstat -vpenal
              В пенал. Ну, вы поняли. :)
        0
        Еще важная тема не забыть локаль консоли сервера поменять, а то подключите потом LARA и будете удивляться почему печатает какую-то ересь :)
          0
          Раз уж упомянули о LARA — это такой KVM, если кто-то вдруг не в курсе, то стоит упомянуть и о некоторых особенностях Hetzner.
          Проблемы с зависаниями, перезагрузками и тп часто возникают из-за железа и увидеть проблемы можно только в LARA, ну например что kernel panic или вообще даже до этого не дошло, тк на экране веселые картинки из-за битой памяти. Если есть подозрения на память и тд, то тут в помощь memtester или md5sum от больших файлов, размером 2 RAM. Диски вообще больное место Hetzner и для этого есть smartctl — на хабре и не только полно примеров, как тестить и отсылать жалобы на битые винты.

          Про взлом — последний мой опыт показал, что полагаться на rkhuner и chkrootkit не стоит и лишь старый добрый clamav нашел Elknot на серверах. Пользуясь случаем напомню, что монтировать /tmp надо с noexec как минимум.
            +1
            memtest может ничего и не найти. Рекомендую использовать netconsole и kdump.
            Кстати, LARA у хетцнера – отвратнейшая.
            0
            Самое главное забыли рассказать: про диагностику и пересборку рейда
              0
              Доброго времени суток, коллеги.
              Возникла проблема при переносе сервера на виртуалку Hetzner. Стоит Ubuntu 12.04
              Загрузился в Rescue, разметил партиции (MBR, не GPT), перенёс образы дисков посредством partclone.
              Примонтировался, chroot, обновился, установил grub. Вот тут и начались танцы. После того, как grub передавал бразды правления системе, она совершенно не видела диск. Далее идут два дня жестокого ххх-видео. А дело вот в чем:
              «Dear Client,
              as the kernel of 12.04 is too old for virtio-scsi you need to enable the HWE for Ubuntu 12.04:
              wiki.ubuntu.com/Kernel/LTSEnablementStack
              If you want to use the old kernel we also can change the disk driver to virtio. This should work with the Ubuntu 12.04 kernel.»
              Так что sudo apt-get install --install-recommends linux-generic-lts-trusty
                0
                Возможно ли через rescue скачать и загрузиться в live iso?
                Например, использовал ли кто-нибудь R1Soft? Там восстановление систеы идёт через Live CD в виде iso образа.

                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.