Конкурс администраторов «Почини сломанный 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. Снова проверяем — работает.
Вот и все : ) Мы надеемся, что выполнять это тестовое задание было настолько же весело, как и нам его выдумывать :)