Floppy Linux

Da GolemWiki.
Jump to navigation Jump to search

Esistono decine di distribuzioni Linux leggere, studiate appositamente per girare su hardware obsoleto

A volte però, quando si tenta di recuperare qualche macchina particolarmente vecchia (magari per trasformarla in router, server web o proxy), anche queste soluzioni possono risultare inadeguate. Ecco che possono venire in nostro soccorso alcune distribuzioni Linux prive di ambiente grafico talmente compatte da poter essere contenute da un unico semplice floppy disk da 1,44 MB.

Su Internet se ne possono trovare di già pronte

Tuttavia tali soluzioni preconfezionate rispondono alle nostre esigenze, spesso hanno kernel datati (2.0, 2.2), mentre altre volte mancano proprio dell’applicazione o del driver di cui abbiamo bisogno.

In questi casi l'unica strada percorribile è quella di costruirsi il proprio floppy Linux personalizzato, il metodo più semplice è utilizzare Buildroot, un tarball che consente la cross-compilazione di un ambiente Linux completo usando le leggerissime librerie uClibc e l'eseguibile busybox. L'ultima versione disponibile e scaricabile da questo indirizzo.

La procedura che utilizzeremo è di fatto analoga a quella usata per la realizzazione di qualsiasi sistema embedded Linux-based: router, decoder, lettory DVD...


Scompattiamo buildroot

$ tar -xjvf buildroot-snapshot.tar.bz2

Entriamo nella directory principale

$ cd buildroot

Configuriamo il toolchain

$ make menuconfig

Indichiamo: l'architettura di destinazione (i386, i486, i586…) le opzioni di compilazione la versione del kernel che intendiamo usare l'aggiunta di eventuali programmi non presenti in busybox (es. dropbear, un client/server ssh) il root filesystem di destinazione

Come filesystem esistono varie opzioni, tra le quali ext2 compresso con bzip2 o lzma. Con lzma si ottengono filesystem fino al 20% più piccoli rispetto a quelli compressi con bzip2, il sistema però necessiterà di maggiore memoria (RAM) per caricarli.

In seguito ad alcune prove ho riscontrato che lo stesso disco compresso con lzma necessitava di almeno 74 MB di RAM per completare il boot, mentre compresso con bzip2 si accontentava di 20 MB.

Se il PC che che avete a disposizione non ha almeno 70-80 MB di RAM (cosa rarissima per un i486) è preferibile optare per la compressione con bzip2, se la quantità di memoria non è un problema la compressione con lzma è sicuramente preferibile.

Per poter caricare correttamente il prompt del login è necessario sostituire
ttyS0 con tty1 nelle opzioni di configurazione del getty.

Configuriamo busybox selezionando i programmi di cui abbiamo bisogno

$ make busybox-menuconfig

Creiamo un kernel ridotto all’osso

$ make linux-menuconfig

Inseriamo unicamente ciò di cui non possiamo fare a meno: Code maturity level->Prompt for development Processor type and features->Support for your processor General setup->kernel support for ELF binaries Block devices->Normal PC floppy disk support Block devices->RAM disk support File systems->/proc filesystem, tmpfs, ext2 Character devices->Virtual terminal Character devices->Support for console on virtual terminal Console drivers->VGA text console General setup->PCI support

I driver delle schede di rete che volete supportare, iptables se ne avete bisogno, un driver ide generico se volete montare un hard disk ATA.

Per risparmiare qualche decina di KB ho compresso l’immagine del kernel (bzImage) con l’algoritmo di compressione lzma, invece che con il solito gzip o bzip2.

Una volta configurato tutto possiamo procedere con la compilazione

$ make

Se per qualche motivo qualcosa dovesse andare storto, guardate qual è il programma incriminato e provate a vedere se cambiando versione la compilazione va buon fine.

Nella directory buildroot/output/images troveremo il prodotto finito, pronto per essere utilizzato. Si tratterà di 2 o 3 file: bzImage, rootfs.i486.ext2 e la sua versione compressa rootfs.i486.ext2.bz2. Controlliamo le dimensioni dei file bzImage e rootfs.i486.ext2.bz2, dobbiamo accertarci che non siano eccessivamente grandi altrimenti non entreranno su un floppy.

Sfortunatamente i miei file sforavano di 150 KB, così ho dovuto rimediare con un espediente: la formattazione non standard di un floppy a 1.72 MB invece che a 1.44MB.

$ sudo mknod /dev/fd0u1722 b 2 60
$ fdformat /dev/fd0u1722
$ mkfs.vfat /dev/fd0u1722

Se non avete un mount point per il floppy createlo

$ sudo mkdir /mnt/floppy

Montate il floppy

$ sudo mount /dev/fd0u1722 /mnt/floppy

Così facendo sono riuscito a copiare i due file nel floppy

$ sudo cp buildroot/output/images/bzImage /mnt/floppy
$ sudo cp buildroot/output/images/rootfs.i486.ext2.lzma /mnt/floppy

Ora occorre installare un boot loader sul floppy, dato che è leggero, semplice da usare e che supporta la FAT16 ho deciso di usare syslinux. (Se già non lo avete occorrerà installarlo, su Arch basta il solito pacman -S syslinux) Per prima cosa creiamo il file di configurazione

$ sudo cd /mnt/floppy

Con un editor di testo create il file syslinux.cfg (io ho usato nano)

$ sudo nano  syslinux.cfg

E scrivete qualcosa del tipo:

default start
timeout 5
prompt 1
label start
kernel bzImage
append initrd=rootfs.i486.ext2.bz2 BOOTDEV=fd0 ramdisk_size=16384 vga=0 root=/dev/ram0

Se avete usato un altro tipo di filesystem cambiate rootfs.i486.ext2.bz2 in rootfs.i486.ext2.lzma, rootfs.i486.ext2.squashfs…

Installiamo il bootloader sul floppy

$ sudo syslinux /dev/fd0

Smontiamolo e godiamoci il nostro nuovo floppy

$ cd
$ sudo umount /mnt/floppy

Se per qualche ragione dovrete modificare il ramdisk basterà copiarlo sul disco fisso, decomprimerlo, montarlo in loop ed effettuare le dovute modifiche

$ sudo mount /mnt/floppy
$ sudo cp /mnt/floppy/rootfs.i486.ext2.bz2
$ sudo bzip2 -d rootfs.i486.ext2.bz2
$ sudo mkdir /mnt/tmp
$ sudo mount -o loop rootfs.i486.ext2 /mnt/tmp
$ cd /mnt/tmp

Effettuate le modifiche… e poi smontate il tutto

$ cd
$ sudo umount /mnt/tmp

Ricomprimete il ramdisk e copiatelo sul floppy per sostituire quello vecchio

$ sudo lzma -c9 rootfs.i486.ext2 > rootfs.i486.ext2.lzma
$ sudo cp rootfs.i486.ext2.lzma /mnt/floppy
$ sudo umount /mnt/floppy