[Перевод] Floppinux — Linux, умещенный на дискету26.05.2021 12:46
Новость по этому поводу уже была, время подавать и сам перевод. В своем руководстве Кристиан подробно излагает каждый шаг процесса создания дистрибутива и его записи на дискету формата 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.19.3.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, обрабатывающий запуск, выход и перезапуск:
Теперь у вас есть собственный образ дистрибутива floppinux.img, готовый к записи на дискету и загрузке на физическом устройстве.
Запись
Если у вас есть встроенный дисковод:
sudo dd if=floppinux.img of=/dev/fd0
У меня возникли сложности с записью образа на внешний дисковод из под Linux, поэтому я использовал инструмент diskwrite в Windows. Проблему я выявил позднее. Если у вас тоже USB-дисковод, то он будет отображаться как /dev/hd*. Команда на моем ПК:
Загрузка 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
Запуск
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. Измените этот путь для запуска вашей программы.