RFC (Request for Comments, Запрос на комментарии) - серия документов, публикуемая сообществом исследователей и разработчиков, руководствующихся практическими интересами, в которой описывается набор протоколов и обобщается опыт функционирования Интернет.
Для написания этой заметки использовалось множество различного материала, найденного в глобальной сети Internet. Указать конкретно, что и откуда брал не представляеться возможным, так как иногда это была просто наводка в нужном направлении. Так что авторам, заметившим какие-либо совпадения со своими работами, просьба написать и я добавлю вас в список источников информации. Отдельное спасибо товарищу lissyara, который полночи консультировал меня по ходу миграции. Все началось с того, что сервер переехал с dedicated (арендуемого) на colocation (размещенный). На дедике стояла дешевая "железка" на базе одноядерного Intel Pentium IV с 1Гб оперативной памяти, а под colocation был куплен 4-х ядерный AMD Phenom с 4Гб оперативной памяти. Соответственно хотелось получить все прелести 64-битного процесора AMD. Задача осложнялась тем, что сервер был перенесен с помощью стандартных утилит dump/restore и был полностью настроен. Вариант с установкой новой ОС FreeBSD amd64 с последующей установкой и настройкой всего программного обеспечения не впечатлял, так как мороки там было много, да и подзабыл я уже некоторые важные мелочи. Поэтому было принято решение мигрировать из-под действующей, рабочей ОС. В итоге имеем: сервер с процессором amd64, двумя жесткими дисками, 4Гб ОЗУ, установленной ОС FreeBSD 6.3-stable i386 без SMP и PAE. На выходе нужно получить ОС FreeBSD 6.3-stable amd64 с SMP. Приступим. ОС установлена на первом жестком диске hdd (имя диска ad4), второй жесткий диск (ad5) соответствено остался незадействованным (планировался под gmirror). Вот на него (ad5) и будем ставить новую ОС. Через sysinstall создаем разделы и монтируем их в /mnt.
Part Mount Size Newfs
---- ----- ---- ----- ----
ad5s1a /mnt 232GB UFS2+S Y
Собирать ядро будем сразу с необходимыми нам опциями, поэтому создаем файл конфигурации. В него вписываем только те директивы, которые нам нужны и не присутствуют в конфигурации по умолчанию. Все остальное подключаем из SMP (в свою очередь SMP подключает директивы из GENERIC).
При сборке ядра (kernel) и мира (world) указываем, что нам нужна архитектура amd64, ну и, конечно же, файл конфигурации ядра. Местом для установки является каталог /mnt, в котором смонтирован второй hdd.
# cd /usr/src
# make -j4 -s buildworld TARGET_ARCH=amd64
# make -j4 -s buildkernel TARGET_ARCH=amd64 KERNCONF=MYKRN
# make installworld TARGET_ARCH=amd64 DESTDIR=/mnt
# cd etc && make distribution DESTDIR=/mnt
# cd ../ && make installkernel TARGET_ARCH=amd64 DESTDIR=/mnt KERNCONF=MYKRN
При наполнении каталога /etc дистрибутивов у меня вылезла неожиданная мелкая проблема - для sendmail'а не хватило файлов конфигурации. Разбираться, почему и из-за чего так получилось, времени не было, поэтому я их просто скопировал со старой ОС. После этого make distribution отработал без ошибок.
Если все прошло успешно, на втором hdd вы должны получить установленную ОС FreeBSD 6.3 adm64. Теперь необходимо все подготовить для ее загрузки. Для этого копируем новое ядро в каталог /boot первого hdd и переименовываем в kernel64. Для разовой загрузки FreeBSD в другую конфигурацию будем использовать утилиту nextboot. Ее можно просто вызвать с необходимыми параметрами, а можно вручную создать для нее файл конфигурации nextboot.conf в каталоге /boot. Второй вариант мне приглянулся больше. В этом файле указываем, какое ядро загружать и какой раздел считать корневым.
Создаем файл конфигурации ОС rc.conf. В него записываем только самое необходимое: настройки сети, запуск демона sshd и проверку файловой системы. Все остальное отключаем.
На этом подготовка новой ОС закончена. Теперь, скрестив пальцы, перезагружаемся.
# shutdown -r now
Если все было сделано правильно, то перед вами предстанет FreeBSD amd64. Если где-то ошиблись, то придется звонить/писать в службу поддержки вашего дата-центра и заказывать kvm. Вот тут-то и проявляется преимущество утилиты nextboot. Она пытается запустить ОС в новой конфигурации только один раз. Если ОС была перезагружена, то вы вернетесь к старому ядру. Но, тем не менее, даже если все было сделано правильно, есть возможность не увидеть свой сервер в сети. У меня, например, новое ядро переназначило нумерацию второго hdd (было ad5, стало ad8) и, соответственно, в автоматическом режиме ядро не загрузилось. Пришлось заказывать kvm и запускать ядро вручную.
mountroot> ufs:/dev/ad8s1a
После этого все поднялось нормально и я смог подключиться к серверу по ssh. Проверяем:
Немного поясню, что у нас получилось. Мы загрузились с нового ядра и с новым миром со второго hdd. Старую ОС (первый hdd) мы смонтировали в каталог /mnt. Теперь нам необходимо собрать и установить мир и ядро в старую ОС. Действия аналогичные тем, что были ранее, только отличается количеством потоков (опция -j8), так как новое ядро поддерживает SMP (симметричную многопроцессорность). Вообще сборка в несколько потоков имеет сомнительную выгоду, так как есть риск появления ошибок сборки. Но я еще не разу не огребал таких проблем, поэтому продолжаю использовать эту опцию на свой страх и риск.
# cd /mnt/usr/src
# make -j8 -s buildworld
# make -j8 -s buildkernel KERNCONF=MYKRN
# make installworld DESTDIR=/mnt
# make installkernel DESTDIR=/mnt KERNCONF=MYKRN
Комментируем все лишнее в rc.conf, оставив только самое нужное: настройки сети, запуск демона sshd, проверку файловой системы. Удаляем конфигурационный файл nextboot и перезагружаемся:
# vi /mnt/etc/rc.conf
# rm /mnt/boot/nextboot.conf
# shutdown -r now
Таким образом мы получили ОС, успешно мигрировавшую с архитектуры i386 на amd64. Но для полного счастья еще необходимо пересобрать все ранее установленное программное обеспечение и удалить старые библиотеки. Искренне вам желаю, чтобы ваше программное обеспечение было установлено из портов.
# portupgrade -fca
# cd /usr/src && make delete-old-libs
Хотелось бы заметить, что пересборка портов заняла полный рабочий день, тогда как сама миграция около 3-4 часов. Все по причине того, что при сборке какого-нибудь порта вываливалась ошибка, которую приходилось исправлять вручную, чаще всего путем индивидуальной пересборки нужного порта. Поэтому полную пересборку портов приходилось запускать более 5 раз. Возможно, я тут что-то делал не оптимально, но в итоге все встало на свои места. Когда закончили с портами, убираем комментарии в rc.conf и делаем контрольную перезагрузку: