[elbe-devel] [PATCH v3 4/5] hdimg: Use losetup wrapper for grubinstaller202
Torben Hohn
torben.hohn at linutronix.de
Wed Apr 15 17:23:07 CEST 2020
On Sat, Apr 04, 2020 at 01:27:54PM -0400, Olivier Dion wrote:
> Instead of using fixed loop device /dev/loop0 and /dev/poop0,
> grubinstaller uses its losetup wrapper to dynamicaly get a device.
> This is because the fixed device could be busy, even though it has
> been detached.
>
> Also add an exception catching and log it. This is because the
> finally block can shadow an exception throwed in the try block.
>
> Signed-off-by: Olivier Dion <dion at linutronix.de>
Reviewed-by: Torben Hohn <torben.hohn at linutronix.de>
> ---
> elbepack/hdimg.py | 32 +++++++++++++++++++-------------
> 1 file changed, 19 insertions(+), 13 deletions(-)
>
> diff --git a/elbepack/hdimg.py b/elbepack/hdimg.py
> index a1c77ce7..c33efa08 100644
> --- a/elbepack/hdimg.py
> +++ b/elbepack/hdimg.py
> @@ -9,6 +9,7 @@
>
> from __future__ import print_function
>
> +import logging
> import os
>
> import parted
> @@ -169,14 +170,16 @@ class grubinstaller202(grubinstaller_base):
> imagemnt = os.path.join(target, "imagemnt")
> imagemntfs = Filesystem(imagemnt)
> try:
> - do('cp -a /dev/loop0 /dev/poop0')
> + loopdev = self.losetup(self.fs['/'].filename)
> + loopnum = loopdev.replace("/dev/loop", "")
> + poopdev = "/dev/poop" + loopnum
>
> - do('losetup /dev/poop0 "%s"' % self.fs['/'].filename)
> - do('kpartx -as /dev/poop0')
> + do('cp -a %s %s' % (loopdev, poopdev))
> + do('kpartx -as %s' % poopdev)
>
> for entry in self.fs.depthlist():
> - do('mount /dev/mapper/poop0p%d %s' %
> - (entry.partnum, imagemntfs.fname(entry.mountpoint)))
> + do('mount /dev/mapper/poop%sp%d %s' %
> + (loopnum, entry.partnum, imagemntfs.fname(entry.mountpoint)))
>
> do("mount --bind /dev %s" % imagemntfs.fname("dev"))
> do("mount --bind /proc %s" % imagemntfs.fname("proc"))
> @@ -185,7 +188,7 @@ class grubinstaller202(grubinstaller_base):
> do('mkdir -p "%s"' % imagemntfs.fname("boot/grub"))
>
> devmap = open(imagemntfs.fname("boot/grub/device.map"), "w")
> - devmap.write("(hd0) /dev/poop0\n")
> + devmap.write("(hd0) %s\n" % poopdev)
> devmap.close()
>
> chroot(imagemnt, "update-initramfs -u -k all")
> @@ -194,8 +197,8 @@ class grubinstaller202(grubinstaller_base):
> if "efi" in self.fw_type:
> grub_tgt = next(t for t in self.fw_type if t.endswith("-efi"))
> do("chroot %s grub-install --target=%s --removable "
> - "--no-floppy /dev/poop0" %
> - (imagemnt, grub_tgt))
> + "--no-floppy %s" %
> + (imagemnt, grub_tgt, poopdev))
> if "shimfix" in self.fw_type:
> # grub-install is heavily dependent on the running system having
> # a BIOS or EFI. The initvm is BIOS-based, so fix the resulting
> @@ -206,8 +209,11 @@ class grubinstaller202(grubinstaller_base):
> "${f[0]} /boot/efi/EFI/debian/${f[0]%%.signed}'" %
> imagemnt)
> if not self.fw_type or "bios" in self.fw_type:
> - do("chroot %s grub-install --no-floppy /dev/poop0" %
> - (imagemnt))
> + do("chroot %s grub-install --no-floppy %s" %
> + (imagemnt, poopdev))
> +
> + except Exception as E:
> + logging.exception(E)
>
> finally:
> os.unlink(imagemntfs.fname("boot/grub/device.map"))
> @@ -216,11 +222,11 @@ class grubinstaller202(grubinstaller_base):
> do("umount %s" % imagemntfs.fname("sys"), allow_fail=True)
>
> for entry in reversed(self.fs.depthlist()):
> - do('umount /dev/mapper/poop0p%d' % entry.partnum,
> + do('umount /dev/mapper/poop%sp%d' % (loopnum, entry.partnum),
> allow_fail=True)
>
> - do('kpartx -d /dev/poop0', allow_fail=True)
> - do("losetup -d /dev/poop0", allow_fail=True)
> + do("kpartx -d %s" % poopdev, allow_fail=True)
> + do("losetup -d %s" % poopdev, allow_fail=True)
>
>
> class grubinstaller97(grubinstaller_base):
> --
> 2.26.0
>
>
> _______________________________________________
> elbe-devel mailing list
> elbe-devel at linutronix.de
> https://lists.linutronix.de/mailman/listinfo/elbe-devel
--
Torben Hohn
Linutronix GmbH | Bahnhofstrasse 3 | D-88690 Uhldingen-Mühlhofen
Phone: +49 7556 25 999 18; Fax.: +49 7556 25 999 99
Hinweise zum Datenschutz finden Sie hier (Informations on data privacy
can be found here): https://linutronix.de/kontakt/Datenschutz.php
Linutronix GmbH | Firmensitz (Registered Office): Uhldingen-Mühlhofen |
Registergericht (Registration Court): Amtsgericht Freiburg i.Br., HRB700
806 | Geschäftsführer (Managing Directors): Heinz Egger, Thomas Gleixner
More information about the elbe-devel
mailing list