From c9c9197a3210ac24a039a4096214150d0e8cebb8 Mon Sep 17 00:00:00 2001 From: Scott Moser Date: Wed, 7 Dec 2016 09:44:41 +0100 Subject: mounts: use mount -a again to accomplish mounts During recent changes to cc_mounts, on systemd systems, we started using systemctl daemon-reload rather than 'mount -a' to get mounts done. The belief was that since entries in /etc/fstab would be written to tell systemd that they should be after cloud-init (x-systemd.requires=cloud-init.service) that the reload would then let systemd mount the units as expected. That doesn't seem to work, and new mount entries end up not getting mounted. The change here moves back to using 'mount -a', but then also does a systemctl daemon-reload. LP: #1647708 --- cloudinit/config/cc_mounts.py | 52 ++++++++++++++++++++++++++++--------------- 1 file changed, 34 insertions(+), 18 deletions(-) (limited to 'cloudinit') diff --git a/cloudinit/config/cc_mounts.py b/cloudinit/config/cc_mounts.py index 452c9e83..0c796b18 100644 --- a/cloudinit/config/cc_mounts.py +++ b/cloudinit/config/cc_mounts.py @@ -327,6 +327,8 @@ def handle(_name, cfg, cloud, log, _args): if "mounts" in cfg: cfgmnt = cfg["mounts"] + LOG.debug("mounts configuration is %s", cfgmnt) + for i in range(len(cfgmnt)): # skip something that wasn't a list if not isinstance(cfgmnt[i], list): @@ -423,37 +425,51 @@ def handle(_name, cfg, cloud, log, _args): cc_lines.append('\t'.join(line)) fstab_lines = [] + removed = [] for line in util.load_file(FSTAB_PATH).splitlines(): try: toks = WS.split(line) if toks[3].find(comment) != -1: + removed.append(line) continue except Exception: pass fstab_lines.append(line) + for d in dirs: + try: + util.ensure_dir(d) + except Exception: + util.logexc(log, "Failed to make '%s' config-mount", d) + + sadds = [WS.sub(" ", n) for n in cc_lines] + sdrops = [WS.sub(" ", n) for n in removed] + + sops = (["- " + drop for drop in sdrops if drop not in sadds] + + ["+ " + add for add in sadds if add not in sdrops]) + fstab_lines.extend(cc_lines) contents = "%s\n" % ('\n'.join(fstab_lines)) util.write_file(FSTAB_PATH, contents) + activate_cmds = [] if needswap: - try: - util.subp(("swapon", "-a")) - except Exception: - util.logexc(log, "Activating swap via 'swapon -a' failed") + activate_cmds.append(["swapon", "-a"]) - for d in dirs: + if len(sops) == 0: + log.debug("No changes to /etc/fstab made.") + else: + log.debug("Changes to fstab: %s", sops) + activate_cmds.append(["mount", "-a"]) + if uses_systemd: + activate_cmds.append(["systemctl", "daemon-reload"]) + + fmt = "Activating swap and mounts with: %s" + for cmd in activate_cmds: + fmt = "Activate mounts: %s:" + ' '.join(cmd) try: - util.ensure_dir(d) - except Exception: - util.logexc(log, "Failed to make '%s' config-mount", d) - - activate_cmd = ["mount", "-a"] - if uses_systemd: - activate_cmd = ["systemctl", "daemon-reload"] - fmt = "Activate mounts: %s:" + ' '.join(activate_cmd) - try: - util.subp(activate_cmd) - LOG.debug(fmt, "PASS") - except util.ProcessExecutionError: - util.logexc(log, fmt, "FAIL") + util.subp(cmd) + log.debug(fmt, "PASS") + except util.ProcessExecutionError: + log.warn(fmt, "FAIL") + util.logexc(log, fmt, "FAIL") -- cgit v1.2.3