viernes, 30 de mayo de 2008

Arrancar MS-DOS desde una memoria USB

Valiéndonos del comando ms-sys desde Linux la tarea es muy sencilla. Partimos con una memoria USB completamente vacía, cosa de la que nos aseguramos llenando el dispositivo de ceros con el comando dd:

# dd if=/dev/zero of=/dev/sdi
dd: writing to `/dev/sdi': No space left on device
492545+0 records in
492544+0 records out
252182528 bytes (252 MB) copied, 192.376 seconds, 1.3 MB/s

A continuación creamos la tabla de particiones y el sistema de ficheros FAT32:

# fdisk /dev/sdi
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel. Changes will remain in memory only,
until you decide to write them. After that, of course, the previous
content won't be recoverable.

Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-1009, default 1):
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-1009, default 1009):
Using default value 1009

Command (m for help): a
Partition number (1-4): 1

Command (m for help): t
Selected partition 1
Hex code (type L to list codes): c
Changed system type of partition 1 to c (W95 FAT32 (LBA))

Command (m for help): p

Disk /dev/sdi: 252 MB, 252182528 bytes
8 heads, 61 sectors/track, 1009 cylinders
Units = cylinders of 488 * 512 = 249856 bytes

Device Boot Start End Blocks Id System
/dev/sdi1 * 1 1009 246165+ c W95 FAT32 (LBA)

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: If you have created or modified any DOS 6.x
partitions, please see the fdisk manual page for additional
information.
Syncing disks.

# mkfs.vfat -F 32 /dev/sdi1
mkfs.vfat 2.11 (12 Mar 2005)

Y ahora escribimos un MBR y un sector de arranque para la par

tición:

# ms-sys -w /dev/sdi
DOS/Windows NT master boot record successfully written to /dev/sdi

# ms-sys -w /dev/sdi1
FAT32 DOS boot record successfully written to /dev/sdi1


# ms-sys -p /dev/sdi1
Start sector (nr of hidden sectors) successfully written to /dev/sdi1
Physical disk drive id 0x80 (C:) successfully written to /dev/sdi1

El ms-sys con la opción -p es importante porque de otro modo, en muchos casos, el MS-DOS no consigue arrancar del disco, tal y como explica la página de manual del ms-sys:

-p, –partition
Write partition info (hidden sectors and drive id) to boot record. This might be
needed on some partitions depending on which program was used to create the file
system.

[...]

BUGS
There have been reports about unbootable FAT32 partitions created with “mformat -F c:”.
One workaround is to use gnu parted to create the partition instead. Since version 1.1.3
ms-sys has the switch -p which is supposed to fix this problem. The problem has also been
reported on partitions formatted with mkdosfs and mkfs.vfat.

El último paso es copiar a la memoria los ficheros de arranque de MS-DOS necesarios (si no los tenemos, más abajo explico de dónde podemos obtenerlos), el IO.SYS, MSDOS.SYS y COMMAND.COM, y también podemos poner ya todos los que vayamos a necesitar según el fin que tengamos pensado para este MS-DOS (especialmente interesantes pueden ser el HIMEM.SYS, el EMM386.SYS, el DBLBUFF.SYS y el IFSHLP.SYS):

# mount /dev/sdi1 /mnt/usb

# cd /path_a_ficheros_de_ms-dos/

# cp io.sys msdos.sys command.com /mnt/usb/

# cp himem.sys emm386.exe ifshlp.sys dblbuff.sys /mnt/usb

# umount /mnt/usb

En este punto la memoria USB ya está lista para arrancar MS-DOS.


Los archivos de MS-DOS podemos tomarlos de cualquier disco de rescate o instalación que tengamos de Windows 98 o Windows ME (o de las últimas versiones de Windows 95 (OSR2) que también soportaban FAT32). Si no tenemos ninguno a mano pero sí un Windows XP, hemos de saber que el Windows XP es capaz de crearnos discos de rescate de MS-DOS de la versión que llevaba el Windows ME (en la Wikipedia se puede ver qué versiones de MS-DOS llevaba cada Windows). Para ello sólo tenemos que ir al diálogo de formatear disquetes y marcar la casilla de “Create an MS-DOS startup disk”:

Windows XP - Create an MS-DOS startup disk

Esta operación nos dejará los siguientes ficheros en el disquete que podremos usar para nuestra memoria USB:

A:\>dir /a
Volume in drive A has no label.
Volume Serial Number is 2A87-6CE1

Directory of A:\

07/04/2001 13:40 9 MSDOS.SYS
15/05/2001 18:57 116.736 IO.SYS
08/06/2000 17:00 58.870 EGA2.CPI
08/06/2000 17:00 58.753 EGA3.CPI
08/06/2000 17:00 58.870 EGA.CPI
08/06/2000 17:00 21.607 KEYB.COM
08/06/2000 17:00 34.566 KEYBOARD.SYS
08/06/2000 17:00 31.942 KEYBRD2.SYS
08/06/2000 17:00 31.633 KEYBRD3.SYS
08/06/2000 17:00 13.014 KEYBRD4.SYS
08/06/2000 17:00 29.239 MODE.COM
08/06/2000 17:00 93.040 COMMAND.COM
08/06/2000 17:00 17.175 DISPLAY.SYS
29/06/2007 10:53 95 AUTOEXEC.BAT
29/06/2007 10:53 33 CONFIG.SYS
15 File(s) 565.582 bytes
0 Dir(s) 888.320 bytes free

Si trabajamos en un sistema sin unidad de disquete, podemos usar el excelente emulador de disquetera para Windows Virtual Floppy Drive 2.1 que nos permite que el Windows XP formateé uno de sus disquetes virtuales dejándonos los ficheros de MS-DOS listos para usar.

Es necesario matizar que MS-DOS usa los ficheros MSDOS.SYS y el IOS.SYS pero, por ejemplo, el PC-DOS y el DR-DOS usaban los ficheros IBMBIO.COM y IBMDOS.COM y el FreeDos usa el KERNEL.SYS (fuente: documentación del comando sys del FreeDos) y que el comando ms-sys no escribe sectores de arranque adecuados para estas variantes de DOS.

Si no queremos usar Linux, hay un camino todavía más rápido para llegar a este punto basado en la utilidad de HP HP USB Key ROMPAQ Setup Utility que nos instala un comando de nombre HPUSBFW.EXE con este aspecto:

HP USB Format Utility

que nos permite, proporcionándole un directorio donde estén los fichero de MS-DOS requeridos que comentábamos antes, tener rápidamente una memoria USB lista para arrancar MS-DOS. En el foro del BartPE, donde estuvieron durante bastante tiempo hablando sobre cómo conseguir botar de USB (algo que usaremos en posteriores entradas), encontramos un interesante análisis sobre qué hace de especial dicha utilidad: Boot Bartpe From Usb Flash Drive, please try this!

The bootsectors of the Windows and HP formats had only 5 differences:
Locations 024-02A: HP=80 00 29 3C AC 48 68, Win=00 00 29 E9 3B 52 00

Igual que hicimos con el Knoppix, en este punto resulta muy interesante ver cómo instalar el GRUB en la memoria USB y configurarlo para que que cargue el MS-DOS. Para ello, desde un Linux con GRUB, hacemos:

# mount /dev/sdi1 /mnt/usb/

# mkdir -p /mnt/usb/boot/grub/

# vi /mnt/usb/boot/grub/device.map

# cat /mnt/usb/boot/grub/device.map
(hd0) /dev/sdi

# /usr/sbin/grub-install --no-floppy --root-directory=/mnt/usb/ '(hd0)'
Installation finished. No error reported.
This is the contents of the device map /mnt/usb//boot/grub/device.map.
Check if this is correct or not. If any of the lines is incorrect,
fix it and re-run the script `grub-install'.

(hd0) /dev/sdi

Y ahora ya sólo nos queda crear un menú adecuado para arrancar el MS-DOS de esta unidad en /mnt/usb/boot/grub/menu.lst:

default 0
fallback 1

title MS-DOS
rootnoverify (hd0,0)
makeactive
chainloader +1

Pero esta configuración usa el sector de arranque que está al principio de la partición, mientras que lo que puede resultarnos mucho más interesante para nuestros propósitos futuros de arrancar varios sistemas operativos desde una memoria USB es almacenar dicho sector de arranque a un fichero y que GRUB use dicho fichero:

# cd /mnt/usb/

# dd if=/dev/sdi1 of=bootsect.dos bs=512 count=1
1+0 records in
1+0 records out
512 bytes (512 B) copied, 0.003348 seconds, 153 kB/s

Y ahora ya podemos poner una alternativa en el menú que nos permita usar dicho sector para arrancar:

default 0
fallback 1

title MS-DOS
rootnoverify (hd0,0)
makeactive
chainloader +1

title MS-DOS bootsector en fichero
rootnoverify (hd0,0)
makeactive
chainloader /bootsect.dos



Para finalizar, comentar el tutorial Boot from USB Flash drive basado en la utilidad mkbt que nos permite coger el sector de arranque de un disquete de arranque y ponerlo en la unidad USB. Sin embargo, hay que comentar que seguir ese tutorial en un filesystem FAT32 lo daña y queda inaccessible, mientras que al hacerlo en uno FAT16 no parece que se rompa nada pero sin embargo a mi no me ha funcionado bien. En cualquier caso, está bien conocer otra alternativa más.

Fuente: Blog de Vicente Navarro Jover