
On Mon, Jun 29, 2015 at 06:44:13PM +0200, Cédric Bosdonnat wrote:
In order to be able to mount a custom host-image as / we need to be able to access libvirt-sandbox-init-common and all its needed dependencies. In the container case we also need to copy libvirt-sandbox-init-lxc.
They are now copied into SANDBOXCONFIGDIR /.libs. Hard linking is not possible since we may be working on separate partitions, and symlinks wouldn't help to work with apparmor. Copying makes apparmor happy and solves our problem. --- configure.ac | 7 + .../libvirt-sandbox-builder-container.c | 15 +- libvirt-sandbox/libvirt-sandbox-builder.c | 159 ++++++++++++++++++++- libvirt-sandbox/libvirt-sandbox-builder.h | 2 + libvirt-sandbox/libvirt-sandbox-init-lxc.c | 8 +- libvirt-sandbox/libvirt-sandbox-init-qemu.c | 9 +- 6 files changed, 196 insertions(+), 4 deletions(-)
diff --git a/libvirt-sandbox/libvirt-sandbox-init-lxc.c b/libvirt-sandbox/libvirt-sandbox-init-lxc.c index 798af37..e2fe7f0 100644 --- a/libvirt-sandbox/libvirt-sandbox-init-lxc.c +++ b/libvirt-sandbox/libvirt-sandbox-init-lxc.c @@ -77,10 +77,16 @@ main(int argc, char **argv) args[narg++] = "1000"; }
- args[narg++] = LIBEXECDIR "/libvirt-sandbox-init-common"; + args[narg++] = SANDBOXCONFIGDIR "/.libs/libvirt-sandbox-init-common"; if (debug) args[narg++] = "-d";
+ if (setenv("LD_LIBRARY_PATH", SANDBOXCONFIGDIR "/.libs", 1) != 0) { + fprintf(stderr, "libvirt-sandbox-init-lxc: %s: cannot set LD_LIBRARY_PATH: %s\n", + __func__, strerror(errno)); + exit(EXIT_FAILURE); + } + if (debug) fprintf(stderr, "Running interactive\n"); execv(args[0], (char**)args); diff --git a/libvirt-sandbox/libvirt-sandbox-init-qemu.c b/libvirt-sandbox/libvirt-sandbox-init-qemu.c index 44305fd..62e8e40 100644 --- a/libvirt-sandbox/libvirt-sandbox-init-qemu.c +++ b/libvirt-sandbox/libvirt-sandbox-init-qemu.c @@ -338,10 +338,17 @@ main(int argc ATTR_UNUSED, char **argv ATTR_UNUSED) args[narg++] = "1000"; }
- args[narg++] = LIBEXECDIR "/libvirt-sandbox-init-common"; + args[narg++] = SANDBOXCONFIGDIR "/.libs/libvirt-sandbox-init-common"; if (debug) args[narg++] = "-d";
+ if (setenv("LD_LIBRARY_PATH", SANDBOXCONFIGDIR "/.libs", 1) < 0) { + fprintf(stderr, "libvirt-sandbox-init-qemu: %s: cannot set LD_LIBRARY_PATH: %s\n", + __func__, strerror(errno)); + exit_poweroff(); + } + + if (debug) fprintf(stderr, "libvirt-sandbox-init-qemu: Running common init %s\n", args[0]); execv(args[0], (char**)args);
We need to unsetenv() in init-common to clear the LD_LIBRARY_PATH setting to prevent it being used by the user application too Regards, Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|