Как стать автором
Обновить

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

очень интересно читать варианты починки, не видя изначального задания.
Точно!
С него надо было начать этот пост (после шапки)
Или хоть со ссылки на него.
Слово задача в самом начале и есть ссылкой
Ее туда добавили не сразу
Спасибо за комментарий, добавили ссылку на задачу
Может задание было что-то вроде: сайт упал, никто ничего не трогал, оно само. Ну и дальше расследование %)
НЛО прилетело и опубликовало эту надпись здесь
Т.к. про ОСь ни слова, значит явно пропущены пункты по обнаружению установленной системы (Вследсвии — какой менеджер пакетов там крутится и кто управляет фаерволом)

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

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

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


Как я запорол конкурс от 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, на этом я закончил.


ps: Если кто укажет на мои ошибки и на то, почему так произошло, буду очень благодарен и отправлю + в карму!

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

Хабраюзер 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


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

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

В статье написано, что два
А знаете, что обидно!? Когда подал заявку на участие, а оказалось необходима регистрация на RUVDS, регистрацию прошел но так и не получил возможность участия. И нет ответа ни на письмо, ни на комментарий в после про задачу.
Уважаемый Ghostly_Fox, напишите, пожалуйста запрос на support@ruvds.com с указанием Вашего конкурсного email и временем подачи заявки. Мы обязательно разберёмся в ситуации.
А можно вывод «fstab -l» или «parted -l» перед началом выполнения и в после?
Спасибо.
НЛО прилетело и опубликовало эту надпись здесь
Уважаемый 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) жалко конкурс прошёл мимо меня :D у меня-то большой опыт замены ОС "на горячую" :) Впрочем, раз там лежит образ, то это вообще как два байта переслать.
2) а целью было "поднять сайт" или "починить установленную систему в том виде как она есть"? :)
А то я бы всё сделал во много раз проще :)

Зарегистрируйтесь на Хабре, чтобы оставить комментарий