USBSTICK-MAKER

Script per crear automàticament un disc de rescat USB desde un host GNU/Linux.

VERSIÓ GRUB2

#!/bin/bash
# USBSTICK-MAKER-GRUB2-VERSION by Sergi Coll - GPLv2 - No Warranty
# 0.1a 201601131037 Initial Release

#VARS

VER=0.1a
DAEMONNAME=`basename $0`
PID=($)
LOGDIR=/var/log/
LOGFILE=$DAEMONNAME.log
DATA=`date +"%h %d %H:%M:%S"`
#
FITXER=test.img
FITXER_TAMANY=2G
LOOPDEVICE=/dev/loop1
LOOPDEVICE_ISO=/dev/loop2
SYSLINUX_MBR=/usr/share/syslinux/mbr.bin
SYSLINUX_MODULS=/usr/share/syslinux/
MOUNTPOINT=/media/usb
GRUBCFG=$MOUNTPOINT/boot/grub2/grub.cfg
#
VMRAM=1024
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"
        sfdisk $FITXER <> $LOGDIR$LOGFILE 2>> $LOGDIR$LOGFILE
2,+,L,*
EOF
        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 EXT4 sense journal a ${LOOPDEVICE}p1"
        mkfs.ext4 -F -O ^has_journal ${LOOPDEVICE}p1 >> $LOGDIR$LOGFILE 2>> $LOGDIR$LOGFILE
        if [ $? -eq 0 ]; then
                logprint "MKFS CHECK: Format sense Journal 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 GRUB 2 ..."
        mount ${LOOPDEVICE}p1  $MOUNTPOINT >> $LOGDIR$LOGFILE 2>> $LOGDIR$LOGFILE
        mkdir -p $MOUNTPOINT/boot/grub2 >> $LOGDIR$LOGFILE 2>> $LOGDIR$LOGFILE
        echo "set timeout=60 set default=0" >$GRUBCFG
        grub2-install -v --removable --boot-directory=$MOUNTPOINT/boot --modules="part_msdos ext2 biosdisk search_fs_uuid loopback" ${LOOPDEVICE} >> $LOGDIR$LOGFILE 2>> $LOGDIR$LOGFILE
        umount ${LOOPDEVICE}p1 >> $LOGDIR$LOGFILE 2>> $LOGDIR$LOGFILE
        losetup -d ${LOOPDEVICE} >> $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 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
        if [ $? -eq 0 ]; then
                logprint "QEMU CHECK: VNC PORT: $((VMVNCDISPLAY+5900)) OK"
        else
                logprint "QEMU CHECK: Problema en arrancar QEMU"
                exit 1
        fi

}

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

function help
{
        echo ""
        echo "USBSTICK-MAKER - v$VER"
        echo "Ús: "`basename $0`" [OPCIÓ]"
        echo ""
        echo "   -h Ajuda"
        echo "   -i Info"
        echo "   -c Creació Imatge"
        echo "   -m Monta Imatge"
        echo "   -u Desmonta Imatge"
        echo "   -q Prova la imatge amb una màquina virtual amb QEMU"
        echo "   -s Instal·la ISO de diferents sistemes"
        echo ""
}

function isos
{
$0 -m
# System Rescue CD

ISO=systemrescuecd.iso
URL="http://netix.dl.sourceforge.net/project/systemrescuecd/sysresccd-x86/4.7.0/systemrescuecd-x86-4.7.0.iso"
if [ ! -f $ISO ]; then
        curl -o $ISO $URL
fi
mkdir -p $MOUNTPOINT/images/sysresccd/
cp $ISO $MOUNTPOINT/images/sysresccd/
cat >>$GRUBCFG <>$GRUBCFG </dev/null
if [ "$?" != 0 ]; then
echo "ERROR: Problems with Log $LOGDIR$LOGFILE. Exiting..."
exit 2
fi


if [ ! $* ]; then
        help
        exit
fi

while getopts "hcqimus" OPTION; do

case "$OPTION" in

         h) help; exit 10 ;;
         c) creacio-imatge ;;
         i) info;;
         m) mount-image;;
         u) umount-image;;
         q) test-vm ;;
         s) isos ;;

        \?) help; exit 10 ;;
esac
done

Per gravar la imatge només cal un ‘DD’. Exemple:

dd if=test.img of=/dev/sdb bs=4M

Muntar les particions dins d’un fitxer imatge

losetup --partscan --find --show disk.img