Руководство по созданию linux

Linux для себя

lx4u

Lx4U или “Linux для себя” — подробное руководство по созданию Linux-системы, используя исходные тексты необходимого программного обеспечения.

Это руководство — самостоятельное ответвление от проекта Linux From Scratch.

На ваш выбор предлагается использование multilib системы, поддержка EFI и набор дополнительного программного обеспечения для организации комфортной работы. Кроме того, существует расширенное руководство, в котором содержится информация о настройке окружения рабочего стола и программного обеспечения, охватывающего различные области применения.

Но главная идея остаётся — вы в центре всего, и вы решаете, какой должна быть Ваша собственная система. А мы просто протягиваем Вам руку помощи.

Начните собственное путешествие в мир Linux прямо сейчас!

Чтобы изучить руководство локально

Требования

  • python3 для работы генератора документации и сервера;
  • pip3 для установки зависимостей.

Установка зависимостей

pip install mkdocs-material mkdocs
pip install git+https://github.com/RedisLabs/mkdocs-include.git

Сборка в Linux

mkdocs build # Сборка
mkdocs serve # Запуск

Сборка в Windows

Могут возникнуть проблемы со сборкой в Windows из-за кодировки.
Чтобы исправить эту проблему, можно выставить переменную окружения PYTHONUTF8 со значением 1

Например

python -m mkdocs build # Сборка
python -m mkdocs serve # Запуск

В результате будет сгенерирован каталог site. Руководство будет доступно по адресу http://127.0.0.1:8000/mkdocs/.

image

В современном мире нас окружает огромное количество электронных устройств различной степени сложности. Если устройство более или менее сложное, например, телевизор, маршрутизатор, смартфон, то с большой долей вероятности оно работает под управлением операционной системы Linuх, и эта мысль не даёт мне покоя.

Ещё больше не даёт покоя мне тот факт, что все ядра операционной системы Linux, которые работают на различных устройствах и серверах, собраны из исходного кода, находящегося в репозитории на сайте kernel.org.

Такие разные устройства, а операционная система, работающая на них, собрана из одного и того же исходного кода! Это утверждение, конечно, верно лишь отчасти, так как фактически ядро обычно расширено и модифицировано разработчиками конкретных дистрибутивов Linux, а также разработчиками конкретных устройств, но общего исходного кода достаточно много.

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

Она не позволит использовать все возможности вашего компьютера, но будет иметь главное – интерфейс командной строки. Поверьте мне, получив работающий интерфейс командной строки Linux на вашем реальном компьютере, вы испытаете неповторимые ощущения.

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

▍ Минимальная операционная система Linux

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

Загрузчик — это специальная программа, которая позволяет процессору начать выполнение машинных инструкций, находящихся в файле ядра операционной системы.

Ядро — это программный код, который содержит:

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

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

Начальная корневая файловая система нужна для того, чтобы ядро выполнило начальную загрузку файлов, необходимую для дальнейшей загрузки операционной системы. Самыми важными являются модули ядра Linux, не вошедшие в состав файла ядра, но нужные для дальнейшей загрузки, и файл, на основании которого будет создан самый первый процесс при загрузке операционной системы (init).

Набор утилит позволяет вам работать с абстракциями, находящимися в ядре операционной системы. В зависимости от сложности и назначения устройства, на котором будет работать операционная система, этот набор может различаться. Утилиты определяют функциональность и интерфейс взаимодействия с пользователем. Например, для роутера они будут одни, для телефона другие, а для персонального компьютера третьи.

▍ Загрузка операционной системы Linux

Загрузка операционной системы Linux может отличаться на различных архитектурах и компьютерах, но для архитектуры x86 загрузка выглядит в большинстве случаев так:

  1. Происходит включение компьютера.
  2. BIOS или UEFI находит на компьютере загрузчик операционной системы и передаёт управление ему.
  3. Загрузчик операционной системы загружает в оперативную память файл ядра Linux и файл образа начальной файловой системы (файл initrd).
  4. Загрузчик операционной системы передаёт управление ядру операционной системы Linux.
  5. Ядро операционной системы проводит начальную инициализацию.
  6. Ядро операционной системы получает доступ к файлам, которые находятся в образе начальной файловой системы (монтирует образ).
  7. Ядро ищет файл init в начальной файловой системе и запускает самый первый процесс пользователя на его основе.
  8. Процесс init монтирует уже постоянную файловую систему, продолжает инициализацию операционной системы и переносит корень файловой системы Linux на смонтированную файловую систему и запускает другие процессы, которые необходимы для инициализации.

▍ Дистрибутивы Linux

Дистрибутив – это ядро Linux, набор библиотек, утилит и программ, который устанавливается на компьютер или устройство.

На данный момент количество различных дистрибутивов огромно. Их перечень вы можете посмотреть на сайте DistroWatch.

Современные дистрибутивы Linux обычно распространяются в виде образов ISO и позволяют устанавливать обновления и дополнительные программы (пакеты), но мы делаем минимальный дистрибутив, поэтому, естественно, у нас такой возможности не будет.

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

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

Поэтому я стремился упростить создание дистрибутива до минимума: мы не будем монтировать постоянную файловую систему, а в качестве файла init будем использовать файл скрипта, который выполнит минимальную инициализацию и запустит оболочку sh.

▍ Загрузка операционной системы

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

Для x86 загрузка может отличаться следующим:

  1. Будет ли использоваться для загрузки BIOS или UEFI.
  2. На каком носителе (жёсткий диск, флеш-накопитель, оптический диск, компьютерная сеть) BIOS или UEFI будет искать загрузчик.
  3. Как размечен жёсткий диск или флеш-накопитель (MBR или GPT).
  4. На каком носителе и в какой файловой системе (FAT, NTFS, EXT, CDFS и др.) будут располагаться файл ядра и файл с образом начальной корневой файловой системы, называющийся initrd.

▍ Структура начальной корневой файловой системы

Начальная корневая файловая система содержит минимальное количество файлов и директорий, необходимых для дальнейшей работы Linux. В нашем случае это директории bin, dev, proc, sys. В директории bin cодержатся утилиты для работы с ядром Linux.

▍ Наборы утилит

Минимальный Linux — это ядро и набор утилит командной строки. Ядро и утилиты командной строки разрабатываются разными командами программистов.

Наиболее распространёнными наборами являются:

  • GNU Core Utils;
  • BusyBox.

Из-за того, что 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 и загрузчика.

Я использовал флеш-накопитель с MBR и установленным загрузчиком EXTLINUX, одним разделом FAT32, на котором располагаются файлы. Загрузку у меня инициировал BIOS (опция Legacy boot, если у вас на компьютере прошит UEFI BIOS).

Алгоритм создания образа загрузочного флеш-накопителя следующий:

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) ${LOOP_DEVICE} boot-disk.img

4. Создаём файловую систему на loopback-устройстве.

$ mkfs.vfat ${LOOP_DEVICE}

5. Монтируем loopback-устройство.

$ mkdir -p /mnt/os
$ mount -t auto ${LOOP_DEVICE} /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.

Суть Docker в следующем:

  1. В файле Dockerfile вы описываете структуру окружения для вашей программы или скрипта.
  2. При помощи утилиты docker на основании Dockerfile вы создаёте образ этого окружения в определённом формате.
  3. При помощи этой же утилиты вы можете запустить на основе образа экземпляр вашей программы или скрипта, работающий в изолированном окружении и называемый Docker-контейнер в терминологии Docker.
  4. Созданные вами образы можно хранить в репозитории и повторно использовать.
    Docker-контейнеры, созданные на основании одного и того же образа, будут идентично выполняться на всех компьютерах, способных его выполнить.
  5. Dockerfile удобно читать и изучать, также его удобно распространять.

На GitHub у меня есть проект, содержащий исходный код среды для сборки Linux на основе технологии Docker-контейнеров.

Ниже приведу содержимое 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 ${pwd}:/app/linux --rm -it simple-linux build

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

3. Создание загрузочного образа для флеш-накопителя.

Обратите внимание, что нужно использовать опцию —privileged в docker, так как скрипт image использует loopback-устройство.

$ docker run -v ${pwd}:/app/linux –-privileged --rm -it simple-linux image

Если вы будете использовать Docker Desktop for Linux, Docker придётся запускать, используя sudo и вместо ${pwd} нужно будет использовать $(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 ${pwd}:/app/linux --rm -it artyomsoft/simple-linux build

У вас появится командная строка моей минимальной Linux, а при выходе из неё вы увидите в текущей директории файл ядра Linux и initrd-файл.

В этой статье я привёл подробную инструкцию, как можно получить работающую систему Linux из исходного кода.

Кому-то эта статья может показаться сильно простой и не заслуживающей внимания. Но я, чтобы не отпугнуть вас подробностями, не углублялся в такие темы, как BIOS, UEFI, файловые системы, загрузчики, библиотека glibc, подробный процесс загрузки операционной системы, различные спецификации, динамическая и статическая линковка, модули ядра Linux… Я только привёл минимальное количество теории, которая позволит понять, что же, собственно, вы делали, и разобраться в теме гораздо быстрее меня, не собирая всю информацию по крупицам.

Полученную операционную систему вы вряд ли будете использовать в дальнейшем, но я надеюсь, что абстрактные знания о Linux у вас превратятся в понимание и умение.

Играй в наш скролл-шутер прямо в Telegram и получай призы! 🕹️🎁


Download Article


Download Article

This wikiHow teaches you how to create a Linux operating system. While creating a Linux distribution from scratch requires advanced knowledge of how to code, a free Linux distribution called Slax will allow you to customize your Linux installation to create a distribution with only the items you want. You will need a windows computer for this process.

  1. Image titled Build Your Own Linux Distribution Step 1

    1

    Install WinRAR if you don’t have it. Since Windows doesn’t have a program which can open ISO files as directories, you’ll use this free program to open the ISO file for Slax later. Go to https://www.rarlab.com/download.htm (or go to https://www.rarlab.com/ and click Downloads on the left side), then do the following:

    • Click WinRAR x64 (64 bit) 5.60 beta 5 near the top of the page.
    • Double-click the downloaded setup file.
    • Click Yes when prompted.
    • Click Install
    • Make sure the «ISO» box is checked.
    • Click OK
    • Click Done
  2. Image titled Build Your Own Linux Distribution Step 2

    2

    Open the Slax website. Go to https://www.slax.org/en/ in your computer’s web browser. This is the website from which you can download Slax.

    Advertisement

  3. Image titled Build Your Own Linux Distribution Step 3

    3

    Click Slax 64bit. It’s on the left side of the page. Doing so prompts the Slax ISO file to download onto your computer.

    • Unless your computer was manufactured in the 90s or early 2000s, don’t use the 32-bit link for Slax.[1]
  4. Image titled Build Your Own Linux Distribution Step 4

    4

    Plug a flash drive into your computer. You can use any type of USB flash drive for this step, but the flash drive must have at least one gigabyte of storage space.

    • Given that it costs less than $10 to buy a 16-gigabyte flash drive, you might want to purchase a flash drive which is larger than one gigabyte.
  5. Image titled Build Your Own Linux Distribution Step 5

    5

    Format the flash drive for NTFS. If your flash drive has never been formatted for NTFS, you’ll need to change the file system on the flash drive to NTFS by selecting it from the «File system» drop-down menu in the Format window.

  6. Advertisement

  1. Image titled Build Your Own Linux Distribution Step 6

    1

    Right-click the downloaded Slax ISO. Doing so will prompt a drop-down menu.

    • Make sure that Slax has finished downloading before you do this.
  2. Image titled Build Your Own Linux Distribution Step 7

    2

    Select Open with. It’s near the middle of the drop-down menu. This prompts a pop-out menu to appear.

  3. Image titled Build Your Own Linux Distribution Step 8

    3

    Click WinRAR archiver. You’ll see it in the pop-out menu. The ISO file will open in WinRAR.

  4. Image titled Build Your Own Linux Distribution Step 9

    4

    Select the «slax» folder. Click once the «slax» folder near the top of WinRAR.

  5. Image titled Build Your Own Linux Distribution Step 10

    5

    Click Extract To. It’s a folder-shaped option at the top of the WinRAR window. Doing so opens a pop-up window.

  6. Image titled Build Your Own Linux Distribution Step 11

    6

    Select your flash drive’s name. You’ll find this option in the pop-up window.

  7. Image titled Build Your Own Linux Distribution Step 12

    7

    Click OK. It’s at the bottom of the window. This will allow the «slax» folder to extract and copy to your flash drive.

  8. Advertisement

  1. 1

    Understand how modules work. Slax is a lightweight distribution, meaning that it only comes with a few absolutely necessary programs and services installed. By adding module files to your Slax installation flash drive, you can determine which programs, features, and graphical interfaces appear in your final distribution.

    • Like Slax, modules are completely free to download and use.
  2. 2

  3. 3

    Select a category. Click any one of the categories (e.g., artwork) to view a list of its included modules.

  4. 4

    Find a module you want to install. Each listed module will have a description to the right of it, so scroll through the descriptions until you find one for a program or feature you’d like to include in your installation.

  5. 5

    Click 64bit. It’s a button to the left of your preferred module.

    • If this button is greyed out, you’ll click 32bit instead. Almost all of the available modules are 64 bit.
  6. 6

    Repeat for any other module files. Once you’ve downloaded all of the modules you want to install, you can proceed.

    • Don’t worry about renaming or classifying the modules—they’re all going to go in the same folder.
  7. 7

    Copy the module files. Click and drag your mouse to select all of your downloaded module files, then press Ctrl+C.

  8. 8

    Open your flash drive. If your flash drive is already open in a window, you’re all set. If not, do the following:

    • Press Win+E to open File Explorer (or type file explorer into Start and then click File Explorer).
    • Click This PC on the left side of File Explorer.
    • Double-click your flash drive’s name.
  9. 9

    Open the «slax» folder. Double-click the «slax» folder at the top of your flash drive’s window.

  10. 10

    Open the «modules» folder. Double-click the «modules» folder near the top of the window.

  11. 11

    Paste in the module files. Once the empty «modules» folder is open, press Ctrl+V to paste the module files into it.

  12. Advertisement

  1. Image titled Build Your Own Linux Distribution Step 24

    1

    Re-open your flash drive. If you closed your flash drive, re-open it via File Explorer.

    • If your flash drive is open, click the «Back» button in the top-left corner of the File Explorer, then skip the next step.
  2. Image titled Build Your Own Linux Distribution Step 25

    2

    Open the «slax» folder. It should be the only folder on your flash drive.

  3. Image titled Build Your Own Linux Distribution Step 26

    3

    Open the «boot» folder. This folder is near the top of the flash drive’s window.

  4. Image titled Build Your Own Linux Distribution Step 27

    4

    Run the boot installer. Double-click the bootinst file in the «boot» folder, then click Yes when prompted. This will allow Slax to make your USB flash drive bootable.

  5. Image titled Build Your Own Linux Distribution Step 28

    5

    Press any key when prompted. Doing so signifies that your USB flash drive is now bootable.

  6. Image titled Build Your Own Linux Distribution Step 29

    6

    Open your computer’s BIOS page. This will vary slightly from Windows computer to Windows computer, but you’ll always start by restarting your PC. After the computer shuts down and begins to reboot, you’ll press your computer’s «BIOS» key, which will change depending on your computer’s manufacturer.

    • The «BIOS» key is usually one of the function keys (e.g., F12), the Del key, or something similar.
  7. Image titled Build Your Own Linux Distribution Step 30

    7

    Set your flash drive as the primary boot location. Again, this will vary depending on your computer’s manufacturer. In most cases, you’ll find the «Boot», «Advanced», or «Drives» section in which all of your computer’s attached drives are, then you’ll use the arrow keys to select your flash drive and press the + key to move the flash drive to the top of the list.

    • Keep in mind that this will cause your computer to boot from the flash drive rather than its built-in hard drive whenever the flash drive is connected.
  8. Image titled Build Your Own Linux Distribution Step 31

    8

    Save and exit. Press the «Save and Exit» key that’s listed in the key legend at the bottom or on the side of the screen.

    • You may have to confirm this choice by pressing another key.
  9. Image titled Build Your Own Linux Distribution Step 32

    9

    Wait for the Slax startup icon to appear. Once you see the Slax four-leaf clover appear, Slax is opening. You should see the Slax desktop appear shortly after this point.

  10. Image titled Build Your Own Linux Distribution Step 33

    10

    View your installed programs. Click the four-box «Menu» icon in the lower-left corner of the screen to do so. You should see any module programs that you installed here.

    • If you added any graphical modules, they will appear as part of your system. For example, if you added an icon module which changes the icons in your Slax distribution, the icons will be different upon booting.
    • You can delete modules from or add modules to your flash drive at any time from within the «slax/modules/» directory.
  11. Advertisement

Add New Question

  • Question

    Is there any way that I can make it by coding?

    Community Answer

    You can use Linux from scratch. Search for it and you will find some tutorials about it.

  • Question

    How do I build my own Linux distribution if SUSE studio is being discontinued?

    Community Answer

    You’ll have to take the harder path, building your own Linux from scratch. It is quite difficult, but will soon be your only option if you want the best customization.

  • Question

    I try to create an account at SUSE Studio, but get error 500 when trying to use my Google account. I do not have any other account to use for it. I don’t want to use method 1. What do I do?

    Community Answer

    SUSE Studio is discontinuing soon, so there really isn’t that much choice.

See more answers

Ask a Question

200 characters left

Include your email address to get a message when this question is answered.

Submit

Advertisement

  • If you’re interested in coding your own Linux distribution from scratch, you should check out the free Linux from Scratch eBook available at http://www.linuxfromscratch.org/lfs/downloads/stable/. You can click the LFS-BOOK-8.2.pdf link to open the PDF version of the book, which offers step-by-step instructions on creating your own distribution.

  • While you can easily run Slax on a virtual machine (e.g., VirtualBox), you won’t be able to use any of the modules for it if you do so.

  • By default, Slax only comes with a few programs. This makes it incredibly fast and easy to install on virtually any computer built in the last decade.

Thanks for submitting a tip for review!

Advertisement

  • Unfortunately, building a Linux distribution via other formerly popular methods (e.g., SUSE) is no longer possible as these services have been discontinued.

  • Slax, like any other Linux version, offers limited support for some programs.

Advertisement

References

About This Article

Thanks to all authors for creating a page that has been read 164,807 times.

Is this article up to date?

Содержание

ВВЕДЕНИЕ

Прежде чем делать свою сборку, Вы должны определить цель и задачи своего творения. Иначе сборка может не получить своё предназначение в этом мире и остаться малоизвестной.Итак, цели и задачи определены и Вы решились сделать сборку своей системы.

Для начала Вы должны либо в Virtualbox (или в другой виртуальной машине), либо у себя на компьютере установить операционную систему со всеми настройками, со всеми программами, которые считаете нужными иметь в Вашей сборке.

Теперь, когда всё настроено и установлено, будем создавать свою сборку. Для этого нам в первую очередь необходимо свободное место на разделе с папкой /home не менее 6 ГБ.

Для создания сборки есть несколько инструментов. Мы будем говорить о Remastersys, который позволяет создать полноценную сборку даже не очень продвинутому пользователю.

Все действия дальше описаны для Ubuntu, но подходят для всех Debian совместимых дистрибутивов.

1. УСТАНОВКА

Для установки Remastersys необходимо скачать и установить вручную , например, через программу gdebi, 2 пакета: remastersys_3.0.x-2_all.deb и remastersys-gtk_3.0.x-2_all.deb

Для Ubuntu 10.04 — 14.04 скачать отсюда

Для Ubuntu 16.04 — 17.04 скачать отсюда

Для Ubuntu 17.10 скачать отсюда

Для Ubuntu 18.04 скачать отсюда

2. ПЕРВЫЕ ШАГИ

Запускаем Система ⇒ Администрирование ⇒ Remastersys (Я использую Мате 1.6. С другими рабочими столами расположение может отличаться). Видим вот такое окно:

Коротко об основных кнопках:

Backup — полная резервная копия установленной системы, включая пользовательские данные и настройки. Сохраняется полностью все файлы в домашних каталогах пользователей системы.

Dist — резервная копия только установленной системы, БЕЗ пользовательских данных. Самый оптимальный вариант для создания сборки системы. Создается структура загрузочного диска и образ диска(iso).

Distcdfs — то же, что и Dist, но создается структура загрузочного диска без создания образа диска(iso).

Distiso — создает образ диска(iso), при условии готовой структуры загрузочного диска. Применяется только после Dist или Distcdfs.

Очистить — очистить временную папку программы. Используется для очищения папки перед созданием нового образа.

Переходим во вкладку Settings:

Здесь мы видим параметры нашей будущей сборки. Рассмотрим самое необходимое.

Username — имя пользователя по-умолчанию при входе в систему LiveCD.

CD Label — метка диска. Высвечивается название при загрузке диска в CD-привод. Ограничение 32 символа, учитывая пробелы.

Filename — имя файла созданного образа.

Остальное пока трогать не будем.

Итак зададим:

— Имя пользователя в строке Username, скажем, alex;

— Придумаем название нашей сборки и запишем в CD Label, допустим, AlexBuntu;

— В строке Filename запишем имя файла сборки, AlexBuntu-12.04-x32.iso.

Должно получится следующее:

Галочка в строке Show install icon on Backup mode desktop создает иконку установки Вашей системы на рабочем столе. Опция работает на всех основных рабочих столах.

Теперь переходим на вкладку Actions:

Нажимаем кнопку Dist. Появится окно:

Жмем ОК. Появится окно:

Всё, теперь можете спокойно и не торопясь попить чай или кофе. Минут через 15 — 60 (всё зависит от мощности ПК) появится сообщение:

Поздравляю Вас с первой Вашей сборкой!

Файл сборки находится по адресу /home/remastersys/remastersys и имеет то имя, которое Вы дали своей сборке. В моем случае это файл AlexBuntu-12.04-x32.iso. В этой же папке есть еще текстовый файл контрольной суммы образа с расширением md5, в моем случае файл AlexBuntu-12.04-x32.iso.md5.

Теперь Вы можете записать свою сборку на диск и насладиться своим творением. Возможно при входе в систему с LiveCD придется ввести имя пользователя, которое было выбрано при создании образа, в моем случае это alex. Пароль оставьте пустым.

3. РАСШИРЕННЫЕ ВОЗМОЖНОСТИ

Многих устроят выше описанные главы. Если Вы всё еще читаете, то Вы действительно хотите познать все тонкости создания сборки, приближенной к профессиональной.

В первую очередь коснемся вкладки Settings и рассмотрим остальные нужные строки.

Working directory — рабочая папка программы. Вы можете ее переназначить в любое место и на любой раздел.

Ну и самая важная строчка настроек Squashfs options.

Remastersys использует для создания дистрибутива возможности SquashFS. Чтобы понять весь смысл данной строки предлагаю Вам рускоязычный блог , в котором прекрасно изложен весь смысл этого мощнейшего инструмента.

После изучения всех возможностей добавим в нашу строчку Squashfs options следующие опции: -comp xz.

Строчка должна иметь вид:

Эта опция устанавливает алгоритм компрессии xz вместо gzip по-умолчанию, что сожмет нашу сборку примерно на 20-25% лучше.Эта опция доступна с версии squashfs 4.2 и, например, в Ubuntu 10.04 она не доступна. В версии Ubuntu 12.04 установлена нужная версия 4.2 squashfs.

Чтобы проверить, доступна ли эта опция, наберите в терминале mksquashfs. Если вы видите похожее на следующее:


mksquashfs

SYNTAX:mksquashfs source1 source2 … dest [options] [-e list of exclude dirs/files]

Filesystem build options:

-comp <comp> select <comp> compression

Compressors available:

gzip (default)

lzo

xz


то всё в порядке и использовать опцию -comp xz можно смело.

С версии 3.06 включение компрессии xz вместо gzip заменено на вкл./выкл. флажка

4. ЗАГРУЗОЧНОЕ МЕНЮ

По-умолчанию Remastersys создает загрузочное меню сборки довольно-таки скучное и однообразное. Одно только радует, что меню достаточно функциональное. Я долго искал простой способ включения своего меню без пересборки всего образа. Все дальнейшие действия не были задуманы авторами Remastersys и являются своего рода моими уловками и обходными способами, к которым я шел несколько месяцев различными экспериментами. Поэтому этот раздел не претендует на правильную инструкцию по Remastersys.

Итак. Вот такое загрузочное меню мы имеем в стандартной установке:

Вот такое меню можно получить после некоторых манипуляций:

Такое загрузочное меню используется в одной из моих сборок. Как видим, картинка изменена и меню русифицировано. Кроме всего прочего я убрал название дистрибутива из меню и написал его в GIMPe яркими красками. Сейчас мы с Вами и займемся заменой картинки и русификацией меню. Для этого нам потребуется обратить внимание на содержимое файлов в папке /home/remastersys/remastersys:

Здесь нас интересует папка ISOTMP. В этой папке хранятся временные файлы программы Remastersys. Этим мы и воспользуемся. Переходим в эту папку:

Структура данной папки очень похожа на структуру образа диска. Не хватает только папки .disk. В папке isolinux хранятся файлы загрузочного меню. Заходим в нее:

Рассмотрим файлы загрузочного меню:

splash.png — фоновое изображение. Размер изображения 640х480 точек на дюйм.

isolinux.cfg — конфигурационный файл загрузочного меню.

vesamenu.c32, isolinux.bin — системные файлы.

Смело меняем фон загрузочного меню на свой. Тип файла и название должно остаться таким же. Размер изображения обязательно 640х480 точек на дюйм.

Далее я выложил листинг отредактированного конфигурационного файла isolinux.cfg. За основу взят стандартный конфигурационный файл Remastersys. Я постарался максимально понятно написать комментарии к строкам. Почти вся информация в интернете на английском языке и очень краткая, поэтому много времени потратил на эксперименты, чтобы узнать, что и как работает.

default vesamenu.c32
prompt 0
timeout 100
font cyr_a8x16.psf
# Фон загрузочного меню
menu background splash.png

# Цвет имеет первые два регистра прозрачности значение от 0 (прозрачно) до 255 (непрозрачно) в HEX.
# Остальные 6 цифр цвет в режиме HEX (код цвета можно взять из GIMPa). Сначала пишется цвет букв, потом фона, потом 3 режима тени (none, std, all)

# Цвет заголовка
menu color title * #ff00923F #00000000 none
# Цвет оконтовки меню (бордюра)
menu color border * #00000000 #00000000 none
# Цвет выбранной строки меню
menu color sel * #7fffffff #00000000 none
# Цвет невыбранной строки меню
menu color unsel * #ffC4613B #00000000 none
# Цвет неактивной строки (отключенной но отображающейся на экране)
menu color disabled * #ffC4613B #00000000 none
# Цвет строки tabmsg расположенной под меню (с надписью Нажмите ENTER для загрузки или TAB для редактирования меню)
menu color tabmsg * #ffCC623E #00000000 none
# Цвет строки timeout (с надписью Автоматическая загрузка начнется через)
menu color timeout_msg * #ffCC623E #00000000 none
#Отступ с верху, строк
menu vshift 1

#Количество строк меню
menu rows 6

# Положение строки tabmsg
menu tabmsgrow 11
# Положение строки timeout
menu timeoutrow 12
menu AUTOBOOT Автоматическая загрузка начнется через # сек
menu tabmsg Нажмите ENTER для загрузки или TAB для редактирования меню
menu cmdlinerow 11

#Ширина меню, количество символов
menu width 80

#Отступ символов слева от края (как табуляция)
menu margin 12


#menu title Ubuntu 12.04 Desktop Mate 1.6
label live
# menu label live - boot the Live System
menu label Загрузить систему с LiveDVD диска
kernel /casper/vmlinuz
append file=/cdrom/preseed/custom.seed boot=casper initrd=/casper/initrd.gz quiet splash --

label install
menu label Установить Ubuntu 12.04 LTS Mate 1.6
kernel /casper/vmlinuz
append file=/cdrom/preseed/custom.seed boot=casper only-ubiquity initrd=/casper/initrd.gz quiet splash --
# Сделать строку меню не активной
# menu disable

label check
menu label Проверить диск на ошибки
kernel /casper/vmlinuz
append boot=casper integrity-check initrd=/casper/initrd.gz quiet splash --

label memtest
menu label Проверить память
kernel /install/memtest
append -

label hd
menu label Загрузиться с первого жесткого диска\
localboot 0x80

Кодировка файла isolinux.cfg должна быть обязательно CP 866. Можно сохранять и редактировать в Cooledit (текстовый редактор Midnight Commandera), в OpenOffice и др. Взять мой отредактированный файл isolinux.cfg можно здесь.

Кроме этого нужно положить в папку isolinux шрифты поддерживающие русский язык. Взять можно отсюда.

В папке должно получится следующее:

Проверьте права доступа файлов должно быть следующее для всех 5 файлов:

Теперь все приготовления закончены. Запускаем Remastersys:

Нажимаем кнопку Distiso. Процесс пересборки образа пойдет намного быстрее, всего 1 — 5 минут, потому что основные файлы системы пересобираться не будут. На выходе будут те же файлы образа и контрольной суммы, но уже с Вашим неповторимым красивым меню.

5. ОЧИСТКА СБОРКИ ОТ «ЛИШНЕГО»

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

Перед очисткой системы установите пакет ubiquity-frontend-gtk.

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

sudo apt-get autoremove
sudo apt-get clean

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

Вторая команда удалит скачанные файлы пакетов в архиве.

Теперь воспользуемся программой Synaptic и удалим все ненужные настройки, оставшиеся после удаленных пакетов. Открываем Synaptic. В открывшемся окне внизу выбираем группу фильтров «Состояние».

Выбираем фильтр «Не установленные (остались файлы настроек)», выделяем все пакеты, попавшие в этот фильтр. Правой клавишей мыши на выделенном выбираем в меню «отметить для полного удаления» и жмем «Применить».

Здесь же в этой группе фильтров удалите пакеты под фильтром «Установленные (авто удаляемые)«

Если фильтры «Не установленные (остались файлы настроек)» и «Установленные (авто удаляемые)» отсутствуют, значит система уже прошла чистку и под данные фильтры ничего не попадает.

Следующий инструмент очистки — программа BleachBit из стандартного репозитория. Интерфейс программы на русском языке, очень доступен для понятия, что Вы будете делать. Также перед очисткой есть кнопка «Предпросмотр», которая покажет, что будет удаляться, и позволяет сделать изменения до удаления. Программа очень эффективно чистит систему от ненужных файлов , а также умеет удалять неиспользуемые языковые файлы. В моей сборке программа удалила около 300 МБ.

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

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

С версии 3.06 и выше временные файлы удаляются автоматически

/var/backups

/var/cache/apt/ — не удалять папку archives

/var/cache/apt/archives — не удалять папку partial и файл lock

/var/cache/apt-xapian-index

/var/cache/flashplugin-installer

/var/crash

/var/lib/apt/lists — не удалять папку partial и файл lock

/var/lib/update-notifer/ — не удалять папки package-data-downloads и user.d

/var/lib/update-notifer/package-data-downloads — не удалять папку partial и файл lock

/var/lib/update-notifer/user.dудалять все файлы обязательно, иначе выдает окно ошибки

/var/tmp

Remastersys в начале установки копирует содержимое папки /var в свою временную папку /home/remastersys/remastersys/dummysys/var, откуда потом и включает в сборку файлы. Учитывая, что после копирования Remastersys проводит еще подготовительные операции, у нас есть примерно 5 минут удалить лишнее из папки /home/remastersys/remastersys/dummysys/var. Тем более, что даже, если мы удалили из папки /var/cache/apt файлы, они всё-равно создаются и копируются в папку /home/remastersys/remastersys/dummysys/var/cache/apt , утяжеляя сборку.

В эти же 5 минут у Вас есть возможность почистить папку /root. В ней оставляйте только те файлы, которые есть в папке /etc/skel и папку Desktop.

6. СОВЕТЫ И РЕКОМЕНДАЦИИ

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

  • Настройки новых пользователей хранятся в папке /etc/skel. Если Вы хотите, чтобы все пользователи имели какие-то одинаковые настройки отличные от по-умолчанию(дефолтных), то копируйте нужные файлы из своей папки /home/[ваш логин входа в систему] в эту папку, не забывая менять права со своих на права root. Всё подряд копировать туда не нужно, это может привести к определенным конфликтам. Обычно для каждой программы это 2-3 файла настроек. Помните, чем меньше вы туда скопируете, тем профессиональнее будет сборка и меньше проблем у пользователей.

  • Программы запуска для всех пользователей отредактировать, добавить, удалить лучше в папке /etc/xdg/autostart, не засоряя папку /etc/skel

  • Если Вы хотите сделать сборку с рабочим столом отличным от имеющегося в дистрибутиве, то лучше воспользоваться минимальной сборкой без графического окружения, включающей в себя ядро и самый минимум пакетов, который позволяет запускает систему в режиме консоли. И уже поверх этой системы доустанавить нужные пакеты и проводить нужные настройки. Такой метод имеет меньше ошибок, чем если брать готовую полную сборку и пытаться выпилить из нее ненужное.
    Здесь все возможные mini.iso для Ubuntu от релиза 12.04 до 16.04 https://help.ubuntu.com/community/Installation/MinimalCD

Удачи! И пусть мир узнает Ваши творения!

Ссылки

image

В современном мире нас окружает огромное количество электронных устройств различной степени сложности. Если устройство более или менее сложное, например, телевизор, маршрутизатор, смартфон, то с большой долей вероятности оно работает под управлением операционной системы Linuх, и эта мысль не даёт мне покоя.

Ещё больше не даёт покоя мне тот факт, что все ядра операционной системы Linux, которые работают на различных устройствах и серверах, собраны из исходного кода, находящегося в репозитории на сайте kernel.org.

Такие разные устройства, а операционная система, работающая на них, собрана из одного и того же исходного кода! Это утверждение, конечно, верно лишь отчасти, так как фактически ядро обычно расширено и модифицировано разработчиками конкретных дистрибутивов Linux, а также разработчиками конкретных устройств, но общего исходного кода достаточно много.

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

Она не позволит использовать все возможности вашего компьютера, но будет иметь главное – интерфейс командной строки. Поверьте мне, получив работающий интерфейс командной строки Linux на вашем реальном компьютере, вы испытаете неповторимые ощущения.

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

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

Загрузчик — это специальная программа, которая позволяет процессору начать выполнение машинных инструкций, находящихся в файле ядра операционной системы.

Ядро — это программный код, который содержит:

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

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

Начальная корневая файловая система нужна для того, чтобы ядро выполнило начальную загрузку файлов, необходимую для дальнейшей загрузки операционной системы. Самыми важными являются модули ядра Linux, не вошедшие в состав файла ядра, но нужные для дальнейшей загрузки, и файл, на основании которого будет создан самый первый процесс при загрузке операционной системы (init).

Набор утилит позволяет вам работать с абстракциями, находящимися в ядре операционной системы. В зависимости от сложности и назначения устройства, на котором будет работать операционная система, этот набор может различаться. Утилиты определяют функциональность и интерфейс взаимодействия с пользователем. Например, для роутера они будут одни, для телефона другие, а для персонального компьютера третьи.

▍ Загрузка операционной системы Linux

Загрузка операционной системы Linux может отличаться на различных архитектурах и компьютерах, но для архитектуры x86 загрузка выглядит в большинстве случаев так:

  1. Происходит включение компьютера.
  2. BIOS или UEFI находит на компьютере загрузчик операционной системы и передаёт управление ему.
  3. Загрузчик операционной системы загружает в оперативную память файл ядра Linux и файл образа начальной файловой системы (файл initrd).
  4. Загрузчик операционной системы передаёт управление ядру операционной системы Linux.
  5. Ядро операционной системы проводит начальную инициализацию.
  6. Ядро операционной системы получает доступ к файлам, которые находятся в образе начальной файловой системы (монтирует образ).
  7. Ядро ищет файл init в начальной файловой системе и запускает самый первый процесс пользователя на его основе.
  8. Процесс init монтирует уже постоянную файловую систему, продолжает инициализацию операционной системы и переносит корень файловой системы Linux на смонтированную файловую систему и запускает другие процессы, которые необходимы для инициализации.

▍ Дистрибутивы Linux

Дистрибутив – это ядро Linux, набор библиотек, утилит и программ, который устанавливается на компьютер или устройство.

На данный момент количество различных дистрибутивов огромно. Их перечень вы можете посмотреть на сайте DistroWatch.

Современные дистрибутивы Linux обычно распространяются в виде образов ISO и позволяют устанавливать обновления и дополнительные программы (пакеты), но мы делаем минимальный дистрибутив, поэтому, естественно, у нас такой возможности не будет.

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

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

Поэтому я стремился упростить создание дистрибутива до минимума: мы не будем монтировать постоянную файловую систему, а в качестве файла init будем использовать файл скрипта, который выполнит минимальную инициализацию и запустит оболочку sh.

▍ Загрузка операционной системы

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

Для x86 загрузка может отличаться следующим:

  1. Будет ли использоваться для загрузки BIOS или UEFI.
  2. На каком носителе (жёсткий диск, флеш-накопитель, оптический диск, компьютерная сеть) BIOS или UEFI будет искать загрузчик.
  3. Как размечен жёсткий диск или флеш-накопитель (MBR или GPT).
  4. На каком носителе и в какой файловой системе (FAT, NTFS, EXT, CDFS и др.) будут располагаться файл ядра и файл с образом начальной корневой файловой системы, называющийся initrd.

▍ Структура начальной корневой файловой системы

Начальная корневая файловая система содержит минимальное количество файлов и директорий, необходимых для дальнейшей работы Linux. В нашем случае это директории bin, dev, proc, sys. В директории bin cодержатся утилиты для работы с ядром Linux.

▍ Наборы утилит

Минимальный Linux — это ядро и набор утилит командной строки. Ядро и утилиты командной строки разрабатываются разными командами программистов.

Наиболее распространёнными наборами являются:

  • GNU Core Utils;
  • BusyBox.

Из-за того, что 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 и загрузчика.

Я использовал флеш-накопитель с MBR и установленным загрузчиком EXTLINUX, одним разделом FAT32, на котором располагаются файлы. Загрузку у меня инициировал BIOS (опция Legacy boot, если у вас на компьютере прошит UEFI BIOS).

Алгоритм создания образа загрузочного флеш-накопителя следующий:

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) ${LOOP_DEVICE} boot-disk.img

4. Создаём файловую систему на loopback-устройстве.

$ mkfs.vfat ${LOOP_DEVICE}

5. Монтируем loopback-устройство.

$ mkdir -p /mnt/os
$ mount -t auto ${LOOP_DEVICE} /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.

Суть Docker в следующем:

  1. В файле Dockerfile вы описываете структуру окружения для вашей программы или скрипта.
  2. При помощи утилиты docker на основании Dockerfile вы создаёте образ этого окружения в определённом формате.
  3. При помощи этой же утилиты вы можете запустить на основе образа экземпляр вашей программы или скрипта, работающий в изолированном окружении и называемый Docker-контейнер в терминологии Docker.
  4. Созданные вами образы можно хранить в репозитории и повторно использовать.
    Docker-контейнеры, созданные на основании одного и того же образа, будут идентично выполняться на всех компьютерах, способных его выполнить.
  5. Dockerfile удобно читать и изучать, также его удобно распространять.

На GitHub у меня есть проект, содержащий исходный код среды для сборки Linux на основе технологии Docker-контейнеров.

Ниже приведу содержимое 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 ${pwd}:/app/linux --rm -it simple-linux build

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

3. Создание загрузочного образа для флеш-накопителя.

Обратите внимание, что нужно использовать опцию —privileged в docker, так как скрипт image использует loopback-устройство.

$ docker run -v ${pwd}:/app/linux –-privileged --rm -it simple-linux image

Если вы будете использовать Docker Desktop for Linux, Docker придётся запускать, используя sudo и вместо ${pwd} нужно будет использовать $(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 ${pwd}:/app/linux --rm -it artyomsoft/simple-linux build

У вас появится командная строка моей минимальной Linux, а при выходе из неё вы увидите в текущей директории файл ядра Linux и initrd-файл.

В этой статье я привёл подробную инструкцию, как можно получить работающую систему Linux из исходного кода.

Кому-то эта статья может показаться сильно простой и не заслуживающей внимания. Но я, чтобы не отпугнуть вас подробностями, не углублялся в такие темы, как BIOS, UEFI, файловые системы, загрузчики, библиотека glibc, подробный процесс загрузки операционной системы, различные спецификации, динамическая и статическая линковка, модули ядра Linux… Я только привёл минимальное количество теории, которая позволит понять, что же, собственно, вы делали, и разобраться в теме гораздо быстрее меня, не собирая всю информацию по крупицам.

Полученную операционную систему вы вряд ли будете использовать в дальнейшем, но я надеюсь, что абстрактные знания о Linux у вас превратятся в понимание и умение.

Понравилась статья? Поделить с друзьями:
  • Egcg green tea extract 400 инструкция на русском
  • Дезковрики для пищевого производства инструкция по применению
  • Смесь беллакт премиум 1 инструкция по применению
  • Парилка для бани своими руками пошаговая инструкция
  • Машинка малютка ссср стиральная инструкция по применению