Решение для конкурса "Почини сломанный VDS"

Конкурс администраторов «Почини сломанный VDS» вызвал неожиданное количество откликов — многим хотелось попробовать свои силы в тестовых заданиях, подготовленных нашими администраторами. За сутки, отведенные на проведение конкурса, с заданием смогли справиться 8 человек! Мы публикуем пошаговое руководство, на случай если вы хотите повысить свою квалификацию администратора или просто узнать, где допустили ошибку. Четкие команды к исполнению представляем только в начале решения, так как в администрировании всегда есть место для индивидуального подхода.

Администрируем конкурсный VDS:

Загрузка сервера

Сервер загружен в rescue-режиме с ISO-образа, требуется загрузиться с «жесткого» диска. Для этого отправляем сервер в перезагрузку и сразу переподключаемся к VNC, в меню загрузки выбираем загрузку с диска. ОС не стартует и выдает kernel panic.

Для выявления ошибки отключаем quite-режим загрузки в конфигурационном файле grub и при следующей загрузке видим ошибку о том, что нет root-устройства.

Выполняем: mount /dev/vda1 /mnt
 vim /mnt/grub/grub.conf

Снова перезагружаемся в rescue-режим. Какие диски присутствуют в системе можно посмотреть по UUID:


ls -la /dev/disk/by-uuid/

Выбрать правильный поможет команда:


fdisk -l /dev/vda

Идем в grub.conf и исправляем UUID, либо выставляем загрузку непосредственно с устройства /dev/vda3

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

Снова перезагружаемся. У нас есть 2 четкие проблемы:

Ошибки о закончившемся месте — нужно освободить

Подключаем корневой раздел:

mount /dev/vda3 /mnt
df -h /mnt

Место, вроде бы есть, но свободны ли inodes?

df -i /mnt

догадка верна, нужно искать место скопления файлов. Проверим каталог /tmp

ls -f /mnt/tmp | wc -l 

Также, выполнив команду ls -la /mnt, можно обратить внимание на размер директории /mnt/tmp. Можно сразу обратить внимание на права 000 на корневой раздел и исправить их. Удаляем немного файлов в /mnt/tmp и изменяем права на корень.

Нет доступа root на сервер — нужно сбросить root пароль

Для этого выполняем команду chroot:

chroot /mnt

Ругается на отсутствие zsh — поэтому надо явно указать какой shell будем использовать, например, bash.

chroot /mnt /bin/bash

Теперь меняем пароль командой passwd.

Перезагружаемся, пробуем зайти. Не заходит, но и не ругается на неправильный пароль. Перезагружаемся и проверяем файл passwd. Видим неправильно прописанную командную оболочку. Исправляем на /bin/bash или другой по вкусу.

Работа сети

На этом шаге уже можно отключить ISO-образ, чтобы не мешал при каждой перезагрузке. Перезагружаемся и успешно входим в систему. Проверяем работу сети — не работает. Смотрим в конфигурационный файл — надо найти данные для сетевого подключения. Это VMmanager, куда у нас есть доступ. Заполняем корректно файл настроек сети. Пробуем запустить и выясняем, что eth0 нет на сервере. Сходим в /etc/udev/rules.d/70-persistent-net.rules и проверим, так ли это на самом деле. Обнаруживаем 2 устройства вместо одного и сетевую карту с нашим MAC-адресом, который мы узнали в VMmanager — eth1. Удаляем лишнюю и переименовываем нашу сетевую карту в eth0. Перезагружаемся.

Сеть поднялась, но сервер недоступен. Проверяем firewall и убираем прописанные ограничения. Можно попробовать открыть сайт по IP-адресу. И ничего не открывается.

Подключаемся по SSH.

Проверяем все необходимые нам сервисы: mysql, apache.

Запуск Apache отрабатывает нормально, но при проверке, запущен ли он, не обнаруживается ни один процесс. Файлы логов говорят об ошибке созданием pid-файла. Смотрим путь, где Apache пытается создать файл — symlink на /var/run/httpd, но директория отсутствует. Создаем файл, даем права и запускаем Apache.

Запускаем MySQL. Нам честно отвечают, что проблема с запуском. Смотрим лог-файл: если ранее проблема с корневым каталогом не была устранена, то возникнет проблема с правами:

[ERROR] Can't start server: Bind on unix socket: Permission denied

Выставляем права на корень, если необходимо, и пробуем снова запуститься — не хватает таблиц в базе. Таблицы на месте, но принадлежат root. Меняем пользователя на mysql, запускаем и вновь ошибка — невозможно создать pid-файл, как уже было с httpd. Повторяем операцию, что уже проделали с Apache и запускаем, наконец, MySQL сервер.

Открываем IP-адрес сервера в браузере и понимаем, что он ведет не туда, куда нужно. Проверяем конфигурацию httpd и не находим VirtualHost’a, который бы вел в необходимый каталог, но видим его в соседнем каталоге — vhost. Добавляем Include. Так же видим, что указан неверный IP для NameVirtualHost и для самого VirtualHost — исправляем. Если мы ну очень внимательные, то сразу понимаем, что DocumentRoot тоже неверный, либо видим warning при перезапуске об этом и исправляем его. Переходим на сайт и получаем ошибку 403 – сморим права. Исправляем права на /var/www/interview/data/, но получаем ошибку о нехватке прав — чаще всего это означает наличие immunable-бита на файл/директорию, убираем его. Добавляем прав на /var/www/interview/data/www/interview.fvds.ru/index.html открывается, но ошибка 403 до сих пор присутствует, необходимо указать DirectoryIndex для VirtualHost’a.

Теперь все открывается, но php не обрабатывается. Добавляем:

php_admin_value engine 1 

в конфигурационный файл /etc/httpd/conf/vhosts/interview/interview.fvds.ru. Mysql.php обрабатывается, но не работает, а вот mail.php вообще не обрабатывается, а все потому, что используется короткий тег. Разрешаем его в php.ini и перезапускаем Apache.

Mysql.php – в VirtualHost настраиваем логи. Из них узнаем, что не хватает расширения mysqli – устанавливаем и перезапускаем службу httpd. Следующая ошибка — неверный хост, и необходимость использовать IP нашего сервера. Исправляем mysql.php, заменяя хост на свой IP, но при сохранении возникает ошибка, а на своих ошибках мы учимся – проверяем immunable-бит и убираем его. Незадача, подключение запрещено — необходимо разрешить пользователю удаленные подключения. Конечно, легкий путь — просто установить localhost, но так совсем не интересно. Держим путь в консоль mysql и добавляем прав пользователю, к счастью, root-пароль для mysql не нужен.

grant all privileges on interview.* to 'interview'@'%' identified by 'R5b8K2r8';

Проверяем — все хорошо.

Mail.php — проверка пишет, что письмо не отправлено. Попробуем отправить письмо из консоли. И получаем ошибку доступа. Добавляем права на запуск и запускаем почтовый сервер — почта уходит из консоли корректно идем проверить сайт — не работает. Файлы журналов сайта говорят, функция отключена — ее необходимо включить в php.ini и перезапустить Apache. Снова проверяем — работает.

Вот и все : ) Мы надеемся, что выполнять это тестовое задание было настолько же весело, как и нам его выдумывать :)

Автор статьи:

Игорь Кузьмин

Аватар пользователя i.kuzmin
Вернуться