![](https://habrastorage.org/webt/yh/2e/kc/yh2ekcoyeiyfmhs6ix3tnrhebdw.jpeg)
Новость по этому поводу уже была, время подавать и сам перевод. В своем руководстве Кристиан подробно излагает каждый шаг процесса создания дистрибутива и его записи на дискету формата 3.5". В конечном итоге работает такой дистрибутив даже на старых ПК с i486DX и вполне может выполнять скомпилированные приложения.
Уже более 7 лет я использую Linux в качестве основной ОС. С этой системой я экспериментирую с момента появления Fedora и Ubuntu и все еще помню получение бесплатных Live-CD от Canonical. Сейчас Linux уже установлена на всех моих компьютерах, включая Raspberry Pi и смартфоны.
Я даже администрирую два сервера IBM, которые также работают на Linux. Но при всем при этом мне до сих пор еще многое неизвестно о его внутреннем устройстве. В итоге я решил обогатить свои знания, реализовав забавный и в то же время полезный мини-проект.
Введение
Я с нуля создал встраиваемый дистрибутив Linux, уместив его всего на одну дискету. На момент написания он занимает около 1Мб, так что остается еще примерно 400Кб для дополнительного ПО.
Этот дистрибутив может загружаться на 486DX с 24 Мб ОЗУ (при меньшем объеме с помощью QEMU не загрузился). Через эмулятор загрузка происходит практически мгновенно. Что же касается современного «железа», не обремененного программной нагрузкой, то единственное, что ограничивает скорость загрузки – это скорость самого дисковода. Ее максимальный показатель составляет 125Кб/с, но в реальности даже меньше.
Я пока еще не пробовал загружать собранный дистрибутив на реальном 486-м, просто потому что такого у меня нет, но зато видел, как это проделывали другие, на что уходило около минуты. Честно говоря, большую часть этого времени происходила загрузка данных с диска.
![](https://habrastorage.org/webt/yh/2e/kc/yh2ekcoyeiyfmhs6ix3tnrhebdw.jpeg)
FLOPPINUX, запущенный на Asus Eee PC 701SD — Intel Celeron-M 900МГц с 512Мб ОЗУ
В самом начале проекта я уделил немало времени подробному изучению вопроса, и к моему удивлению не нашлось ни одного хорошего руководства. Возможно, просто мне не удалось такое найти. Есть множество инструкций о том, как реализовать некоторые детали, но в большинстве случаев бесполезные, устаревшие или излишне упрощенные. Когда же я пробовал объединить эти знания, то постоянно заходил в тупик. Это и побудило меня еще больше углубиться в тему. В конечном итоге я многое узнал и сумел реализовать все свои замыслы.
Если у вас есть желание проделать нечто подобное, то эта статья для вас.
Выбор приложения
Первым приложением, которое я хочу запустить, будет создаваемый мной олдскульный журнал Nomad Diskmag, который я планирую выпускать на дискетах. Для ПК я разработал приятный GUI с помощью PyGame. Что касается моего встраиваемого проекта, то для него я заменю фронтенд на скрипт bash. Статьи в обеих версиях представляют простые файлы
.txt
, поэтому все что нужно – это создать обложку, содержание и выполнить cat
для вывода тела каждого файла (используя less
для вывода страниц).Но прежде мне нужен рабочий дистрибутив, который будет загружать и выполнять этот скрипт. Его созданием мы и займемся.
Цели проекта
![](https://habrastorage.org/webt/le/gx/g6/legxg6afrrtjb3-jjdnqdgebpoy.jpeg)
Красочные прозрачные дискеты!
Очевидная и наиболее важная цель – уместить все (ОС + ПО) на одну дискету или в 1440 Кб. В остальном же их можно описать так:
- Последнее ядро Linux.
- Минимум инструментов, необходимых для поддержки встраиваемого приложения.
- Документация с легкими и понятными шагами для воспроизведения сборки.
- Ну и, как обычно, открытый исходный код.
Будущие дополнения:
- Возможность монтировать другую дискету для сохранения файлов.
- Текстовый редактор nano (или подобный).
Сборка дистрибутива FLOPPINUX
![](https://habrastorage.org/webt/y8/w3/ad/y8w3ad7ikkudi7udacdvw6nsccw.jpeg)
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
Голая система, готовая для кастомизации.
- Ядро: bzImage
- Файловая система с инструментами: rootfs.cpio.gz
- Загрузчик: syslinux.cfg
- Конфигурации Linux / Busybox (немного обновленные после публикации)
- Готовый образ дискеты: floppinux.img <– Вам нужен этот файл
- Зеркало: floppinux_0.1.0
Запуск
<source lang="bash">qemu-system-i386 -fda floppinux.img
Версия 0.2.1
![](https://habrastorage.org/webt/3e/jl/ac/3ejlaceyuwin5vdktvhhq-ihca8.jpeg)
FLOPPINUX Version 0.2.0 новый логотип и загрузочный образ
Новый логотип, новый экран загрузки и в целом текстовый интерфейс. Простой интерактивный скрипт оболочки для чтения текстовых файлов. Режим KIOSK.
Подробнее об этом я написал в дополнении Floppinux Update 0.2.1
- Ядро: bzImage
- Файловая система с инструментами: rootfs.cpio.gz
- Загрузчик: syslinux.cfg
- Конфигурация Linux / Busybox
- Готовый образ дискеты: floppinux_0.2.1.img <– Вам нужен этот файл
- (необязательно) репозиторий GitHub https://github.com/w84death/floppinux
- Зеркало: https://archive.org/details/floppinux_0.2.1
Добавление приложения
Теперь, когда у нас есть встраиваемый дистрибутив, пора найти ему применение. Загружается он очень быстро (после загрузки дисковода) и может легко выполнять любое скомпилированное приложение. Я же хочу поиграться со скриптами, поэтому вместо скомпилированной программы добавлю скрипты
.sh
. Далее процесс будет таким же.- Обновите файлы в каталоге
/filesystem/
- Сожмите файл
rootfs
- Смонтируйте образ дистрибутива
- Замените файл
rootfs
- Размонтируйте образ
- (необязательно) запишите новый образ на дискету
- Загрузите новую систему с обновленным ПО
Режим KIOSK
FLOPPINUX запускает любое приложение, находящееся в
/home/main
. Измените этот путь для запуска вашей программы. Ресурсы
Репозиторий GitHub https://github.com/w84death/floppinux
- https://www.insentricity.com/a.cl/283
- https://backreference.org/2010/07/04/modifying-initrdinitramfs-files/
- https://www.centennialsoftwaresolutions.com/post/build-the-linux-kernel-and-busybox-and-run-them-on-qemu
- http://blog.nasirabed.com/2012/01/minimal-linux-busybox.html
- https://bootlin.com/doc/legacy/elfs/embedded_lfs.pdf
Обсуждение (англ.)
https://news.ycombinator.com/item?id=27247612
![](https://habrastorage.org/webt/ty/b7/fd/tyb7fdkkt98xbfhc-jlqbuybdda.jpeg)
![](https://habrastorage.org/webt/ou/g5/kh/oug5kh6sjydt9llengsiebnp40w.png)