Floppinux — Linux, умещенный на дискету +53


AliExpress RU&CIS


Новость по этому поводу уже была, время подавать и сам перевод. В своем руководстве Кристиан подробно излагает каждый шаг процесса создания дистрибутива и его записи на дискету формата 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





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

  1. Hadariel
    /#23079990 / +3

    Интересный проект, чем-то напомнило kolibri OS, только с той разницей, что здесь линукс

    • boojum
      /#23080446

      Скорее напоминает OpenWRT — те же объём и системные требования, тот же busybox, только с той разницей, что назначение OpenWRT понятно, а этой поделки — нет.

      • dlinyj
        /#23080708

        Можно было всё собрать в buildroot (основа OpenWRT).

      • Hadariel
        /#23081422 / +1

        В итоге я решил обогатить свои знания, реализовав забавный и в то же время полезный мини-проект.

        Автор для себя пилил, вот и статью набросал.

      • LynXzp
        /#23082668

        Раньше такие поделки (floppix, muLinux) использовались чтобы оживить старые машины, использовать в качестве продвинутых роутеров. HDD можно переиспользовать и на новой, а старое железо никому не нужно, считай бесплатно. Но сейчас появились flash диски, поэтому смысл потерялся, остался только спортивный интерес.

        Кроме того такая машина получалась без шумящего и стрекочащего HDD (они были громче чем сейчас, а SSD конечно не было), общая нагрузка была низкой так что все вентиляторы на 5В.

        • aik
          /#23083024

          CF-карты и мелкие IDE'шные флэшки были в природе. Правда, были легки и дороги, потому во времена актуальности 486 уже не использовались.

          Но из-за того, что старые винты шумные, я в своих сборках предпочитаю именно CF-карты. Ибо винт середины девяностых шумит так, что слышно на всю квартиру.

          А вот вентиляторов на 486 зачастую могло и не быть, они только для 75-100 стали обязательными. 66 радиатором вполне обходились.

          И единственным источником шума оставался блок питания. Где, впрочем, тоже можно было скинуть вентилятору обороты.

    • juray
      /#23081358 / +1

      Еще из подобного был muLinux.
      Можно было стартовать с одной дискеты (выбирая между сервером или рабочей станцией), и сверху накатывать еще пакеты с дополнительных дискет.

  2. azatfr
    /#23080032 / +2

    Я даже не знаю где дискеты можно купить, давно не видел в продаже. Да и дисковод некуда воткнуть — на матплате нет контролера.

    • PTM
      /#23080066 / +1

      слишком новый комп… у меня до win 7 комп обязательно требовал флоппи с драйверами к контроллеру hdd, сейчас это usb флешка)

    • dlinyj
      /#23080098 / +1

      У автора USB-флопидисковод. У меня был такой.

      image

      Вот так подключается.

      [608034.663789] usb 1-14.2: new full-speed USB device number 16 using xhci_hcd
      [608034.765467] usb 1-14.2: New USB device found, idVendor=0644, idProduct=0000
      [608034.765473] usb 1-14.2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
      [608034.765477] usb 1-14.2: Product: TEACV3.0
      [608034.765481] usb 1-14.2: Manufacturer: TEACV3.0
      [608034.768228] usb-storage 1-14.2:1.0: USB Mass Storage device detected
      [608034.768908] scsi host7: usb-storage 1-14.2:1.0
      [608035.783444] scsi 7:0:0:0: Direct-Access     TEAC     USB UF000x       
      3.00 PQ: 0 ANSI: 0 CCS
      [608035.787154] sd 7:0:0:0: Attached scsi generic sg1 type 0
      [608035.911438] sd 7:0:0:0: Power-on or device reset occurred
      [608036.167406] sd 7:0:0:0: [sdb] Attached SCSI removable disk

    • ASUAndy
      /#23080536

      У автора на видео внешний USB дисковод

  3. Revertis
    /#23080800

    Мне кажется, в наше время не стоит так себя ограничивать. Тем более, (теоретическими) скоростями 125кбпс. Обе проблемы — скорость и объём, можно решить переходом на небольшую флэшку.

    • aik
      /#23080920

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

      Хотя 486 и 24 мегабайта — это слишком большие системные требования.

  4. dikey_0ficial
    /#23080838

    надо было назвать floppaLinux

    • Hadariel
      /#23081742

      SmallFloppaLinux для 3.5"

      MediumFloppaLinux для 5.25"

      BigFloppaLinux для 8"

  5. x8core
    /#23081084

    Давайте что-то поменьше дискеты. Вдруг надо будет в аэропорту провести в прямой кишке линукс.

    • teakettle
      /#23081444

      Дык уже есть! MicroSD же!

      • dikey_0ficial
        /#23082198

        У меня на микросд вентой с двумя линуксями и третрисос :))))

  6. commanderxo
    /#23081214

    Вчера (5/25 в американской нотации) был день пятидюймовой дискеты. Вот те диски были действительно гибкими, согнуть же 3.5 на 1.44 может только сильный программист.

    Можно ли уместить Linux в 1.2 Mb?

  7. unsignedchar
    /#23081486 / +1

    Старейшины говорят, что их деды тоже умели поместить linux на 1 дискету. Но предпочитали отдельно boot disk, отдельно root — чтобы в root было немного больше свободного места.
    tldp.org/HOWTO/Bootdisk-HOWTO/x88.html

  8. Oxyd
    /#23082554

    Ну до однодискетной OS/2 этому дистру далеко. Та сборка, на основе Warp 3, загружалась с гуём и сетью на любой железке с памятью от двух гиг мегабайт.

    • NickSin
      /#23082640

      вот тут как раз гуи и не хватает для старого железа)

      • aik
        /#23083026

        А смысл? Современный браузер оно всё равно не потянет, а всё остальное можно и в консоли делать.

  9. kost
    /#23082854

    В 2005 году у меня был в офисе роутер из старого компьютера, без HDD. Раздавал интернет на 5-6 компьютеров. Работал с дискеты с Freesco.

  10. Viceroyalty
    /#23082880

    Мсье знает толк. Где бы еще флоповод найти.

    • aik
      /#23083028

      Флоповод найти не проблема. USB'шные и в продаже есть, а обычных на свалках полно.
      У меня на работе у кучи компов стоят до сих пор даже после апгрейдов — дырку в корпусе закрывают.

  11. aik
    /#23083018

    В общем, я попробовал у себя с готовых образов. Грузиться начало:
    image

    Но потом упало в панику:
    image

  12. aik
    /#23083434 / +1

    Ну и вдогонку:
    p200 MMX — паника
    p3 450 — завелось

    Собрано под i686, скорее всего.
    Возможно, запустится на п2 или к6, но п2 у меня нет, а на к6 проверять уже лениво.

    В общем, 486 в минимальных требованиях — это пока что неправда.
    Ядро, впрочем, грузится — проблемы с busybox, похоже — его надо пересобирать.

    • dlinyj
      /#23083952

      Да rootfs можно отдельно пересобрать.

  13. OnlySlon
    /#23084014

    Еще во времена молодости был QNX demo disk — на флопик помещалась сама ОС со звонилкой либо драйверами для сетевухи, GUI, Несколько прикладных программ, вэб сервервер, и та-да… браузер с JS
    image

    • aik
      /#23084088 / +1

      Там из программ были блокнот и демка, которая писала «кьюникс это круто». Ну и демка браузера, да.
      К использованию сей продукт пригоден не был, был именно демкой.

      Из лёгких ОС была приятна BeOS, на dx100 у меня работала повеселее винды. Софта, правда, было ощутимо меньше.

  14. magiavr
    /#23086290

    Все же встраиваемая система должна что-то полезное делать, а не быть просто маленькой. Она нужна в маршрутизаторах, в каких-то приборах ( умных часах, колонках, осцилографах, телевизорах, приставках и т. п.). Т. е. желательно суметь чтобы зоводилось нужное ПО и интерфейсы, а вот ненужно максимально урезать. При этом желательно по минимум писать на диск, чтоб работало как live- CD и только настройки и пользовательские данные сохранялись и работало без всяких swap.

  15. BubaVV
    /#23086504

    Где-то рядом CirrOS — микродистр для проверки виртуалок в клаудах. Там что-то типа 40 Мб имейдж и 64 Мб RAM в требованиях