====== Dateisystem-Images ====== ===== Image auf einen USB-Stick schreiben ===== * [[https://download.freebsd.org/releases/ISO-IMAGES/|Download FreeBSD-ISO-IMAGES]] * [[https://download.freebsd.org/releases/ISO-IMAGES/14.0/|FreeBSD 14.0 ISO-IMAGES]] * [[https://download.freebsd.org/releases/ISO-IMAGES/14.0/FreeBSD-14.0-RELEASE-amd64-memstick.img|FreeBSD 14.0 MEM-IMAGE]] * [[https://docs.freebsd.org/en/books/handbook/bsdinstall/#bsdinstall-usb|Writing an Image File to USB]] > 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:__ * [[::bootfähige Volumen]] * [[::mount ISO]] * [[::freebsd:Festplatten/Partitionen mounten]] 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: * [[http://www.hutsky.cz/blog/2014/06/mount-a-disk-image-containing-lvm/]] ==== FreeBSD-root-Image (mit UFS) einer VM vergrößern ==== [[::FreeBSD:FreeBSD-14.0-STABLE-Image#FreeBSD-14.0-STABLE-Image (UFS-RAW) vergrößern]] ==== FreeBSD-root-Image (mit ZFS) einer VM vergrößern ==== * [[https://www.freebsd.org/doc/handbook/disks-virtual.html]] * [[https://www.freebsd.org/doc/de/books/handbook/disks-virtual.html]] * [[http://www.hardwareforums.com/threads/mounting-img-and-iso-images-in-freebsd.26670/]] * [[http://www.forensicswiki.org/wiki/Mounting_Disk_Images#FreeBSD]] 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 ==== * [[http://www.andremiller.net/content/mounting-hard-disk-image-including-partitions-using-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''//:** * [[http://www.azertech.net/content/creating-disk-images]] //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''//:** * [[http://www.syslinux.org/wiki/index.php/Hard_disk_images]] * [[http://www.grulic.org.ar/~mdione/glob/posts/create-a-disk-image-with-a-booting-running-debian/]] 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 [[#mit_offset|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 === * [[http://alexeytorkhov.blogspot.de/2009/09/mounting-raw-and-qcow2-vm-disk-images.html]] * [[http://www.rushiagr.com/blog/2014/08/02/qcow2-mount/]] 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 ==== * [[https://help.ubuntu.com/community/LiveCDCustomization]] * [[https://help.ubuntu.com/community/LiveCDCustomizationFromScratch]] ==== initrd ==== * [[https://wiki.ubuntu.com/CustomizeLiveInitrd]] === 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: * [[http://wiki.ubuntuusers.de/PXE-Boot#Ubuntu-Diskless]] bevor wir jetzt unsere neue //initrd// bauen, kontrollieren wir noch eine Option in zwei Dateien: - /etc/initramfs-tools/initramfs.conf * MODULES=list * BOOT=local - /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 ==== * [[http://www.linuxforen.de/forums/showthread.php?t=118001]] 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 ==== * [[http://libguestfs.org/virt-make-fs.1.html]] * [[https://cloud-images.ubuntu.com/bionic/current/]] === 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 [[https://gist.github.com/shamil/62935d9b456a6f9877b5|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) === [[https://wiki.ubuntuusers.de/GRUB_2/Reparatur/#chroot-Methode|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 ==== #/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/ #/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}* #!/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