Как стать автором
Обновить

Как самому за один вечер собрать минимальную ОС Linux из исходного кода

Уровень сложностиСредний
Время на прочтение11 мин
Количество просмотров81K
Всего голосов 83: ↑82 и ↓1+108
Комментарии81

Комментарии 81

Чисто навскидку, насколько lfs собирать дольше, чем то, что описано в статье?

В первый раз ушло часов 10-12

Зато удовлетворение от результата больше)

Что!?!

Да я к этому Linux ни в жизни больше не подойду (шучу!)

тогда buildroot: там сделать make nconfig && make

На хабре есть хороший материал про buildroot

Собираем бинарные файлы BusyBox и для ядра Linux. Этот процесс займёт достаточно много времени, порядка 10 минут и даже больше, поэтому не пугайтесь.

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

это наверно такой завуалированный намек "это дольше чем видос".

(но все равно - что-то меня фраза "не пугайтесь" для 10 минутной компиляции пугает сильнее, чем все остальное... это же насколько attention-span у ЦА пониженный?)

Весело было включить ПОЛНУЮ отладку ядра, по UART. Тогда зарузка ядра длилась 10+ часов.

Мне пришлось хуже: когда я не знал о волшебном -j8 ядро компилировалось 3 часа. Точнее на этой отметке у меня лопнуло терпение :)

Кстати, на заметку, с современными технологиями ядро может грузить uefi напрямую, никакой загрузчик не требуется.

Это может упростить сборку ещё на пару пунктов. Более того - этот метод работает не только с x86. Uefi есть и в arm.

Linux обычно собирают в Linux

А можно собрать Linux в WSL?

Никаких проблем. В сути такой же Линукс. Ограничения только на работу с железом.

Интересно, может ли считаться линуксоидом чел, не читавший Gentoo Handbook и не пробовавший поставить этот замечательный дистрибутив?

Не дам ответа, но опишу ситуацию. Сейчас нахожусь в поиске работы, и большинство работодателей требует знания Ubuntu. На мои Debian+Gentoo возражают "ну как же мы вас возьмём, если вы с Ubuntu не работали".

А для какой это вакансии такая ситуация?

Так Debian+Gentoo это и не Linux вовсе, а так - узкоспециализированное хобби. Вам же нужно работать, а не развлекаться и вот тут знание Ubuntu просто необходимо, т.к. вся работа происходит исключительно в графическом окружении, как у всех нормальных людей. Ну и как же они вас возьмут, если вы с Ubuntu не работали?

Если это сарказм то я его не понял. 99% работы линуксового админа происходит в терминале в командной строке. 1% это всякие мессенджеры типа слака которые от работы отвлекают.

вся работа происходит исключительно в графическом окружении

Это применимо только к рабочим станциям. Мне бы никогда не пришло в голову ставить на сервер графическое окружение, чтобы подключиться к нему по VNC/RDP и…
Открыть терминал! Потому что у тех, кто с Linux на серверах работает, обычно достаточно навыков, чтобы использовать терминал было эффективнее, чем копаться в десятках менюшек. Ну и ещё потому, что графические инструменты для администрирования не особо развиты.

Таки сарказм.

Боже, да напишите вы убунту там, разве не может в супер классной компании быть просто эйчар, который не оканчивал всех академий, чего-то может не знать? Или вы всерьёз рассчитываете на общение с техническими людьми с первого этапа собеса?

Это в первую очередь фильтр для отсеивания работодателей. Ибо на рынке труда два идиота - один работу ищет (когда мог бы свой бизнес-проект начать), второй работника (готовые работники стоят дороже, а обучать новеньких - некому).

Сначала воспоминания. Помнится, году так в 2007 я устроился приходящим системным администратором в Московскую Страховую Компанию. Windows Server 2000, и все работники филиала - администраторы домена. Естественно, за пару недель в сотрудничестве с администраторами головного офиса весь бардак привели в порядок. Провели миграция на 2003 сервер, навели порядок с правами, поставили зеркало на сервер... И я думал, что подобного не повторится.

Но в 2022 году я прошёл собеседование в "федеральную компанию" с представительствами в Москве, СПБ, Екатеринбурге, Казани и ещё где-то... На собеседовании был упор на информационную безопасность, резервирование всего что можно. В первый же день обнаруживаю в AD, что все пользователи входят в группу Domain Admins И знаете, уже как-то не смешно. И разгребать подобное желания нет совсем.

Был у меня в 2001 году похожий опыт: работал в конторе, которая заправляла картриджи на выезде, я тоже так ездил, а однажды директор отправил меня, как "самого грамотного", к клиентам избавить их от вирусов. И вот сижу я, ковыряюсь, пытаюсь навести вирусам геноцид, а они откуда-то появляются и появляются. Уже только к вечеру понял, что этих долбодятлов диск C: открыт на запись в доступен из Интернета! Если что, это ещё времени Win98. Я себе такую дичь даже представить не мог, поэтому далеко не сразу посмотрел права доступа.

В общем, ученье свет, а неучёных тьма.

диск C: открыт на запись в доступен из Интернета!

это как так?

Вам какая часть непонятна? Организационная или техническая? Если первая, то мне это до сих пор непонятно.

техническая

У них внутренняя сеть раздавалась через один из компьютеров и на нём для "Сетей Майкрософт" был открыт доступ на запись на диск C: без разграничения прав. Соответственно, сканер находил этот компьютер, писал ему на диск вирус, который чем-то запускался (кажется, подменялась какая-то системная программа, которую регулярно запускает сама система) и дальше уже распространялся по внутренней сети.

Напоминаю, что это был 2001, то есть стояла на тех компах Win98, которая жила на FAT32, у которой не было и нет никаких средств управления доступом.

как выход в интернет организован то? и как он связан с диском С:?

Сейчас не вспомню, как именно --- давно было. Что-то вроде двух сетевых карт, чтобы одна смотрела в сторону провайдера, а вторая во внутреннюю сеть. Или через модем наружу, а внутрь --- через сетевую карту.

Что такое "Сети Майкрософт" знаете? Разграничение доступа тогда было доступно только на этом уровне. А они открыли доступ к диску C: для ВСЕХ и без ограничений по сетевым интерфейсам. В итоге, писать на диск C: мог вообще кто угодно, кто додумался постучаться на IP конторы в качестве клиента этих самых "Сетей Майкрософт".

Что такое «Сети Майкрософт» знаете?

SAMBA что-ли?

Насколько я понимаю, SAMBA --- это уже следующая итерация. Но если нет, то спорить не буду: тогда у меня компьютер в доме был один и обмен фалами по локальной сети не был актуальным вопросом в силу отсутствия этой сети.

+1 - не надо доказывать что мы самые умные.
Перечислите все популярные дистрибутивы.

В нормальных компаниях это не имеет значения. Максимум: разделение на Debian и RH based distros.
Может стоит поискать что-то ещё?
Или добавить таки Ubuntu в CV?

Рискну предположить, что убунтоспецифические знания - это работа с PPA и Snap. Можно слегка попрактиковаться с ними в виртуалке и нагло заявлять "Я знаю Ubuntu", тем более, что всё остальное в Убунте --- от Дебиана.

Если админу Linux потребуется знание PPA или Snap, то страшно представить, что придётся администрировать.

Вы уверены, что Торвальдс это делал?

And when it comes to distributions, ease of installation has actually been
one of my main issues - I'm a technical person, but I have a very
specific area of interest, and I don't want to fight the rest. So the
only distributions I have actively avoided are the ones that are known
to be "overly technical" - like the ones that encourage you to compile
your own programs etc.

Может

Вы удивитесь, но минимальный набор, необходимый для получения командной строки Linux содержит всего два файла: файл ядра Linux и файл начального образа корневой файловой системы.

Автор, так можно сказать, что минимальный набор для полноценной Ubuntu или Windows содержит вообще один только файл: образ.img.
"файл начального образа корневой файловой системы" - это и есть образ, который может содержать тысячи файлов.

Ну нельзя же так.

В начале статьи поймал себя на дежавю. Когда-то для запуска системы тоже надо было всего два файла: io.sys и command.com ......

а как же msdos.sys?

Да, согласен. Забыл про него. Прошу простить. Давно это было.

А точно именно для запуска системы не хватило бы одного io.sys?

command.com это, если память не изменяет, командный интерпретатор, шелл другими словами

msdos.sys это расширенные функции. 21 прерывание и тому подобное.

И то и другое не сказать что прямо так уж необходимо для запуска.

Что-то мне кажется, что command.com работает с файлами, дисплеем, клавиатурой через прерывания 21h, а не через прерывания BIOS

Начиная с седьмой версии msdos.sys стал простым текстовым файлом конфигурации и для загрузки перестал быть обязательным.

Да. Проще в те времена все было. Но если мне не изменяет память, то вроде как три, еще msdos.sys

Точно, три. Выше уже исправился.

Четыре: + загрузчик в бутсекторе ?

Ну тут можно поспорить, загрузчик в бутсекторе не попадает под определение файла, как именованой области на диске

В статье всё-таки речь идёт об ОС GNU с ядром Linux. Говорить «ОС Linux» некорректно хотя бы по отношению к людям, создавшим GNU.

Если быть более точным, я использовал ядро Linux и Busybox, который не являeтся частью проекта GNU

Как самому за один вечер собрать минимальную ОС Linux из исходного кода

https://buildroot.org/

А кто уже пробовал armbian X86_64?

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

Разве что... Мне одному показалась странной идея форматировать корневой линукс-раздел в FAT32?

Я сделал раздел FAT, чтобы можно было в Windows увидеть на флеш-накопителе файлы ядра Linux и образа корневой файловой системы, загрузчика EXTLINUX и его конфигурацию. Изначально я использовал ext4.

А вы не пробовали компилировать из исходников ваш мини дистрибутив Clang и GCC и потом сравнить результаты ? Я насколько знаю помощью Clang полностью скомпилировать рабочий дистрибутив Linux невозможно

Я не пробовал, но спасибо за идею.

Не подскажете как собрать минимальный докер образ FROM scratch только с JVM?

А чем не устраивают официальные образы openjdk из Docker Hub?

Если нужна только JRE, можно в Alpine Linux поставить пакет вроде openjdk17-jre.

Если хочется, можно и вручную установить JRE.

Извините за запоздалый ответ. Openjdk не собирается FROM scratch. Если знаете толковый работающий в 2022 году сценарий сборки минимального образа JRE "из ничего", бросьте ссылку, пожалуйста.

Помню старые добрые времена, когда при выходе нового ядра все дружно качали сырцы и собирали ядро под свою машинку. Без этого совесть не позволяла считаться линуксоидом. А стандартный бенчмарк для компа - это естественно была сборка ядра. Да, было время...

А для FreeBSD это было вообще стандартной практикой.

Для Gentoo тоже :)

Какой смысл собирать что-то из исходных кодов без того, чтобы прочитать исходные коды? Настаиваю на включении пункта "Читаем исходные коды" сразу после "Скачиваем и распаковываем". Здоровую параною и исследовательский интерес нужно воспитывать с самого начала

Не у всех цель изучить продукт, некоторым нужно просто им пользоваться

Да, исходники кернела можно читать вечность.

Это интересно, но было бы интереснее почитать о сборке и модификации самого ядра(Kernel).

Всё это интересно для.. саморазвития. А для реального проекта потребуется установить (из исходников, разумеется) несколько десятков пакетов, накатить исправления безопасноти (которые ещё нужно найти), настроить всякие udev rules, настроить systemd. Потом запустить и столкнуться с какой-нибудь проблемой, которая даже не гуглится (например: postgresql не может сделать bind на IPv6 виртуальной сети, а на ::1 может, а другие сервисы спокойно слушают обе сети). Если речь не идёт об embedded, то минимальный работающий дистрибудтив можно собрать одной лишь командой `debootstrap --variant=minbase`, взяв за основу Ubuntu или Debian. C embedded чуть посложнее, можно взять buildroot или yocto.

Целью статьи было донести информацию так, чтобы книга по LFS воспринималась проще, я не ставил целью получить дистрибутив Linux, который можно полноценно использовать. Можно сказать, что моя статья это введение в сборку Linux.

из статьи не понял, ткните - вот собираю положим ядро на интеле для запуска на amd . Надо что то указывать? А вообще другой архитектуры?

Если вы имеете в виду Amd64, то я думаю ядро должно запуститься. А вот если для других архитектур, то там кроме системы команд процессора другие загрузчики. Кросскомпиляцию я не затрагивал в этой статье, чтобы она была краткой и удобной для восприятия.

Про должно запустится понятно, а какой то настройки оптимизации нет при компиляции если я знаю на чем выполняется?

Для этого нужно использовать make config или make menuconfig вместо make defconfig. Там нужно ответить на множество вопросов или зайти в различные формы, но тут уже Вам конкретно нужно знать, что Вы хотите настроить. Для menuconfig необходимо установить ncurses eще.

А как это запихнуть в iso?

Это более продвинутая тема, если кратко, то Вам нужно использовать программу xorriso и загрузчик ISOLINUX.

Вместо редактора vim (команда vi)

Я конечно извиняюсь за своё занудство, но Vi и Vim это разные редаткоры!

http://xgu.ru/wiki/Vim

Ну тогда еще позанудствуем...
Ну тогда еще позанудствуем...

Зарегистрируйтесь на Хабре, чтобы оставить комментарий