From: Stanislaw Kardach Date: Sun, 6 Mar 2016 16:09:39 +0100 Subject: [PATCH] Fix qemu-user-static replacement --- fuel_agent/manager.py | 6 ++++++ fuel_agent/utils/build.py | 18 ++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/fuel_agent/manager.py b/fuel_agent/manager.py index ba1ab78..637c99a 100644 --- a/fuel_agent/manager.py +++ b/fuel_agent/manager.py @@ -760,6 +760,12 @@ class Manager(object): fu.mount_bind(chroot, '/proc') bu.populate_basic_dev(chroot) + # we need to make sure that qemu-{target_arch}-static binary is + # not replaced inside chroot because we're possibly using it + # through qemu-debootstrap + LOG.debug('Preventing qemu-user-static replacement inside chroot') + bu.prevent_qemu_replacement(chroot, CONF.target_arch) + def destroy_chroot(self, chroot): # Umount chroot tree and remove images tmp files if not bu.stop_chrooted_processes(chroot, signal=signal.SIGTERM): diff --git a/fuel_agent/utils/build.py b/fuel_agent/utils/build.py index 74cbfd8..1bc0a5f 100644 --- a/fuel_agent/utils/build.py +++ b/fuel_agent/utils/build.py @@ -320,6 +320,24 @@ def populate_basic_dev(chroot): utils.execute('chroot', chroot, 'ln', '-s', '/proc/self/fd', '/dev/fd') +def prevent_qemu_replacement(chroot, arch): + """Prevents qemu-user-static replacement inside chroot. + + Use dpkg-divert to prevent replacing qemu-user-static binary inside + chroot which is necessary for host-side qemu-debootstrap to work + properly.""" + if arch == 'arm64': + qemu = 'qemu-aarch64-static' + elif arch == 'amd64': + qemu = 'qemu-x86_64-static' + utils.execute('chroot', chroot, + 'dpkg-divert', '--divert', '/usr/bin/%s.orig' % qemu, + '/usr/bin/%s' % qemu) + utils.execute('chroot', chroot, + 'dpkg-divert', '--divert', '/usr/sbin/update-binfmts.orig', + '--rename', '/usr/sbin/update-binfmts') + utils.execute('chroot', chroot, 'ln', '-sf', '/bin/true', + '/usr/sbin/update-binfmts') def create_sparse_tmp_file(dir, suffix, size=8192): """Creates sparse file.