Установка FreeBSD методом crossbuild


Возможно, сегодня уже не так проблематично скачать установочную болванку (около 650 Мб), но бывают ситуации, когда такой возможности нет.

Моя ситуация: привезли рабочую станцию. Ставлю FreeBSD. В момент запуска BIOS выдал надпись: EM64T supported.

Думаю, а чего бы и не сделать себе полноценный 64-bit WorkStation (мало ли, пользы вообще-то в делах администрирования никакой, но ради
эксперимента - сойдет). Под рукой оказался только собранный дома диск с 6.0-RELEASE-p4 FreeBSD/i386. Поставил ее. Посмотрел, что пишут в
Makefile.

Там написано, что можно и crossbuild сделать, никто не запрещает. Вот, думаю им и займусь.

Соответственно, последовательность такой сборки должна быть такой:

#make buildworld TARGET_ARCH=amd64
#make buildkernel TARGET_ARCH=amd64

(поскольку для линковки ядра под отличающуюся от `uname -m` архитектуру будут использоваться библиотеки соответствующей целевой архитектуры, то, их сначала и собираем)

Всё это собралось. Далее, метод проб и ошибок: Нельзя:

#make installworld TARGET_ARCH=amd64

т.к. в процессе установки заменяются некоторые важные библиотеки, в том числе /libexec/ld.elf.so, которые при дальнейших запусках любых
приложений будут требовать ядра, собранного под amd64, а перезапуск делать пока что рано). Однако, "#make installkernel TARHET_ARCH=amd64"
уже можно сделать.

Был найден такой способ решения проблемы установки world'а:

Для начала устанавливаем мир в некоторый отличный от / каталог:

#make installworld TARGET_ARCH=amd64 DESTDIR=/usr/local/amd64

Затем, архивируем его tar'ом (для упрощения дальнейшего переноса этого всего в /)

#cd /usr/local/amd64 && tar cf /usr/local/world_amd64.tar *

И только теперь позволим себе перезагрузиться. При перезагрузке ставим в привод наш исходный установочный i386-диск и грузимся с него.

В запустившемся при запуске с диска sysinstall в пункте FixIt запускаем live-систему:

FixIt->Live filesystem->CD-ROM

Далее, придется вспомнить, какой диск был целевым при первоначальной установке системы на жесткий диск, если таковых было несколько.

Если же жесткий диск один (или же установленных *BSD на дисках до сих пор не было), то легко это выяснить:

# ls /dev/ad*s*a
/dev/ad0s1a

В моём случае это оказался ad0, причем на 1-м слайсе, корневая файловая система на разделе a

Его и монтируем:

# mount /dev/ad0s1a /mnt

Переходим в mnt и выясняем какие еще файловые системы и на какие каталоги монтировались при установке:

# cd /mnt && cat etc/fstab
# Device Mountpoint FStype Options Dump Pass#
/dev/ad0s1b none swap sw 0 0
/dev/ad0s1a / ufs rw 1 1
/dev/ad0s1e /tmp ufs rw,noexec 2 2
/dev/ad0s1f /usr ufs rw 2 2
/dev/ad0s1d /var ufs rw,noexec 2 2
/dev/acd0 /cdrom cd9660 ro,noauto 0 0

Здесь нам понадобятся:

/usr и /var

монтируем их (напоминяю, cwd у нас до сих пор - /mnt, куда смонтирован корневой раздел установленной уже на диск системы):

# mount /dev/ad0s1f usr
# mount /dev/ad0s1d var

Всё. Теперь можно распаковывать имеющийся архив world'а (ядро мы уже установили ранее), однако, установщик, равно как и installworld, ставят
на некоторые каталоги (из mtree) и файлы системный флаг schg, который не позволяет производить никаких изменений в соответствующих каталогах/файлах, и его надо будет с них предварительно снять:

# chflags -R noschg *
# tar -xfp usr/local/world_amd64.tar

tar, кстати, эти флаги на файлах восстановит, останется только kernel, в принципе, если используется не GENERIC - то после пересборки все равно скрипт установки флаги установит, если же GENERIC - не грех и снова пересобрать, благо на таких системах этот процесс не такой уж и долгий (10-20 минут максимум).

Всё. На этом можно считать crossbuild-установку системы завершённой.

#exit

В окне sysinstall'а просто выходим из установщика, он перегрузит машину.
Теперь можно смело грузиться с жесткого диска. Система и ядро у нас теперь полноценные amd64:

# uname -m
amd64

Ну, при желании, можно удалить всё из /usr/obj, /usr/local/amd64 и собственно архив world'а:

# rm -Rf /usr/obj/*
# chflags -R noschg /usr/local/amd64 && rm -Rf /usr/local/amd64 /usr/local/world_amd64.tar

PS: Есть только один момент: порты у меня были предновогодние, может быть, сегодня ситуация и исправлена, но при запуске сборки cvsup из
портов получил сообщение следующего содержания (в переводе): "CVSup не поддерживает запуск в графическом режиме при сборке под 64-хбитную платформу. Компилирую без графического интерфейса."

Мне лично это не страшно, но есть подозрения, что это не единственный порт, не дружащий в графике с 64-bit. Возможны казусы в дальнейшем, но это отдельная история.

PPS: Указанный метод установки подходит в принципе для любой архитектуры при условии, конечно, что исходный установочный диск собран под поддерживаемую Вашим процессором архитектуру.

Обновлено: 12.03.2015