#! /bin/sh pkg=$1 pkgversion="$2" moddir="$3" # qemu-system-* can be told to add a new device at runtime, # including block devices for which a driver is implemented # in a loadable module. In case qemu is upgraded, running # qemus will not be able to load modules anymore (since the # new modules are from the different build). Qemu has # mechanism to load modules from alternative directory, # it is hardcoded in util/module.c as /run/qemu/$version/. # We can save old modules on upgrade if qemu processes are # running, - it does not take much space but ensures qemu # is not left without maybe-needed modules. See LP#1847361. # # Ideally the remove of the saved modules should be done when # last qemu-system-* process with this version is terminated, # but we can't do this. So old modules keep accumulating in # /run/qemu/ until reboot, even if not needed already. # # Currently we handle purging of the modules, removing the # whole saved LAST-versioned subdir. Probably we should # remove all saved subdirs in this case. # # Additional complication is that /run is mounted noexec # so it's impossible to run .so files from there, and # a (bind-re-)mount is needed. # # When this script is run, files for the package in question # has already been installed into debian/package/. savetopdir=/run/qemu savedir=$savetopdir/$(echo -n "$pkgversion" | tr --complement '[:alnum:]+-.~' '_') tagname=.savemoddir tx=$savedir/$tagname marker="### added by qemu/$0:" # add_maintscript_fragment package {preinst|postinst|prerm|postrm} < contents add_maintscript_fragment() { maintscript=debian/$1.$2.debhelper if ! grep -sq "^$marker$" $maintscript; then { echo "$marker"; cat; echo "### end added section"; } >> $maintscript fi } modules=$(echo debian/$pkg/$moddir/*.so | sed "s|debian/[^ ]*/||g") add_maintscript_fragment $pkg prerm < $tx; chmod 0744 $tx if [ ! -x $tx ]; then # mounted noexec? mountpoint -q $savedir || mount --bind $savedir $savedir mount -o remount,exec $savedir fi fi ;; esac EOF add_maintscript_fragment $pkg postrm </dev/null || : rmdir "\$dir" 2>/dev/null || : fi done ;; esac EOF