Создание своего дистрибутива на базе Ubuntu
Представленный здесь материал — лишь основы создания своих дистрибутивов на базе Ubuntu, т.к. существует множество тонких моментов по наполнению дистрибутива и оптимизации ядра под разные задачи. Но этого вполне хватит для того, чтобы создать диск с нужными программами или оригинальный подарок другу.
Необходимые компоненты
Оригинальный iso-образ дистрибутива Ubuntu (CD)
Подготовленные файлы оформления: сплэш-скрин, апсплэш-скрин, GDM-тема, обои, набор иконок
Пакет Reconstructor — платный.
Желателен выход в интернет для доступа к онлайн-репозиторию, или локальный срез репозитория
Руководство. Часть 1 — Reconstructor
Запускаем Reconstructor:Приложения/Системные/Reconstructor, появится окно терминала запрашивающее пароль администратора — введите пароль, без этого программа работать не будет.
Первое окно — Приветствие
Приветствие, и кнопка обновления программы. Либо обновляем пакет, либо нажимаем Next.
Второе окно — Выбор способа инсталляции
Выбираем Desktop (чтобы установка шла в графическом режиме и была возможность работать с LiveCD).
Третье окно — Выбор рабочего окружения
Выбор рабочего окружения для создания своего дистрибутива:
Working Directory — директория в которой происходит разбор оригинального iso-образа (оставьте как есть, программа предложит создать директорию reconstructor в вашей личной директории).
Далее идут три чекбокса: когда вы собираете дистрибутив в первый раз (или собираете заново с оригинала) — во всех трех окошках надо выставить галочки. Если же вы создали свой дистрибутив и через некоторое время захотите доработать его — но при этом не потерять все ваши остальные изменения, то галочки выставлять не надо.
Аналогичный подход и к последнему пункту — Live CD ISO Filename, надо указать файл с образом дистрибутива, который вы собираетесь переделывать, чтобы программа его распаковала в директории, но если вы все еще дорабатываете свой дистрибутив, который лежит в разобранном виде, указывать образ iso не надо, иначе распаковка образа перезапишет находящуюся там информацию.
Поскольку мы делаем первую сборку: отмечаем галочками три окна, указываем где лежит оригинальный образ с дистрибутивом Ubuntu.
Начнется распаковка образа в директории, она займет от 10 до 15 минут (в зависимости от мощности вашей машины).
Четвертое окно — Настройка
Это окно состоит шести вкладок:
Boot Screen (экран загрузчика)
LiveCD Splash, первый экран, который увидит пользователь. Для него используется картинка в формате .pcx, она должна быть размером 640×480, с индексированной палитрой в 256 цветов. Создать такую картинку можно в GIMP.
LiveCD Text Color — цвет текста в меню установки (у меня меню окажется на светлом фоне, поэтому я выбрал черный цвет, не переживайте по поводу нижнего меню или подсветки выбора опций меню — программа умная и создаст сама нужную цветовую гамму, потом увидите сами).
Upsplash Filename — когда будет происходить загрузка, будет показан логотип и бегунок. Этот файл представляет из себя скомпилированный .so файл библиотеки.
Где его взять? С одной стороны на gnome-look можно найти готовые файлы с бегунками любой тематики, но с другой — ведь нас интересует наше личное оформление, и мы сами можем приложить свой творческий потенциал к оформлению.
Поэтому нам интересна следующая опция — Upsplash Generation, она позволит из .png файла, который можно создать в GIMP создать собственный upsplash.so (Внимание: у картинки должна быть индексированная палитра в 256 цветов!).
Gnome (оформление среды Gnome)
Login
GDM Theme — оформление темы входа в систему. Когда вы установите дистрибутив приглашение на вход может быть оформлено стандартными темами (выпадающий список), либо скачайте понравившуюся тему отсюда и укажите ее файл, чтобы она попала в список. Я выбрал тему Mint-Shadows. Кстати, файлы тем идут в архивах tar.gz их можно распаковать, локализовать и переделать под свой вкус, подробные руководства для создания своих тем есть на офсайте, т.е. здесь.
Далее, идут три окошка: Sounds — запретить/разрешить проигрывание звука входа в систему; Root Login — разрешить/запретить вход в систему под суперпользователем; XDMCP разрешить/запретить вход в систему автономным дисплеем;
Splash Screen — после входа в систему, GNOME начинает прогружаться и выбрасывает иконки отражающие стадии загрузки, этот Spash Screen нужен для того чтобы эти иконки отображались на его красивом фоне.
Я не стал его менять.
Background Color — цвет фона. Я поставил черный.
Desktop
Wallpaper — обои, которые будут идти по умолчанию. Я подкинул эти.
Application Font, Document Font, Desktop Font, Title Bar Font, Fixed Font — дают вам возможность выбрать шрифты для вашего дистрибутива.
Theme
Theme — выбор темы оформления, я выбрал Murrina-GreenMod.
Widow Borders — оформление рамок окон.
Icons — выбор иконок, я скачал GNUtoon — прикольный набор веселых иконок.
Apt (настройка списка репозиториев)
Если отметить чекбоксы галочками, вы замените официальные репозитории Ubuntu на свои.
Свои можно вносить в окно в известной вам форме, там есть пример:
deb http://адрес сервера/ версия_системы main restricted
У меня нет своих репозиториев, хотя и есть список стороних, я ничего не менял во вкладке Apt.
Optimization (Оптимизация!)
Здесь есть пара опций, позволяющих вам ускорить свою систему, но пользуйтесь ими осторожно:
Startup — оптимизировать скорость загрузки системы и Shutdown — оптимизировать скрипты завершения работы.
Я включил только опцию Shutdown, поскольку там есть кнопка Restore — откат. Если будут глюки верну настройки обратно.
LiveCD
Это настройки для пользователя LiveCD, если вам надо закрыть доступ к диску — можете создать пользователя заполнив эти поля соответствующей информацией.
Modules
Вот тут-то начинается самое интересное, поскольку здесь вы можете набить свой дистрибутив нужными вам пакетами, обновить имеющиеся или удалить ненужные. Кроме того, можно добавлять и активировать сторонние или свои модули (хотите запуск Emerald сразу при загрузке?).
Обратите внимание, перечислять пакеты для установки/удаления надо через пробел — пакет1 пакет2 пакет3.
Ну и конечно вам необходимо знать как именно называется устанавливаемый/удаляемый пакет.
Я не стал собирать какой-то специфический дистрибутив с определенным набором программ. Просто поудалял некоторые из имеющихся и поставил русскую локаль Thunderbird.
Теперь, после того, как вы оформили свой дистрибутив и снабдили его нужными программами, надо нажать кнопку “Apply”, чтобы применить сделанные вами изменения.
После применения изменений нажмите Next.
Появится финальное окно, после которого начнется сборка вашего iso образа.
Здесь ничего трогать не стоит, разве что можете указать имя файла (FileName), и описание дистрибутива (Description), уточнить выбор архитектуры (я использовал x86, поэтому ничего не менял).
Next. Понеслось. Ждем 10-15 минут.
Руководство. Часть 2 — Ubuntu Customization Kit
Теперь мы воспользуемся Ubuntu Customization Kit (UCK), он был установлен в Приложения/Стандартные.
Первым делом он спросит — какие языковые пакеты вам надо установить, выбирайте ru.
Потом он спросит — какой язык должен использоваться при инсталляции системы, выбирайте ru.
Затем он спросит — какое окружение рабочего стола используется, выбирайте gnome.
После этого откроется окно, в котором вы должны найти свой iso образ со своим дистрибутивом, который вы создали с помощью Reconstructor.
После этого он предложит возможность переименовать ваш дистрибутив, если вы не сделали этого в Reconstructor-e можете сделать это сейчас.
После этого он спросит вас: Не хотите ли ручками добавить/удалить пакеты, воспользоваться консолью и вообще проконтролировать процесс сборки?
Мы уже сделали это в Reconstructor-e, поэтому говорим — no.
Теперь он спросит — хотите удалить приложения для Windows с диска? Я сказал — yes. Это удалит win32 версию Mozill-ы, и еще кое-что, что нам не нужно. Зато размер iso уменьшится.
Всё! UCK готов к сборке, он откроет консоль и запросит административный пароль чтобы собрать уже окончательную версию вашего дистрибутива.
В процессе сборки (10-15 минут) он полезет в репозиторий, чтобы установить языковую локализацию для вашего Gnome и его программ, а так же уберет неиспользуемые языковые пакеты.
Собранный iso дистрибутива будет лежать здесь:
/home/ваша_домашняя_папка/tmp/remaster-new-files/
Как создать свой собственный дистрибутив Linux с Yocto на Ubuntu
В этой статье мы сосредоточимся на создании минимального дистрибутива Linux с использованием проекта Yocto на платформе Ubuntu. Проект Yocto очень известен в мире встраиваемых систем Linux благодаря своей гибкости и простоте использования. Целью проекта Yocto является создание дистрибутива Linux для производителей встроенного оборудования и программного обеспечения. Новый минимальный дистрибутив Linux будет создан для qemu в качестве целевой машины (qemu — это базовый программный эмулятор), и мы будем запускать его в qemu.
Предпосылки для машины разработки
- Не менее 4–6 ГБ ОЗУ.
- Последняя версия ОС Ubuntu (в данном случае 16.04 LTS).
- Не менее 60–80 ГБ свободного места на диске.
- Установка следующих пакетов перед созданием нового дистрибутива Linux.
- Загрузите последнюю стабильную ветку Yocto (Poky, минимальная среда разработки).
apt-get update
apt-get install wget git-core unzip make gcc g++ build-essential subversion sed autoconf automake texi2html texinfo coreutils diffstat python-pysqlite2 docbook-utils libsdl1.2-dev libxml-parser-perl libgl1-mesa-dev libglu1-mesa-dev xsltproc desktop-file-utils chrpath groff libtool xterm gawk fop

Как показано ниже, для установки необходимых пакетов разработки требуется почти 1 ГБ.

В этом руководстве стабильная версия poky morty клонируется в систему.
git clone -b morty git://git.yoctoproject.org/poky.git

Войдите в каталог poky и выполните следующую команду, чтобы установить/экспортировать некоторые переменные для разработки yocto.
source oe-init-build-env
Как показано ниже, после запуска сценария открытой встроенной (oe) среды сборки путь в терминале будет изменен на каталог \build\ для дальнейшей настройки и компиляции нового дистрибутива.

Приведенный выше снимок экрана показывает, что файл local.conf создается внутри каталога conf. Это файл конфигурации для yocto, в котором указаны сведения о целевой машине и SDK для желаемой архитектуры и т. д.
Как показано ниже, установка целевой машины \qemux86-64\.

Раскомментируйте следующие параметры в файле «local.conf», как показано на скриншотах.
DL_DIR ?= "$/downloads"

SSTATE_DIR ?= "$/sstate-cache"

TMPDIR ?= "$/tmp"

PACKAGE_CLASSES ?= "package_rpm"
SDKMACHINE ?= "i686"

Как показано ниже, установите пустой пароль для Linux на базе Yocto и включите следующие параметры в файл local.conf. В противном случае пользователь не сможет войти в новый дистрибутив.
EXTRA_IMAGE_FEATURES ?= "debug-tweaks"

Мы не используем какой-либо инструмент с графическим интерфейсом, такой как тостер (варочная панель больше не поддерживается), для создания ОС Linux.
Процесс компиляции и сборки Yocto
Теперь выполните следующую команду утилиты bitbake, чтобы начать загрузку и компиляцию пакетов для выбранной целевой машины.
bitbake core-image-minimal

Важно выполнить приведенную выше команду как обычный пользователь Linux, а не как пользователь root. Как показано на следующем снимке экрана, при запуске команды bitbake от имени пользователя root возникает ошибка.

Снова запустите скрипт экспорта переменных среды (oe-init-build-env) и повторно запустите ту же команду, чтобы начать процесс загрузки и компиляции.

Как показано ниже, первым шагом утилиты сценария сборки является разбор рецепта.

На следующем снимке экрана показано завершение этапа синтаксического анализа скрипта сборки. Он также показывает детали системы сборки, на которой будет создан новый дистрибутив на основе yocto.

После загрузки SDK и необходимых библиотек следующим шагом будет загрузка и компиляция пакетов. На следующем снимке экрана показана задача для нового дистрибутива. Этот шаг займет 2-3 часа, потому что сначала загружаются необходимые пакеты, а затем компилируется для нового дистрибутива Linux.

На следующем снимке экрана показано завершение списка задач.

Скомпилированные новые образы для целевого типа машины \qemux86-64\ находятся внутри пути \build/tmp/deploy/images/qemux86-64\, как показано ниже.

Как показано ниже, приведенная выше команда вызовет ошибку при запуске в Putty.

Приведенная выше команда снова запускается внутри терминала через rdp на платформе Ubuntu.

Другой экран открыт для эмулятора qemu для нового дистрибутива Linux на основе yocto.

Ниже показан экран входа в новый дистрибутив, на котором также показана эталонная версия проекта yocto. Имя пользователя по умолчанию — root и пустой пароль.

Наконец, войдите в новый дистрибутив с именем пользователя root и пустым паролем. Как показано на следующем снимке экрана, основные команды (date,ifconfig и uname) выполняются в минимальной версии Linux.

Цель этой статьи — понять процедуру создания нового дистрибутива Linux с помощью проекта yocto.
CUBIC или как собрать свой Ubuntu
Несколько месяцев назад мне стало интересно, могу ли я собрать свою сборку или даже дистрибутив linux. Как оказалось (внезапно) я могу сделать и то и другое. Но в этой статье мы поговорим именно про создание своей сборки.
Итак, мы будем использовать CUBIC и создавать свою сборку на основе Ubuntu. CUBIC — Custom Ubuntu ISO Creator, эта программа позволяет особо не заморачиваясь собрать полноценную сборку базирующуюся на Ubuntu. Давайте рассмотрим этот процесс подробнее.
Установка CUBIC
Итак, для того, что бы собрать Ubuntu нам потребуется собственно CUBIC и образ той версии Ubuntu на основе которой мы и будем строить нашу сборку. Давайте установим CUBIC на Ubuntu, для этого выполним следующие команды в терминале:
sudo apt update sudo apt-add-repository ppa:cubic-wizard/release sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 6494C6D6997C215E sudo apt install cubic
И по факту, на этом установка всё.
Создание сборки
Переходим к самой интересной части этой статьи – созданию сборки. Открываем Cubic, вы можете сделать это воспользовавшись графическим интерфейсом или просто введя cubic в терминале. И откроется такое окно:

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

Итак вам надо выбрать оригинальный диск и часть полей заполнятся автоматически. Давайте подробнее рассмотрим поля для кастомного образа:
- Version – автоматически должно заполнится текущей датой, можете указать там версию вашего проекта.
- Filename – имя файла вашего кастомного образа.
- Directory – папка, в которой будет ваш образ после его создания, фактически та папка, которую мы выбрали вначале.
- Volume Id – идентификатор диска.
- Disk Name – имя диска, то что будет отображаться во время установки ОС
- Release – версия Ubuntu
Заполненным всё это будет выглядеть примерно так:

После того как вы нажмёте Next, Cubic распакует ISO образ и предоставит вам доступ к эмулятору терминала с root правами, вы сможете установить в образ всё, что вам нужно.
Выглядеть это будет примерно так:

Ну, давайте чисто для примера установим парочку программ.
Для примера я установлю туда Cubic через PPA – репозитарий (да, так тоже можно было), для этого выполните эти команды:
apt-add-repository ppa:cubic-wizard/release apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 6494C6D6997C215E apt install cubic

Ну, для примера – этого хватит.
Жмём кнопку Next и нам дают выбрать пакеты которые будут удалены после установки. Так например мы можем превратить Ubuntu в супер лёгкую OS даже без графического интерфейса рабочего стола.

Пакетов здесь очень много, и про каждый вам лучше почитать отдельно… Гугл вам в помощь.
После того, как вы закончите выбирать пакеты и нажмёте Next, вам предложат выбрать версию ядра.

В моём случае я буду использовать базовое ядро. Здесь же во вкладке Preseed вы можете настроить авто установку, а во вкладке Boot — некоторые дополнительные конфигурации.
После этого, вам нужно выбрать сжатие файлов. Тут есть такая весьма понятная диаграмма:

Чем ниже и правее – тем медленнее, но меньше размер, а чем левее и выше – тем быстрее, но тем больше объем.
Я оставлю золотую середину и пойду дальше. После нажатия кнопки Generate начнется запаковка пакетов и сборка iso образа.
Потом вы должны увидеть что диск был успешно создан и вы можете его протестировать или закрыть программу.
Давайте попробуем запустить собранный нами образ не в QEMU, использовать который для проверки предлагает Cubic (я не имею ничего против этого эмулятора, но запускать виртуальную машину на виртуальной машине — не самое удобное и быстрое решение), а на VMwere. Я не стал устанавливать эту OС, а просто покажу вам страницу загрузки:

Как видите стандартные кнопки Try и Install имеют подпись не Ubuntu, а Custom. Значит, всё в порядке и у нас всё получилось!
Итог
Cubic — это действительно неплохая программа программа, которая позволяет сделать сборку Ubuntu особо не заморачиваясь. С её помощью вы можете создать образ с предустановленными программами, необходимыми вам, установить другое ядро, исключить некоторые пакеты из Ubuntu для облегчения или оптимизации ОС, настроить авто установку и многое другое.
В этой статье был представлен максимально короткий гайд для начинающих знакомится с этой программой. Однако, если кому то это действительно интересно, я могу подготовить более обширную статью по этому поводу, в которой на практике расскажу обо всех особенностях работы с Cubic на примере сборки ОС для себя.
От автора
Спасибо, что дочитали статью до конца, надеюсь она была вам полезна и сэкономила вам время. Если хотите повлиять на выход дальнейших статей, то можете подписаться на мой telegram-канал, там в том числе будут опросы касаемо выходов новых статей а так же разнообразные интересные материалы. Если хотите со мной связаться или предложить тему для статьи — мои контакты есть на сайте.
Ещё раз спасибо, что дочитали до сюда!
Как самому за один вечер собрать минимальную ОС Linux из исходного кода

В современном мире нас окружает огромное количество электронных устройств различной степени сложности. Если устройство более или менее сложное, например, телевизор, маршрутизатор, смартфон, то с большой долей вероятности оно работает под управлением операционной системы Linuх, и эта мысль не даёт мне покоя.
Ещё больше не даёт покоя мне тот факт, что все ядра операционной системы Linux, которые работают на различных устройствах и серверах, собраны из исходного кода, находящегося в репозитории на сайте kernel.org.
Такие разные устройства, а операционная система, работающая на них, собрана из одного и того же исходного кода! Это утверждение, конечно, верно лишь отчасти, так как фактически ядро обычно расширено и модифицировано разработчиками конкретных дистрибутивов Linux, а также разработчиками конкретных устройств, но общего исходного кода достаточно много.
Мне всегда хотелось собрать операционную систему Linux самому из исходного кода, но процесс этот всегда казался сложным и запутанным, да и многого я не понимал. Но всё-таки в определённый момент времени я накопил достаточное количество знаний, чтобы осуществить свою мечту. В этой статье я хочу рассказать вам, как собрать минимальную Linux из исходного кода и запустить её у себя на компьютере.
Она не позволит использовать все возможности вашего компьютера, но будет иметь главное – интерфейс командной строки. Поверьте мне, получив работающий интерфейс командной строки Linux на вашем реальном компьютере, вы испытаете неповторимые ощущения.
Вы удивитесь, но минимальный набор, необходимый для получения командной строки Linux содержит всего два файла: файл ядра Linux и файл начального образа корневой файловой системы. Естественно, необходим загрузчик, который загрузит эти два файла и инициирует выполнение ядра, передав ему образ начальной корневой файловой системы и другие параметры, если они необходимы.
▍ Минимальная операционная система Linux
Чтобы вы как-то смогли работать с операционной системой, вам нужны четыре составляющие: загрузчик, ядро, начальная корневая файловая система и набор утилит, являющийся интерфейсом к ядру операционной системы.
Загрузчик — это специальная программа, которая позволяет процессору начать выполнение машинных инструкций, находящихся в файле ядра операционной системы.
- aбстракции для различных физических устройств ввода-вывода, с которыми может работать процессор (драйвера устройств),
- aбстракции структур данных для хранения (файловые системы),
- aбстракции для разделения во времени выполнения программных инструкций (процессы, потоки),
- другие абстракции.
Начальная корневая файловая система нужна для того, чтобы ядро выполнило начальную загрузку файлов, необходимую для дальнейшей загрузки операционной системы. Самыми важными являются модули ядра Linux, не вошедшие в состав файла ядра, но нужные для дальнейшей загрузки, и файл, на основании которого будет создан самый первый процесс при загрузке операционной системы (init).
Набор утилит позволяет вам работать с абстракциями, находящимися в ядре операционной системы. В зависимости от сложности и назначения устройства, на котором будет работать операционная система, этот набор может различаться. Утилиты определяют функциональность и интерфейс взаимодействия с пользователем. Например, для роутера они будут одни, для телефона другие, а для персонального компьютера третьи.
▍ Загрузка операционной системы Linux
- Происходит включение компьютера.
- BIOS или UEFI находит на компьютере загрузчик операционной системы и передаёт управление ему.
- Загрузчик операционной системы загружает в оперативную память файл ядра Linux и файл образа начальной файловой системы (файл initrd).
- Загрузчик операционной системы передаёт управление ядру операционной системы Linux.
- Ядро операционной системы проводит начальную инициализацию.
- Ядро операционной системы получает доступ к файлам, которые находятся в образе начальной файловой системы (монтирует образ).
- Ядро ищет файл init в начальной файловой системе и запускает самый первый процесс пользователя на его основе.
- Процесс init монтирует уже постоянную файловую систему, продолжает инициализацию операционной системы и переносит корень файловой системы Linux на смонтированную файловую систему и запускает другие процессы, которые необходимы для инициализации.
▍ Дистрибутивы Linux
Дистрибутив – это ядро Linux, набор библиотек, утилит и программ, который устанавливается на компьютер или устройство.
На данный момент количество различных дистрибутивов огромно. Их перечень вы можете посмотреть на сайте DistroWatch.
Современные дистрибутивы Linux обычно распространяются в виде образов ISO и позволяют устанавливать обновления и дополнительные программы (пакеты), но мы делаем минимальный дистрибутив, поэтому, естественно, у нас такой возможности не будет.
Одна из самых полных инструкций, как собрать дистрибутив Linux с нуля, находится здесь. Сборка дистрибутива Linux — процесс интересный и позволит вам узнать много нового, но уж очень он долгий, а значит вам необходима огромная сила воли, чтобы выполнить его от начала до конца.
Когда ты получаешь такой огромный массив информации, не сильно разбираясь в теме, есть вероятность, что ты часть вещей выполнишь, не сильно вникая в суть.
Поэтому я стремился упростить создание дистрибутива до минимума: мы не будем монтировать постоянную файловую систему, а в качестве файла init будем использовать файл скрипта, который выполнит минимальную инициализацию и запустит оболочку sh.
▍ Загрузка операционной системы
За долгие годы своего существования Linux был портирован на множество аппаратных платформ. Загрузка Linux для каждой платформы отличается.
- Будет ли использоваться для загрузки BIOS или UEFI.
- На каком носителе (жёсткий диск, флеш-накопитель, оптический диск, компьютерная сеть) BIOS или UEFI будет искать загрузчик.
- Как размечен жёсткий диск или флеш-накопитель (MBR или GPT).
- На каком носителе и в какой файловой системе (FAT, NTFS, EXT, CDFS и др.) будут располагаться файл ядра и файл с образом начальной корневой файловой системы, называющийся initrd.
▍ Структура начальной корневой файловой системы
Начальная корневая файловая система содержит минимальное количество файлов и директорий, необходимых для дальнейшей работы Linux. В нашем случае это директории bin, dev, proc, sys. В директории bin cодержатся утилиты для работы с ядром Linux.
▍ Наборы утилит
Минимальный Linux — это ядро и набор утилит командной строки. Ядро и утилиты командной строки разрабатываются разными командами программистов.
- GNU Core Utils;
- BusyBox.
▍ Создание среды для сборки Linux
Как бы это парадоксально ни звучало, но Linux обычно собирают в Linux. Для этого вам необходима операционная система Linux, в которой присутствуют программы, позволяющие собрать ядро Linux и набор утилит для сборки.
Например, на Ubuntu 22.10 нам необходимо установить следующие пакеты: make, build-essential, bc, bison, flex, libssl-dev, libelf-dev, wget, cpio, fdisk, extlinux, dosfstools, qemu-system-x86. Для других систем набор пакетов может отличаться.
▍ Создание минимальной Linux в Ubuntu 22.10
1. Устанавливаем необходимые пакеты для сборки.
$ cd ~ $ mkdir -p simple-linux/build/sources $ mkdir -p simple-linux/build/downloads $ mkdir -p simple-linux/build/out $ mkdir -p simple-linux/linux $ sudo apt update $ sudo apt install --yes make build-essential bc bison flex libssl-dev libelf-dev wget cpio fdisk extlinux dosfstools qemu-system-x86
2. Загружаем из интернета исходный код для ядра Linux и BusyBox.
$ cd simple-linux/build $ wget -P downloads https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.15.79.tar.xz $ wget -P downloads https://busybox.net/downloads/busybox-1.35.0.tar.bz2
3. Распаковываем архивы с исходным кодом.
$ tar -xvf downloads/linux-5.15.79.tar.xz -C sources $ tar -xjvf downloads/busybox-1.35.0.tar.bz2 -C sources
4. Собираем бинарные файлы BusyBox и для ядра Linux. Этот процесс займёт достаточно много времени, порядка 10 минут и даже больше, поэтому не пугайтесь.
$ cd sources/busybox-1.35.0 $ make defconfig $ make LDFLAGS=-static $ cp busybox ../../out/ $ cd ../linux-5.15.79 $ make defconfig $ make -j8 || exit $ cp arch/x86_64/boot/bzImage ~/simple-linux/linux/vmlinuz-5.15.79
5. Создаём файл init.
$ mkdir -p ~/simple-linux/build/initrd $ cd ~/simple-linux/build/initrd $ vi init
Вместо редактора vim (команда vi) вы можете использовать другой текстовый редактор, например gedit.
Файл init
#! /bin/sh mount -t sysfs sysfs /sys mount -t proc proc /proc mount -t devtmpfs udev /dev sysctl -w kernel.printk="2 4 1 7" /bin/sh poweroff -f
6. Cоздаём структуру директорий и файлов.
$ chmod 777 init $ mkdir -p bin dev proc sys $ cd bin $ cp ~/simple-linux/build/out/busybox ./ $ for prog in $(./busybox --list); do ln -s /bin/busybox $prog; done
7. Помещаем структуру в файл initrd, который у нас является cpio-архивом.
$ cd .. $ find . | cpio -o -H newc > ~/simple-linux/linux/initrd-busybox-1.35.0.img
8. Запускаем собранный образ в эмуляторе qemu.
$ cd ~/simple-linux/linux $ qemu-system-x86_64 -kernel vmlinuz-5.15.79 -initrd initrd-busybox-1.35.0.img -nographic -append 'console=ttyS0'
9. Попробуем ввести известные вам команды Linux. Выходим из эмулируемой Linux, набрав команду exit.
▍ Создание загрузочного образа для флеш-накопителя
Если мы хотим запустить наш Linux на реальном железе, то, наверное, самый простой способ — это создать образ для размещения на загрузочном накопителе и записать его. Создание такого образа и загрузка с накопителя, с моей точки зрения, самый сложный процесс и требует более продвинутых знаний от вас.
- что будет инициировать загрузку (BIOS или UEFI),
- какой накопитель вы будете использовать (CDROM, флеш-накопитель, жёсткий диск),
- как вы разметите накопитель (MBR, GPT) и будете ли его размечать,
- какой загрузчик вы будете использовать,
- какая файловая система будет использоваться там, где будут располагаться файлы Linux и загрузчика.
Алгоритм создания образа загрузочного флеш-накопителя следующий:
1. Создаём файл образа.
$ dd if=/dev/zero of=boot-disk.img bs=1024K count=50
2. Создаём загрузочный раздел внутри файла образа.
$ echo "type=83,bootable" | sfdisk boot-disk.img
3. Настраиваем loopback-устройство на загрузочный раздел внутри файла boot-disk.img.
$ losetup -D $ LOOP_DEVICE=$(losetup -f) $ losetup -o $(expr 512 \* 2048) $ boot-disk.img
4. Создаём файловую систему на loopback-устройстве.
$ mkfs.vfat $
5. Монтируем loopback-устройство.
$ mkdir -p /mnt/os $ mount -t auto $ /mnt/os
6. Копируем файл ядра Linux и файл initrd на первый раздел внутри файла boot-disk.img.
$ cp vmlinuz-5.15.79 initrd-busybox-1.35.0.img /mnt/os
7. Выполняем установку загрузчика EXTLINUX внутри файла boot-disk.img.
$ mkdir -p /mnt/os/boot $ extlinux --install /mnt/os/boot
8. Создаём файл конфигурации для загрузчика, в котором указываем, что именно грузить.
$ echo "DEFAULT linux" >> /mnt/os/boot/syslinux.cfg $ echo " SAY Booting Simple Linux via SYSLINUX" >> /mnt/os/boot/syslinux.cfg $ echo " LABEL linux" >> /mnt/os/boot/syslinux.cfg $ echo " KERNEL /vmlinuz-5.15.79" >> /mnt/os/boot/syslinux.cfg $ echo " APPEND initrd=/initrd-busybox-1.35.0.img nomodeset" >> /mnt/os/boot/syslinux.cfg
9. Размонтируем loopback-устройство.
$ umount /mnt/os $ losetup -D
10. Выполняем установку загрузчика MBR в начало диска внутри файла boot-disk.im.
$ dd if=/usr/lib/syslinux/mbr/mbr.bin of=boot-disk.img bs=440 count=1 conv=notrunc
Файл boot-disk.img будет содержать загрузочный образ флеш-накопителя
▍ Использование Docker для сборки Linux
Описанные выше алгоритмы содержат много команд и параметров, в них достаточно просто ошибиться при наборе. Команды можно объединить в bash-скрипты, а чтобы можно было собрать Linux в операционной системе Windows 10 или 11, рационально использовать Docker Desktop.
- В файле Dockerfile вы описываете структуру окружения для вашей программы или скрипта.
- При помощи утилиты docker на основании Dockerfile вы создаёте образ этого окружения в определённом формате.
- При помощи этой же утилиты вы можете запустить на основе образа экземпляр вашей программы или скрипта, работающий в изолированном окружении и называемый Docker-контейнер в терминологии Docker.
- Созданные вами образы можно хранить в репозитории и повторно использовать.
Docker-контейнеры, созданные на основании одного и того же образа, будут идентично выполняться на всех компьютерах, способных его выполнить. - Dockerfile удобно читать и изучать, также его удобно распространять.
Ниже приведу содержимое Dockerfile:
FROM ubuntu:22.10 RUN apt update && apt install --yes make build-essential bc bison flex libssl-dev libelf-dev wget RUN apt install --yes cpio fdisk extlinux dosfstools qemu-system-x86 RUN apt install --yes vim ARG APP=/app ARG LINUX_DIR=$APP/linux ARG FILES_DIR=$APP/files ARG SCRIPTS_DIR=$APP/scripts ENV BUILD_DIR=$APP/build ENV LINUX_DIR=$LINUX_DIR ENV FILES_DIR=$FILES_DIR ENV LINUX_VER=5.15.79 ENV BUSYBOX_VER=1.35.0 ENV BASH_ENV="$SCRIPTS_DIR/bash-env/env" COPY ./scripts $APP/scripts COPY ./files $APP/files RUN mkdir -p $LINUX_DIR RUN ln -s $APP/scripts/start-linux.sh /usr/bin/start &&\ ln -s $APP/scripts/build-linux.sh /usr/bin/build &&\ ln -s $APP/scripts/build-image.sh /usr/bin/image WORKDIR $APP/scripts CMD build
Команда FROM является самой важной в нём, она указывает, на основании какого образа файловой системы будет строиться наш образ для сборки Linux. В данном случае это ubuntu:22.10.
Команда RUN запускает команды внутри создаваемого нами образа. Т. е. команды, которые следуют после RUN, будут выполнены так, как было бы, если бы вы работали в Ubuntu 22.10 и выполнили их в командной строке. В результате работы команды образ файловой системы у вас изменится, так как эти команды изменяют файловую систему внутри него.
Команда COPY копирует файлы из файловой системы нашей операционной системы внутрь создаваемого образа. Как и RUN, она изменяет файловую систему внутри образа.
Команды ARG и ENV вызывают путаницу. Не знаю, проясню я вам или нет, но ARG – это создание переменных, которые используются при создании образа, а ENV – это создание переменных, которые используются, когда уже на основании этого образа создан контейнер, и эти переменные будут видны внутри него.
Команда WORKDIR указывает, какая директория будет рабочей при запуске контейнера, созданного на базе нашего образа.
Команда CMD указывает, какая команда будет выполнена по умолчанию внутри контейнера при его запуске.
▍ Запуск и сборка минимальной Linux при помощи Docker
Вы можете поэкспериментировать с моим проектом. В Windows лучше всего запускать Docker в PowerShell.
1. Создание Docker-образа:
$ git clone https://github.com/artyomsoft/simple-linux.git $ cd simple-linux $ docker build --build-arg APP -t simple-linux .
2. Запуск минимальной Linux:
$ mkdir linux $ cd linux $ docker run -v $:/app/linux --rm -it simple-linux build
В созданной вами директории linux будет находиться собранный файл ядра Linux и файл образа начальной корневой системы.
3. Создание загрузочного образа для флеш-накопителя.
Обратите внимание, что нужно использовать опцию —privileged в docker, так как скрипт image использует loopback-устройство.
$ docker run -v $:/app/linux –-privileged --rm -it simple-linux image
Если вы будете использовать Docker Desktop for Linux, Docker придётся запускать, используя sudo и вместо $ нужно будет использовать $(pwd).
▍ Запись загрузочного образа для флеш-накопителя на носитель
Созданный файл образа для флеш-накопителя (linux-5.15.79-busybox-1.35.0-disk.img) вы можете записать на флеш-накопитель при помощи утилиты Win32DiskImager. Следует заметить, что при записи вы потеряете все данные, хранящиеся на флеш-накопителе, поэтому лучше использовать накопитель, на котором нет никаких файлов.
После записи образа на флеш-накопитель перезагрузите компьютер и выберите загрузку с USB-HDD, т. е. c созданного вами флеш-накопителя. Скорее всего, перед этим вам будет нужно выбрать Legacy Boot и отключить Secure Boot в BIOS.
▍ Выводы
Если вы дочитали эту статью до конца, то у меня для вас есть небольшой -==BONUS==-
Имея установленный Docker Desktop для Windows, посмотреть, как всё работает, и запустить сборку моей минимальной ОС Linux можно одной командой в PowerShell.
docker run -v $:/app/linux --rm -it artyomsoft/simple-linux build
У вас появится командная строка моей минимальной Linux, а при выходе из неё вы увидите в текущей директории файл ядра Linux и initrd-файл.
В этой статье я привёл подробную инструкцию, как можно получить работающую систему Linux из исходного кода.
Кому-то эта статья может показаться сильно простой и не заслуживающей внимания. Но я, чтобы не отпугнуть вас подробностями, не углублялся в такие темы, как BIOS, UEFI, файловые системы, загрузчики, библиотека glibc, подробный процесс загрузки операционной системы, различные спецификации, динамическая и статическая линковка, модули ядра Linux… Я только привёл минимальное количество теории, которая позволит понять, что же, собственно, вы делали, и разобраться в теме гораздо быстрее меня, не собирая всю информацию по крупицам.
Полученную операционную систему вы вряд ли будете использовать в дальнейшем, но я надеюсь, что абстрактные знания о Linux у вас превратятся в понимание и умение.