Re: [lxc-devel] [RFC PATCH] lxc: add clone hook.
On Wed, 15 May 2013, Serge Hallyn wrote: > > > Soon analogous create and destroy hooks will be added as well. > > > > I think I'd have preferred storing the command arguments in > > LXC_CLONE_ARGS instead of directly in argv. Doing so would allow us to > > remove/add other arguments without breaking all existing hooks. > > > > The user could then do "set -- $LXC_CLONE_ARGS" and just use $1... as usual. > > > > But I'm not horribly opposed to the proposed implementation and the rest > > looks good. > > Actually, > > yeah that would let menot add the argv[] to run_lxc_hooks, and make the > patch quite a bit shorter. > > I'll redo it like that. I'd really prefer proper arguments. In argv you have null terminated strings, a proper array. In "LXC_CLONE_ARGS" you have to encode the null terminated string in some way, forcing the comsumer to unencode it. Ie, set -- $LXC_CLONE_ARGS which is actually insufficient. In order to avoid shell expansion, the user has to do something like this: eval set -- "${LXC_CLONE_ARGS}" and you'll have to shell escape the content that you put in there. -- Try New Relic Now & We'll Send You this Cool Shirt New Relic is the only SaaS-based application performance monitoring service that delivers powerful full stack analytics. Optimize and monitor your browser, app, & servers with just a few lines of code. Try New Relic and get this awesome Nerd Life shirt! http://p.sf.net/sfu/newrelic_d2d_may ___ Lxc-devel mailing list Lxc-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/lxc-devel
[lxc-devel] [PATCH] ubuntu-cloud-prep: cleanup, fix bug with userdata
--userdata was broken, completely missing an implementation. This adds that implementation back in, makes 'debug' logic correct, and then also improves the doc at the top. Signed-off-by: Scott Moser diff --git a/hooks/ubuntu-cloud-prep b/hooks/ubuntu-cloud-prep index 159fd02..7985a73 100755 --- a/hooks/ubuntu-cloud-prep +++ b/hooks/ubuntu-cloud-prep @@ -1,21 +1,21 @@ #!/bin/bash -## If the container being cloned has one or more lxc.hook.clone specified, -## then the specified hooks will be called for the new container. The first -## 3 arguments passed to the clone hook will be: +## If the container being cloned has one or more lxc.hook.clone +## specified, then the specified hooks will be called for the new +## container. The arguments passed to the clone hook are: ## 1. the container name ## 2. a section ('lxc') ## 3. hook type ('clone') ## 4. .. additional arguments to lxc-clone ## Environment variables: -## LXC_ROOTFS_MOUNT: path under which the container's root fs is mounted. -## LXC_CONFIG_FILE: The configuration file pathname -## LXC_SRC_NAME: old container name -## LXC_ROOTFS_PATH: path or device on which the root fs is located +## LXC_ROOTFS_MOUNT: path to the root filesystem +## LXC_CONFIG_FILE: path to config file +## LXC_SRC_NAME: old container name +## LXC_ROOTFS_PATH: path or device on which the root fs is located VERBOSITY="0" error() { echo "$@" 1>&2; } -debug() { [ "$1" -ge "$VERBOSITY" ] || return; shift; error "$@"; } +debug() { [ "$VERBOSITY" -ge "$1" ] || return; shift; error "$@"; } fail() { [ $# -eq 0 ] || error "$@"; exit 1; } prep_usage() { @@ -122,7 +122,10 @@ prep() { MIRROR="http://archive.ubuntu.com/ubuntu"; fi -{ +if [ -n "$userdata" ]; then +cp "$userdata" "$seed_d/user-data" +else +{ local lc=$(locale | awk -F= '/LANG=/ {print $NF; }') echo "#cloud-config" echo "output: {all: '| tee -a /var/log/cloud-init-output.log'}" @@ -131,8 +134,8 @@ prep() { [ -z "$LANG" ] || echo "locale: $LANG"; echo "password: ubuntu" echo "chpasswd: { expire: false; }" - -} > "$seed_d/user-data" +} > "$seed_d/user-data" +fi [ $? -eq 0 ] || { error "failed to write user-data write to '$seed_d/user-data'"; return 1; -- Get 100% visibility into Java/.NET code with AppDynamics Lite! It's a free troubleshooting tool designed for production. Get down to code-level detail for bottlenecks, with <2% overhead. Download for free and get started troubleshooting in minutes. http://pubads.g.doubleclick.net/gampad/clk?id=48897031&iu=/4140/ostg.clktrk ___ Lxc-devel mailing list Lxc-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/lxc-devel
[lxc-devel] [PATCH] ubuntu-cloud-prep: cleanup, fix bug with userdata
ubuntu-cloud-prep: cleanup, fix bug with userdata --userdata was broken, completely missing an implementation. This adds that implementation back in, makes 'debug' logic correct, and then also improves the doc at the top. Signed-off-by: Scott Moser diff --git a/hooks/ubuntu-cloud-prep b/hooks/ubuntu-cloud-prep index 159fd02..7985a73 100755 --- a/hooks/ubuntu-cloud-prep +++ b/hooks/ubuntu-cloud-prep @@ -1,21 +1,21 @@ #!/bin/bash -## If the container being cloned has one or more lxc.hook.clone specified, -## then the specified hooks will be called for the new container. The first -## 3 arguments passed to the clone hook will be: +## If the container being cloned has one or more lxc.hook.clone +## specified, then the specified hooks will be called for the new +## container. The arguments passed to the clone hook are: ## 1. the container name ## 2. a section ('lxc') ## 3. hook type ('clone') ## 4. .. additional arguments to lxc-clone ## Environment variables: -## LXC_ROOTFS_MOUNT: path under which the container's root fs is mounted. -## LXC_CONFIG_FILE: The configuration file pathname -## LXC_SRC_NAME: old container name -## LXC_ROOTFS_PATH: path or device on which the root fs is located +## LXC_ROOTFS_MOUNT: path to the root filesystem +## LXC_CONFIG_FILE: path to config file +## LXC_SRC_NAME: old container name +## LXC_ROOTFS_PATH: path or device on which the root fs is located VERBOSITY="0" error() { echo "$@" 1>&2; } -debug() { [ "$1" -ge "$VERBOSITY" ] || return; shift; error "$@"; } +debug() { [ "$VERBOSITY" -ge "$1" ] || return; shift; error "$@"; } fail() { [ $# -eq 0 ] || error "$@"; exit 1; } prep_usage() { @@ -122,7 +122,10 @@ prep() { MIRROR="http://archive.ubuntu.com/ubuntu"; fi -{ +if [ -n "$userdata" ]; then +cp "$userdata" "$seed_d/user-data" +else +{ local lc=$(locale | awk -F= '/LANG=/ {print $NF; }') echo "#cloud-config" echo "output: {all: '| tee -a /var/log/cloud-init-output.log'}" @@ -131,8 +134,8 @@ prep() { [ -z "$LANG" ] || echo "locale: $LANG"; echo "password: ubuntu" echo "chpasswd: { expire: false; }" - -} > "$seed_d/user-data" +} > "$seed_d/user-data" +fi [ $? -eq 0 ] || { error "failed to write user-data write to '$seed_d/user-data'"; return 1; -- Get 100% visibility into Java/.NET code with AppDynamics Lite! It's a free troubleshooting tool designed for production. Get down to code-level detail for bottlenecks, with <2% overhead. Download for free and get started troubleshooting in minutes. http://pubads.g.doubleclick.net/gampad/clk?id=48897031&iu=/4140/ostg.clktrk ___ Lxc-devel mailing list Lxc-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/lxc-devel
[lxc-devel] ubuntu-cloud-prep: patch /sbin/start for overlayfs
upstart depends on inotify, and overlayfs does not support inotify. That means that the following results in 'tgt' not running. tgt is simply used here as an example of a service that installs an upstart job and starts it on package install. lxc-clone -s -B overlayfs -o source-precise-amd64 -n test1 lxc-start -n test1 .. apt-get install tgt The change here is to modify /sbin/start inside the container so that when something explicitly tries 'start', it results in an explicit call to 'initctl reload-configuration' so that upstart is aware of the newly placed job. Should overlayfs ever gain inotify support, this should still not cause any harm. Signed-off-by: Scott Moser diff --git a/hooks/ubuntu-cloud-prep b/hooks/ubuntu-cloud-prep index 7985a73..5e0a999 100755 --- a/hooks/ubuntu-cloud-prep +++ b/hooks/ubuntu-cloud-prep @@ -12,6 +12,7 @@ ## LXC_SRC_NAME: old container name ## LXC_ROOTFS_PATH: path or device on which the root fs is located +set -f VERBOSITY="0" error() { echo "$@" 1>&2; } @@ -34,9 +35,56 @@ Usage: ${0##*/} [options] root-dir EOF } +write_patched_start() { +cat > "$1" <<"EOF" +#!/bin/bash +## This is a wrapper around upstart's /sbin/start to ensure that +## calling 'start' on a job after writing it to /etc/init will function +## correctly despite broken/missing support for inotify in overlayfs. +## +real() { exec -a /sbin/start "/sbin/start.real" "$@"; } + +# no args or not root +[ $# -ne 0 -a "$UID" = "0" ] || real "$@" + +job="" +# find first argument that doesn't start with '-' as 'job' +for x in "$@"; do + [ "${x#-}" = "$x" ] && { job="$x"; break; } +done + +# if job isn't there, no reason to check further +[ -n "$job" ] && [ -f "/etc/init/$job.conf" ] || real "$@" + +# on Unknown, 'status' exits 1, and prints 'Unknown job' to stderr. +out=$(status "$@" 2>&1) +[ $? -eq 1 -a "${out#*nknown job}" != "$out" ] || real "$@" + +initctl reload-configuration >/dev/null 2>&1 +real "$@" +EOF +chmod 755 "$1" +} + +patch_start() { +# patch /sbin/start inside root_d to deal with lack of inotify +local root_d="$1" + +# already patched +[ -f "$root_d/sbin/start.real" ] && +{ debug 1 "$root_d 'start' seems already patched"; return 1; } + +debug 1 "patching /sbin/start in $root_d" +chroot "$root_d" dpkg-divert --local --rename \ +--divert /sbin/start.real --add /sbin/start || +{ error "failed to patch /sbin/start for overlayfs"; return 1; } + +write_patched_start "$root_d/sbin/start" +} + prep() { local short_opts="Chi:L:S:u:v" -local long_opts="auth-key:,cloud,help,hostid:,name:,nolocales:,userdata:,verbose" +local long_opts="auth-key:,cloud,help,hostid:,name:,nolocales:,patch-start,userdata:,verbose" local getopt_out getopt_ret getopt_out=$(getopt --name "${0##*/}" \ --options "${short_opts}" --long "${long_opts}" -- "$@" 2>/dev/null) || @@ -49,6 +97,8 @@ prep() { local cur="" next="" local userdata="" hostid="" authkey="" locales=1 cloud=0 name="" +local patch_start=0 + while [ $# -ne 0 ]; do cur="$1"; next="$2"; case "$cur" in @@ -57,6 +107,7 @@ prep() { --name) name="$next";; -i|--hostid) hostid="$next";; -L|--nolocales) locales=0;; + --patch-start) patch_start=1;; -S|--auth-key) [ -f "$next" ] || { error "--auth-key: '$next' not a file"; return 1; } @@ -86,6 +137,9 @@ prep() { error "${0##*}: usage failed, continuing with defaults" fi +[ "$patch_start" -eq 0 ] || patch_start "$root_d" || +{ error "failed to patch start for overlayfs"; return 1; } + local seed_d="" seed_d="$root_d/var/lib/cloud/seed/nocloud-net" if [ $cloud -eq 1 ]; then @@ -149,10 +203,13 @@ main() { local _LXC_HOOK if [ -n "$LXC_ROOTFS_MOUNT" -a "$3" = "clone" ]; then _LXC_HOOK="clone" -local name="$1" +local name="$1" pstart="" shift 3 -debug 1 prep "--name=$name" "$LXC_ROOTFS_MOUNT" "$@" -prep "--name=$name" "$LXC_ROOTFS_M
[lxc-devel] [PATCH] ubuntu-cloud-prep: improve overlayfs workaround
the previous 'patch_start' can be vastly simplified now that I better understand what the bug was. Instead of wrapping 'start', we only need to ensure that /etc/init exists inside the overlayfs, so that the directory that upstart watches is guaranteed to be in the overlay, not the underlay. The problem is described under bug 1213925. Signed-off-by: Scott Moser --- hooks/ubuntu-cloud-prep | 69 + 1 file changed, 12 insertions(+), 57 deletions(-) diff --git a/hooks/ubuntu-cloud-prep b/hooks/ubuntu-cloud-prep index a6999b6..c4c3620 100755 --- a/hooks/ubuntu-cloud-prep +++ b/hooks/ubuntu-cloud-prep @@ -35,56 +35,9 @@ Usage: ${0##*/} [options] root-dir EOF } -write_patched_start() { -cat > "$1" <<"EOF" -#!/bin/bash -## This is a wrapper around upstart's /sbin/start to ensure that -## calling 'start' on a job after writing it to /etc/init will function -## correctly despite broken/missing support for inotify in overlayfs. -## -real() { exec -a /sbin/start "/sbin/start.real" "$@"; } - -# no args or not root -[ $# -ne 0 -a "$UID" = "0" ] || real "$@" - -job="" -# find first argument that doesn't start with '-' as 'job' -for x in "$@"; do - [ "${x#-}" = "$x" ] && { job="$x"; break; } -done - -# if job isn't there, no reason to check further -[ -n "$job" ] && [ -f "/etc/init/$job.conf" ] || real "$@" - -# on Unknown, 'status' exits 1, and prints 'Unknown job' to stderr. -out=$(status "$@" 2>&1) -[ $? -eq 1 -a "${out#*nknown job}" != "$out" ] || real "$@" - -initctl reload-configuration >/dev/null 2>&1 -real "$@" -EOF -chmod 755 "$1" -} - -patch_start() { -# patch /sbin/start inside root_d to deal with lack of inotify -local root_d="$1" - -# already patched -[ -f "$root_d/sbin/start.real" ] && -{ debug 1 "$root_d 'start' seems already patched"; return 1; } - -debug 1 "patching /sbin/start in $root_d" -chroot "$root_d" dpkg-divert --local --rename \ ---divert /sbin/start.real --add /sbin/start || -{ error "failed to patch /sbin/start for overlayfs"; return 1; } - -write_patched_start "$root_d/sbin/start" -} - prep() { local short_opts="Chi:L:S:u:v" -local long_opts="auth-key:,cloud,help,hostid:,name:,nolocales:,patch-start,userdata:,verbose" +local long_opts="auth-key:,cloud,help,hostid:,name:,nolocales:,create-etc-init,userdata:,verbose" local getopt_out getopt_ret getopt_out=$(getopt --name "${0##*/}" \ --options "${short_opts}" --long "${long_opts}" -- "$@" 2>/dev/null) || @@ -97,7 +50,7 @@ prep() { local cur="" next="" local userdata="" hostid="" authkey="" locales=1 cloud=0 name="" -local patch_start=0 +local create_etc_init=0 while [ $# -ne 0 ]; do cur="$1"; next="$2"; @@ -107,7 +60,7 @@ prep() { --name) name="$next";; -i|--hostid) hostid="$next";; -L|--nolocales) locales=0;; - --patch-start) patch_start=1;; + --create-etc-init) create_etc_init=1;; -S|--auth-key) [ -f "$next" ] || { error "--auth-key: '$next' not a file"; return 1; } @@ -137,8 +90,10 @@ prep() { error "${0##*}: usage failed, continuing with defaults" fi -[ "$patch_start" -eq 0 ] || patch_start "$root_d" || -{ error "failed to patch start for overlayfs"; return 1; } +[ "$create_etc_init" -eq 0 ] || +echo "#upstart needs help for overlayfs (LP: #1213925)." > \ +"$root_d/etc/init/.overlayfs-upstart-helper" || +{ error "failed to create /etc/init in overlay"; return 1; } local seed_d="" seed_d="$root_d/var/lib/cloud/seed/nocloud-net" @@ -203,13 +158,13 @@ main() { local _LXC_HOOK if [ -n "$LXC_ROOTFS_MOUNT" -a "$3" = "clone" ]; then _LXC_HOOK="clone" -local name="$1" pstart="" +local name="$1" create_etc_init="" shift 3 -# if mountpoint is overlayfs then add '--patch-start' +# if mountpoint is overlayfs then add '--create-etc-init' [ "${LXC_ROOTFS_PATH#overlayfs}" != "${
[lxc-devel] [PATCH] hooks/ubuntu-cloud-prep: add hostname to meta-data
prior to my enabling of the clone hook, the setting of the hostname was being done by writing to /etc/hostname. Instead of relying on that we're now writing 'local-hostname' into the metadata for the instance. cloud-init then reads this and sets the hostname properly. The one caveat is that setting of the hostname then occurs after the initial dhcp, so the hostname sent in the dhcp request would be the original one. Should this prove problematic (possibly for avahi dns) we can revert to explicitly writing the hostname into /etc/hostname as well. --- hooks/ubuntu-cloud-prep | 7 +-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/hooks/ubuntu-cloud-prep b/hooks/ubuntu-cloud-prep index c4c3620..725c63a 100755 --- a/hooks/ubuntu-cloud-prep +++ b/hooks/ubuntu-cloud-prep @@ -49,8 +49,8 @@ prep() { fi local cur="" next="" -local userdata="" hostid="" authkey="" locales=1 cloud=0 name="" -local create_etc_init=0 +local userdata="" hostid="" authkey="" locales=1 cloud=0 +local create_etc_init=0 name="ubuntucloud-lxc" while [ $# -ne 0 ]; do cur="$1"; next="$2"; @@ -110,6 +110,9 @@ prep() { echo "instance-id: lxc-$hostid" > "$seed_d/meta-data" || { error "failed to write to $seed_d/meta-data"; return 1; } +echo "local-hostname: $name" >> "$seed_d/meta-data" || +{ error "failed to write to $seed_d/meta-data"; return 1; } + if [ -n "$authkey" ]; then { echo "public-keys:" && -- 1.8.3.2 -- Introducing Performance Central, a new site from SourceForge and AppDynamics. Performance Central is your source for news, insights, analysis and resources for efficient Application Performance Management. Visit us today! http://pubads.g.doubleclick.net/gampad/clk?id=48897511&iu=/4140/ostg.clktrk ___ Lxc-devel mailing list Lxc-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/lxc-devel
Re: [lxc-devel] [PATCH] hooks/ubuntu-cloud-prep: add hostname to meta-data
On Thu, 22 Aug 2013, Serge Hallyn wrote: > Quoting Scott Moser (smo...@ubuntu.com): > > prior to my enabling of the clone hook, the setting of the hostname > > was being done by writing to /etc/hostname. Instead of relying on that > > we're now writing 'local-hostname' into the metadata for the instance. > > > > cloud-init then reads this and sets the hostname properly. > > > > The one caveat is that setting of the hostname then occurs after > > the initial dhcp, so the hostname sent in the dhcp request would be > > the original one. > > > > Should this prove problematic (possibly for avahi dns) we can revert > > to explicitly writing the hostname into /etc/hostname as well. > > Hi Scott, > > this did manage to set the container name as hostname on first boot, > however apparently not in time for dhcp's send gethostname(). On > first boot, the parent dnsmasq couldn't resolve the hostname, but > after a reboot it could. > > I don't mind applying the patch as is, but is that going to be a problem > for ubuntu-cloud users? I kind of see this as a broken design in that you're having lxc tell the instance what its hostname is, then having the instance tell dnsmasq, and relying on that for hostname resolution. A better solution would be for lxc to set dnsmasq correctly so dns resolution works independent of the instance's configuration. lxc knows the MAC address. That said, I'll re-send with setting /etc/hostname also. -- Introducing Performance Central, a new site from SourceForge and AppDynamics. Performance Central is your source for news, insights, analysis and resources for efficient Application Performance Management. Visit us today! http://pubads.g.doubleclick.net/gampad/clk?id=48897511&iu=/4140/ostg.clktrk ___ Lxc-devel mailing list Lxc-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/lxc-devel
[lxc-devel] [PATCH] hooks/ubuntu-cloud-prep: add hostname to meta-data
prior to my enabling of the clone hook, the setting of the hostname was being done by writing to /etc/hostname. Instead of relying on that we're now writing 'local-hostname' into the metadata for the instance. cloud-init then reads this and sets the hostname properly. We are also writing /etc/hostname with the new hostname explicitly. This is useful/necessary because on network bringup of eth0, dhclient will submit its hosname. The updating done by cloud-init occurs to late, and thus the dhcp request goes out with the un-configured hostname and dns doens't work correctly. Signed-off-by: Scott Moser --- hooks/ubuntu-cloud-prep | 11 +-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/hooks/ubuntu-cloud-prep b/hooks/ubuntu-cloud-prep index c4c3620..f0b30ea 100755 --- a/hooks/ubuntu-cloud-prep +++ b/hooks/ubuntu-cloud-prep @@ -49,8 +49,8 @@ prep() { fi local cur="" next="" -local userdata="" hostid="" authkey="" locales=1 cloud=0 name="" -local create_etc_init=0 +local userdata="" hostid="" authkey="" locales=1 cloud=0 +local create_etc_init=0 name="ubuntucloud-lxc" while [ $# -ne 0 ]; do cur="$1"; next="$2"; @@ -97,6 +97,10 @@ prep() { local seed_d="" seed_d="$root_d/var/lib/cloud/seed/nocloud-net" + +echo "$name" > "$root_d/etc/hostname" || +{ error "failed to write /etc/hostname"; return 1; } + if [ $cloud -eq 1 ]; then debug 1 "--cloud provided, not modifying seed in '$seed_d'" else @@ -110,6 +114,9 @@ prep() { echo "instance-id: lxc-$hostid" > "$seed_d/meta-data" || { error "failed to write to $seed_d/meta-data"; return 1; } +echo "local-hostname: $name" >> "$seed_d/meta-data" || +{ error "failed to write to $seed_d/meta-data"; return 1; } + if [ -n "$authkey" ]; then { echo "public-keys:" && -- 1.8.3.2 -- Introducing Performance Central, a new site from SourceForge and AppDynamics. Performance Central is your source for news, insights, analysis and resources for efficient Application Performance Management. Visit us today! http://pubads.g.doubleclick.net/gampad/clk?id=48897511&iu=/4140/ostg.clktrk ___ Lxc-devel mailing list Lxc-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/lxc-devel
Re: [lxc-devel] [PATCH] lxc-ubuntu-cloud: pass --numeric-owner and -p to untar
On Mon, 7 Oct 2013, Stéphane Graber wrote: > On Mon, Oct 07, 2013 at 04:16:05PM -0500, Serge Hallyn wrote: > > An example of where this can break is if you pass in sshkey to user > > ubuntu in the container, where user ubuntu exists with different uid > > on host. > > > > Signed-off-by: Serge Hallyn > > Acked-by: Stéphane Graber Just following up here, Serge raised the question of whether or not the other two invocations of 'tar' in this script need '--numeric-owner'. They probably should have it, although its of little concern because the 'build_root_tgz' path is only taken if there is no '-root.tar.gz' file for download, and the only supported ubuntu release without the -root.tar.gz download is 10.04 at this point. Anyway, below is a more complete diff, also including a fix as '--numeric-uid' is not a valid option to tar. The name is '--numeric-owner'. Signed-off-by: Scott Moser diff --git a/templates/lxc-ubuntu-cloud.in b/templates/lxc-ubuntu-cloud.in index 47a5fca..a2af003 100644 --- a/templates/lxc-ubuntu-cloud.in +++ b/templates/lxc-ubuntu-cloud.in @@ -340,7 +340,7 @@ build_root_tgz() echo "Creating new cached cloud image rootfs" tar --wildcards -zxf $tarname $imgname mount -o loop $imgname $xdir -(cd $xdir; tar zcf ../$filename .) +(cd $xdir; tar --numeric-owner -cpzf ../$filename .) umount $xdir rm -f $tarname $imgname rmdir $xdir @@ -371,7 +371,7 @@ do_extract_rootfs() { echo "Extracting container rootfs" mkdir -p $rootfs cd $rootfs -tar -zxf $cache/$filename +tar --numeric-owner -xpzf $cache/$filename } if [ -n "$tarball" ]; then-- October Webinars: Code for Performance Free Intel webinars can help you accelerate application performance. Explore tips for MPI, OpenMP, advanced profiling, and more. Get the most from the latest Intel processors and coprocessors. See abstracts and register > http://pubads.g.doubleclick.net/gampad/clk?id=60134071&iu=/4140/ostg.clktrk___ Lxc-devel mailing list Lxc-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/lxc-devel