СБОРКА СОБСТВЕННОГО ДИСТРИБУТИВА GNU/LINUX. ШАГ 3 — СОЗДАНИЕ ВРЕМЕННОЙ СИСТЕМЫ И ЗАГРУЗКА

В прошлой статье был собран кросскомпилятор, которым уже будет собираться промежуточная версия дистрибутива. Временная система нужна для того, чтобы в неё загрузиться и собрать основную. Архитектуру она уже будет иметь x86_64, однако размещаться будет почти целиком во временной папке /tools.

Как раньше уже писал, основываюсь я на CLFS, а сборка временной системы – нудное занятие. Почти полностью повторяющее то, что есть в руководстве. Само по себе копирует 5 и 7 пункт этого чтива. Заменив CLFS на LFS64 в переменных окружения. За некоторым исключением, так как версии пакетов немного другие, а именно:

binutils-2.26 bootscripts-cross-lfs-3.0-20140710 bzip2-1.0.6 check-0.10.0 coreutils-8.25 diffutils-3.3 e2fsprogs-1.43 eudev-3.2 file-5.28 findutils-4.6.0 gawk-4.1.3 gcc-6.1.0 gettext-0.19.8 glibc-2.23 gmp-6.1.0 gperf-3.0.4 grep-2.25 gzip-1.8 isl-0.17 linux-4.7 m4-1.4.17 make-4.2 mpc-1.0.3 mpfr-3.1.4 nano-2.6.0 ncurses-6.0 patch-2.7 pkg-config-lite-0.28-1 sed-4.2 shadow-4.1.4 sysvinit-2.88dsf tar-1.29 texinfo-6.1 tzdata2016e util-linux-2.28 xz-5.2.2 zlib-1.2.8

Понятное дело, что перечислять компиляцию большинства из них, при этом состоящую из действий:
./configure && make && make installбольшого смысла не несёт. А конфигурировать пакеты для временной системы как-то по-особому, тоже не имеет цели.

Поэтому я остановлюсь лишь на некоторых моментах, которые были затруднительны для меня:

Отличие от CLFS

Я не использовал патчи от CLFS ввиду своих убеждений, да и просто пакеты других версий. Однако следует внимательно читать пункты. Редактирование Makefile или config.cache, прописанные там, несут определённый смысл.

Кроме того, я не собирал:

  • GRUB 2, так как уже установлен на другом разделе.
  • Bс, который нужен для сборки ядра – полностью рабочее ядро собрал в основной системе, так как проверенный .config файл у меня есть.
  • Kmod, у меня монолитное ядро, без модулей.
  • Vi, заменил его на nano.

Binutils 2.26

На данном этапе при сборке появляется следующая ошибка:
../../binutils-2.26/gold/dirsearch.cc:125:1: error: '{anonymous}::Dir_caches::~Dir_caches()' defined but not used [-Werror=unused-function] Dir_caches::~Dir_caches()

Причина, как в самом коде, так и в особенностях GCC 6.1. Для того, чтобы скомпилировать binutils 2.26 компилятором GCC 6.1 можно просто удалить -Werror из CXXFLAGS в Makefile binutils. Хотя это неправильное и некрасивое решение.

Ncurses 6.0

Опять же, при компиляции ошибка:
In file included from ./curses.priv.h:325:0, from ../ncurses/lib_gen.c:19: _13999.c:843:15: error: expected ')' before 'int' ../include/curses.h:1631:56: note: in definition of macro 'mouse_trafo' #define mouse_trafo(y,x,to_screen) wmouse_trafo(stdscr,y,x,to_screen)

Вызвана она тем, что в качестве интерпретатора awk в Debian используется mawk (хотя это совсем не очевидно), а не gawk. Просто установим gawk и удалим mawk. Проблема при повторной компиляции исчезнет:
# apt-get install gawk # apt-get purge mawk

Linux 4.7

При компиляции ядра возникло предупреждение:
arch/x86/Makefile:133: stack-protector enabled but compiler support brokenа затем ошибка:
LD init/built-in.o init/built-in.o: In function `name_to_dev_t': (.text+0x10d): undefined reference to `__stack_chk_guard' init/built-in.o: In function `name_to_dev_t': (.text+0x163): undefined reference to `__stack_chk_guard' init/built-in.o: In function `initcall_blacklisted': main.c:(.init.text+0x1dd): undefined reference to `__stack_chk_guard' main.c:(.init.text+0x252): undefined reference to `__stack_chk_guard' init/built-in.o: In function `do_one_initcall': (.init.text+0x8d4): undefined reference to `__stack_chk_guard' init/built-in.o:(.init.text+0x9cb): more undefined references to `__stack_chk_guard' follow Makefile:966: ошибка выполнения рецепта для цели «vmlinux» make: *** [vmlinux] Ошибка 1

Причина в том, что компилятор неверно обрабатывает -fstack-protector. Ну или само ядро неверно написано по мнению GCC. Это всё лирика, а скомпилировать ядро как-то нужно. Для этого во время конфигурации ядра необходимо перейти в пункт General setup. А затем изменить значение Stack protector buffer overflow detection на None.

На данном этапе задача – собрать минимальную рабочую систему, а не изучать подробно ошибки, что и как не так было при конфигурации GCC 6.1 (тем более, его скоро опять собирать =). Поэтому решение такое.

Создание символьных ссылок

После перезагрузки моя временная система не загрузилась и выпала в kernel panic:
Kernel panic - not syncing: No working init found. Try passing init= option to kernel. See Linux Documentatio/init.txt for guidance.Указание опции init=/sbin/init не помогло, опять же:
Kernel panic - not syncing: Requested init /sbin/init failed (error -2)

Немного поматерившись и разобравшись нашел проблему — не хватает библиотеки и необходима еще одна символьная ссылка:
# ln -sv /tools/lib64/ld-linux-x86-64.so.2 ld-linux-x86-64.so.2

Конфигурация GRUB 2.0

Сам пакет я не устанавливал а просто изменил /boot/grub/grub.cfg на разделе, на котором установлен загрузчик. Добавив туда пункт меню для загрузки временной системы:
menuentry 'LFS GNU/Linux' --class gnu-linux --class gnu { insmod gzio insmod part_msdos insmod ext2 set root='hd0,msdos3' echo 'Загружается Linux 4.7' linux /tools/boot/vmlinuz-4.7 root=/dev/sda3 init=/sbin/init ro quiet }

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

Итоги

Были еще некоторые проблемы, не столь значительные. Решалось всё с помощью CLFS и гугла достаточно быстро. остановился лишь на не очевидных для меня вещах. В любом случае, временная система загрузилась:

Чему я был очень рад. Теперь начинается самое интересное – сборка основной системы. Тут уже действительно есть смысл хорошо конфигурировать пакеты и вообще проявлять самодеятельность.

Я буду очень рад комментарию!

Ваш комментарий будет первым

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

4 × два =