*BSD

индекс
131,42

FreeBSD 7.1 — i386 -> amd64 migration via SSH only :)

Есть сервер, который находится в датацентре в г. Москва. Есть я, который находится в уездном городе N™ :-) Единственный доступ к серверу — SSH и Remote PDU для перезагрузки.

Появилась нужда перейти на FreeBSD amd64, за одно обновив ПО и пересобрав ядро.

Что было до:
FreeBSD hostname FreeBSD 7.1-RELEASE i386.

Что стало после:
FreeBSD hostname FreeBSD 7.1-RELEASE amd64.



Short disclamer:
  • Вы все делаете на свой страх и риск.
  • Я не советую так делать. Правда. Если есть возможность приехать или заказать KVM и поставить систему как обычно — лучше поставить как обычно. Установка-настройка FreeBSD занимает пару часов, а на эту «процедуру» (включая чтение манов и издевательство над гуглом) у меня ушло почти два дня.
  • Использовались материалы с FreeBSD.org, OpenNet.ru, lissyara.su. Ну и гугл, куда без него.


Примем за основу:

FreeBSD 7.x i386.
Наличие двух HDD (или разделов).

Для начала нам нужны полные исходники системы и ядра (каталог /usr/src/). Установить их можно через CVSup (директива src-all), либо через sysinstall (sysinstall -> Distribution -> src).

В принципе, весят исходники не много и качаются быстро.

После этого мы должны создать новый конфиг ядра для нашей системы.

cp /usr/src/sys/amd64/conf/GENERIC ~/<название_ядра>
ee <название_ядра>


Опции ядра зависят от ваших задач и железа, свои здесь приводить не буду. Единственное, что советую добавить от себя —

options IPFIREWALL_DEFAULT_TO_ACCEPT


Это пригодится, т.к. в новой системе на момент первого старта не будет в том числе и конфигураций ipfw (а по умолчанию он блокирует все, в т.ч. наш SSH). Я так попал :) Пришлось отправлять сервер в ребут и переносить конфигурацию.

После того, как закончим настройку ядра — «устанавливаем» наш конфиг обратно путем копирования. Главное не забыть, что берем и ставим мы конфиг не в sys/i386, как обычно, а sys/amd64.

Я лично убрал из /etc/make.conf все «лишние» опции, которые могли помешать компиляции — оптимизацию и т.д, чего и вам советую.

После этого нужно собрать мир:

cd /usr/src/
make -s buildworld TARGET_ARCH=amd64


И ядро:

make -s buildkernel TARGET_ARCH=amd64 KERNCONF=<имя_ядра>


Ключем -s мы говорим make, что не нужно выводить каждый файл, только называния каталогов, которые он собирает.
Вся процедура у меня (C2D E7200) заняла примерно два — два с половиной часа.

Далее будем считать, что наш второй HDD — примонтирован в /backup/, который чист.

Устанавливаем мир:
make -s installworld TARGET_ARCH=amd64 DESTDIR=/backup/

Устанавливаем ядро:
make -s installkernel TARGET_ARCH=amd64 DESTDIR=/backup/ KERNCONF=<имя_ядра>

Устанавливаем конфигурационные файлы и пр. мелочь:
cd etc/
make -s distribution DESTDIR=/backup/


На этом шаге могут возникнуть проблемы с недостатком каких либо конф. файлов (лично у меня — ругалось на sendmail и sshd). Их можно просто скопировать из рабочей системы.

Перетаскиваем ядро:

cp -pr /backup/boot/kernel /boot/kernel.test

И редактируем\переносим конфиг. файлы в /backup/etc. Нам интересны rc.conf (хостнейм, сетевые настрйки), sshd_conf и passwd-shadow. Если вы не ставили default_to_accept, не забывайте открыть себе SSH в rc.firewall.

Пришло время пробовать.

Для разовой загрузки в новую систему мы будем использовать nextboot. Это очень хорошая программа, которая позволяет загрузится с другим ядром\миром ОДИН раз. Если сервер будет перезагружен — снова загрузится наша старая система.

nextboot -D
nextboot -o vfs.root.mountfrom=ufs:/dev/ad2s1d -k kernel.test

Ключ -D сбрасывает конфигурацию nextboot, если она уже была. -o vfs.root.mountfrom указывает, где находится корневой раздел. Естественно, вместо ad2s1d должен быть указан ваш второй диск\раздел, а не мой, а -k — путь к ядру относительно /boot/.

Последний чеклист:



  • Проверим, установлен ли мир и ядро в правильные места.
  • Проверим, перенесли ли конфигурационные файлы SSHd, rc.conf, passwd, shadow…
  • Проверим, перенесли ли настройки сети — resolv.conf, IP-alias-ы (если были), опять-же rc.conf
  • Проверим, перенесен и исправлен ли /etc/fstab под новую систему.
  • Проверим наличие и содержимое /boot/nextboot.conf
  • Помолимся (в зависимости от религиозности).


Если все пункты выполнены — sudo shutdown -r now

Если вы все сделали правильно, а еще вам немного повезло и система не выкинула финт ушами — мы увидим работающую amd64 FreeBSD :)
Если же не увидели ее в сети через несколько минут — перезагружаем сервер через удаленное управление питанием и ищем, где мы ошиблись :)

Осталось только пересобрать все нужное Вам ПО.
+32
2 февраля 2009, 21:54
19

комментарии (17)

0
jean #
А не проще настроить на виртуальной машине и залить образ прямиком на хард?
+3
differentlocal #
Проще, но не всегда лучше.

1) Трафик. И со стороны сервера, и со стороны собирающего. Голый world+kernel у меня вышел на 300 метров (что не предел, я кое-что обрезал), + исходники, + ПО. Плюс ISO дистрибутива для установки на виртуалку. Итого выйдет не мало, да и анлим — не у всех.

2) Ресурсы. На обычном десктопе (а у меня и вовсе — ноутбук, хоть и мощный) эта процедура займет уже не два часа, а изрядно больше. А если еще виртуалка, которой отдали не все ресурсы машины...?

3) Да и просто интересная задача :)
0
Jekel #
Видел в туториал как сделать такой финт только новый устанавливая новый мир в своп ;) бут с него и сборка нового мира и установка по путям основной ОС
mirrorbox.livejournal.com/236227.html
+4
Recluse #
Буквально на днях экстремальным способом (далеко ехать, если что) обновлял фрю с кучей установленных портов с 7.0 до 7.1. После прочтения статьи руки чешутся перейти на х86_64 <_<, благо, машинка позволяет.
Это ж провокация :)
+4
ivlis #
Мужик! :)
+2
MaoDzeDun #
ха!
я, будучи в Киеве, удаленно перевел 3 машины с Генту на Фряху 7
и, да, доступен был только SSH.
Никаких PDU
0
Veshij #
пруфлинк? :) А то не поверим.
+1
MaoDzeDun #
да легко!
www.freebsd.org/doc/en/articles/remote-install/index.html
делал по этой штуке все 3 сервера
это был очень хороший, но нервный экспириенс
0
AstonMartin #
ниндзя блин =))
0
neiromancer #
я бы щё щедуллер поменял на ULE, на многоядерности даёт существенный рост производительности
0
differentlocal #
options SCHED_ULE # ULE scheduler

По-умолчанию :)
0
egorinsk #
> Я лично убрал из /etc/make.conf все «лишние» опции, которые могли помешать компиляции — оптимизацию и т.д, чего и вам советую.

А по моему так gcc (или какой там у вас компилятор) и с оптимизацией то не ахти какой код выдает, а без оптимизации — вообще плохой.
0
differentlocal #
Здесь каждый решает сам, что ему важнее :)
Я единожды насмотревшись на дивные глюки с оптимизацией предпочитаю на боевых серверах ее отключать. Во всяком случае — на ядро и мир… Выигрыш там минимален, а вот головной боли может быть много.
0
redchrom #
Не знаю как сейчас, но во времена FreeBSD 6 по дефолту был -O2
0
differentlocal #
И сейчас по дефолту — -О2. Я и не советовал дефолты трогать — только то, что ручками добавлено в make.conf (-O3 например).
0
gladchenko #
Я лично при построении своего /etc/make.conf ориентируюсь на /usr/share/examples/etc/make.conf.
Ну и про /etc/src.conf тоже забывать не стоит: как минимум WITHOUT_RCMDS=, WITHOUT_PROFILE=, WITHOUT_INET6= и еще с десяток строк из src.conf(5) до начала построения мира у меня в нём обязательно прописано.
0
feci #
спасибо, весьма полезно)

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.