Crear un fitxer imatge de disquet (floppy) desde OpenSuSE

Una cosa rapideta per crear un disc imatge del tipus Floppy 1.44M.

zypper install dosfstools
mkdir -p /media/floppya/
dd bs=512 count=2880 if=/dev/zero of=floppyA.img
mkfs.msdos floppyA.img
mount -o loop floppyA.img /media/floppya/

Script per crear una imatge USB de 128MB o un FLOPPY de 1.44MB

#!/bin/bash
# FREEDOS-MAKER- by Sergi Coll - GPLv2 - No Warranty
# 0.1a 201602121000 Initial Release

#  zypper install dosfstools

#VARS

VER=0.1a
DAEMONNAME=`basename $0`
PID=($)
LOGDIR=/var/log/
LOGFILE=$DAEMONNAME.log
DATA=`date +"%h %d %H:%M:%S"`
#
FITXER=freedos-maker.img
FITXER_FLOPPY=freedos-floppy.img
SECTOR=512
FLOPPY_TAMANY=2880
FITXER_TAMANY=128M
LOOPDEVICE=/dev/loop1
LOOPDEVICE_ISO=/dev/loop2
LOOPDEVICE_FLOPPY=/dev/loop3
SYSLINUX_MBR=/usr/share/syslinux/mbr.bin
SYSLINUX_MODULS=/usr/share/syslinux/
MOUNTPOINT=/media/usb
MOUNTPOINT_ISO=/media/iso
MOUNTPOINT_FLOPPY=/media/floppy
#
VMRAM=256
VMVNCDISPLAY=200

#FUNCIONS
function logprint {
DATA=`date +"%h %d %H:%M:%S"`
echo "$DATA $HOSTNAME $0[$PID] : $1" >> $LOGDIR$LOGFILE
}

function creacio-imatge {
        logprint "DD: Crearem el fitxer $FITXER de tamany $FITXER_TAMANY"
        dd if=/dev/zero of=${FITXER} bs=${FITXER_TAMANY} count=0 seek=1 >> $LOGDIR$LOGFILE 2>> $LOGDIR$LOGFILE
        if [ $? -eq 0 ]; then
                logprint "DD CHECK: S'ha creat correctament el fitxer $FITXER de tamany $FITXER_TAMANY"
        else
                logprint "DD CHECK: Problema a la creació del fitxer $FITXER de tamany $FITXER_TAMANY. Abortem..."
                exit 1
        fi
        logprint "SFDISK: Crearem les particions del disk"
        echo 0,,C,* | sfdisk $FITXER >> $LOGDIR$LOGFILE 2>> $LOGDIR$LOGFILE
        if [ $? -eq 0 ]; then
                logprint "SFDISK CHECK: S'ha creat correctament les particions en el fitxer $FITXER"
        else
                logprint "SFDISK CHECK: Problema en la creació de particions en el fitxer $FITXER. Abortem..."
                exit 1
        fi
        losetup -P $LOOPDEVICE $FITXER >> $LOGDIR$LOGFILE 2>> $LOGDIR$LOGFILE
        partprobe $LOOPDEVICE
        if [ $? -eq 0 ]; then
                logprint "LOOP CHECK: Configuració del losetup del $FITXER OK"
        else
                logprint "LOOP CHECK: Problema en la configuració del losetup del $FITXER"
                exit 1
        fi
        logprint "MKFS: Crearem un sistema de fitxers FAT a ${LOOPDEVICE}p1"
        mkfs.msdos -F 32 -n FREEDOS ${LOOPDEVICE}p1 >> $LOGDIR$LOGFILE 2>> $LOGDIR$LOGFILE
        if [ $? -eq 0 ]; then
                logprint "MKFS CHECK: Format OK en la partició 1 ${LOOPDEVICE}p1 del $FITXER"
        else
                logprint "MKFS CHECK: Problema en la formatació de la partició 1 ${LOOPDEVICE}p1 del $FITXER. Abortem..."
                exit 1
        fi
        logprint "Instal·lant MBR ..."
        dd if=$SYSLINUX_MBR of=${LOOPDEVICE} >> $LOGDIR$LOGFILE 2>> $LOGDIR$LOGFILE
        logprint "Instal·lant SYSLINUX ..."
        syslinux -m -a -i ${LOOPDEVICE}p1 >> $LOGDIR$LOGFILE 2>> $LOGDIR$LOGFILE
        #mount ${loopdevice}p1  $mountpoint >> $logdir$logfile 2>> $logdir$logfile
        #umount ${loopdevice}p1 >> $logdir$logfile 2>> $logdir$logfile
        losetup -d ${LOOPDEVICE} >> $LOGDIR$LOGFILE 2>> $LOGDIR$LOGFILE
        sync
}

function floppy {
        logprint "DD: Crearem el fitxer $FITXER"
        dd if=/dev/zero of=${FITXER_FLOPPY} bs=${SECTOR} count=${FLOPPY_TAMANY} >> $LOGDIR$LOGFILE 2>> $LOGDIR$LOGFILE
        if [ $? -eq 0 ]; then
                logprint "DD CHECK: S'ha creat correctament el fitxer $FITXER_FLOPPY de tamany $FITXER_TAMANY"
        else
                logprint "DD CHECK: Problema a la creació del fitxer $FITXER_FLOPPY de tamany $FITXER_TAMANY. Abortem..."
                exit 1
        fi
        losetup -P $LOOPDEVICE_FLOPPY $FITXER_FLOPPY >> $LOGDIR$LOGFILE 2>> $LOGDIR$LOGFILE
        partprobe $LOOPDEVICE_FLOPPY
        if [ $? -eq 0 ]; then
                logprint "LOOP CHECK: Configuració del losetup del $FITXER_FLOPPY OK"
        else
                logprint "LOOP CHECK: Problema en la configuració del losetup del $FITXER_FLOPPY"
                exit 1
        fi
        logprint "MKFS: Crearem un sistema de fitxers FAT a ${LOOPDEVICE_FLOPPY}p1"
        mkfs.msdos -n FREEDOS ${LOOPDEVICE_FLOPPY} >> $LOGDIR$LOGFILE 2>> $LOGDIR$LOGFILE
        if [ $? -eq 0 ]; then
                logprint "MKFS CHECK: Format OK en la partició 1 ${LOOPDEVICE_FLOPPY}p1 del $FITXER"
        else
                logprint "MKFS CHECK: Problema en la formatació de la partició 1 ${LOOPDEVICE_FLOPPY}p1 del $FITXER. Abortem..."
                exit 1
        fi
        logprint "Instal·llant MBR ..."
        syslinux -m -a -i ${LOOPDEVICE_FLOPPY} >> $LOGDIR$LOGFILE 2>> $LOGDIR$LOGFILE
        losetup -d ${LOOPDEVICE_FLOPPY} >> $LOGDIR$LOGFILE 2>> $LOGDIR$LOGFILE
        sync
}

function mount-image {
        logprint "Muntant imatge $FITXER al ${LOOPDEVICE}..."
        losetup -P $LOOPDEVICE $FITXER >> $LOGDIR$LOGFILE 2>> $LOGDIR$LOGFILE
        partprobe $LOOPDEVICE
        if [ $? -eq 0 ]; then
                logprint "LOOP CHECK: Configuració del losetup del $FITXER OK"
        else
                logprint "LOOP CHECK: Problema en la configuració del losetup del $FITXER"
                exit 1
        fi
        logprint "MOUNT: Muntant partició"
        mount ${LOOPDEVICE}p1 $MOUNTPOINT
                if [ $? -eq 0 ]; then
                logprint "MOUNT CHECK: Muntant ${LOOPDEVICE}p1 a $MOUNTPOINT OK"
        else
                logprint "MOUNT CHECK: Problema muntant ${LOOPDEVICE}p1 a $MOUNTPOINT. Abortem ..."
                exit 1
        fi
}

function umount-image {
        logprint "Dsmuntant imatge $FITXER al ${LOOPDEVICE}..."
        umount ${LOOPDEVICE}p1
        losetup -d ${LOOPDEVICE} >> $LOGDIR$LOGFILE 2>> $LOGDIR$LOGFILE

        if [ $? -eq 0 ]; then
                logprint "LOOP CHECK: Desconfiguració del losetup del $FITXER OK"
        else
                logprint "LOOP CHECK: Problema en la desconfiguració del losetup del $FITXER"
                exit 1
        fi
}

function mount-image-floppy {
        mkdir -p $MOUNTPOINT_FLOPPY >> $LOGDIR$LOGFILE 2>> $LOGDIR$LOGFILE
        logprint "Muntant imatge $FITXER_FLOPPY al ${LOOPDEVICE_FLOPPY}..."
        losetup -P $LOOPDEVICE_FLOPPY $FITXER_FLOPPY >> $LOGDIR$LOGFILE 2>> $LOGDIR$LOGFILE
        partprobe $LOOPDEVICE_FLOPPY
        if [ $? -eq 0 ]; then
                logprint "LOOP CHECK: Configuració del losetup del $FITXER_FLOPPY OK"
        else
                logprint "LOOP CHECK: Problema en la configuració del losetup del $FITXER_FLOPPY"
                exit 1
        fi
        logprint "MOUNT: Muntant partició"
        mount ${LOOPDEVICE_FLOPPY} $MOUNTPOINT_FLOPPY
                if [ $? -eq 0 ]; then
                logprint "MOUNT CHECK: Muntant ${LOOPDEVICE_FLOPPY}p1 a $MOUNTPOINT_FLOPPY OK"
        else
                logprint "MOUNT CHECK: Problema muntant ${LOOPDEVICE_FLOPPY}p1 a $MOUNTPOINT_FLOPPY. Abortem ..."
                exit 1
        fi
}

function umount-image-floppy {
        logprint "Dsmuntant imatge $FITXER_FLOPPY al ${LOOPDEVICE_FLOPPY}..."
        umount ${LOOPDEVICE_FLOPPY}
        losetup -d ${LOOPDEVICE_FLOPPY} >> $LOGDIR$LOGFILE 2>> $LOGDIR$LOGFILE

        if [ $? -eq 0 ]; then
                logprint "LOOP CHECK: Desconfiguració del losetup del $FITXER_FLOPPY OK"
        else
                logprint "LOOP CHECK: Problema en la desconfiguració del losetup del $FITXER_FLOPPY"
                exit 1
        fi
}

function test-vm {
        logprint "Arrancant VM per provar la iamtge"
        #qemu-system-x86_64 -enable-kvm -m $VMRAM -vnc 0.0.0.0:${VMVNCDISPLAY} -k en-us -usb -usbdevice disk:$FITXER -cdrom systemrescuecd.iso -boot menu=on -daemonize >> $LOGDIR$LOGFILE 2>> $LOGDIR$LOGFILE
        qemu-system-x86_64 -enable-kvm -m $VMRAM -vnc 0.0.0.0:${VMVNCDISPLAY} -k en-us -usb -usbdevice disk:$FITXER -boot menu=on -daemonize >> $LOGDIR$LOGFILE 2>> $LOGDIR$LOGFILE
        #qemu-system-x86_64 -enable-kvm -m $VMRAM -vnc 0.0.0.0:${VMVNCDISPLAY} -k en-us -hda $FITXER -boot menu=on -daemonize >> $LOGDIR$LOGFILE 2>> $LOGDIR$LOGFILE
        if [ $? -eq 0 ]; then
                logprint "QEMU CHECK: VNC PORT: $((VMVNCDISPLAY+5900)) OK"
                echo "QEMU CHECK: VNC PORT: $((VMVNCDISPLAY+5900)) OK"
        else
                logprint "QEMU CHECK: Problema en arrancar QEMU"
                exit 1
        fi
}

function test-vm-floppy {
        logprint "Arrancant VM per provar la iamtge de disquet"
        qemu-system-x86_64 -enable-kvm -m $VMRAM -vnc 0.0.0.0:${VMVNCDISPLAY} -k en-us -fda $FITXER_FLOPPY -boot menu=on -daemonize >> $LOGDIR$LOGFILE 2>> $LOGDIR$LOGFILE
        if [ $? -eq 0 ]; then
                logprint "QEMU CHECK: VNC PORT: $((VMVNCDISPLAY+5900)) OK"
                echo "QEMU CHECK: VNC PORT: $((VMVNCDISPLAY+5900)) OK"
        else
                logprint "QEMU CHECK: Problema en arrancar QEMU"
                exit 1
        fi
}


function info
{
        echo ""
        echo "FREEDOS-MAKER - v$VER"
        echo ""
        ls -lhas $FITXER
        ls -lhas $FITXER_FLOPPY
}

function help
{
        echo ""
        echo "FREEDOS-MAKER - v$VER"
        echo "Ús: "`basename $0`" [OPCIÓ]"
        echo ""
        echo "   -h Ajuda"
        echo "   -i Info"
        echo "   -c Creació Imatge"
        echo "   -s Instal·la FreeDOS a la imatge"
        echo "   -m Monta Imatge"
        echo "   -u Desmonta Imatge"
        echo "   -q Prova la imatge amb una màquina virtual amb QEMU"
        echo "   -f Crea disquet"
        echo "   -e Instal·la FreeDOS al disquet"
        echo "   -k Monta Disquet"
        echo "   -j Desmonta Disquet"
        echo "   -w Prova el floppy amb una màquina virtual amb QEMU"
        echo ""
        echo "   Creació ràpida de la imatge"
        echo "   $0 -c ;  $0 -s; $0 -q"
        echo ""
        echo "   Creació ràpida del disquet"
        echo "   $0 -f ;  $0 -e; $0 -w"
        echo ""
}

function isos
{
$0 -m
# FREEDOS

ISO=freedos.iso
URL="http://www.freedos.org/download/download/fd11src.iso"
if [ ! -f $ISO ]; then
        curl -o $ISO $URL
fi
mkdir -p $MOUNTPOINT_ISO  >> $LOGDIR$LOGFILE 2>> $LOGDIR$LOGFILE
mount freedos.iso $MOUNTPOINT_ISO  >> $LOGDIR$LOGFILE 2>> $LOGDIR$LOGFILE
mkdir $MOUNTPOINT/fdos  >> $LOGDIR$LOGFILE 2>> $LOGDIR$LOGFILE
find $MOUNTPOINT_ISO/freedos/packages |grep .zip | xargs -l unzip -d $MOUNTPOINT/fdos  >> $LOGDIR$LOGFILE 2>> $LOGDIR$LOGFILE
cp $MOUNTPOINT/fdos/autoexec.txt  $MOUNTPOINT/autoexec.bat >> $LOGDIR$LOGFILE 2>> $LOGDIR$LOGFILE
cp $MOUNTPOINT/fdos/config.txt  $MOUNTPOINT/config.sys >> $LOGDIR$LOGFILE 2>> $LOGDIR$LOGFILE
umount $MOUNTPOINT_ISO  >> $LOGDIR$LOGFILE 2>> $LOGDIR$LOGFILE

cat <$MOUNTPOINT/syslinux.cfg
default fdos
prompt 1
timeout 3
label fdos
    menu label fdos - Load FreeDOS 1.1 from USB flash drive
    com32 /fdos/bin/chain.c32
    append freedos=/fdos/bin/kernel.sys
EOF
$0 -u
}

function isos-floppy
{
$0 -k
# FREEDOS

ISO=freedos.iso
URL="http://www.freedos.org/download/download/fd11src.iso"
if [ ! -f $ISO ]; then
        curl -o $ISO $URL
fi
mkdir -p $MOUNTPOINT_ISO  >> $LOGDIR$LOGFILE 2>> $LOGDIR$LOGFILE
mount freedos.iso $MOUNTPOINT_ISO  >> $LOGDIR$LOGFILE 2>> $LOGDIR$LOGFILE
mkdir $MOUNTPOINT_FLOPPY/fdos  >> $LOGDIR$LOGFILE 2>> $LOGDIR$LOGFILE
unzip $MOUNTPOINT_ISO/freedos/packages/base/commandx.zip bin/command.com -d $MOUNTPOINT_FLOPPY/fdos  >> $LOGDIR$LOGFILE 2>> $LOGDIR$LOGFILE
unzip $MOUNTPOINT_ISO/freedos/packages/base/kernelx.zip bin/kernel.sys -d $MOUNTPOINT_FLOPPY/fdos  >> $LOGDIR$LOGFILE 2>> $LOGDIR$LOGFILE
cp /usr/share/syslinux/chain.c32 $MOUNTPOINT_FLOPPY/fdos/bin  >> $LOGDIR$LOGFILE 2>> $LOGDIR$LOGFILE
umount $MOUNTPOINT_ISO  >> $LOGDIR$LOGFILE 2>> $LOGDIR$LOGFILE

cat <$MOUNTPOINT_FLOPPY/config.sys
SHELLHIGH=A:\FDOS\BIN\COMMAND.COM A:\FDOS\bin /E:1024 /P=A:\AUTOEXEC.BAT
SET DOSDIR=A:\FDOS
EOF
cat <$MOUNTPOINT_FLOPPY/autoexec.bat
@echo off
set lang=EN
set PATH=%dosdir%\bin
set NLSPATH=%dosdir%\NLS
set HELPPATH=%dosdir%\HELP
set temp=%dosdir%\temp
set tmp=%dosdir%\temp
SET BLASTER=A220 I5 D1 H5 P330
set DIRCMD=/P /OGN
SET autofile=A:\autoexec.bat
SET CFGFILE=A:\fdconfig.sys
alias reboot=fdapm warmboot
alias halt=fdapm poweroff
echo.
echo Welcome to FreeDOS 1.1
echo.

EOF
cat <$MOUNTPOINT_FLOPPY/syslinux.cfg
default fdos
prompt 1
timeout 3
label fdos
    menu label fdos - Load FreeDOS 1.1 from USB flash drive
    com32 /fdos/bin/chain.c32
    append freedos=/fdos/bin/kernel.sys
EOF
$0 -j
}


###########################################################################
#MAIN
###########################################################################a

touch -a $LOGDIR$LOGFILE 2>/dev/null
if [ "$?" != 0 ]; then
echo "ERROR: Problems with Log $LOGDIR$LOGFILE. Exiting..."
exit 2
fi


if [ ! $* ]; then
        help
        exit
fi

while getopts "hcqimusfwjke" OPTION; do

case "$OPTION" in

         h) help; exit 10 ;;
         c) creacio-imatge ;;
         i) info;;
         m) mount-image;;
         u) umount-image;;
         k) mount-image-floppy;;
         j) umount-image-floppy;;
         q) test-vm ;;
         s) isos ;;
         e) isos-floppy ;;
         f) floppy ;;
         w) test-vm-floppy ;;

        \?) help; exit 10 ;;
esac
done