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)


  1. maquefel
    07.12.2022 12:34
    +15

    1. poxvuibr
      07.12.2022 12:46
      +4

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


      1. aelaa
        07.12.2022 13:28
        +6

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

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


      1. tyderh
        07.12.2022 13:29
        +5

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


        1. DungeonLords
          08.12.2022 13:36

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



  1. Godless
    07.12.2022 13:47
    +5

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

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


    1. vassabi
      07.12.2022 13:55
      +6

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

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


    1. BiosUefi
      07.12.2022 13:59

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


  1. n_bogdanov
    07.12.2022 14:45
    +6

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

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


  1. dmitryvolochaev
    07.12.2022 16:09

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

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


    1. dlinyj
      07.12.2022 18:51
      +2

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


    1. Terimoun
      08.12.2022 03:38
      +2

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


  1. bagrintsev
    07.12.2022 16:49
    +3

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


    1. Mirzapch
      07.12.2022 17:18
      +5

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


      1. DeepHill
        07.12.2022 17:54
        +2

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


        1. Mirzapch
          07.12.2022 18:16
          +2

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


          1. klounader
            08.12.2022 05:12
            +1

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


            1. Samhuawei
              08.12.2022 09:45
              +2

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


            1. skozharinov
              09.12.2022 04:16

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

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


      1. aspect04tenor
        07.12.2022 18:29
        +8

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


        1. Mirzapch
          07.12.2022 18:48

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

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

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


          1. AndreyHenneberg
            07.12.2022 21:58
            +1

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

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


        1. vitaly_il1
          07.12.2022 19:55
          +1

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


      1. select26
        07.12.2022 20:41
        +1

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


      1. LorHobbit
        07.12.2022 23:06

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


    1. leok
      08.12.2022 07:31

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

      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.


    1. Ole
      08.12.2022 12:45

      Может


  1. select26
    07.12.2022 18:45
    +8

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

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

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


  1. vasyaa747
    07.12.2022 21:45
    +3

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


    1. Zagrebelion
      07.12.2022 21:51
      +5

      а как же msdos.sys?


      1. vasyaa747
        07.12.2022 22:03
        +1

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


      1. JPEGEC
        08.12.2022 02:52
        +1

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

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

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

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


        1. artyomsoft Автор
          08.12.2022 03:59
          +1

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


      1. 586
        09.12.2022 09:57

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


    1. artyomsoft Автор
      07.12.2022 21:54
      +1

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


      1. vasyaa747
        07.12.2022 22:05
        +1

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


        1. roboter
          08.12.2022 11:30

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


          1. artyomsoft Автор
            08.12.2022 11:44

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


  1. Spym
    07.12.2022 22:11
    +1

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


    1. artyomsoft Автор
      07.12.2022 22:20
      +9

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


  1. ValdikSS
    07.12.2022 22:25
    +6

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

    https://buildroot.org/


    1. DungeonLords
      09.12.2022 08:48

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


  1. sparrowhawk
    07.12.2022 23:09
    +1

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

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


  1. LorHobbit
    07.12.2022 23:26
    +2

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

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


    1. artyomsoft Автор
      07.12.2022 23:38
      +2

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


  1. ITCarn
    07.12.2022 23:33
    +2

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


    1. artyomsoft Автор
      07.12.2022 23:40
      +2

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


    1. pvvv
      08.12.2022 13:16
      +1

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

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

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


  1. olku
    08.12.2022 00:07
    -1

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


    1. 3735928559
      08.12.2022 08:44

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

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

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


  1. eaa
    08.12.2022 00:07
    +7

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


    1. toivo61
      08.12.2022 12:11
      +1

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


      1. LorHobbit
        08.12.2022 20:27
        +1

        Для Gentoo тоже :)


  1. xxxDSSxxx
    08.12.2022 00:21
    +3

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


    1. Layan
      08.12.2022 03:08

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


    1. anwender95
      08.12.2022 07:29
      +1

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


  1. Herourtime
    08.12.2022 00:57

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


  1. mbait
    08.12.2022 08:35

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