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


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 — это ядро и набор утилит командной строки. Ядро и утилиты командной строки разрабатываются разными командами программистов.

Наиболее распространёнными наборами являются:
Из-за того, что 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 у вас превратятся в понимание и умение.




Комментарии (59):

    • poxvuibr
      /#24986508 / +4

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

      • aelaa
        /#24986686 / +6

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

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

  1. Godless
    /#24986772 / +5

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

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

    • vassabi
      /#24986802 / +6

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

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

    • BiosUefi
      /#24986824

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

  2. n_bogdanov
    /#24987028 / +6

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

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

  3. dmitryvolochaev
    /#24987178

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

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

    • dlinyj
      /#24987808 / +2

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

    • Terimoun
      /#24988688 / +2

      Проблем вроде нет с этим

  4. bagrintsev
    /#24987338 / +3

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

    • Mirzapch
      /#24987454 / +5

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

      • DeepHill
        /#24987608 / +2

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

        • Mirzapch
          /#24987686 / +2

          Системный администратор Linux без узкой специализации.

          • klounader
            /#24988716 / +1

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

            • Samhuawei
              /#24989108 / +2

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

            • skozharinov
              /#24991746

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

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

      • aspect04tenor
        /#24987736 / +8

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

        • Mirzapch
          /#24987800

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

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

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

          • AndreyHenneberg
            /#24988202 / +1

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

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

        • vitaly_il1
          /#24987960 / +1

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

      • select26
        /#24988062 / +1

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

      • LorHobbit
        /#24988390

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

    • leok
      /#24988820

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

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

  5. select26
    /#24987790 / +8

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

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

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

  6. vasyaa747
    /#24988170 / +3

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

    • Zagrebelion
      /#24988184 / +5

      а как же msdos.sys?

      • vasyaa747
        /#24988206 / +1

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

      • JPEGEC
        /#24988666 / +1

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

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

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

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

        • artyomsoft
          /#24988694 / +1

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

      • 586
        /#24992130

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

    • artyomsoft
      /#24988196 / +1

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

      • vasyaa747
        /#24988210 / +1

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

        • roboter
          /#24989442

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

          • artyomsoft
            /#24989488

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

  7. Spym
    /#24988232 / +1

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

    • artyomsoft
      /#24988272 / +9

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

  8. ValdikSS
    /#24988278 / +6

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

    https://buildroot.org/

  9. sparrowhawk
    /#24988394 / +1

    Может проще взять gentoo за основу?

    Как-то делал докерфайл для питона, сервитут ml модели, может кому пригодится https://gist.github.com/andreevmipt/595636e22716d8ee154b13eff9e0e086

  10. LorHobbit
    /#24988436 / +2

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

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

    • artyomsoft
      /#24988458 / +2

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

  11. ITCarn
    /#24988448 / +2

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

    • artyomsoft
      /#24988462 / +2

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

    • pvvv
      /#24989824 / +1

      старенькое ядро вроде бы можно было собрать даже "игрушечным" TCC.

      причем даже каждый раз при загрузке :)

      https://bellard.org/tcc/tccboot.html

  12. olku
    /#24988502 / -1

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

    • 3735928559
      /#24988948

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

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

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

  13. eaa
    /#24988506 / +7

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

    • toivo61
      /#24989598 / +1

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

  14. xxxDSSxxx
    /#24988532 / +3

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

    • Layan
      /#24988676

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

    • anwender95
      /#24988816 / +1

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

  15. Herourtime
    /#24988574

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

  16. mbait
    /#24988918

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