5 дней назад я хотел было проверить какую-то мелочь, как она работает на freebsd. Машинки с виртуалками под рукой не было, но зато под рукой была флешка и коробочка с жёстким диском на usb-шнурке. На флешку был записан установочный образ freebsd-13.0 для x86_64. В bios-е компьютера "на всякий случай" был отключён контроллер дисков. И я попытался загрузиться с флешки...
Меня ждал сюр... сюрприз. Я никак не мог ожидать, что воскресная "история на полчаса" затянется на несколько вечеров.
Установочный диск freebsd меня приветствовал надписью btx halted. На тот момент я уже знал, что btx-говно, но мне ещё предстояло открыть - насколько.
Итак, традиционно, дебуг мы начинаем с убирания всего лишнего. Убираем usb-коробочку и... Установщик запускается нормально, как родной!
Тут надо бы уточнить, что у меня за система, а это материнская плата Asus P5Q-EM, она выпущена в далёком 2008-м году, то есть ей уже пошёл.. 14-й год. Но к чести Asus эта плата - живчик, никаких сбоев, глюков, странного поведения - очень удачный в плане беспроблемности экземпляр.
Вобщем, btx не завис, это значит, что проблемы вызывает именно коробочка. И коробочка у меня оказалась не то чтобы старая - это китайский полупрозрачный бокс, максимально дешёвый и работающий по интерфейсу usb-3.0. С приличными скоростями - на моём ssd мне удавалось выжать из коробаса почти 500 мегабайт в секунду на чтение и около 120-130 мегабайт в секунду на запись и, скорее всего, я упирался в производительность самого ssd. В windows и в linux этот коробас работает без нареканий - надёжно, без каких-либо сбоев. В MacOS - своя атмосфера, они там любят через некоторое время отключать usb-устройства, для экономии энергии и... возможно, там надо какие-то биты где-то ставить в device features или ещё где... вобщем, китайцы про это не знают.
Акей, одна коробочка виснет, но у меня есть другая! она по-древнее, умеет только в usb-2.0, но на плате 3.0 нету, поэтому в плане производительности мы ничего не теряем. А что с совместимостью? Btx halted. То есть, тоже самое.
Интересная история. Допустим... А может, дело тут в чипе, на котором сделана коробочка? (точнее, в драйвере, через который работает btx с такими коробчками). Для меня было открытием, но оба коробаса реализованы на чипе JMicron. Чипы сами по себе максимально дешёвые и известны тем, что умеют работать на широком спектре разных шин - pci, usb, pci-express итд, в электрическом плане относительно неприхотливые, работают устойчиво, умеют в разные режимы - в т.н. IDE-режим и в AHCI. Старая коробочка шла в комплекте с ssd Kingston в качестве т.н. migration kit. Удачная конструкция для механических дисков, они в ней не дохли, как, например, в одной из коробочек transcend (это прям death box для дисков был). И проблем с совместимостью у этого коробаса вообще никаких не было: с неё умели взлетать линуксы чуть ли не с ядром 2.6, с неё устанавливалась windows, в т.ч. в uefi-режиме (если коробас разметить в gpt, а партицию с установщиком сделать esp fat32 и запускать установщик в native uefi режиме). За новую я такого не скажу - её роль была - для создания бэкапов.
Но, довольно лирики. Что дальше? А давайте, попробуем подпихнуть usb-коробас на экране выбора вариантов загрузки инстоллера, взетит? Да, инстоллер запустился и даже удалось поставить ос на жёсткий диск в коробасе. Но... сам по себе коробас загружаться не хочет - ошибка та же "btx halted". По крайней мере, мы установили freebsd на коробочку. Что дальше?
Интернеты нам в помощь... Копание в разных форумах и на прочих сайтах результатов не дало. Мэйнтэйнеры старательно отмораживаются, проблему не признают методом не-ответа на темы с проблемами. В трекерах топики традиционно закрываются по наступлению eol очередной версии freebsd (проблема есть чуть ли не со времён freebsd-5.4, кстати), либо по истечении полугода неактивности темы. Вобщем, мэйнтэйнеры "работают в поте лица", но не в том направлении. А что сообщество? А сообщество решает эту проблему переводом мат.платы из режима BIOS в режим UEFI. Либо установкой режима контроллера из IDE в AHCI (но это помогает не всегда, видимо, у некоторых производителей AHCI=IDE, то есть баг в биосе). Но эти решения относятся к случаю, когда JMicron работает на шине PCI или PCI-Express. А у меня - USB и там даже нет выбора между IDE и AHCI режимами. Да и сама по себе мат.плата слишком старая, тогда efi, конечно, уже придумали, но внедрение этой технологии началось как минимум лет через 5 после выпуска мое мат.платы.
Ладно, а как вам теория, что может быть получится взлететь на другой freebsd? Их же там на сегодня 2 штуки - 13.0 и 12.3. Ставим аналогичным образом 12.3 (кстати, в отличие от 13-й, 12-я обнаружила wifi-сеть, а 13-я - только wifi-свисток и ни одной сети). Результат предсказуемо тот же - btx halted. Но попробовать стОило.
Давно тому назад, был такой проект Debian/kFreeBSD - они грузили ядро freebsd с помощью grub-а. Не сильно популярный метод в стане BSD-шников, по религиозным соображениям, они там не любят всё, что GNU GPL licensed, а grub как раз такой. В дереве портов его регулярно помечают как unmaintained. Якобы, туда коммиты происходят чуть ли не раз в несколько лет, а связано это с тем, что grub работает и исправлять в нём особо нечего, но любителям посмотреть на количество коммитов традиционно насрать, они меряют работоспособность программ в регулярности коммитов.
Итак, давайте, попробуем загрузиться через grub. Гуглим загрузку freebsd через grub. Выскакивают советы, как организовать chainboot того же btx-а. Но нас это не волнует, всё что делает btx в случае chainboot - выдаёт уже знакомое нам "btx halted". Находим пример menuentry, в котором кому-то удалось загрузить через grub ядро и далее систему freebsd.
Казалось бы решение найдено, ура! Копируем сниппет к себе. А у меня на системе установлена система Slackware-15.0 и там почти ванильный grub-2.06. Надо исправить местоположение root-а, ставим другой девайс, вроде всё выглядит цивильно... запускаемся, выбираем нашу фряху и... лампочка на usb-коробочке замигала, экран почернел, проходит 10-15 секунд... загружается стартовый экран bios-а.
Произошёл reboot. Вопрос - на каком этапе? это grub сдох или ядро freebsd?
К сожалению, такой конкретики мне выяснить не удалось. Однако, в интернетах нашёлся Super Grub2 Disk. Это загрузочный диск, на котором grub настроен таким образом, что может авто-находить и пытаться загрузить разные ОС с дисков. В моём случае, он нашёл все ядра, найденные через slackware grub, а также исталляцию freebsd. Menuentry для первого пункта загружало именно ядро freebsd, а не делало chainboot btx-а. Рискнём.
И super grub2 disk таки загрузил freebsd с usb-коробочки! система запустилась, нашла сеть, мне удалось залогиниться с тем логином и паролем, которые я задал при установке freebsd, то есть это прям оно.
Осталось... воспроизвести результат в slackware. Но не тут-то было. На slackware grub отказывался грузить menuentry, скопированный с sg2d. Симптомы те же: чёрный экран, лампочка на коробочке несколько раз мигает (больше 10 раз), а потом перезагрузка.
Попробуем спереть grub с sg2d. Просто ради эксперимента. На slackware у нас grub-2.06, на sg2d - grub-2.04. Своровать надо всё содержимое /boot/grub/i386-pc. Впрочем, сказать проще, чем сделать. В sg2d нету файла /boot/grub/i386-pc/kernel.img, а это основной файл операционной системы grub2. Может, он там где-то в другом месте запрятан, но там не так-то и много укромных уголков. Впрочем, при большом желании, можно его заныкать в качестве boot diskette image, в область, куда это хозяйство прячется по стандарту el-torito.
Проще взять такой же grub из deb-пакета ubuntu, например, из grub-pc-bin_2.04-1ubuntu26.15_amd64.deb там есть целиком весь каталог i386-pc с полным набором нужных файлов... Распаковал, забэкапил одноимённый каталог в /usr/lib64/grub, подложил новый, сделал
grub-install /dev/sda
grub-mkconfig -o /boot/grub/grub.cfg
И наступил момент истины, выключаем пеку, подтыкаем usb-коробочку, включаем. Выбираем FreeBSD 12 и вуа-ля, система загрузилась.
Таким образом у нас оказался не только сломанный btx, но и сломанный стоковый grub в slackware-15.0. Но в итоге нам удалось это как-то починить.
Но, к сожалению, я уже забыл, что хотел посмотреть во фряхе 🙁
В post mortem спешу отметить, что я таки собрал на slackware-15.0 grub-2.06 со всеми патчами из ubuntu-22.10 и оказалось, что grub не работает и там тоже, во всяком случае для загрузки kfreebsd в её родной среде обитания.