Arranque el último kernel de Linux desde un disquete en una computadora 486



En agosto de 2019, realicé una competencia de Sing-Along Week para sincronizar un archivo MIDI con un sintetizador de voz que canta una canción. En mi almacén encontré una tarjeta MIDI MQX-32M (clon Roland MPU-401) que quería usar para convertir señales MIDI a la interfaz Apple II + con sintetizador de voz Echo II, pero terminé usando una computadora portátil con interfaz USB MIDI. Otra competencia de Pizza Week me interesó en encontrar una computadora 486 que cabría en una caja de pizza, y ahora se presentó una oportunidad.



Buscar en eBay no fue fácil porque no pudo encontrar un término de búsqueda realmente bueno. No me molesté en guardar la búsqueda, ya que este proyecto no es una prioridad. En cambio, de vez en cuando, algo me inspiró a ir a eBay y probar nuevas búsquedas. Hace un par de semanas, vi esta computadora 486 e hice una suposición sobre el tamaño del caso, a juzgar por la altura de la bahía de 5,25 pulgadas. Es bastante delgado y tiene una tarjeta dedicada para insertar otras tarjetas de lado, y el chasis es más corto que la tarjeta ISA. Aunque más grueso que una caja de pizza, ¡se está acercando!



Placa base TMC PAT48PG4viene con 32 MB de RAM (técnicamente 36 MB, tiene cuatro SIM de 30 pines) y cuatro tarjetas: VGA, SoundBlaster, módem y E / S multifuncional. El vendedor revisó la computadora y la vendió como no operativa, ya que no pasó la POST, aunque todas las tarjetas funcionaron. Principalmente necesitaba un caso, así que no me molesté demasiado. Por supuesto, cuando obtuve la computadora, tuve que verificar si la placa base estaba realmente muerta. Tampoco funcionó para mí, pero luego descubrí que si presiono el botón de reinicio, hay varios pitidos de error. Probé con otra fuente de alimentación y los sistemas cobraron vida después de presionar el botón Restablecer. Todavía no se iniciará desde el apagado en frío presionando el botón de encendido, no estoy seguro sihay una cubierta defectuosa o un daño leve en la batería (la batería se cambió antes) evita que la línea de reinicio se desconecte después de encender la alimentación. Sin embargo, trabajó lo suficiente para explorar sus posibilidades.



Mi objetivo final es instalar la última distribución de Linux y Python 3 en un disco duro "grande". Como tenemos una computadora 486, instalar la distribución actual de Linux no es una tarea trivial. Las únicas distribuciones de Linux que aún admiten la instalación de disquetes están bastante desactualizadas. Por lo general, omití por completo la instalación del disquete y simplemente inicié la computadora vieja a través de PXE y luego instalé el sistema a través de la red. Pensé que podría escribir iPXE en un disquete e insertarlo en ISA NIC, pero iPXE simplemente se cuelga sin ningún mensaje de error justo después de arrancar desde el disquete.



El BIOS es antiguo y tiene dificultades para admitir el disco duro "grande" que conecté. El tamaño del disco es de 8.45 GB, pero el BIOS solo ve 8.0 GB. Al habilitar LBA en el BIOS, la computadora se congela durante la POST después de la detección del disco. Win98 fdisk insiste en que el disco tiene solo 504 MB. FreeDOS no lo ve en absoluto. Intenté enchufar la NIC de la ROM XTIDE en el zócalo, y XTIDE también insiste en que la unidad no está conectada.



Como quería ver cómo Linux detectaría la unidad, necesitaba encontrar una manera de arrancar Linux. Después de buscar un poco en Google, descubrí la opción make tinyconfiglo que hace que un núcleo muy pequeño (pero inútil) sea lo suficientemente pequeño como para caber en un disquete. Encendí un par de otras opciones, encontré un initramfs lo suficientemente pequeño y pude cargarlo en el 486. Como se esperaba, Linux ve el disco y su capacidad total sin ningún problema.



El siguiente paso es instalar realmente Linux en su disco duro. Preferiría no lanzar mi propia distribución, pero es posible que deba hacerlo. Otra posibilidad es arrancar Linux desde un disquete, y luego arrancar el núcleo e initrd desde la distribución actual y kexec a él. Pero siento que es como reinventar el iPXE.



Compilar el kernel de Linux desde la fuente



Un resumen de los pasos para crear una imagen de disquete:



  • git clone git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git



    • v5.8-rc2-1-g625d3449788f 
  • make ARCH=x86 tinyconfig
  • make ARCH=x86 menuconfig



    • 486: CONFIG_M486=y



      • Processor type and features > Processor family > 486
    • tty: CONFIG_TTY=y

      • Device Drivers > Character devices > Enable TTY
    • printk: CONFIG_PRINTK=y



      • General Setup > Configure standard kernel features (expert users) > Enable support for printk
    • initramfs: CONFIG_INITRAMFS_COMPRESSION_GZIP=y



      • General Setup > Initial RAM filesystem and RAM disk (initramfs/initrd) support > Support initial ramdisk/ramfs compressed using gzip
    • ELF: CONFIG_BINFMT_ELF=y

      • Executable file formats > Kernel support for ELF binaries
  • make ARCH=x86 bzImage


Necesita rootfs, tome el system-image-486 de la imagen aborigen de Linux , extraiga rootfs.cpio.gz.



Prueba de arranque desde qemu:



qemu-system-i386 -kernel arch/x86/boot/bzImage -initrd ../system-image-486/rootfs.cpio.gz


Crear una imagen de disquete vacía:



dd if=/dev/zero of=linux-boot.img bs=1k count=1440
mkdosfs linux-boot.img
syslinux --install linux-boot.img
mount -o loop linux-boot.img /mnt
cp arch/x86/boot/bzImage /mnt
cp rootfs.cpio.gz /mnt


Creando /mnt/syslinux.cfg:



DEFAULT linux
LABEL linux
 SAY Now booting the kernel from SYSLINUX...
 KERNEL bzImage
 APPEND initrd=rootfs.cpio.gz


Escribir una imagen en un disquete:



umount /mnt
fdformat /dev/fd0
ddrescue -f -D linux-boot.img /dev/fd0



All Articles