Мы — долго запрягаем, быстро ездим, и сильно тормозим.
www.lissyara.su —> статьи —> FreeBSD —> настройка —> i386=>amd64

Удаленная миграция с i386 на amd64

Автор: serge.


    Для написания этой заметки использовалось множество различного материала, найденного в глобальной сети Internet. Указать конкретно, что и откуда брал не представляеться возможным, так как иногда это была просто наводка в нужном направлении. Так что авторам, заметившим какие-либо совпадения со своими работами, просьба написать и я добавлю вас в список источников информации. Отдельное спасибо товарищу lissyara, который полночи консультировал меня по ходу миграции.
   Все началось с того, что сервер переехал с dedicated (арендуемого) на colocation (размещенный). На дедике стояла дешевая "железка" на базе одноядерного Intel Pentium IV с 1Гб оперативной памяти, а под colocation был куплен четырехядерный 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

   В итоге должно получиться примерно следующее:
# df -h
Filesystem     Size    Used   Avail Capacity  Mounted on
/dev/ad4s1a    480M    107M    335M    24%    /
devfs          1.0K    1.0K      0B   100%    /dev
/dev/ad4s1d    1.9G     20K    1.8G     0%    /tmp
/dev/ad4s1e    9.7G    1.1G    7.8G    13%    /var
/dev/ad4s1f     19G     11G    7.3G    59%    /usr
devfs          1.0K    1.0K      0B   100%    /var/named/dev
/dev/ad4s1g    192G    2.5G    174G     1%    /home
/dev/ad5s1a    232G     10K    456M     0%    /mnt

   Собирать ядро будем сразу с необходимыми нам опциями, поэтому создаем файл конфигурации. В него вписываем только те директивы, которые нам нужны и не присутствуют в конфигурации по умолчанию. Все остальное подключаем из SMP (в свою очередь SMP подключает директивы из GENERIC).
# rm -rf /usr/obj/
# cat > /usr/src/sys/amd64/conf/MYKRN
include SMP
ident           MYKRN-SMP
options         IPFIREWALL
options         IPFIREWALL_VERBOSE
options         IPFIREWALL_VERBOSE_LIMIT=100
options         IPFIREWALL_DEFAULT_TO_ACCEPT
options         QUOTA

   При сборке ядра (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 отработал без ошибок.
install: freebsd.cf: No such file or directory
*** Error code 71
Stop in /usr/src/etc/sendmail.
*** Error code 1
Stop in /usr/src/etc.
# ll sendmail/
total 16
-rw-r--r--  1 root  wheel   2,9K 22 янв  2004 Makefile
-rw-r--r--  1 root  wheel   4,0K 24 фев 04:03 freebsd.mc
-rw-r--r--  1 root  wheel   899B 22 ноя 19:20 freebsd.submit.mc
-rw-r--r--  1 root  wheel   2,2K 14 июн  2005 freefall.mc
# cp /etc/mail/freebsd.cf sendmail/
# cp /etc/mail/freebsd.submit.cf  sendmail/

   Если все прошло успешно, на втором hdd вы должны получить установленную ОС FreeBSD 6.3 adm64. Теперь необходимо все подготовить для ее загрузки. Для этого копируем новое ядро в каталог /boot первого hdd и переименовываем в kernel64. Для разовой загрузки FreeBSD в другую конфигурацию будем использовать утилиту nextboot. Ее можно просто вызвать с необходимыми параметрами, а можно вручную создать для нее файл конфигурации nextboot.conf в каталоге /boot. Второй вариант мне приглянулся больше. В этом файле указываем, какое ядро загружать и какой раздел считать корневым.
# cp -r /mnt/boot/kernel /boot/kernel64
# echo 'nextboot_enable="YES"' > /boot/nextboot.conf
# echo 'kernel="kernel64"' >> /boot/nextboot.conf
# echo 'vfs.root.mountfrom="ufs:/dev/ad5s1a"' >> /boot/nextboot.conf

   Для того, чтобы можно было подключиться к новой ОС удаленно (и не только), копируем файлы пользовательских учеток и прочие настройки из старой ОС:
# cd /etc
# cp -rp host.conf ssh passwd group master.passwd pwd.db /
spwd.db resolv.conf /mnt/etc

   Создаем в новой ОС файл fstab в соответствии с имеющимися разделами:
# cat > /mnt/etc/fstab
# Device                Mountpoint      FStype  Options         Dump    Pass#
/dev/ad5s1a             /               ufs     rw              1       1
/dev/ad4s1b             none            swap    sw              0       0
/dev/ad4s1a             /mnt            ufs     rw              2       2
/dev/ad4s1e             /mnt/var        ufs     rw              2       2
/dev/ad4s1f             /mnt/usr        ufs     rw	        2       2

   Создаем файл конфигурации ОС rc.conf. В него записываем только самое необходимое: настройки сети, запуск демона sshd и проверку файловой системы. Все остальное отключаем.
# cat > /mnt/etc/rc.conf
defaultrouter="xxx.xxx.xxx.xxx"
hostname="myhosting.ru"
ifconfig_xl0="inet xxx.xxx.xxx.xxx  netmask 255.255.255.xxx"
sshd_enable="YES"
sendmail_enable="NONE"
firewall_enable="NO"
inetd_enable="NO"
fsck_y_enable="YES"
background_fsck="NO"

   На этом подготовка новой ОС закончена. Теперь, скрестив пальцы, перезагружаемся.
# shutdown -r now

   Если все было сделано правильно, то перед вами предстанет FreeBSD amd64. Если где-то ошиблись, то придется звонить/писать в службу поддержки вашего дата-центра и заказывать kvm. Вот тут-то и проявляется преимущество утилиты nextboot. Она пытается запустить ОС в новой конфигурации только один раз. Если ОС была перезагружена, то вы вернетесь к старому ядру.
   Но, тем не менее, даже если все было сделано правильно, есть возможность не увидеть свой сервер в сети. У меня, например, новое ядро переназначило нумерацию второго hdd (было ad5, стало ad8) и, соответственно, в автоматическом режиме ядро не загрузилось. Пришлось заказывать kvm и запускать ядро вручную.
mountroot> ufs:/dev/ad8s1a

   После этого все поднялось нормально и я смог подключиться к серверу по ssh.
   Проверяем:
# uname -a
FreeBSD myhosting.ru 6.3-STABLE FreeBSD 6.3-STABLE #0: Fri Apr 25 00:25:35 MSD 2008
serge@myhosting.ru:/usr/obj/amd64/usr/src/sys/MYKRN  amd64

   Немного поясню, что у нас получилось. Мы загрузились с нового ядра и с новым миром со второго 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 и делаем контрольную перезагрузку:
# vi /etc/rc.conf
# shutdown -r now



размещено: 2008-04-28,
последнее обновление: 2008-05-03,
автор: serge


SAS, 2008-04-28 в 21:32:17

Эх, где же вы были раньше! Буквально пару недель назад думал над онлайн миграцией, но решил не рисковать, т.к. dedicated + далеко от меня.
Но спасибо за статью, очень пригодится в будущем :)

vyruz, 2008-04-29 в 10:12:22

Спасибо за статью, только у меня обратное направление :) Буду делать по аналогии

Heliar, 2008-04-30 в 5:27:26

Все по причине того, что при сборке какого-нибудь порта вываливалась ошибка, которую приходилось исправлять вручную, чаще всего путем индивидуальной пересборки нужного порта.

Если добавить в опции portupgrade -k, то оно отваливаться не будет, а будет пропускать. А в конце выведет список непоставившихся портов с примерными причинами (вообще, в любом случае).

Samm, 2008-05-04 в 10:24:46

Спасибо за заметку, собирался делать подобное на одном из серверов, но всёже, решил не рисковать и поставил всё заново. По поводу ключика -j, он уже очень давно как совершенно безопасен и применяется многими разработчиками/админами для сборки системы. А вот при сборке портов его применять и в самом деле не надо, там бывают траблы.

sava, 2008-05-20 в 17:54:32

Не так он совершенно и безопасен. Даже в 7 фряхе попробуй собрать ядро с опцией libalias. Не собирается.

weec, 2008-05-28 в 16:31:44

serge, подправь чуток статью, пусть используется swap вместо второго hdd

только-только мигрировал на amd64
http://mirrorbox.livejournal.com/236227.html

Test, 2008-07-15 в 20:06:39

ребят, у вас ошибка в  cp -rp host.conf ssh passwd group master.passwd pwd.db /
spwd.db resolv.conf /mnt/etc

тут слеш в конце строки не в ту сторону

lissyara, 2008-09-29 в 14:16:12

Тока что успешно переставил ОС по этой инструкции.
Правда без смены платформы - x64=>x64 - просто старый совсем от экспериментов убился.
Единственная допущенная ошибка - юзеров в новой ось заводил руками через vipw - забыл себя в группу wheel засунуть =)

receptor, 2009-03-06 в 0:33:51

Статья очень интересная и полезная, он не проще бы было установить чистую систему со всеми прогами и скопировать конфиги?

shirker, 2009-05-21 в 12:50:09

статья абалденная! и актуальная
если нет второго hdd можно по совету Петера Вемма и mirrorbox из жж (его статья упоминается выше в крякозяблах).. короче можно объединить извращения и поставить временную ось на своп, если размер оного позволит:
swapoff /dev/ad0s1b
newfs /dev/ad0s1b
mount /dev/ad0s1b /mnt

а далее все как тут написано))

playnet, 2009-12-06 в 21:05:16

/var всего 10 гиг.
У меня на боевом сервере было 15 гиг выделено (веб-сервер), так очень быстро раздел в ноль забивается. Это при том, что фактически там только /var/db да /var/log самые большие. База мускуля и логи апача. Сами проекты апача в /home/www лежат...
В итоге логи пришлось перенести к проектам в /home/www. Вынести туда же базы не вышло, мускуль просто не стартует. Так что думаю, как отрезать от /home 4 гигов и прилепить их к var...

playnet, 2009-12-06 в 21:06:33

=45 гигов

Wic, 2010-10-26 в 15:04:29

Спасибо большое, удачно мигрировал по этому гайду с 7,2 х86 на 8,1 амд64. Если добавить отличие конфигурации ядра разных веток то будет совсем хорошо

Хуита, 2011-04-27 в 8:42:34

полнейшая хуита.

Собираем ядро с миром х64 в любую папку и после копируем  папку boot и ядро 64 заместо того что есть, грузимся, и пересобираем мир.

Весь тот онанизм ни к чему.

ыавыа, 2011-04-30 в 4:26:04

есть только одно замечание: как автор сделал \"portupgrade -fca\", если portupgrade у него 32-х бит, а система 64-х?

weec, 2011-05-24 в 17:48:34

http://habrahabr.ru/blogs/bsdelniki/50828/

HellSentinel, 2011-06-08 в 12:36:44

А кто нибудь пробовал провернуть шутку, описанную в комментарии пользователя "Хуита"? Хотя бы теоретически это прокатить может?
P.S. не пинайте тока сильно - ну не знаю я какой спектр файлов использует фряха для запуска (изменяющихся в зависимости от платформы)

weec, 2011-06-10 в 11:27:04

пробовал, ядро загружается, но с 32-битным миром многое не работает

weec, 2011-06-10 в 14:53:39

столкнулся с проблемой - после указания нужной рутовой партиции, система монтировала партицию по умолчанию
решил проблему прописав параметр vfs.root.mountfrom в /boot/defaults/loader.conf

fantasticos, 2011-10-17 в 23:56:04

в статье ошибки, не грузится ядро подобным способом. надо там пункт один допилить

fantasticos, 2011-10-18 в 14:42:21

ошибки в /mnt/etc/fstab
# Device    Mountpoint FStype Options Dump Pass#
/dev/ad6s1b none       swap   sw      0       0
/dev/ad4s1a /           ufs    rw      1    1
/dev/ad6s1e /tmp       ufs    rw      2       2
/dev/ad6s1f /usr       ufs    rw      2       2
/dev/ad6s1d /var       ufs    rw      2       2
/dev/ad6s1a /mnt       ufs    rw      2    2
где ad4 - диск с залитой системой amd64, ad6 - диск в i386
иначе не загрузится, соответственно придется ехать к серваку

Dimon, 2012-08-17 в 8:39:08

А если просто поставить голую систему на отдельный винт, из под неё примонтировать разделы с исходной системы, далее в голой системе создать мир и ядро, установив их на исходную систему, или это всё для того, чтобы делать такие вещи удалённо?

Gamerman, 2014-01-08 в 14:24:04

А зачем 2 раза собирать ядро и мир?



 

  Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
  Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.1135 секунд
Из них PHP: 50%; SQL: 50%; Число SQL-запросов: 77 шт.
Исходный размер: 38713; Сжатая: 10640