First commit
This commit is contained in:
parent
b35df052ef
commit
7924f84a9d
182
src/bootdisk
Executable file
182
src/bootdisk
Executable file
@ -0,0 +1,182 @@
|
||||
#!/bin/bash
|
||||
|
||||
version="0.1"
|
||||
|
||||
qemubin=qemu-system-x86_64
|
||||
bootargs=
|
||||
qemucpucores=$(nproc --all)
|
||||
qemumem=$(grep MemTotal /proc/meminfo | awk '{print int($2/3000)}')
|
||||
qemurtcbase=utc
|
||||
qemusrctype=-hda
|
||||
qemusrc=
|
||||
qemuworkdir=$(mktemp -d -u)
|
||||
qemuworkdirpersistent=
|
||||
diskoverlay=
|
||||
bootcmd=bootefi
|
||||
|
||||
ovmfcode=/usr/share/edk2-ovmf/x64/OVMF_CODE.fd
|
||||
ovmfcodesb=/usr/share/edk2-ovmf/x64/OVMF_CODE.secboot.fd
|
||||
ovmfvars=/usr/share/edk2-ovmf/x64/OVMF_VARS.fd
|
||||
|
||||
inittpm(){
|
||||
swtpm socket \
|
||||
--tpm2 \
|
||||
--tpmstate dir=${qemuworkdir} \
|
||||
--ctrl type=unixio,path=${qemuworkdir}/swtpm-sock &
|
||||
}
|
||||
initsecureboot(){
|
||||
if [[ ! -f ${qemuworkdir}/OVMF_CODE.secboot.fd ]]; then
|
||||
cp ${ovmfcodesb} ${qemuworkdir}/OVMF_CODE.secboot.fd
|
||||
fi
|
||||
if [[ ! -f ${qemuworkdir}/OVMF_VARS.fd ]]; then
|
||||
cp ${ovmfvars} ${qemuworkdir}/OVMF_VARS.fd
|
||||
fi
|
||||
}
|
||||
initbootargs(){
|
||||
bootargs="-boot menu=on,strict=on,reboot-timeout=1000 "
|
||||
bootargs+="-no-hpet "
|
||||
bootargs+="-rtc base=${qemurtcbase} "
|
||||
bootargs+="-cpu host "
|
||||
bootargs+="-smp cores=${qemucpucores} "
|
||||
bootargs+="-m ${qemumem} "
|
||||
bootargs+="-device intel-hda -device hda-duplex "
|
||||
bootargs+="-usbdevice tablet "
|
||||
bootargs+="-vga qxl "
|
||||
bootargs+="-display gtk,window-close=off "
|
||||
}
|
||||
|
||||
bootbios(){
|
||||
echo "Booting BIOS..."
|
||||
initbootargs
|
||||
${qemubin} \
|
||||
${bootargs} \
|
||||
-machine accel=kvm \
|
||||
${qemusrctype} ${qemusrc} \
|
||||
${qemusdb}
|
||||
}
|
||||
bootefi(){
|
||||
echo "Booting EFI..."
|
||||
initbootargs
|
||||
${qemubin} \
|
||||
-bios ${ovmfcode} \
|
||||
${bootargs} \
|
||||
-machine accel=kvm \
|
||||
${qemusrctype} ${qemusrc} \
|
||||
${qemusdb}
|
||||
}
|
||||
bootefitpm(){
|
||||
echo "Booting EFI + TPM..."
|
||||
inittpm
|
||||
initbootargs
|
||||
${qemubin} \
|
||||
-bios ${ovmfcode} \
|
||||
${bootargs} \
|
||||
-machine accel=kvm \
|
||||
-chardev socket,id=tpmchar,path=${qemuworkdir}/swtpm-sock \
|
||||
-tpmdev emulator,id=tpmdev,chardev=tpmchar \
|
||||
-device tpm-tis,tpmdev=tpmdev \
|
||||
${qemusrctype} ${qemusrc} \
|
||||
${qemusdb}
|
||||
}
|
||||
bootefisec(){
|
||||
echo "Booting EFI + TPM + Secure boot..."
|
||||
inittpm
|
||||
initsecureboot
|
||||
initbootargs
|
||||
${qemubin} \
|
||||
-bios ${ovmfcode} \
|
||||
${bootargs} \
|
||||
-machine type=q35,smm=on,accel=kvm \
|
||||
-global driver=cfi.pflash01,property=secure,value=on \
|
||||
-global ICH9-LPC.disable_s3=1 \
|
||||
-drive if=pflash,format=raw,unit=0,file=${qemuworkdir}/OVMF_CODE.secboot.fd,readonly=on \
|
||||
-drive if=pflash,format=raw,unit=1,file=${qemuworkdir}/OVMF_VARS.fd \
|
||||
-chardev socket,id=tpmchar,path=${qemuworkdir}/swtpm-sock \
|
||||
-tpmdev emulator,id=tpmdev,chardev=tpmchar \
|
||||
-device tpm-tis,tpmdev=tpmdev \
|
||||
${qemusrctype} ${qemusrc} \
|
||||
${qemusdb}
|
||||
}
|
||||
|
||||
help(){
|
||||
echo "bootdisk ${version} by MatMoul"
|
||||
echo ""
|
||||
echo "Usage :"
|
||||
echo "-------"
|
||||
echo "bootdisk [options] device|file"
|
||||
echo ""
|
||||
echo "--help | -h : show this help"
|
||||
echo ""
|
||||
echo "Options :"
|
||||
echo " -wd : Work Dir (default in tmp random folder, mktemp)"
|
||||
echo " -wdp : Work Dir Persistent"
|
||||
echo " -boot : Boot mode [bios|efi|tpm|secure] (default : efi)"
|
||||
echo " -cores : CPU cores"
|
||||
echo " -mem : Memory in Mb"
|
||||
echo " -dd : Additional device"
|
||||
echo " -cdr : Force boot dev as cd-rom (not needed for iso file)"
|
||||
echo " -overlay : Add overlay on boot device"
|
||||
}
|
||||
|
||||
|
||||
while (( ${#} )); do
|
||||
case ${1} in
|
||||
-h|--help) help
|
||||
exit 0;;
|
||||
-wd) qemuworkdir=${2}
|
||||
shift;;
|
||||
-wdp) qemuworkdirpersistent=1;;
|
||||
-boot) case ${2} in
|
||||
bios) bootcmd=bootbios;;
|
||||
efi) bootcmd=bootefi;;
|
||||
tpm) bootcmd=bootefitpm;;
|
||||
secure) bootcmd=bootefisec;;
|
||||
esac
|
||||
shift;;
|
||||
-cores) qemucpucores=${2}
|
||||
shift;;
|
||||
-mem) qemumem=${2}
|
||||
shift;;
|
||||
-dd) qemusdb="-hdb ${2}"
|
||||
shift;;
|
||||
-cdr) qemusrctype=-cdrom;;
|
||||
-overlay) diskoverlay=1;;
|
||||
*) qemusrc=${1};;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
if [ ${qemusrc: -4} == ".iso" ]; then
|
||||
qemusrctype=-cdrom
|
||||
fi
|
||||
|
||||
initworkdir(){
|
||||
if [[ ! -d ${qemuworkdir} ]]; then
|
||||
mkdir -p ${qemuworkdir}
|
||||
fi
|
||||
}
|
||||
releaseworkdir(){
|
||||
if [[ -d ${qemuworkdir} ]]; then
|
||||
if [[ ! ${qemuworkdirpersistent} ]]; then
|
||||
rm -R ${qemuworkdir}
|
||||
fi
|
||||
fi
|
||||
}
|
||||
initoverlay(){
|
||||
if [[ ! "${qemusrctype}" == "-cdrom" ]]; then
|
||||
if [[ ! -f "${qemuworkdir}/overlay.cow" ]]; then
|
||||
sourceformat=$(qemu-img info ${qemusrc} | grep "file format" | awk -F':' '{print $2}')
|
||||
qemu-img create -f qcow2 -F ${sourceformat} -b ${qemusrc} ${qemuworkdir}/overlay.cow
|
||||
fi
|
||||
qemusrc=${qemuworkdir}/overlay.cow
|
||||
fi
|
||||
}
|
||||
|
||||
if [[ -n "${qemusrc}" ]]; then
|
||||
initworkdir
|
||||
if [[ ${diskoverlay} ]]; then
|
||||
initoverlay
|
||||
fi
|
||||
${bootcmd}
|
||||
releaseworkdir
|
||||
fi
|
Loading…
Reference in New Issue
Block a user