LXF169:Дистрострой. Сам себе дистрибутив
Olkol (обсуждение | вклад) (→Инструменты сборки) |
Olkol (обсуждение | вклад) м (Olkol переименовал страницу LXF168:Дистрострой. Сам себе дистрибутив в LXF169:Дистрострой. Сам себе дистрибутив) |
Текущая версия на 09:37, 14 ноября 2018
|
|
|
Crosstool-ng: Ищем инструментарий.
Содержание |
[править] Основы дистростроения. Готовим инструментарий для сборки дистрибутива
Дмитрий Кузнецов готовится к сборке собственного дистрибутива, тщательно подбирая инструменты.
Дистрибутив Linux ныне установить легко. За полчаса, ответив на ряд простых вопросов, любой новичок получает готовую ОС. Она сама загружается, снабжена графическим интерфейсом пользователя и содержит солидный набор прикладных программ, расширяемый несколькими движениями мыши. Это здорово! Разработчики дистрибутивов заслуживают самой искренней благодарности и восхищения. Большинству пользователей ничего сверх того и не надо. Но есть и те, кто хочет понимать внутреннее устройство системы, а не только пожинать плоды работы «черного ящика». Их пытливый ум вечно ставит вопросы. Как работает система? Из каких компонентов состоит? В каком порядке они запускаются при загрузке? Какие из них главные, а какие второстепенные? Как их собрать из исходных кодов? Анатомия Linux в общих чертах освещена в главной статье номера, но тут и целой книги будет мало.
Жертвовать глубиной изложения, говоря о таких фундаментальных проблемах, было бы ошибкой. Разумнее ограничить ширину охвата наиболее важными вопросами – их глубокое понимание станет прочной основой для дальнейшего изучения. Мы попробуем построить минимальный дистрибутив для архитектуры x86_64 и запустить его на виртуальной машине KVM. Эти базовые знания позволят читателям ладить с любым дистрибутивом Linux, а особо неугомонным – продолжить изыскания самим.
[править] Комплектация
Очевидно, минимальный дистрибутив Linux должен уметь загрузить компьютер и предоставить пользователю возможность запускать имеющиеся в его составе программы. Какое ПО для этого нужно? Для ответа сперва разберемся в процессе загрузки Linux.
После включения питания процессору подается сигнал RESET, чтобы процессор установил свои регистры на передачу управления коду BIOS, записанному в ПЗУ. BIOS тестирует и инициализирует аппаратные устройства, а затем просматривает первые (загрузочные) секторы всех дисков, указанных в BIOS Setup, для поиска загрузчика ОС. Когда загрузчик найдется, он скопируется в оперативную память и начинает выполняться. Его задачи – найти ядро Linux, скопировать его в память и передать туда управление. Ядро выполняет свою инициализацию, монтирует корневую файловую систему и запускает первую пользовательскую программу init – обычно это /sbin/init, но в параметрах ядра можно указать любую другую. Действия init настраиваются в файле /etc/inittab – обычно указывается запуск стартового сценария и командной оболочки [shell]. Все, ОС загружена и ждет команд пользователя.
- Метамодернизм в позднем творчестве В.Г. Сорокина
- ЛитРПГ - последняя отрыжка постмодерна
- "Ричард III и семиотика"
- 3D-визуализация обложки Ridero создаем обложку книги при работе над самиздатом.
- Архитектура метамодерна - говоря о современном искусстве, невозможно не поговорить об архитектуре. В данной статье будет отмечено несколько интересных принципов, характерных для построек "новой волны", столь притягательных и скандальных.
- Литература
- Метамодерн
- Рокер-Прометей против изначального зла в «Песне про советскую милицию» Вени Дркина, Автор: Нина Ищенко, к.ф.н, член Союза Писателей ЛНР - перепубликация из журнала "Топос".
- Как избавиться от комаров? Лучшие типы ловушек.
- Что делать если роблокс вылетает на windows
- Что делать, если ребенок смотрит порно?
- Почему собака прыгает на людей при встрече?
- Какое масло лить в Задний дифференциал (мост) Visco diff 38434AA050
- О чем может рассказать хвост вашей кошки?
- Верветки
- Отчетность бюджетных учреждений при закупках по Закону № 223-ФЗ
- Срок исковой давности как правильно рассчитать
- Дмитрий Патрушев минсельхоз будет ли преемником Путина
- Кто такой Владислав Поздняков? Что такое "Мужское Государство" и почему его признали экстремистским в России?
- Как правильно выбрать машинное масло в Димитровграде?
- Как стать богатым и знаменитым в России?
- Почему фильм "Пипец" (Kick-Ass) стал популярен по всему миру?
- Как стать мудрецом?
- Как правильно установить FreeBSD
- Как стать таким как Путин?
- Где лучше жить - в Димитровграде или в Ульяновске?
- Почему город Димитровград так называется?
- Что такое метамодерн?
- ВАЖНО! Временное ограничение движения автотранспортных средств в Димитровграде
- Тарифы на электроэнергию для майнеров предложено повысить
Теперь очевиден список необходимого ПО:
» Загрузчик и ядро Linux.
» Init, shell и другие прикладные программы.
» Библиотеки, необходимые для прикладных программ. Для большинства утилит командной строки Linux требуется только стандартная библиотека языка C (GNU libc или ее аналоги).
» Файл /etc/inittab для настройки init.
» Стартовый сценарий (запускается из inittab).
Для других архитектур (не x86) процесс загрузки отличается лишь начальной стадией: до передачи управления ядру Linux. Например, на встраиваемых платформах (архитектура ARM) часто используют U-boot. Это специальная стартовая среда (еще ее называют bootstrap-среда или загрузчик), которая выполняет функции BIOS и загрузчика на ПК.
[править] Инструменты сборки
Комплектация дистрибутива определена. Исходные тексты компонентов доступны. Как их собрать? Ответ вроде очевиден: есть же GCC, стандартный компилятор для OC Linux. Верно. Но не все знают, что GCC – только вершина айсберга. Для компиляции и генерации исполняемого кода из исходных текстов его мало, нужен целый инструментарий [англ. toolchain – цепочка инструментов]. Он состоит из следующих компонентов:
» GCC (GNU Compiler Collection) – набор компиляторов (в том числе С и C++).
» Binutils – ассемблер, компоновщик и набор программ для обращения с объектным кодом.
» GNU libc (или ее аналог) – стандартная библиотека языка С.
» Заголовочные файлы ядра Linux.
Все эти инструменты входят в состав любого дистрибутива Linux в готовом к использованию виде. Но учтите, что они собраны с целью генерировать исполняемый код только для данного дистрибутива и данной архитектуры. То есть с их помощью можно собрать только клон дистрибутива своего ПК. И двоичная совместимость будет превосходная. Кстати, в разности инструментариев и кроются корни проблем двоичной несовместимости разных дистрибутивов Linux. А фаза Луны, как думают иные, тут ни при чем.
Собирать только клоны неинтересно, нужно докопаться до первоисточников. Похоже, вопросов становится все больше. Если какие-то компоненты инструментария не устраивают? Если нужно собрать инструментарий для другой архитектуры (не x86)? Если на ПК нужно создать среду сборки ПО для своего смартфона с ARM процессором? Все это возможно. Компоненты инструментария поддерживают массу разных архитектур и имеют огромное количество параметров сборки. Но нужно уметь их самостоятельно собирать из исходных кодов. Конечно, это непростая задача, которая требует времени, опыта и специальных знаний.
К счастью, есть замечательный проект – crosstool-ng. С его помощью легко задать нужные параметры инструментария, загрузить из Интернета исходные коды его компонентов и автоматически их собрать. Кроме того, crosstool-ng ведет подробный журнал выполненных команд, анализируя который, можно детально разобраться в процессе сборки.
[править] Crosstool-ng: установка
Загрузим архив исходных кодов сrosstool-ng с сайта проекта:
wget -nd -P /root/work/download crosstool-ng.org/download/crosstool-ng/crosstool-ng-1.16.0.tar.bz2
Он имеет формат tar.bz2, традиционный для мира Linux, поэтому легко распаковывается в рабочий каталог:
tar -C /root/work/src -xjvf /root/work/download/crosstool-ng-1.16.0.tar.bz2
Для работы crosstool-ng требуется дополнительное ПО – зависимости. Установить его (если это не сделано ранее) можно так:
apt-get install bison flex gperf texinfo gawk libtool automake libncurses5-dev g++ subversion
Сборка проекта тоже не отличается особой оригинальностью, за вычетом ключа enable-local, которым нам сейчас удобно воспользоваться. Он информирует crosstool-ng, что пользователь не намерен устанавливать его в систему, а будет запускать локально из каталога с его исходными кодами. Таким образом, для удаления crosstool-ng достаточно будет просто удалить этот каталог.
cd /root/work/src/crosstool-ng-1.16.0/
./configure --enable-local
make
[править] Сборка инструментария
Итак, crosstool-ng собран и готов к работе. Можно собирать инструментарий. Сборка инструментария состоит из двух этапов:
1 Подготовка файла .config. Это – конфигурация собираемого инструментария.
2 Запуск сборки по созданной конфигурации.
Файл .config похож на тот, что используется ядром Linux. Есть и аналогичная интерактивная система конфигурирования, запустив которую, можно создать конфигурацию с нуля или откорректировать уже существующую. По умолчанию считается, что .config находится в текущем каталоге. К счастью, в состав crosstool-ng (подкаталог samples) входит множество примеров конфигураций, которые служат хорошей основой для построения своих собственных. Они настолько разнообразны, что часто достаточно изменить всего лишь несколько параметров.
Промежуточные результаты своей работы (исходный код компонентов, объектые файлы, журнал сборки и т. д.) crosstool-ng хранит в текущем каталоге. Поэтому для сборки каждого инструментария удобно создавать отдельный каталог, делать его текущим и все команды запускать из него:
mkdir -p /root/work/files/toolchain/build
cd /root/work/files/toolchain/build
Среди доступных примеров легко найти подходящий для данного случая: /work/src/crosstool-ng-1.16.0/samples/x86_64-unknown-linux-gnu/crosstool.config. Чтобы им воспользоваться, нужно скопировать его в рабочий каталог под именем .config и запустить интерактивную систему конфигурирования:
cp ../../../src/crosstool-ng-1.16.0/samples/x86_64-unknown-linux-gnu/crosstool.config ./.config
/root/work/src/crosstool-ng-1.16.0/ct-ng menuconfig
Она показывает параметры инструментария в иерархическом виде. Многие из них снабжены справочной информацией (кнопка Help внизу экрана). Это удобно для изучения: так быстрее разобраться, что в данной конфигурации надо изменить.
» Раздел Paths and misc options [Пути и общие настройки всей системы]
Установить Try features marking EXPERIMENTAL. Это даст возможность выбрать новейшие версии компонентов инструментария.
Указать в Local tarballs directory путь /root/work/download. Там будут сохранены загруженные архивы с исходными кодами. При повторной сборке они не будут загружаться снова.
Указать в Prefix directory путь /root/work/files/toolchain/result. Там будет сохранен собранный инструментарий.
» Раздел Target options [Параметры целевой архитектуры]
Здесь все правильно. В Target architecture установлено значение x86, а в Bitness – 64-bit, как раз наш случай. Но богатство выбора архитектур впечатляет: девять штук! Например, можно выбрать arm и получить инструментарий для сборки ПО под смартфоны.
» Раздел версий компонентов
Что-то они староваты. Пожалуй, стоит выбрать поновее. (Например, можно ориентироваться на Ubuntu 12.04 LTS, где полный список установленного ПО можно получить командой dpkg -l.)
Пройдя по подпунктам меню, выберем версию ядра Linux: Operating system > Linux kernel version – укажем 3.2.25.
Теперь аналогичным образом выберем версию binutils: Binary utilities > binutils version – нас интересует 2.22 (EXPERIMENTAL).
Нам понадобится определенная версия GCC: C compiler > gcc version – выберем 4.6.3. Заодно в том же разделе C compiler нужно отключить поддержку языков Fortran и Java (раз уж мы решили собирать минимальный дистрибутив, обойдемся без излишеств).
Далее озаботимся выбором библиотеки языка С. Отметим, что существует несколько аналогов этой библиотеки. Конечно, GNU C library (glibc) – это классика. Но не все ею довольны, и таких с каждым годом все больше и больше: есть у старушки ряд проблем. Поэтому разработчики некоторых дистрибутивов решили сменить glibc на один из ее аналогов. Скажем, в Ubuntu применяют Embedded GLIBC (eglibc). Итак, идем по подпунктам: C-library > C library – выберем eglibc, C-library > eglibc version – выберем 2.15.
Версии сопутствующих библиотек (математические библиотеки, используемые в GCC) указываются в разделе Companion libraries: GMP version – 5.0.2, MPFR version – 3.1.0, PPL version – 0.11.2, CLog/ppl version – 0.15.11, MPC version – 0.9.
» Раздел Debug facilities Для простоты лучше отключить тут все.
Осталось закрыть систему конфигурирования (дважды нажав Esc), согласившись с сохранением изменений в файле .config. Конфигурация инструментария готова. Можно запускать сборку:
/root/work/src/crosstool-ng-1.16.0/ct-ng build
На это потребуется несколько десятков минут. crosstool-ng самостоятельно загрузит исходный код необходимых компонентов, соберет их и предоставит подробный отчет о проделанной работе (build.log в текущем каталоге).
Ура, наш инструментарий подготовлен! Теперь можно собирать компоненты дистрибутива из исходных кодов – чем мы и займемся в следующий раз. |