Введение
Статью изначально хотел написать на тему установки Xenserver 7 на mdadm raid1. Мне всегда нравился xen именно за возможность установить его на mdadm. Это позволяло использовать гипервизор на любом железе с двумя хардами, обеспечивая простую отказоустойчивость на уровне дисков. Это удобно и бюджетно. То же самое можно сделать на kvm, но лично мне у xen больше нравится оснастка управления в виде приложения для windows. В нее можно удобно подключать множество серверов и управлять всем из одного места. Как плюс, в сравнении с kvm, проще и быстрее установить и настроить в работу, передать кому-нибудь на управление.
Собственно, черновик статьи по установке Xenserver на софтовый рейд я подготовил и протестировал. На первый взгляд все работает. Проблемы начались, когда я стал проверять отказоустойчивость и отключать один хард. Как оказалось, xenserver не может нормально загрузиться, если рейд mdadm уходит в состояние degreaded. Я был очень расстроен этим фактом и потратил непрерывно почти сутки на то, чтобы разобраться с ситуацией и попробовать решить проблему. Но у меня это не получилось. И в интернете рецепта по решению проблемы тоже не нашел, но нашел подтверждение этой проблемы.
Похоже, XenServer с версии 7 больше не поддерживает работу на mdadm. Об этом даже упомянуто в официальном FAQ:
Я проверил на версии 7.0 и 7.1. Результат один и тот же — система не загружается, если рейд развалился. Причем в интернете есть статьи, где рассказано, как перенести чистую установку xen 7 на mdadm. Похоже эти люди просто не тестировали отказ одного из дисков. Пока это не проверишь, кажется, что все в порядке. Проблема тут в том, что Xenserver 7 перешел на CentOS 7. А там много нововведений, в частности systemd. Я точно не смог определить в чем же конкретно проблема. Есть какая-то не совместимость в модулях загрузки, ядре xenserver и версии mdadm. На CentOS 7 был похожий баг в момент выхода, но он был оперативно исправлен. А на XenServer разработчики на это забили, так как поддержку mdadm и не обещали. В итоге гипервизор остался без возможности установки на mdadm. Для меня это неприемлемо, так как mdadm активно использую. Если выходит из строя любой диск, система в момент загрузки бесконечно висит с сообщением:
A Start Job is running for dev-md0.device
У меня до сих пор есть много виртуальных машин под управлением CentOS 5. Особенность этой версии в том, что для нормальной работы на XenServer на систему устанавливалось специальное ядро kernel-xen. В итоге, при переносе системы на другой гипервизор, она отказывалась работать. Необходимо серьезно поработать напильником, чтобы завести ее
Мне важно было отработать этот момент, так как в работе придется постепенно уходить от Xenserver в сторону либо Hyper-V, либо KVM. Пока еще не решил окончательно, так как на KVM у меня так и не получилось завести виртуальные машины с xen, а вот на Hyper-V удалось
Об этом и расскажу.
Восстановление загрузки linux сервера
Для того, чтобы виртуальная машина заработала на hyper-v, как я уже сказал, необходимо установить стандартное ядро. Для этого загружаемся в виртуальной машине с загрузочного диска CentOS 7 и выбираем режим Rescue a CentOS system.
Чтобы выбрать этот раздел, необходимо в главном меню выбрать Troubleshooting. Дожидаемся загрузки и выбираем первый предложенный вариант.
Сразу чрутимся в нашу восстанавливаемую систему. Первым делом надо обновить систему и установить стандартное ядро. Скорее всего через yum у вас ничего не получится, так как ссылки на репозитории centos 5 стали неактивны, после того, как 31-го марта закончилась поддержка системы. Необходимо изменить файл /etc/yum.repos.d/CentOS-Base.repo, отредактировав пути соответствующих разделов на следующие:
baseurl=http://vault.centos.org/5.11/os/$basearch/ baseurl=http://vault.centos.org/5.11/updates/$basearch/ baseurl=http://vault.centos.org/5.11/addons/$basearch/ baseurl=http://vault.centos.org/5.11/extras/$basearch/ baseurl=http://vault.centos.org/5.11/centosplus/$basearch/ baseurl=http://vault.centos.org/5.11/contrib/$basearch/
Все строки с mirrorlist надо закомментировать, а baseurl изменить на указанные. После этого надо настроить сеть и запустить обновление системы.
# yum clean all # yum update
Теперь установим стандартное ядро linux, а от xen удалим.
# yum remove kernel-xen # yum install kernel
Дальше обновим initrd. Чтобы не было ошибок, необходимо в файле /etc/modprobe.conf закомментировать все строки, в которых есть упоминание xen.
Теперь проверяем версию имеющихся библиотек ядра в системе.
# ls -l /lib/modules/
Берем самую свежу версию и собираем образ initrd.
# mkinitrd -v -f /boot/initrd-2.6.18-419.el5.img 2.6.18-419.el5
Редактируем конфиг загрузчика /boot/grub/grub.conf, чтобы он выбрал при загрузке именно эту версию ядра.
Параметр default=1 соответствует второй строке меню, так как отсчет идет от 0. То есть как раз будет выбрано нужное обновленное ядро. Обновляем загрузчик на диске.
# grub-install /dev/sda
Если получите ошибку:
/dev/sda does not have any corresponding BIOS drive.
Используйте такую команду:
# grub-install --recheck /dev/sda
По идее, на этом можно было бы и завершить. Мы фактически выполнили полное восстановление поломанной загрузки linux сервера. Но так как речь идет о xenserver, есть еще один нюанс. Если сейчас попробовать загрузить виртуальную машину, то все пройдет гладко почти до самого конца загрузки, а потом вылезет ошибка.
init: Id ‘co’ respawning too fast: disabled for 5 minutes
Она будет висеть бесконечно. Связана с доступом к консоли виртуальной машины на xenserver. В другом окружении, параметр должен быть изменен. Чтобы исправить ошибку, надо отредактировать файл /etc/inittab. Найти в нем строку
co:123457:respawn:/sbin/agetty xvc0 9600 vt100-nav
Закомментировать ее, а вместо нее снять комментарий со строки
1:123457:respawn:/sbin/mingetty tty1
Теперь можно перезагружать виртуалку. Она должна благополучно загрузиться. По крайней мере у меня было так.
К сожалению, указанный выше способ не смог заставить загрузиться эту же виртуальную машину на гипервизоре KVM. Не знаю почему. После выбора в загрузчике версии ядра, система просто зависает в таком положении.
И дальше ничего не происходит. Никаких ошибок при этом нет. У меня даже нет идей из-за чего это может быть и в каком направлении двигаться, чтобы запустить виртуалку. Если у кого-то есть идеи как это сделать, прошу совета. Мне бы очень хотелось перенести виртуальные машины с centos 5 на kvm. Я пробовал переносить уже восстановленные виртуалки с hyper-v на kvm, конвертировал диск с vhd в qсow2, но все без результата. Они все равно зависают точно так же, как если бы я их переносил напрямую с xenserver.
Перенос виртуальной машины с xenserver на kvm
Сам перенос виртуальной машины представляет из себя простое копирование диска с одного гипервизора на другой. Для бэкапа Xenserver я использую бесплатную версию программы Alike Free. К сожалению, ее больше нет в бесплатной редакции. Разработчики закрыли бесплатный проект, есть только триальная версия от платной. Но у меня остался и дистрибутив, и ключи для бесплатной версии. Я продолжаю ее использовать. Простая и удобная программа, которая позволяет делать инкрементные бэкапы виртуальных машин. Она же умеет выгружать бэкапы в vhd формате. Все что надо сделать для переноса виртуалки — создать такую же машину на hyper-v и в качестве диска указать перенесенный vhd образ с xenserver. Но если после этого просто запустить виртуалку, вы получите ошибку.
Error 13: invalid or unsupported executable format
Ничего удивительного в этом нет, модифицированное ядро для xen работает только на самом гипервизоре. Для работы в другой среде необходимо установить стандартное ядро linux. Вот этим я и займусь далее. Задача оказалась очень непростой, пришлось много ковыряться в различных нюансах. В первую очередь, чтобы не забыть приобретенный опыт, я и пишу эту статью. Хотя понимаю, что мало кому пригодится подобный опыт. Вряд ли найдется много людей, кто будет переносить уже снятую с поддержки систему CentOS 5 с гипервизора Xen куда-то в другое место. По-хорошему, системы надо переставлять, и я этим постепенно займусь. Но все равно необходимо иметь под рукой готовую инструкцию на случай всяких неожиданностей.
Описанный ниже способ восстановления загрузки виртуальной машины является универсальным средством для решения проблем с загрузкой linux сервера. Если у вас по какой-то причине не загружается linux сервер, сломался загрузчик или возникли проблемы после обновления ядра, рассказанные далее способы обновления и замены ядра и загрузчика могут помочь в решении этой проблемы.
Заключение
Перенос виртуальных машин хорошо работает в рамках одного гипервизора. В случае, если переносите с одного на другой, с большой долей вероятности получите некоторые проблемы. Я с этим частенько сталкиваюсь, особенно с linux и freebsd. Чаще всего начинаются проблемы с дисками и загрузчиком. То буквы дисков поменяются, приходится править fstab, то загрузчик не стартует. Иногда сеть может не работать. Везде приходится по месту разбираться и решать возникающие проблемы.
Онлайн курс Infrastructure as a code
Если у вас есть желание научиться автоматизировать свою работу, избавить себя и команду от рутины, рекомендую пройти онлайн курс Infrastructure as a code. в OTUS. Обучение длится 4 месяца.
Что даст вам этот курс:
- Познакомитесь с Terraform.
- Изучите систему управления конфигурацией Ansible.
- Познакомитесь с другими системами управления конфигурацией — Chef, Puppet, SaltStack.
- Узнаете, чем отличается изменяемая инфраструктура от неизменяемой, а также научитесь выбирать и управлять ей.
- В заключительном модуле изучите инструменты CI/CD: это GitLab и Jenkins
Смотрите подробнее программу по .