Benutzer-Werkzeuge

Webseiten-Werkzeuge


dateisystem-images

Dateisystem-Images

Image auf einen USB-Stick schreiben

> wget https://download.freebsd.org/releases/ISO-IMAGES/14.0/FreeBSD-14.0-RELEASE-amd64-memstick.img
> dd if=FreeBSD-14.0-RELEASE-amd64-memstick.img of=/dev/sdf bs=1M conv=sync

HDD-Image

siehe auch:

ein Image erstellen, welches zu Beginn nur 1MB groß ist aber bis zu 10GB groß werden kann:

> dd if=/dev/zero of=daten.hdd bs=1M count=1 seek=10240

so kann man ein LVM-Volumen von einem Image mounten:

FreeBSD-root-Image (mit UFS) einer VM vergrößern

FreeBSD-root-Image (mit ZFS) einer VM vergrößern

ein Image mit einer Größe von 20GB anlegen:

> truncate -s 20G blk.img

ein bereits vorhandes Image um 10GB vergrößern:

> truncate -s +10G blk.img

ein bereits vorhandes Image auf 40GB vergrößern:

> truncate -s 40G blk.img

ZFS-Partitionen samt Größe anzeigen:

> zpool status
  pool: zroot
...
          vtbd0p3   ONLINE
...

> gpart list /dev/vtbd0
...
Consumers:
1. Name: vtbd0
   Mediasize: 42949672960 (40G)
...

> gpart show
=>      40  41942960  vtbd0  GPT  (40G) [CORRUPT]
        40      1024      1  freebsd-boot  (512K)
      1064       984         - free -  (492K)
      2048   4194304      2  freebsd-swap  (2.0G)
   4196352  37744640      3  freebsd-zfs  (18G)
  41940992      2008         - free -  (1.0M)

"freebsd-zfs" reparieren:

> gpart recover vtbd0
> gpart show
=>      40  41942960  vtbd0  GPT  (40G)
...

Wenn die Beschädigung zu schwerwiegend ist und gpart sie nicht beheben kann, dann ist hier Feierabend und die Partitionen müssen dann auf dem Image komplett neu angelegt werden.

"freebsd-zfs" vergrößern:

> gpart resize -i 3 vtbd0
> gpart show
> zpool online -e zroot /dev/vtbd0p3
> df -h

FreeBSD

Einhängen eines existierenden Abbildes unter FreeBSD

# mdconfig -a -t vnode -f diskimage -u 0
# mount /dev/md0 /mnt

Erstellen eines dateibasierten Laufwerks mit mdconfig

# dd if=/dev/zero of=newimage bs=1k count=5k
5120+0 records in
5120+0 records out

# mdconfig -a -t vnode -f newimage

# mdconfig -l
md0

# bsdlabel -w md0 auto
file -s /dev/md0a

# newfs md0a
/dev/md0a: 5.0MB (10224 sectors) block size 16384, fragment size 2048
        using 4 cylinder groups of 1.25MB, 80 blks, 192 inodes.
super-block backups (for fsck -b #) at:
 160, 2720, 5280, 7840

# mount /dev/md0a /mnt

# df /mnt
Filesystem 1K-blocks Used Avail Capacity  Mounted on
/dev/md0a       4710    4  4330     0%    /mnt

Mit mdmfs ein dateibasiertes Dateisystem erstellen

# dd if=/dev/zero of=newimage bs=1k count=5k
5120+0 records in
5120+0 records out
# mdmfs -F newimage -s 5m md0 /mnt
# df /mnt
Filesystem 1K-blocks Used Avail Capacity  Mounted on
/dev/md0        4718    4  4338     0%    /mnt

Linux

ohne OffSet

einfach als LOOP mounten:

> mount -t ext4 -o ro,loop /var/tmp/disk01.hdd /mnt

mit OffSet

erstmal den OffSet ermitteln

> parted /var/tmp/disk01.hdd

hier die Darstellungseinheit festlegen

(parted) unit
Unit?  [compact]? B

Partitionen anzeigen:

(parted) print
...
Number  Start        End           Size         Type     File system  Flags
 1      32256B       106928639B    106896384B   primary  ext3         boot
 2      106928640B   1184440319B   1077511680B  primary  linux-swap
 3      1184440320B  10256924159B  9072483840B  primary  ext3

In der Spalte "Start" stehen die gesuchten Werte für "OffSet"; "fdisk" würde hier "63" (512B-Blöcke) stehen haben.

mount mit OffSet:

> mount -o loop,ro,offset=32256 /var/tmp/disk01.hdd /mnt

sollte der OffSet zu groß sein (manche Tools können das nicht), dann kann man auch mit "dd" ein angepasstes Image generieren:

> dd if=/var/tmp/disk01.hdd of=/var/tmp/disk01_2.hdd bs=8 skip=1184440320 count=9072483840
> mount -t ext4 -o ro,loop /var/tmp/disk01_2.hdd /mnt

Variante 1 mit fdisk:

> fdisk -lu disk01.hdd
Units = sectors of 1 * 512 = 512 bytes
Device           Boot Start    End  Blocks Id System
disk01.hdd1         *    63 409247 204592+  6 FAT16
> mount -o loop,offset=$((512*63)) disk01.hdd /mnt

Variante 2 mit kpartx:

kpartx installieren:

> aptitude install kpartx
> man kpartx

Partition(en) anlegen:

> fdisk disk01.hdd
> fdisk -lu disk01.hdd

hier wird jede Partition auf dem Image auf ein lo-Dev gelegt:

> kpartx -av disk01.hdd
> kpartx -l disk01.hdd
loop0 : 0 16777089 /dev/loop0 63

lo-Dev formatieren:

> mkfs -t ext4 /dev/mapper/loop0p1

mounten

> mount -o loop /dev/mapper/loop0p1 /mnt/

Daten drauf packen:

> tar xzf ubuntu_1004.tgz -C /mnt/

alles wieder lösen:

> umount /mnt/
> kpartx -dv disk01.hdd

Variante 3 mit losetup:

nachsehen, welches lo-Dev als erstes freies vorliegt:

> losetup -f
/dev/loop0

Image an ein lo-Dev binden und dann partitionieren:

> losetup /dev/loop0 disk01.hdd
> fdisk /dev/loop0

lo-Dev wieder lösen, damit es mit OffSet erneut gebunden werden kann

> losetup -d /dev/loop0

das Image mit OffSet an das lo-Dev mounten, also nur die Partition:

> losetup -o $OFFSET /dev/loop0 disk01.hdd

das Gerät an ein Verzeichnis mounten, damit man Daten reinschreiben kann:

> mount /dev/loop0 mnt

alles wieder lösen:

> umount /mnt/
> losetup -d /dev/loop0

QEMU QCOW Image

Image-Format ermitteln:

> file image.hdd
image.hdd: QEMU QCOW Image (unknown version)
> modprobe nbd max_part=63
> qemu-nbd -c /dev/nbd0 image.hdd
> mount /dev/nbd0p1 /mnt/
> ls /mnt/
> umount /mnt/
> qemu-nbd -d /dev/nbd0

Live-CD

initrd

eine neue initrd bauen

Sollten in dieser initrd auch nicht die benötigten Treiber drin sein, dann müssen wir uns eine eigene initrd bauen.

Hier wird beschrieben, wie man sich eine neue initrd baut:

bevor wir jetzt unsere neue initrd bauen, kontrollieren wir noch eine Option in zwei Dateien:

  1. /etc/initramfs-tools/initramfs.conf
    • MODULES=list
    • BOOT=local
  2. /etc/initramfs-tools/update-initramfs.conf
    • update_initramfs=yes

wir müssen die Option auf "list" stellen, um die gewünschten Treiber hier angeben zu können:

# vi /etc/initramfs-tools/modules

jetzt können wir uns die neue initrd bauen:

# mkinitramfs -o /tmp/initrd.img

eine vorhandene Ubuntu-initrd (ab Ubuntu 9.10) modifizieren

entpacken
# mkdir initrd
# cd initrd
# lzma -dc -S .lz ../initrd.lz | cpio -imvd --no-absolute-filenames

Bootprozess modifizieren

Dazu müssen die Dateien im Verzeichnis usr/share/initramfs-tools/scripts/casper-bottom/* verändert werden:

  • usr/share/initramfs-tools/scripts/casper
  • usr/share/initramfs-tools/scripts/casper-bottom/10adduser

Ubuntu 14.04:

> gzip -dc /boot/initrd.img-4.4.0-83-generic | cpio -id
> zcat /boot/initrd.img-4.4.0-83-generic | cpio -idmv
verpacken

Variante 1:

# mv -v ../initrd.lz ../inird.lz.orig
# find . | cpio --quiet --dereference -o -H newc | lzma -7 > ../initrd.lz

Variante 2:

# cd ..
# chroot initrd/
# mkinitramfs -o /initrd.gz 2.6.38-11-generic
# exit
# gzip -dc initrd/initrd.gz | sudo lzma -7 > initrd.lz

initrd von Ubuntu 13.04

Auch die initrd's der alten Ubuntu-Versionen von vor 9.10 können so bearbeitet werden.

auspacken:

> mkdir /tmp/initrd
> cd /tmp/initrd
> zcat /boot/initrd.img-3.8.0-19-generic | cpio -imvd --no-absolute-filenames

einpacken:

> cd /tmp/initrd
> find . | cpio --quiet --dereference -o -H newc | gzip -9 > ~/new-initrd.gz

Slackware-initrd

entpacken:

> zcat initrd.img > initrd.img.entpackt
> mount -o loop,rw initrd.img.entpackt /mnt/initrd

Im Verzeichnis lib/ sollten dann ein paar Kernel Module liegen. Dort kopierst du deinen Treiber hin. Zudem mußt du in der linuxrc einen insmod /lib/dein-raid-treiber.o hinzufügen.

danach:

> umount /mnt/initrd
> gzip -9 initrd.img.entpackt
> mv initrd.img initrd.img.old
> mv initrd.img.entpackt initrd.img

Nicht vergessen den lilo aufzurufen, falls dieser verwendet wird.

squash-Image

entpacken

# aptitude install squashfs-tools genisoimage
# unsquashfs filesystem.squashfs
# cd squashfs-root
# ...

verpacken

# ...
# cd ..
# rm -v filesystem.squashfs
# mksquashfs squashfs-root filesystem.squashfs -nolzma
# printf $(sudo du -sx --block-size=1 squashfs-root | cut -f1) > filesystem.size

Cloud-Images

Cloud-Images saugen

Leider hat dieses Image keine Partition.

> wget https://cloud-images.ubuntu.com/bionic/current/bionic-server-cloudimg-amd64.tar.gz
> tar xzf bionic-server-cloudimg-amd64.tar.gz
> fdisk -l bionic-server-cloudimg-amd64.img
> mount bionic-server-cloudimg-amd64.img /mnt

das Image auf 20GB vergrößern:

> qemu-img resize -f raw bionic-server-cloudimg-amd64.img 20G

umwandeln in das platzsparende QCOW2-Format:

> qemu-img convert -p -f raw -O qcow2 bionic-server-cloudimg-amd64.img bionic-server-cloudimg-amd64.qcow2

How to mount a qcow2 disk image:

> modprobe nbd max_part=8
> qemu-nbd --connect=/dev/nbd0 bionic-server-cloudimg-amd64.qcow2
> fdisk -l /dev/nbd0
> mount /dev/nbd0p1 /mnt/

> ls -lha /mnt/

> umount /mnt/somepoint/
> qemu-nbd --disconnect /dev/nbd0
> rmmod nbd

Cloud-Images bauen

Leider hat dieses Image keinen OS-Kernel.

Bis Ubuntu 16.04 war der Partitionstyp DOS mit MBR. Seit Ubuntu 18.04 ist das Image vom Partitionstyp GPT im EFI-Format.

Vorbereitungen für das erzeugen eines Images:

> wget https://cloud-images.ubuntu.com/bionic/current/bionic-server-cloudimg-amd64-root.tar.xz
> apt install xz-utils libguestfs-tools
> xz -d bionic-server-cloudimg-amd64-root.tar.xz

Der User, der die Konvertierung durchführen soll, muß in der Gruppe "kvm" sein bzw. auf das Gerät "/dev/kvm" zugreifen können:

> id

Jetzt muß überprüft werden, ob noch der DASH-Bug behoben werden muss, wenn diese Datei nicht existiert:

> cat /usr/lib/x86_64-linux-gnu/guestfs/supermin.d/zz-dash-packages

dann muss man sie anlegen:

> echo dash > /usr/lib/x86_64-linux-gnu/guestfs/supermin.d/zz-dash-packages

sonst funktioniert es nicht.

so erzeugen wir unterschiedliche Images aus dem TAR-Paket:

> virt-make-fs -t ext4 --label root -s 20G bionic-server-cloudimg-amd64-root.tar bionic-server-cloudimg-amd64-root.hdd
> virt-make-fs -t ext4 --label root -s 20G --format=qcow2 bionic-server-cloudimg-amd64-root.tar bionic-server-cloudimg-amd64-root.qcow2
> virt-make-fs -t ext4 --label root -s 20G --format=qcow2 --partition=mbr bionic-server-cloudimg-amd64-root.tar bionic-server-cloudimg-amd64-root.qcow2

später kann man das erzeugte Image aber auch noch nach belieben in andere Formate konvertieren:

> apt install qemu-utils
> qemu-img convert -p -f qcow2 -O raw bionic-server-cloudimg-amd64.qcow2 bionic-server-cloudimg-amd64.img
> qemu-img info bionic-server-cloudimg-amd64.img

> qemu-img info bionic-server-cloudimg-amd64-root.qcow2

so kann man ein RAW-Image einhängen:

> apt install fdisk
> fdisk -l bionic-server-cloudimg-amd64-root.hdd
Festplatte bionic-server-cloudimg-amd64-root.hdd: 1 GiB, 1073741824 Bytes, 2097152 Sektoren
Einheiten: Sektoren von 1 * 512 = 512 Bytes
Sektorgröße (logisch/physikalisch): 512 Bytes / 512 Bytes
E/A-Größe (minimal/optimal): 512 Bytes / 512 Bytes
Festplattenbezeichnungstyp: dos
Festplattenbezeichner: 0xe76bc6c9

Gerät                                  Boot Anfang    Ende Sektoren   Größe Kn Typ
bionic-server-cloudimg-amd64-root.hdd1         128 2097024  2096897 1023,9M 83 Linux

als OFFSET muss die "128" aus der Spalte "Anfang" verwendet werden ("128" → 128 Blöcke / 1Block=512Byte):

> mount -o loop,offset=$((512*128)) bionic-server-cloudimg-amd64-root.hdd /mnt

HDD-Image bootfähig machen

Bis Ubuntu 16.04 war der Partitionstyp DOS mit MBR. Seit Ubuntu 18.04 ist das Image vom Partitionstyp GPT im EFI-Format.

bootfähiges HDD-Image erzeugen

benötigte Werkzeuge installieren (meistens sind sie bereits installiert):

> apt install wget tar xz-utils

Wir holen uns ein (neues/aktuelles) TAR-GZ-Paket mit vollständigem Root-File-System (inklusive OS-Kernel) aus dem Internet. Dann bauen wir uns ein bootfähiges Image auf einer RAW-Partition (DOS-Partition) und MBR.

in diesem Paket sind alle Dateien für ein lauffähiges Betriebssystem drin:

> wget --no-check-certificate https://cloud-images.ubuntu.com/bionic/current/bionic-server-cloudimg-amd64.tar.gz
> tar xzf bionic-server-cloudimg-amd64.tar.gz
> ls -lha bionic-server-cloudimg-amd64.img
-rw-r--r-- 1 fritz fritz 1,1G Sep 21 15:29 bionic-server-cloudimg-amd64.img

jetzt bauen wir uns ein leeres HDD-Image (hier 20GB groß) mit einer RAW-Partition (DOS-Partition) und MBR:

> mkdir /tmp/img
> virt-make-fs -t ext4 --label root -s 20G --format=raw --partition=mbr /tmp/img bionic-server-cloudimg-amd64.hdd
> ls -lha bionic-server-cloudimg-amd64.hdd
-rw-r--r-- 1 root root 20G Sep 21 19:35 bionic-server-cloudimg-amd64.hdd

> mount bionic-server-cloudimg-amd64.img /mnt1
> losetup -a
/dev/loop0: [64770]:561321382 (/home/manfred/Downloads/bionic-server-cloudimg-amd64.img)

> losetup -fP bionic-server-cloudimg-amd64.hdd
> losetup -a
/dev/loop1: [64770]:561328298 (/home/manfred/Downloads/bionic-server-cloudimg-amd64.hdd)
/dev/loop0: [64770]:561321382 (/home/manfred/Downloads/bionic-server-cloudimg-amd64.img)

> ls -lha /dev/loop1*
brw-rw---- 1 root disk   7, 1 Sep 21 15:58 /dev/loop1
brw-rw---- 1 root disk 259, 0 Sep 21 15:58 /dev/loop1p1

> mount /dev/loop1p1 /mnt0
> df -h
...
/dev/loop0              991M    922M   54M   95% /mnt1
/dev/loop1p1             20G    673M   18G    4% /mnt0

> cd /mnt1/
> cp -a * /mnt0/

vergleichen, ob alle Daten rübergekommen sind bzw. beide gleich sind:

> du -sm /mnt1/ /mnt0/
917     /mnt1/
917     /mnt0/

> find /mnt1/ | wc -l ; find /mnt0/ | wc -l
66670
66670

fertig

> umount /mnt1/

Den Mount-Point "/mnt0/" brauchen wir noch, weil dort ja der Grub noch das Image bootfest machen soll.

Grub auf dem Image ausführen (bootfähig machen)

chroot-Methode

> mount -B /proc/ /mnt0/proc/
> mount -B /sys/ /mnt0/sys/
> mount -B /dev/ /mnt0/dev/
> mount -B /dev/pts/ /mnt0/dev/pts/

> chroot /mnt0 /bin/bash
> df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/loop1p1     20G  961M   18G   6% /
udev             16G     0   16G   0% /dev

damit er das Betriebsystem aus dem Host-System nicht findet:

> echo "GRUB_DISABLE_OS_PROBER=true" >> /etc/default/grub

WICHTIG! hier muss das Gerät /dev/loop1 ohne p1 angegeben werden:

> grub-install /dev/loop1
Installing for i386-pc platform.
Installation finished. No error reported.

> update-grub2
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-4.15.0-34-generic
Found initrd image: /boot/initrd.img-4.15.0-34-generic
done

fertig

> umount /mnt0/dev/pts/
> umount /mnt0/dev/
> umount /mnt0/sys/
> umount /mnt0/proc/
> umount /mnt0/
> losetup -a
/dev/loop1: [64770]:561328298 (/home/manfred/Downloads/xenial-server-cloudimg-amd64-root.hdd)

> losetup -d /dev/loop1

Vorbereitung für VirtualBox:

> mv xenial-server-cloudimg-amd64-root.img test01.hdd
> qemu-img convert -p -f raw -O qcow2 test01.hdd test01.qcow2
    (100.00/100%)

> ls test01.qcow2
-rw-r--r-- 1 fritz fritz 1,1G Sep 21 16:28 test01.qcow2

FIXME Leider bleibt die VM (in VirtualBox) beim booten stehen und kann den Bootvorgang nicht abschließen, so das ich kein Prompt bekomme… :-(

Skripte für das mounten von HDD-Images mit Partitionen

<hidden /root/bin/mount_img.sh>

/root/bin/mount_img.sh
#/bin/bash
 
#==============================================================================#
#
# /root/bin/mount_img.sh /var/lib/uvtool/libvirt/images/x-uvt-b64-Y29tLnVidW50dS5jbG91ZDpzZXJ2ZXI6MTYuMDQ6YW1kNjQgMjAxODA5PWE=_bionic.raw /mnt
#
#==============================================================================#
 
VERSION="v2018092100"
 
 
SKRIPTVERZ="$(dirname ${0})"
#. ${SKRIPTVERZ}/mount_img.cfg
 
# mount -o loop,offset=$((512*2048)) /var/lib/uvtool/libvirt/images/x-uvt-b64-Y29tLnVidW50dS5jbG91ZDpzZXJ2ZXI6MTYuMDQ6YW1kNjQgMjAxODA5MTI=_xenial.raw /mnt/
IMAGE_NAME="${1}"
MOUNT_POINT="${2}"
 
#------------------------------------------------------------------------------#
### Parameterüberprüfung
 
if [ ! -e "${IMAGE_NAME}" ] ; then
        echo "Das Image '${IMAGE_NAME}' wurde nicht gefunden..."
        exit 1
fi
 
if [ ! -d "${MOUNT_POINT}" ] ; then
        echo "Der Mount-Point '${MOUNT_POINT}' ist bereits belegt..."
        exit 1
fi
 
BELEGT="$(df -h ${MOUNT_POINT} | tail -n1 | awk '{print $1}' | fgrep loop)"
if [ "x${BELEGT}" != "x" ] ; then
        echo "Der Mount-Point '${MOUNT_POINT}' ist bereits belegt: '${BELEGT}'"
        exit 1
fi
 
#------------------------------------------------------------------------------#
### mount
 
losetup -fP "${IMAGE_NAME}"
LO_DEV="$(losetup -a | fgrep "${IMAGE_NAME}" | awk -F':' '{print $1}')"
ls -lha ${LO_DEV}*
mount ${LO_DEV}p1 ${MOUNT_POINT}
 
#------------------------------------------------------------------------------#
### Bind-Mount
 
mount -B /proc/ /${MOUNT_POINT}/proc/
mount -B /sys/ /${MOUNT_POINT}/sys/
mount -B /dev/ /${MOUNT_POINT}/dev/
mount -B /dev/pts/ /${MOUNT_POINT}/dev/pts/

</hidden>

<hidden /root/bin/umount_img.sh>

/root/bin/umount_img.sh
#/bin/bash
 
#==============================================================================#
#
# /root/bin/umount_img.sh /var/lib/uvtool/libvirt/images/x-uvt-b64-Y29tLnVidW50dS5jbG91ZDpzZXJ2ZXI6MTYuMDQ6YW1kNjQgMjAxODA5PWE=_bionic.raw /mnt
#
#==============================================================================#
 
VERSION="v2018092100"
 
 
SKRIPTVERZ="$(dirname ${0})"
#. ${SKRIPTVERZ}/mount_img.cfg
 
# umount /mnt/
IMAGE_NAME="${1}"
MOUNT_POINT="${2}"
 
#------------------------------------------------------------------------------#
### Parameterüberprüfung
 
#if [ ! -d "${MOUNT_POINT}" ] ; then
#       echo "Der Mount-Point '${MOUNT_POINT}' wurde nicht gefunden..."
#       exit 1
#fi
 
BELEGT="$(df -h ${MOUNT_POINT} | tail -n1 | awk '{print $1}' | fgrep loop)"
if [ "x${BELEGT}" = "x" ] ; then
        echo "Der Mount-Point '${MOUNT_POINT}' ist nicht in Nutzung..."
        exit 1
fi
 
#------------------------------------------------------------------------------#
### umount
 
umount /${MOUNT_POINT}/dev/pts/
umount /${MOUNT_POINT}/dev/
umount /${MOUNT_POINT}/sys/
umount /${MOUNT_POINT}/proc/
umount /${MOUNT_POINT}/
 
LO_DEV="$(losetup -a | fgrep "${IMAGE_NAME}" | awk -F':' '{print $1}')"
losetup -d ${LO_DEV}
ls -lha ${LO_DEV}*

</hidden>

<hidden /root/bin/mach_img.sh>

/root/bin/mach_img.sh
#!/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

</hidden>

/home/http/wiki/data/pages/dateisystem-images.txt · Zuletzt geändert: von manfred