Pull to refresh

Comments 57

PinnedPinned comments

Очень интересная статья. Хорошо и подробно всё описано. Наверное, одна из лучших технических статьей года будет на Хабре как на мой взгляд)

Я на своём старом imac7,1 тоже мучился с установкой разных систем: altLinux, Windows 8.1, Mac OS X. Думал тоже для коллекции ещё поставить FreeBSD. Но руки не дошли. Правда и EFI-прошивка у меня сразу 64-битная. А rEFInd - да, очень упрощает жизнь.

Странно, что у вашего MacBook-a до сих пор DVD-привод читает диски. У моего iMac давно перестал читать. У них вроде как со временем лазер слабеет.

Почему каждый раз нужно запускать fsck я вот не понял? UFS не умеет в журналирование?

И странно, что переключение раскладок вы настроили в XFce. Традиционно это в xorg конфигах делают.

То, что вы поучаствовали в разработке FreeBSD — это круто, у меня вызывает серьёзное уважение!)

Для меня тоже удивительно, что 64-битный режим оказалось быстрее. Сам сижу на 32-битной altLinux p10 до сих пор на своём старом Pentium D который на LGA775. Но последние дистрибутивы Linux совсем плохенько поддерживают 32бита похоже. Регулярные segfault-ы, в том числе и в драйверах файловых систем в ядре.

И сложность статьи, на мой взгляд, граничит между «средней» и «высокой»;)

А почему решили накатить именно FreeBSD, а не GNU\Linux?

Потому что могу. :)

Но честно говоря, Linux (а этого добра у меня тоже есть) последних лет превратился в кучу очень плохо пахнущей субстанции. Вот, что лично меня напрягает в Linux-ах:

  1. Постоянные революционные изменения в системе администрирования. Не успеешь привыкнуть к одному набору тулов и конфигов, как в следующем релизе завозят новый. Инструкции и мануалы стремительно устаревают.

  2. Systemd.

  3. Попытки затащить Rust в ядро и переписать все системные тулы на этом убогом языке с очень ограниченным кругом умельцев.

  4. Wayland и попытки убить X11.

  5. Повальная контейнеризация.

  6. Раздувание софта. Требования к памяти и вычислительным ресурсам стремительно растут без особой необходимости.

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

Так у freebsd тоже полно планов на развитие, в том числе и свой аналог systemd, да и rust они вроде добавили в базовую систему.

Так у freebsd тоже полно планов на развитие, в том числе и свой аналог systemd,

Ну как разовьют, будем переползать на OpenBSD.

да и rust они вроде добавили в базовую систему.

rz@horizon:~ % uname -a
FreeBSD horizon 14.3-RELEASE FreeBSD 14.3-RELEASE releng/14.3-n271432-8c9ce319fef7 GENERIC amd64

rz@horizon:~ % rustc
rustc: Command not found.

Покаместь этой инфекции не замечено.

Там это тоже будет, думаю. Так что удачи с переползанием на netbsd. Только не пойму все же, в чем проблема. Вас же не заставляют на расте писать.

Я препочитаю иметь возможность читать исходники и править баги (или хотя бы делать баг-репорты, так чтобы их оперативно исправляли). Если часть системы будет написана на Rust, то мне это уже будет не доступно и я от такой системы избавлюсь.

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

Хотя там по большей части были кривые конфиги, сам код на си не правил. Но не вижу проблем так править код на расте. Это же не переписывание проекта с нуля.

На самом деле, я ещё не видел дистрибутивов линукса, которые в своей дефолтной инсталляции тащат с собой rustc. Да что уж там, хватает дистрибутивов, которые и gcc/clang не приносят. Так что наличие/отсутствие rustc не является показателем использования Rust в ядре или в стандартных утилитах

В статье я описывал, что занимался сборкой ядер, драйверов и системных приложений для FreeBSD, у меня установлены ВСЕ необходимые для этого тулы. rustc среди них пока что не замечен, кода на Rust в ядре нет! (три раза сплюнул)

По первому пункту полностью согласен.

А чем системд не нравится?

Странно что минусуют, мне тоже интересно стало. Не в смысле "какого хрена" а в смысле "почему Фря?"

Да я не могу уже T_T Стоит только выйти в +1 по карме и иметь возможность лайкать посты/комменты, как тут же получаю за шиворот минусы, хотя вроде общаюсь вежливо и совсем глупости не пишу.

Прошу прощения за нытье, но душа болит, щито поделать

Так Вы напишите пару интересных статей в песочницу, и желательно без нейрослопа. И будет Вам кармы хоть на рынке торгуй. :)

Однако разработчики современных ОС либо игнорировали этот режим, либо считали, что загружаясь через MBR (режим CSM), ОС должна работать только в 32-х битном режиме.

Вот тут не очень понятно. На моём старом нетбуке с классическим BIOS и MBR нормально взлетают более-менее свежие 64битные Ubuntu и NetBSD (через grub). На системе с 32битным UEFI через CSM такое не сработает?

Классический 32-х битный загрузчик запускаемый из MBR не может стартовать 64-х битное ядро если его специально этому не обучили. Поддержка заргузки 64-х битного ядра Linux на 32-х битном UEFI появилась не сразу, а только после того как пропатчили GRUB. На счет NetBSD ничего не знаю, видел эту ОС последний раз году в 2000-ом. Во FreeBSD 32-х битный UEFI загрузчик завезли пару месяцев назад. Классический boot0-boot1-boot2 умеет стартовать только 32-х битное ядро.

То есть 64битная FreeBSD не загрузится на системе с классическим BIOS без UEFI?

Какое то странное исключение. На том же нетбуке у меня ещё 64битные Haiku и 9front, тоже без проблем грузятся по классической схеме (real-mode код в бут секторе, который grub подхватывает через chainloader). И какое то время компы с 64битным процессором и классическим BIOS были не такой уж редкостью.

PS Вот тут FreeBSD даже с ZFS ставят на систему c legacy BIOS и MBR.

Не даже, а специально! :-)

В этой инструкции используют специальный загрузчик zfsboot, он умеет. Классический - не умеет. Но ZFS на такой древнючей машине лучше даже не пытаться.

Да, есть помежуточные загрузчики (Boot Manager-ы), об одном из них (rEFInd) я написал.

Даже не знаю как ответить. Никогда таких проблем не испытывал. Обычная установка с usbflash со стандартным установочным образом. Правда устанавливал еще 12.4, потом freebsd-update.

MB SuperMICRO X8DT3-F, UEFI в BIOS даже не пахнет.

# uname -a
FreeBSD xxx.xxx 14.3-RELEASE-p7 FreeBSD 14.3-RELEASE-p7 GENERIC amd64

# cat /var/run/dmesg.boot | grep mount\ root

Trying to mount root from zfs:zroot/ROOT/default []...

# zpool list -v zroot

NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
zroot 294G 270G 24.2G 33.4G - 72% 91% 1.00x ONLINE -
da8p3 294G 270G 24.2G 33.4G - 72% 91.8% - ONLINE

# gpart show da8

=> 40 5859352496 da8 GPT (2.7T)
40 1024 1 freebsd-boot (512K)
1064 984 - free - (492K)
2048 4194304 2 freebsd-swap (2.0G)
4196352 616763392 3 freebsd-zfs (294G)
620959744 5238392792 4 freebsd-zfs (2.4T)

Короткий ответ: zfsboot.

Да, загрузка с ZFS возможна через BIOS, но не на макбуке 2008-го года с 2ГБ ОЗУ. Даже если попытаться это сделать, я совсем не уверен в том, что там не выползут проблемы аналогичные тем, которые всплыли в loader_ia32.efi.

С этим я и не пытался спорить.

Вы ответили на

>То есть 64битная FreeBSD не загрузится на системе с классическим BIOS без UEFI?

>>Именно так.

Я возразил.

Я был слишком категоричен. :)

Именно так.

Нет. FreeBSD amd64 нормально ставится на машины без UEFI с разметкой диска с MBR. Ей для этого не нужена специфически ZFS с её загрузчиком, можно и с UFS поставить.

У меня есть старенький комп с Атлоном и без UEFI, я попробую на него поставить 64-х битную фрю на MBR. На MacBook-е это не заработало, я пробовал ставить 15.-RELEASE/amd64 и в GPT, и в MBR.

Это "тазик на линуксе" с материнкой ASUS M2NPV-VM и камнем AMD Athlon 64 прямо сейчас (нет там никакого UEFI, это машина 2006 года):

# dmesg -a

CPU: AMD Athlon(tm) 64 Processor 3800+ (2405.09-MHz K8-class CPU)

# uname -a

FreeBSD gateway 14.3-RELEASE-p7 FreeBSD 14.3-RELEASE-p7 GENERIC amd64

# gpart show ada0

=> 63 234441585 ada0 MBR (112G)
63 1 - free - (512B)
64 234441584 1 freebsd [active] (112G)

# fdisk

WARNING: fdisk is deprecated and is not available in FreeBSD 15 or later.
Please use gpart instead.

******* Working on device /dev/ada0 *******
parameters extracted from in-core disklabel are:
cylinders=232581 heads=16 sectors/track=63 (1008 blks/cyl)

Figures below won't work with BIOS for partitions not in cyl 1
parameters to be used for BIOS calculations are:
cylinders=232581 heads=16 sectors/track=63 (1008 blks/cyl)

Media sector size is 512
Warning: BIOS sector numbering starts with sector 1
Information from DOS bootblock is:
The data for partition 1 is:
sysid 165 (0xa5),(FreeBSD/NetBSD/386BSD)
start 64, size 234441584 (114473 Meg), flag 80 (active)
beg: cyl 0/ head 1/ sector 2;
end: cyl 1023/ head 255/ sector 63

# mount
/dev/ada0s1a on / (ufs, local, noatime, soft-updates)

Я кое-что протестировал и вот что обнаружил. Старая машинка у меня всё же оказалась с UEFI, c 32-х битным, в ней AMD E-350 где-то 2011 года. Так вот, при попытке установить 64-х битную FreeBSD 15.0-RELEASE в раздел MBR, фрюшный Инсталлер добросовестно предупреждает, что загружаться система НЕ будет:

Фото 1

И действительно, после завершения установки и перезагрузки, от BIOS вывалило следующее сообщение:

Фото 2

То есть возвращаясь к изначальному вопросу пользователя @unreal_undead2 , ответ следующий: 64-х битная FreeBSD на 32-х битном и на 64-х битном UEFI в режиме BIOS (CSM) не загружается!

А вот с GPT таблицей разделов - очень даже загружается! Но как я отмечал в статье, старые макбуки не распознают диск с таблицей GPT как загрузочный! Поэтому, выходов у меня было два: либо ставить 32-х битную FreeBSD, либо патчить загрузчик loader_ia32.efi чтобы установить 64-х битную. Я проделал оба варианта.

Как ведет себя 64-х битная FreeBSD на машинах без UEFI я пока проверить не могу. Но я потратил некоторое время на чтение исходных кодов загрузчиков, которые используются при старте из MBR, и я пока НЕ вижу там кода "трамплина" для перехода в "long mode" (64-х битный режим). Там есть код перехода в 32-х битный "Protected Mode" - но это позволяет стартовать только 32-х битные ядра. Определенно есть какой-то нюанс, я попытаюсь в нем разобраться.

А вот с GPT таблицей разделов - очень даже загружается!

Не очень понятна связь формата разделов (GPT/MBR) и загрузки 64битного ядра. Какой загрузчик переводит процессор в 64битный режим при использовании GPT?

я пока НЕ вижу там кода "трамплина" для перехода в "long mode" (64-х битный режим)

elf64_exec здесь - не оно?

Для загрузки с GPT используется отдельный загрузчик gptboot, он имеется в двух вариантах для UEFI и для BIOS.

Функция elf64_exec() это трамплин, её вызов присутствует в нескольких загрузчиках, в том числе в UEFI, gptboot, userboot, но её вызова нет из boot1-boot2 (MBR загрузчик). Код boot1, boot2 и BTX весь 32-х битный. Этот загрузчик хорошо задокументирован - есть большая с статья с описанием в Handbook-е. Про устройство остальных загрузчиков информации мало, надо изучать код.

Что такое userboot мне пока не понятно.

Да, возможно userboot это не то - создаётся впечталение, что он используется в гипервизоре (Bhyve) и загрузке ядра из живой системы (kload). Но для стандартной загрузки по доке понял, что boot2 грузит /boot/loader , и он уже грузит ядро и передаёт ему управление - но где конкретно в коде /boot/loader переход на код ядра (где должен быть трамплин), сходу не вижу.

Согласно статье в Handbook-е, boot2 состоит из следующих частей: boot2 релокатора, BTX-клиента и BTX-сервера. Переход в защищенный режим прозводиться в BTX сервере - он работает в 0-м кольце. Сервер нужен для возврата в 16-ти битный режим и вызова функций BIOS. BTX-клиент работает в 3-м кольце, он загружает загрузчик четвертой стадии /boot/loader. А этот уже загружает и запускает ядро. Это только часть схемы для MBR. Для других вариантов загрузки все подругому. Я нагуглил статью про процессы загрузки FreeBSD, пытаюсь из неё что-то понять.

Вот, кстати, все схемы по стадиям:

Схемы загрузки FreeBSD
BIOS/ MBR/UFS

  +-> MBR from 'Boot Device' BIOS disk          | MBR
    +-> boot0                                   | STAGE 0
      +-> boot1                                 | STAGE 1
        +-> boot2                               | STAGE 2
          +-> loader                            | STAGE 3
            +-> kernel                          | KERNEL
              +-> init                          | INIT

BIOS/ MBR/ZFS
  +-> MBR from 'Boot Device' BIOS disk          | MBR
    +-> boot0                                   | STAGE 0
      +-> boot1                                 | STAGE 1
        +-> zfsboot         | STAGE 2
          +-> zfsloader    | STAGE 3
            +-> kernel                          | KERNEL
              +-> init                          | INIT

BIOS/ GPT/UFS
  +-> GPT from 'Boot Device' BIOS disk          | GPT
    +-> pmbr                                    | STAGE 0
      +-> gptboot                               | STAGE 1 + STAGE 2
        +-> loader                              | STAGE 3
          +-> kernel                            | KERNEL
            +-> init                            | INIT

BIOS/ GPT/ZFS
  +-> GPT from 'Boot Device' BIOS disk          | GPT
    +-> pmbr                                    | STAGE 0
      +-> gptzfsboot                            | STAGE 1 + STAGE 2
        +-> zfsloader (analogous to loader)     | STAGE 3
          +-> kernel                            | KERNEL
            +-> init                            | INIT

UEFI/GPT/MBR/UFS/ZFS
  +-> GPT/MBR from 'Boot Device' BIOS disk      | GPT/MBR
    +-> UEFI                                    | STAGE 0
      +-> boot1.efi (/efi/boot/boot${ARCH}.efi) | STAGE 1 + STAGE 2
        +-> loader.efi                          | STAGE 3
          +-> kernel                            | KERNEL
            +-> init                            | INIT

UEFI/GPT/MBR/UFS/ZFS (13.0 and later)
  +-> GPT/MBR from 'Boot Device' BIOS disk      | GPT/MBR
    +-> UEFI                                    | STAGE 0
      +-> loader.efi (/efi/FreeBSD/loader.efi)  | STAGE 1-3
        +-> kernel                              | KERNEL
          +-> init                              | INIT

Трамплин на переход в "long mode" (64 бит) действительно находится в /boot/loader, я нашел как это выглядит.

/boot/loader является 32-х битным приложением, у него есть конфигурационный массив struct file_format *file_formats[] который заполнется указателями на функции загрузки и исполнения ELF модуля (или ядра) для различных архитектур:

struct file_format *file_formats[] = {
        &multiboot,
        &multiboot_obj,
#ifdef LOADER_PREFER_AMD64
    &amd64_elf,
    &amd64_elf_obj,
#endif
    &i386_elf,
    &i386_elf_obj,
#ifndef LOADER_PREFER_AMD64
    &amd64_elf,
    &amd64_elf_obj,
#endif
    NULL
};

В свою очередь amd64_elf это структура с двумя указателями на функции загрузки и исполнения:

struct file_format amd64_elf = { elf64_loadfile, elf64_exec };

А elf64_exec это указатель на функцию которая содержит вызов трамплина amd64_tramp().

Получается, что /boot/loader загруженный через MBR может запускать 64-х битные ядра.

Осталось выяснить, почему схема boot0->boot1-boot2->loader не срабатывает в режиме совместимости BIOS (CSM).

Так вот, при попытке установить 64-х битную FreeBSD 15.0-RELEASE в раздел MBR, фрюшный Инсталлер добросовестно предупреждает, что загружаться система НЕ будет:

У меня такое ощущение, что вы ZFS пытаетесь накатить в MBR и загрузиться с него потом. Оно там сломано еще со времен 13.1 и никто не чинит.

У меня такое ощущение, что вы ZFS пытаетесь накатить в MBR

Нет. ZFS, кстати, надо будет попробовать.

Интересно. Даже не подозревал, что привычного BIOS Setup у этих машин нет.

Даже теперь захотел закончить свои опыты с установкой альтернативных ОС на iBook G4, который ещё на PPC. Там, правда, с производительностью по нынешним меркам всё довольно так себе, увы.

На сколько я помню на PPC Маках нет BIOS, там своя кухня под названием "Open Firmware".

Да, оно. Но там интерфейс всё ещё удобнее кучи сочетаний клавиш, там командная строка открывается.

Автор претендует на звание: «маньяк Года» :)

Наконец-то нормальная техническая статья на habr-е

Аффтор жги исщё:)

Можно было бы не мучиться с яблочным UEFI, а поставить Canoeboot (тык), который на этом ноуте можно прошить даже без программатора.

Однако есть претензии по качеству Coreboot в целом. Мой MacBook 2,1, с которым я некоторое время ходил, работал довольно-таки хорошо (для такого извращенца, как я), за исключением проблемы с перегревом и сломанных аудио-портов (наушники определялись, но звук продолжал идти на динамики). Но сам ноутбук имел пожелтевший корпус, и при вскрытии было большое количество какой-то коричневой пыли, так что, быть может, проблема в предыдущих владельцах.

И ещё: в Coreboot нет того самого бесящего звука, который никак отключить в яблочной прошивке.

нет того самого бесящего звука

Вот этого "Дыннннь" при запуске?

Очень интересная статья. Хорошо и подробно всё описано. Наверное, одна из лучших технических статьей года будет на Хабре как на мой взгляд)

Я на своём старом imac7,1 тоже мучился с установкой разных систем: altLinux, Windows 8.1, Mac OS X. Думал тоже для коллекции ещё поставить FreeBSD. Но руки не дошли. Правда и EFI-прошивка у меня сразу 64-битная. А rEFInd - да, очень упрощает жизнь.

Странно, что у вашего MacBook-a до сих пор DVD-привод читает диски. У моего iMac давно перестал читать. У них вроде как со временем лазер слабеет.

Почему каждый раз нужно запускать fsck я вот не понял? UFS не умеет в журналирование?

И странно, что переключение раскладок вы настроили в XFce. Традиционно это в xorg конфигах делают.

То, что вы поучаствовали в разработке FreeBSD — это круто, у меня вызывает серьёзное уважение!)

Для меня тоже удивительно, что 64-битный режим оказалось быстрее. Сам сижу на 32-битной altLinux p10 до сих пор на своём старом Pentium D который на LGA775. Но последние дистрибутивы Linux совсем плохенько поддерживают 32бита похоже. Регулярные segfault-ы, в том числе и в драйверах файловых систем в ядре.

И сложность статьи, на мой взгляд, граничит между «средней» и «высокой»;)

Очень интересная статья. Хорошо и подробно всё описано. Наверное, одна из лучших технических статьей года будет на Хабре как на мой взгляд)

Спасибо, что нашли время прочитать.

Странно, что у вашего MacBook-a до сих пор DVD-привод читает диски. У моего iMac давно перестал читать. У них вроде как со временем лазер слабеет.

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

Почему каждый раз нужно запускать fsck я вот не понял? UFS не умеет в журналирование?

В файловой системе UFS есть такая фича как Soft Update - это альтернатива журналированию, имплементированная Кирком МакКузиком еще в 1999 году. Soft Updates работает существенно быстрее чем журналирование, но со своими особенностями - не все сбои разрешимы. С версии 9.0-RELEASE появилось настоящее журналирование (по умолчанию отключено), но оно существенно увеличивает количество записей на диск и на SSD его лучше не применять. fsck -f -y подчищает всякий мусор и гарантирует, что в момент монтирования на read-write файловая система будет полностью consistent. Если эту команду не делать при загрузке, то файловая система всё равно будет рабочей, но с некторыми inconsistencies, они могут накапливаться и если сбои по питанию пойдут один за другим, то файловая система сломается и тогда уже придется применять более серьезные средства.

И странно, что переключение раскладок вы настроили в XFce. Традиционно это в xorg конфигах делают.

Я раньше так и делал. Но сейчас есть мода на использование Xorg в "бесконфижном" варианте, поэтому настойки клавиатуры перенес в конфиг xfce. А еще этой позволяет каждому пользователю натсроить совой способ переключения раскладки: у меня супруга привыкла к виндовому варианту LeftCtrl+LeftShift, а я вот люблю самую бесполезную клавишу CapsLock для этих целей. :-)

То, что вы поучаствовали в разработке FreeBSD — это круто, у меня вызывает серьёзное уважение!)

Ну как поучаствовал - постоял рядом, ключи подавал. :-) Но меня порадовало то, что разработчики очень быстро отреагировали на баг-репорт и принялись чинить. Это второй мой баг-репорт во FreeBSD. :)

На эту машину ставится любой 32 битный дистро, легко и просто без этих танцев с бубном, Elementary OS Freya например , очень органична и шикарно работает, другое дело что это махровое го*но мамонта … Что делаем, даже dd не нужен: форматим флешку fat 32, создаём папки /efi/boot и туда МАКовский загрузчик bootAI32.efi/bootAI64.efi , и образ дистро любой переименуем в boot.iso … логично ось 32 и загрузчик 32, я ставил фрею, а также дебиан … если usb отваливается можно Дем смол линукс поставить, или с HDD запустить Лив сессию, поднять сеть и залить любое го*но, и через чрут запилить граб …

Спасибо, но причем тут FreeBSD ? 32-х битная FreeBSD загружается без танцев с подменой загрузчика - это на случай если Вы статью не читали.

Снимаю шляпу! Вы проявили недюженное упорство и принципиальность!

Я буквально вчера полдня совершал 4-ю попытку натянуть FreeBSD-15.0 на мой достаточно современный i7 11700K (Desktop), но в 4-й раз потерпел фиаско... :-(
Сначала оказалось, что i915kms не поддерживает мою карту, но я все же запустил xorg на scfb.

Но радость была недолгой - перестал запускаться pkg: ругается на ошибку sqlite. Так что никакие пакеты не устанавливаются...

Но после вашей статьи я буду совершать 5-ю попытку!

Я буквально вчера пытался ставить 15.0 на вполне стандартный ПК и не смог - не видит Ethernet, какие-то косяки в инсталлере. Похоже эта версия еще требуется доработки. 14.3 взлетела с пол пинка. :-)

какие-то косяки в инсталлере

А инсталлятор какой? Там же их теперь два - обычный bsdinstall и еще этот новый модный с пакетами.

bsdinstall. Новый модный молодёжный пока не пробовал.

Но после вашей статьи я буду совершать 5-ю попытку!

Пишите в личку если возникнут проблемы - помогу чем смогу. :)

Спасибо на добром слове!

Хотел поставить именно пятнашку, так как были слухи о якобы допиливании i915kms для моей видеокарты. Но... Не взлетело.

Заодно потестил пакетный инсталлятор. На виртуалке все норм, а тут - тоже облом. Сыроват пока.

Без DRM, конечно, отличий от 14 нет.

А какая карта у Вас ? Что показывает pciconf -lv | grep -A 4 vga ?

Sign up to leave a comment.

Articles