Новость по этому поводу уже была, время подавать и сам перевод. В своем руководстве Кристиан подробно излагает каждый шаг процесса создания дистрибутива и его записи на дискету формата 3.5". В конечном итоге работает такой дистрибутив даже на старых ПК с i486DX и вполне может выполнять скомпилированные приложения.

Уже более 7 лет я использую Linux в качестве основной ОС. С этой системой я экспериментирую с момента появления Fedora и Ubuntu и все еще помню получение бесплатных Live-CD от Canonical. Сейчас Linux уже установлена на всех моих компьютерах, включая Raspberry Pi и смартфоны.

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

Введение


Я с нуля создал встраиваемый дистрибутив Linux, уместив его всего на одну дискету. На момент написания он занимает ок��ло 1Мб, так что остается еще примерно 400Кб для дополнительного ПО.

Этот дистрибутив может загружаться на 486DX с 24 Мб ОЗУ (при меньшем объеме с помощью QEMU не загрузился). Через эмулятор загрузка происходит практически мгновенно. Что же касается современного «железа», не обремененного программной нагрузкой, то единственное, что ограничивает скорость загрузки – это скорость самого дисковода. Ее максимальный показатель составляет 125Кб/с, но в реальности даже меньше.

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


FLOPPINUX, запущенный на Asus Eee PC 701SD — Intel Celeron-M 900МГц с 512Мб ОЗУ

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

Если у вас есть желание проделать нечто подобное, то эта статья для вас.

Выбор приложения


Первым приложением, которое я хочу запустить, будет создаваемый мной олдскульный журнал Nomad Diskmag, который я планирую выпускать на дискетах. Для ПК я разработал приятный GUI с помощью PyGame. Что касается моего встраиваемого проекта, то для него я заменю фронтенд на скрипт bash. Статьи в обеих версиях представляют простые файлы .txt, поэтому все что нужно – это создать обложку, содержание и выполнить cat для вывода тела каждого файла (используя less для вывода страниц).

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

Цели проекта



Красочные прозрачные дискеты!

Очевидная и наиболее важная цель – уместить все (ОС + ПО) на одну дискету или в 1440 Кб. В остальном же их можно описать так:

  • Последнее ядро Linux.
  • Минимум инструментов, необходимых для поддержки встраиваемого приложения.
  • Документация с легкими и понятными шагами для воспроизведения сборки.
  • Ну и, как обычно, открытый исходный код.

Будущие дополнения:

  • Возможность монтировать другую дискету для сохранения файлов.
  • Текстовый редактор nano (или подобный).

Сборка дистрибутива FLOPPINUX



Gold Master Floppy для FLOPPINUX VERSION 0.1.0

x86_64 и x86


Компилировать 32-битный код на 64-битной системе не очень удобно, и чтобы упростить процесс, я просто проделываю это на старом ноутбуке с 32-битным ЦПУ.

Также можно использовать VirtualBox с 32-битной системой.

Если же вы хотите использовать 64-битную хост-систему, добавляйте к командам ARCH=x86. Вот пример:

make ARCH=x86 tinyconfig

EPUB


Это руководство доступно во многих форматах, включая EPUB. Так что для удобства чтения можете загрузить его на eBook.

Ссылка для скачивания: https://archive.org/details/floppinux-manual/

Рабочая директория


Создайте директорию, где будете хранить все файлы.

mkdir ~/my-linux-distro/
cd ~/my-linux-distro/

Ядро


Я использую последнюю версию, которая объединяет в себе старые и новые технологии. На данный момент это Kernel 5.13.0-rc2.

Получение ресурсов:

git clone --depth=1 https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
cd linux

Теперь, когда они находятся у вас в каталоге /linux/, перейдем к настройке и сборке собственного ядра. Начнем с создания минимальной конфигурации:

make tinyconfig

Теперь нужно добавить поверх нее дополнительные настройки:

make menuconfig

Из меню выберите следующие опции:

  • Processor type and features > Processor family > 486
  • Device Drivers > Character devices > Enable TTY
  • General Setup > Configure standard kernel features (expert users) > Enable support for printk
  • General Setup > Initial RAM filesystem and RAM disk (initramfs/initrd)
  • Executable file formats > Kernel support for ELF binaries
  • Executable file formats > Kernel support for scripts starting with #!

Далее выходим из конфигурации с сохранением настроек в .config. А теперь компиляция:

make bzImage

Скорость процесса будет зависеть от скорости вашего ЦПУ. В конечном итоге ядро будет создано в arch/x86/boot/bzImage. Переместите его в основную директорию.

mv arch/x86/boot/bzImage ../

Инструменты


Без инструментов ядро будет просто загружаться, и вы ничего не сможете делать. Одной из самых популярных и легковесных утилит является BusyBox. Она заменяет (более объемные) инструменты GNU функциональностью, которой достаточно для процессов встраивания.

Последнюю версию этого продукта можно найти в соответствующем разделе их сайта https://busybox.net/downloads/. На данный момент это 1.33.1. Скачайте файл, извлеките его и смените каталог:

wget https://busybox.net/downloads/busybox-1.33.1.tar.bz2
tar xjvf busybox-1.33.1.tar.bz2
cd busybox-1.33.1/

Как и для ядра, здесь тоже требуется создать стартовую конфигурацию:

make allnoconfig

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

make menuconfig

Я выбрал следующие:

  • Settings > Build static binary (no shared libs)
  • Coreutils > cat, du, echo, ls, sleep, uname (change Operating system name to anything you want)
  • Console Utilities > clear
  • Editors > vi
  • Init Utilities > poweroff, reboot, init, Support reading an inittab file
  • Linux System Utilities > mount, umount
  • Miscellaneous Utilities > less
  • Shells > ash

Далее выход с сохранением конфигурации и переход к компиляции.

make
make install

Эта команда создаст файловую систему со всеми файлами в _install. Переместите ее в основной каталог. Лично я при этом также изменяю имя.

mv _install ../filesystem

Файловая система


Ядро и базовые инструменты готовы, но системе требуется дополнительная структура каталогов.

cd ../filesystem
mkdir -pv {dev,proc,etc/init.d,sys,tmp}
sudo mknod dev/console c 5 1
sudo mknod dev/null c 1 3

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

cat >> welcome << EOF
Some welcome text...
EOF

Файл Inittab, обрабатывающий запуск, выход и перезапуск:

cat >> etc/inittab << EOF
::sysinit:/etc/init.d/rc
::askfirst:¬/bin/sh
::restart:/sbin/init
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount ¬-a -¬r
EOF

И сам скрипт init:

cat >> etc/init.d/rc << EOF
#!/bin/sh
mount -t proc none /proc
mount -t sysfs none /sys
clear
cat welcome
/bin/sh
EOF

Сделайте init исполняемым и установите владельца всех файлов как root:

chmod +x etc/init.d/rc
sudo chown -R root:root .

В завершении упакуйте директорию в один файл:

find . | cpio -H newc -o | gzip -9 > ../rootfs.cpio.gz

В правильности проделанного можете убедиться, запустив QEMU из основной директории:

qemu-system-i386 -kernel bzImage -initrd rootfs.cpio.gz

Теперь можно записывать систему на дискету.

Загрузочный образ


Создайте загрузочный файл syslinux, который будет указывать на созданное ядро и файловую систему:

cat >> syslinux.cfg << EOF
DEFAULT linux
LABEL linux
SAY [ BOOTING FLOPPINUX VERSION 0.1.0 ]
KERNEL bzImage
APPEND initrd=rootfs.cpio.gz
EOF


chmod +x syslinux.cfg

Создайте пустой образ дискеты:

dd if=/dev/zero of=floppinux.img bs=1k count=1440
mkdosfs floppinux.img
syslinux --install floppinux.img

Смонтируйте его, после чего скопируйте туда syslinux, ядро и файловую систему:

sudo mount -o loop floppinux.img /mnt
sudo cp bzImage /mnt
sudo cp rootfs.cpio.gz /mnt
sudo cp syslinux.cfg /mnt
sudo umount /mnt

Готово!

Теперь у вас есть собственный образ дистрибутива floppinux.img, готовый к записи на дискету и загрузке на физическом устройстве.

Запись


Если у вас есть встроенный дисковод:

sudo dd if=floppinux.img of=/dev/fd0

У меня возникли сложности с записью образа на внешний дисковод из под Linux, поэтому я использовал инструмент diskwrite в Windows. Проблему я выявил позднее. Если у вас тоже USB-дисковод, то он будет отображаться как /dev/hd*. Команда на моем ПК:

sudo dd if=floppinux.img of=/dev/sdb

Весь процесс занял меньше трех минут.

1474560 bytes (1,5 MB, 1,4 MiB) copied, 164,476 s, 9,0 kB/s

Первая загрузка!


Загрузка Floppinux на Fujitsu Siemens P1610 — Intel Core Solo 1.2 ГГц с 1 Гб ОЗУ:

Общая сводка


Объем диска: 1440Кб / 1.44Мб
Размер ядра: 632Кб
Инструменты: 552Кб
Оставшееся свободное место (du -h): 272Кб

Ссылки для скачивания


Если вы не хотите заморачиваться со всем этим, то просто скачайте мои файлы:

Версия 0.1.0
Голая система, готовая для кастомизации.


Запуск


<source lang="bash">qemu-system-i386 -fda floppinux.img

Версия 0.2.1


FLOPPINUX Version 0.2.0 новый логотип и загрузочный образ

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

Подробнее об этом я написал в дополнении Floppinux Update 0.2.1


Добавление приложения


Теперь, когда у нас есть встраиваемый дистрибутив, пора найти ему применение. Загружается он очень быстро (после загрузки дисковода) и может легко выполнять любое скомпилированное приложение. Я же хочу поиграться со скриптами, поэтому вместо скомпилированной программы добавлю скрипты .sh. Далее процесс будет таким же.

  • Обновите файлы в каталоге /filesystem/
  • Сожмите файл rootfs
  • Смонтируйте образ дистрибутива
  • Замените файл rootfs
  • Размонтируйте образ
  • (необязательно) запишите новый образ на дискету
  • Загрузите новую систему с обновленным ПО

Режим KIOSK


FLOPPINUX запускает любое приложение, находящееся в /home/main. Измените этот путь для запуска вашей программы.

Ресурсы


Репозиторий GitHub https://github.com/w84death/floppinux


Обсуждение (англ.)


https://news.ycombinator.com/item?id=27247612