#!/bin/bash #==============================================================================# # # Dieses Skript baut aus den Image-Daten (z.B.: bionic-server-cloudimg-amd64.tar.gz) # ein DOS-Image mit MBR (z.B.: bionic-server-cloudimg-amd64.hdd). # # /root/bin/mach_img.sh bionic-server-cloudimg-amd64.tar.gz bionic-server-cloudimg-amd64.hdd 20G # #==============================================================================# VERSION="v2018092100" SKRIPTVERZ="$(dirname ${0})" Z="$(head -c 100 /dev/urandom | base64 | tr -d '\n' | tr -cd '[:alnum:]' | cut -b-12)" # ${0} bionic-server-cloudimg-amd64.tar.gz bionic-server-cloudimg-amd64.hdd 20G DATEN_NAME="${1}" # bionic-server-cloudimg-amd64.tar.gz (bionic-server-cloudimg-amd64.img) IMAGE_NAME="${2}" # neues Image, z.B.: bionic-server-cloudimg-amd64.hdd IMAGE_GR="${3}" # (virt-make-fs): gewünschte Größe des neuen HDD-Images #------------------------------------------------------------------------------# ### Parameterüberprüfung if [ ! -e "${DATEN_NAME}" ] ; then echo "Das Image '${IMAGE_NAME}' wurde nicht gefunden..." exit 1 fi if [ -e "${IMAGE_NAME}" ] ; then echo "Das Image '${IMAGE_NAME}' existiert bereits..." exit 1 fi if [ "x${IMAGE_GR}" = x ] ; then IMAGE_GR="20G" # Standardgröße des neuen Images, wenn nichts angegeben wurde fi #------------------------------------------------------------------------------# ### Vorbereitungen mkdir -v /tmp/img_${Z}/ cp ${DATEN_NAME} /tmp/img_${Z}/ cd /tmp/img_${Z}/ Dz_NAME="$(basename ${DATEN_NAME})" D_NAME="$(echo "${Dz_NAME}" | sed 's/[.]tar[.]gz$/.img/')" if [ "${Dz_NAME}" = "${D_NAME}" ] ; then echo "Die Datei '${Dz_NAME}' liegt nicht im Format '*.tar.gz' vor..." exit 1 else # bionic-server-cloudimg-amd64.tar.gz -> bionic-server-cloudimg-amd64.img tar xvzf ${Dz_NAME} fi mkdir -p /tmp/img_${Z}/img echo "virt-make-fs -t ext4 --label root -s ${IMAGE_GR} --format=raw --partition=mbr -> ${IMAGE_NAME}" virt-make-fs -t ext4 --label root -s ${IMAGE_GR} --format=raw --partition=mbr /tmp/img_${Z}/img ${IMAGE_NAME} #------------------------------------------------------------------------------# ### Datenübertragung mkdir -pv /mnt0 mkdir -pv /mnt1 mount ${D_NAME} /mnt0 || exit 2 losetup -fP "${IMAGE_NAME}" LO_DEV="$(losetup -a | fgrep "${IMAGE_NAME}" | awk -F':' '{print $1}')" if [ "x${LO_DEV}" = x ] ; then echo "Es konnte kein Gerät erzeugt werden: '${LO_DEV}'" exit 11 fi ls -lha ${LO_DEV}* mount ${LO_DEV}p1 /mnt1 || exit 3 cd - cd /mnt0/ || exit 4 cp -a * /mnt1/ cd - umount /mnt0/ umount /mnt1/ LO_DEV="$(losetup -a | fgrep "${IMAGE_NAME}" | awk -F':' '{print $1}')" if [ "x${LO_DEV}" != x ] ; then for l in ${LO_DEV} do losetup -d ${l} done fi ls -lha ${LO_DEV}* mv /tmp/img_${Z}/${IMAGE_NAME} . rm -fr /tmp/img_${Z}/ #------------------------------------------------------------------------------# ### mount + update-grub2 /root/bin/mount_img.sh ${IMAGE_NAME} /mnt1 LO_DEV="$(losetup -a | fgrep "${IMAGE_NAME}" | awk -F':' '{print $1}')" if [ "x${LO_DEV}" = x ] ; then echo "Leider konnte keine gebundene loop-Gerätedatei gefunden werden..." else echo "GRUB_DISABLE_OS_PROBER=true" >> /mnt1/etc/default/grub echo "grub-install ${LO_DEV}" | chroot /mnt1 /bin/bash echo "update-grub2" | chroot /mnt1 /bin/bash fi sync sleep 5 /root/bin/umount_img.sh ${IMAGE_NAME} /mnt1