Закончился наш конкурс «как починить сломанный VPS на Linux». Задачей участников было починить «сломанный» VPS сервер на linux. C задачей смогли справиться лишь двое участников конкурса. Победитель справился с задачей за 17 часов.

» Участник с почтой farst***@gmail.com получает главный приз — VPS-сервер (5x2.6ГГц, 5 ГБ RAM, 50 ГБ SSD) на год.
» Участник с почтой non7*****@gmail.com занимает второе место — ему мы даём пожизненную скидку в 70% на виртуальные сервера RUVDS и нашу фирменную кружку. Ну а решение под катом.



Всем остальным участникам конкурса мы дарим скидку 10% на виртуальные сервера от RUVDS. Чтобы получить скидку напишите письмо на support@ruvds.com укажите свой логин.

Итак, выкладываем решение задачи.

Решение


1. Используем аварийный режим, подключаемся под пользователем administrator.

2. Монтируем root fs с правами на запись (файловая система монтируется в таком режиме, так как файл /etc/fstab был переименован в /etc/fstab_backup

sudo mount -o remount,rw /dev/sda3 /
sudo mv /etc/fstab_backup /etc/fstab

3. Разрешаем входящие подключения на 80 и 22 порты:

sudo ufw allow 80
sudo ufw allow 22

4. Отключаем swap:

sudo swapoff -a

В fstab комментируем соотвествующую строку:

sudo vim /etc/fstab
#UUID=1dc65039-4ac4-xxxxx-xxx-4xxxxf96xxxx none            swap    sw              0       0

5. Форматируем swap в xfs (или в любую другую файловую систему), например используя утилиту mkfs -t xfs

6. Удаляем ненужное из текущей инсталляции для того, чтобы её можно было скопировать на раздел /dev/sda2

sudo apt-get autoremove
sudo apt-get remove name-of-package --purge #для ненужных пакетов
sudo rm -rf /var/log
sudo rm -rf /tmp/*

7. Монтируем /dev/sda2 в /mnt и копируем необходимые файлы из корневого раздела и файлы конкурса.

sudo mount /dev/sda2 /mnt
cp -dpRx / /mnt

8. Получаем uuid /dev/sda2:

sudo blkid /dev/sda2

9. Указываем новое значение для root, обновляем uuid в /etc/grub/grub.cfg

10. Загружаемся под новым корневым разделом

shutdown -r now

11. Удаляем (xfs не поддерживает shrink) раздел /dev/sda3 и разбиваем его на 2 (/dev/sda3 и /dev/sda4) в соответствии с условиями задачи. Это можно сделать с помощью fdisk.

12. Форматируем новые разделы в xfs (утилита mkfs -t xfs)

13. Монтируем раздел /dev/sda3 и копируем туда файлы необходимые файлы корневого раздела.

14. Монтируем раздел /dev/sda4 и копируем туда файлы конкурса

15. Снова правим /etc/grub/grub.cfg и прописываем там новый uuid (нового раздела /dev/sda3) и устройство.

16. Правим fstab и перезагружаемся.

17. Помечаем раздел /dev/sda2 снова в качестве swap (раскомментируем запись в fstab, устанавливаем идентификатор swap через fdisk и выполняем swapon)

18. Перезагружаем ваш VPS, настраиваем сайт в nginx и открываем браузер, и видим наш сайт, задача решена:

Поделиться с друзьями
-->

Комментарии (23)


  1. TaHKucT
    23.08.2016 19:19
    +12

    очень интересно читать варианты починки, не видя изначального задания.


    1. Ghool
      23.08.2016 19:24
      +1

      Точно!
      С него надо было начать этот пост (после шапки)
      Или хоть со ссылки на него.


      1. suicidesquad
        24.08.2016 10:06

        Слово задача в самом начале и есть ссылкой


        1. TaHKucT
          24.08.2016 12:20

          Ее туда добавили не сразу


    1. ruvds
      23.08.2016 20:37

      Спасибо за комментарий, добавили ссылку на задачу


  1. AleksandrFox
    23.08.2016 20:29

    Может задание было что-то вроде: сайт упал, никто ничего не трогал, оно само. Ну и дальше расследование %)


  1. rockin
    23.08.2016 20:57
    +1

    Вывод из сей басни таков — пользуйтесь, господа, бекапами!
    Создавайте заблаговременно, автоматически, храните более, чем в одном хранилище
    И периодически проверяйте бекапы на корректность

    Сайты, конечно, иногда падают. Но бекап восстанавливается очень быстро. Хотя, причину падения тоже надо найти. Однако, на резервной копии, запущенной в песочнице.


  1. Fox_exe
    23.08.2016 21:57
    +1

    Т.к. про ОСь ни слова, значит явно пропущены пункты по обнаружению установленной системы (Вследсвии — какой менеджер пакетов там крутится и кто управляет фаерволом)

    Ну и малость безумное решение — если оперативки много — можно создать рамдиск, скопировать и перемонтировать на него rootfs и работать с него, что позволит делать с хардом что угодно (Даже комп ребутать не придётся. Да и груб трогать незачем (Хотя и надо — а то комп не включится после перезагрузки)


    1. kvaps
      23.08.2016 23:00

      Я так и делал :)


  1. kvaps
    23.08.2016 22:20
    +1

    Ладно, вот мой вариант произошедшего:


    Как я запорол конкурс от RUVDS


    Длиный лог моих действий с коментариями

    Захожу в контрольную панель, узнаю что IP тачки 194.87.147.194


    ssh root@194.87.147.194 # без результата
    ping 194.87.147.194 # без результата

    Подключаюсь через консоль, логинюсь


    ping 8.8.8.8 # без результата
    ip addr

    Вижу, что установлен ip-адрес 194.87.144.194, а не 194.87.147.194


    Ок, что за ось то?


    cat /etc/*-release

    Ubuntu 16.04, ладно, проверим интерфейсы:


    cat /etc/network/interfaces

    Ага, вот оно, поправим:


    sed -i /etc/network/interfaces 's/.144./.147./g'

    Cразу получаю ошибку о недоступности записи, оказывается "/" смонтирован только для чтения


    Исправляю ситуацию:


    mount -o remount,rw /

    теперь, надо бы записать изменения в fstab:


    vim /etc/fstab # нет такого файла

    Ладно, нет так нет, значит создадим:


    cat /proc/mounts | grep /dev/sda >> /etc/fstab

    Вернемся, к сетевым настройкам. Cнова меняю адрес:


    sed -i /etc/network/interfaces 's/.144./.147./g'
    systemctl networking restart

    Пробуем интернет


    ping 8.8.8.8 # без результата
    ping 194.87.147.1 # без результата
    arp
    ip route
    ...

    Здесь я понимаю, что допустил первую ошибку, я не посмотрел на то, что сеть там /22, а не /24
    Исправляю ситуацию:


    vim /etc/network/interfaces # Правлю адрес шлюза и сети обратно на 144

    Пробую заново:


     ping 8.8.8.8 # есть пинг

    Ага, отлично, пробую залогиниться снова:


    ssh root@194.87.147.194 # без результата
    ping 194.87.147.194 # есть пинг

    Фаервол? Смотрю логи:


    jornalctl -f #вижу сообщения от ufw

    Минута гугления, и команда для ufw готова:


    ufw allow ssh

    Снова захожу:


    ssh root@194.87.147.194 # Permission denied!

    Пароль правильный, значит root логин запрещен, разрешаем (знаю не красиво, но ведь конкурс же)


    sudo sed -i 's/prohibit-password/yes/' /etc/ssh/sshd_config

    Захожу:


    ssh root@194.87.147.194 # ура, я в тачке!

    Теперь диски:


    fdisk -l # /dev/sda - 3 раздела; /dev/sda3 - это корень занимает 18G, swap раздел на 1G (точно не помню)
    df -h # корень весит всего 1.8G,
    free -h # 2 гига оперативки

    Ага, объема /swap + ram должно хватить что бы скопировать туда корень


    mkdir /ramroot
    mount -n -t tmpfs -o size=2G none /ramroot
    cd / # (containing the root filesystem contents)
    find / -depth -xdev -print | cpio -pd --quiet /ramroot
    cd /ramroot
    mkdir oldroot
    pivot_root . oldroot # Синтаксическая ошибка

    Как долго я ни гуглил, так и не нашел решения этой ошибки
    Я решил пойти другим способом: использовать switch_root вместо pivot_root
    Для этого, нужно перенести proc, sysfs, и dev в наш новый рут:


    for i in /dev /run /sys /proc; do mount --move $i /ramdisk$i ; done # получаю ошибки

    Снова гуглю нахожу решение:


    mount --make-private /
    mount --make-private /proc/

    Повторяю:


    umount /ramdisk/*
    for i in /dev /run /sys /proc; do mount --move $i /ramdisk$i ; done

    Вроде все ок, логинимся в наш новый рут:


    exec switch_root -c /dev/console /ramdisk /bin/bash

    Круто, работает!


    mount # /dev/sda3 никуда не смонтирован

    Ну теперь дело за малым, разметим диск снова:


    parted /dev/sda # Удаляем 3 пртишен, создаем два новых, сохраняем

    Получаю варнинг, что диск уже используется в системе, и ядро не узнает о том, что он изменился
    Ладно, соглашаюсь.


    ls /dev/sda* # как и предполагалось четвертого партишена нет

    Что бы появился, надо перезагрущится, но понятное дело, что перезагружаться мы не можем, у нас система в памяти висит!
    И что же это, конец? Ан нет.
    Чуть-чуть пораскинув мозгами мне в голову приходит гениальная идея я вспоминаю о том как некогда я маунтил образы дисков из виртуальных машин прямо в систему, с разметкой отдельных партишенов, пробуем повторить, тоже самое для /dev/sda:


    losetup /dev/loop0 /dev/sda
    partx -a /dev/loop0
    ls /dev/loop0* # Появились все четыре новых партиции, ура победа!

    Дальше по накатаной:


    mkfs.xfs -f /dev/loop0p1
    mount /dev/loop0p1 /new-root
    find / -depth -xdev -print | cpio -pd --quiet /new-root

    Тут ssh-соединение рвется.
    В консоли тачки Kernel Panic
    Ребут, понятное дело, выкидывает в initramfs, на этом я закончил.


    1. kvaps
      23.08.2016 22:24

      Так же хочу поблагодарить авторов конкурса, хоть я его и провалил. Было очень занятно, правда, спасибо!
      И хочу отметить что консоль сервера у меня ужасно глючила и тормозила (пробовал firefox и chromium под Linux)


    1. kvaps
      24.08.2016 11:59

      Хабраюзер non7top отписал мне на почту:


      На швабре у меня ro, потому тут пишу.

      http://unix.stackexchange.com/questions/226872/how-to-shrink-root-filesystem-without-booting-a-livecd

      Ссылку нашел гуглом за 5 минут, в ней инструкция на 99% подходящая и в ней описана вся сложная часть. После того как сделал pivot_root, оказываешься в новой системе, старую sda3 потом можно размонтировать из /oldroot, потом пару манипуляций с fdisk и из sda3 получаются 2 новых раздела. sda3 замонтировать и скопировать туда все обратно из нового корня, на sda4 залить файлы сайта и добавить его в фстаб. Перезагрузка.

      Ваша ошибка началась с фразы
      "Что бы появился, надо перезагрузиться", естественно перезагрузка в данном случае не обязательна. Соответсвенно вся история с losetup является излишней.

      mkfs.xfs -f /dev/loop0p1 зачем /boot форматировать? loop0p3 наверное должен был быть.

      1. Спасибо за подсказку, перезагрузку я понятное дело не делал, но дело даже не в этом, а в том, что я не уделил должного внимания этой команде:


        mount --make-rprivate / # necessary for pivot_root to work

        Я не попробовал после нее сделать pivot_root, а сразу воспользовался switch_root


        Если ее не выполнить, то попытка запуска pivot_root приведет к следющей ошибке:


        pivot_root: failed to change root from ' /ramdisk': Invalid argument

        И нигде, кроме данного ответа на stackexchange, про это не написано, даже в man pivot_root нет ни слова...


      2. Ну да ладно, после того как я сделал switch_root, рут изменился и все пошло бы по плану, но я не понимаю почему возник Kernel Panic, ведь на тот момент система работала уже в tmpfs.
        Получается что /dev/sda3 был по прежнему куда-то смонтирован и занят ядром?


      3. mkfs.xfs -f /dev/loop0p1 зачем /boot форматировать? loop0p3 наверное должен был быть.

        По поводу этого: некоторые команды я записывал потом и банально опечатался, конечно же там /dev/loop0p3



  1. kein
    23.08.2016 23:32

    Отличный конкурс, узнал много нового, задачку решил путем увеличения жесткого диска машины через личный кабинет (знаю, что читерство, но весело же) и перекидыванием всей системы на созданный в дополнительном пространстве /dev/sda4 (для копирования системы использовал xfs_copy).


  1. saboteur_kiev
    24.08.2016 03:08

    А есть статистика, сколько человек участвовало всего?


    1. ruvds_official2
      24.08.2016 09:44

      Уважаемый saboteur_kiev, в конкурсе участвовало 133 человека.


      1. kvaps
        24.08.2016 10:53

        А сколько человек успешно закончило конкурс?


        1. saboteur_kiev
          24.08.2016 17:37

          В статье написано, что два


  1. GHostly_FOX
    24.08.2016 06:11
    +1

    А знаете, что обидно!? Когда подал заявку на участие, а оказалось необходима регистрация на RUVDS, регистрацию прошел но так и не получил возможность участия. И нет ответа ни на письмо, ни на комментарий в после про задачу.


    1. ruvds_official2
      24.08.2016 09:48

      Уважаемый Ghostly_Fox, напишите, пожалуйста запрос на support@ruvds.com с указанием Вашего конкурсного email и временем подачи заявки. Мы обязательно разберёмся в ситуации.


  1. izyk
    24.08.2016 11:13

    А можно вывод «fstab -l» или «parted -l» перед началом выполнения и в после?
    Спасибо.


  1. glowingsword
    27.08.2016 12:25

    А у меня всё закончилось на моменте, когда я стал искать подходящий дисковый раздел, что-бы скопировать содержимое корневого. Я располагал всего несколькими свободными часами на участие в конкурсе. И я их бездарно потратил. Не догалался заюзать swap, и про tmpfs не подумал. Вместо этого я забэкапил содержимое корня, создав архив в формате tar.xz на /dev/sda1, после чего пытался заюзать обнаруженный мной на sda1 iso-образ с ubuntu 16.04(который почему-то назывался также, как одно из установленных ядер, но имел расширение iso), но обнаружил что стандартные команды grub для загрузки iso-образа с ubuntu в данном случае не работали. Хотя образ нормально монтировался и выглядел корректно, в нём отсутствовал каталог casper, в результате загрузиться с обнаруженного образа не удалось. Но за само участие в конкурсе спасибо организаторам конкурса. Было очень интересно:)


    1. ruvds_official2
      28.08.2016 12:37

      Уважаемый glowingsword, iso — образ был «спрятан» как ещё один способ решения задачи. Чтобы загрузиться с него, нужно было сделать следующее:

      Добавляем в /etc/grub.d/40_config:

      menuentry "Ubuntu ISO" {
          set root=(hd0,1)
          set isofile="/boot/ubuntu-16.04-server-amd64.iso"
          loopback loop (hd0,1)$isofile
          linux (loop)/install/netboot/ubuntu-installer/amd64/linux iso-scan/filename=${isofile}
          initrd (loop)/install/netboot/ubuntu-installer/amd64/initrd.gz
      }
      


      Обновляем grub и перезагружаемся, выбирая Ubuntu ISO.


      1. glowingsword
        29.08.2016 00:56

        Я предположил, что это один из вариантов решения, но изучил содержимое образа не внимательно, в результате так и не смог его использовать. И было очень интересно узнать, как именно его можно было использовать. Спасибо за интересный конкурс, а также за то, что удовлетворили моё любопытство)