From 20a0cf9bf34408706f34edee5e1e75fd9676774c Mon Sep 17 00:00:00 2001 From: Scott Moser Date: Tue, 19 Jul 2011 15:42:52 -0400 Subject: do not complain if attempt to resizefs in an lxc container fails it is expected / understood that mknod would fail inside an lxc container. So, if thats the case, just log a debug message saying so. LP: #800856 --- ChangeLog | 1 + cloudinit/CloudConfig/cc_resizefs.py | 3 +++ cloudinit/util.py | 23 +++++++++++++++++++++++ 3 files changed, 27 insertions(+) diff --git a/ChangeLog b/ChangeLog index 762abafa..14039690 100644 --- a/ChangeLog +++ b/ChangeLog @@ -26,6 +26,7 @@ - fix cloud-init in ubuntu lxc containers (LP: #800824) - sanitize hosts file for system's hostname to 127.0.1.1 (LP: #802637) - add chef support (cloudinit/CloudConfig/cc_chef.py) + - do not give trace on failure to resize in lxc container (LP: #800856) 0.6.1: - fix bug in fixing permission on /var/log/cloud-init.log (LP: #704509) - improve comment strings in rsyslog file tools/21-cloudinit.conf diff --git a/cloudinit/CloudConfig/cc_resizefs.py b/cloudinit/CloudConfig/cc_resizefs.py index e396b283..883c269b 100644 --- a/cloudinit/CloudConfig/cc_resizefs.py +++ b/cloudinit/CloudConfig/cc_resizefs.py @@ -42,6 +42,9 @@ def handle(name,cfg,cloud,log,args): dev=os.makedev(os.major(st_dev),os.minor(st_dev)) os.mknod(devpth, 0400 | stat.S_IFBLK, dev) except: + if util.islxc(): + log.debug("inside lxc, ignoring mknod failure in resizefs") + return log.warn("Failed to make device node to resize /") raise diff --git a/cloudinit/util.py b/cloudinit/util.py index 8f6a6b0d..ec37f2f7 100644 --- a/cloudinit/util.py +++ b/cloudinit/util.py @@ -395,3 +395,26 @@ def dos2unix(input): pos = input.find('\n') if pos <= 0 or input[pos-1] != '\r': return(input) return(input.replace('\r\n','\n')) + +def islxc(): + # is this host running lxc? + try: + with open("/proc/1/cgroup") as f: + if f.read() == "/": + return True + except IOError as e: + if e.errno != errno.ENOENT: + raise + + try: + # try to run a program named 'lxc-is-container'. if it returns true, then + # we're inside a container. otherwise, no + sp = subprocess.Popen(['lxc-is-container'], stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + out,err = sp.communicate(None) + return(sp.returncode == 0) + except OSError as e: + if e.errno != errno.ENOENT: + raise + + return False -- cgit v1.2.3