diff options
author | Jonathan Lebon <jonathan@jlebon.com> | 2018-06-07 14:42:42 -0400 |
---|---|---|
committer | Atomic Bot <atomic-devel@projectatomic.io> | 2018-06-07 21:41:32 +0000 |
commit | ecdebeb20e232e5ec373be25a8cbf106180fcc0a (patch) | |
tree | 0934aebd231c37a4c6e9a6d2ee919f22181012f7 | |
parent | 6f3b5620de29654624eea1c3e6691c46be058dc8 (diff) | |
download | ostree-ecdebeb20e232e5ec373be25a8cbf106180fcc0a.tar.gz |
switchroot: Allow letting ostree-prepare-root mount /var
In some scenarios, it might make sense to let `ostree-prepare-root` do
the `/var` mount from the state root as before. For example, one may
want to do some system configuration before the switch root. This of
course comes at the expense of supporting `/var` as a mount point in
`/etc/fstab`.
Closes: #1617
Approved by: cgwalters
-rw-r--r-- | src/switchroot/ostree-mount-util.h | 2 | ||||
-rw-r--r-- | src/switchroot/ostree-prepare-root.c | 11 | ||||
-rw-r--r-- | src/switchroot/ostree-system-generator.c | 10 |
3 files changed, 20 insertions, 3 deletions
diff --git a/src/switchroot/ostree-mount-util.h b/src/switchroot/ostree-mount-util.h index 08e10f97..0b40bb40 100644 --- a/src/switchroot/ostree-mount-util.h +++ b/src/switchroot/ostree-mount-util.h @@ -31,6 +31,8 @@ #include <fcntl.h> #include <string.h> +#define INITRAMFS_MOUNT_VAR "/run/ostree/initramfs-mount-var" + static inline int path_is_on_readonly_fs (char *path) { diff --git a/src/switchroot/ostree-prepare-root.c b/src/switchroot/ostree-prepare-root.c index 5ed9b60f..53df463c 100644 --- a/src/switchroot/ostree-prepare-root.c +++ b/src/switchroot/ostree-prepare-root.c @@ -151,12 +151,17 @@ main(int argc, char *argv[]) if (chdir (deploy_path) < 0) err (EXIT_FAILURE, "failed to chdir to deploy_path"); - /* In the systemd case, this is handled by ostree-system-generator */ + bool mount_var = true; + /* In the systemd case, this is handled by ostree-system-generator by default */ #ifndef HAVE_SYSTEMD_AND_LIBMOUNT + /* file in /run can override that behaviour */ + if (lstat (INITRAMFS_MOUNT_VAR, &stbuf) < 0) + mount_var = false; +#endif + /* Link to the deployment's /var */ - if (mount ("../../var", "var", NULL, MS_MGC_VAL|MS_BIND, NULL) < 0) + if (mount_var && mount ("../../var", "var", NULL, MS_MGC_VAL|MS_BIND, NULL) < 0) err (EXIT_FAILURE, "failed to bind mount ../../var to var"); -#endif char srcpath[PATH_MAX]; /* If /boot is on the same partition, use a bind mount to make it visible diff --git a/src/switchroot/ostree-system-generator.c b/src/switchroot/ostree-system-generator.c index 970ef41e..799a3104 100644 --- a/src/switchroot/ostree-system-generator.c +++ b/src/switchroot/ostree-system-generator.c @@ -49,6 +49,16 @@ main(int argc, char *argv[]) exit (EXIT_SUCCESS); } + /* We conflict with the magic ostree-mount-deployment-var file for ostree-prepare-root */ + { struct stat stbuf; + if (fstatat (AT_FDCWD, INITRAMFS_MOUNT_VAR, &stbuf, 0) == 0) + { + if (unlinkat (AT_FDCWD, INITRAMFS_MOUNT_VAR, 0) < 0) + err (EXIT_FAILURE, "Can't unlink " INITRAMFS_MOUNT_VAR); + exit (EXIT_SUCCESS); + } + } + if (argc > 1 && argc != 4) errx (EXIT_FAILURE, "This program takes three or no arguments"); |