diff options
author | Colin Walters <walters@verbum.org> | 2013-06-04 13:18:36 -0400 |
---|---|---|
committer | Colin Walters <walters@verbum.org> | 2013-06-04 15:59:52 -0400 |
commit | 7e882cc2cff988c128b0b3dba9092c220ab52c75 (patch) | |
tree | a6e821184aef7f68aa05fd1ab71cb798857fff38 /src/switchroot | |
parent | 26baee6c3b16d35db28de1b8d3e62ae57856496f (diff) | |
download | ostree-7e882cc2cff988c128b0b3dba9092c220ab52c75.tar.gz |
dracut: Add ostree-remount
Linux creates a copy of the soure mount flags when creating a bind
mount; if the source is read-only, then the bind mount is.
The problem is that systemd will remount the rootfs read/write, but
each mount (/home, /var etc.) will still be read-only. We need to
remount every bind mount except for /usr to read-write too.
This only "worked" with the old ostree-switch-root because it
effectively force mounted the rootfs read-write always, ignoring the
"ro" flag.
Diffstat (limited to 'src/switchroot')
-rw-r--r-- | src/switchroot/ostree-mount-util.c | 50 | ||||
-rw-r--r-- | src/switchroot/ostree-mount-util.h | 27 | ||||
-rw-r--r-- | src/switchroot/ostree-prepare-root.c | 28 | ||||
-rw-r--r-- | src/switchroot/ostree-remount.c | 79 | ||||
-rw-r--r-- | src/switchroot/ostree-switch-root.c | 25 |
5 files changed, 161 insertions, 48 deletions
diff --git a/src/switchroot/ostree-mount-util.c b/src/switchroot/ostree-mount-util.c new file mode 100644 index 00000000..c993c238 --- /dev/null +++ b/src/switchroot/ostree-mount-util.c @@ -0,0 +1,50 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * + * Copyright (C) 2011,2013 Colin Walters <walters@verbum.org> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Colin Walters <walters@verbum.org> + */ + +#define _GNU_SOURCE + +#include <stdarg.h> +#include <errno.h> +#include <string.h> +#include <stdio.h> + +#include "ostree-mount-util.h" + +int +perrorv (const char *format, ...) +{ + va_list args; + char buf[1024]; + char *p; + + p = strerror_r (errno, buf, sizeof (buf)); + + va_start (args, format); + + vfprintf (stderr, format, args); + fprintf (stderr, ": %s\n", p); + fflush (stderr); + + va_end (args); + + return 0; +} diff --git a/src/switchroot/ostree-mount-util.h b/src/switchroot/ostree-mount-util.h new file mode 100644 index 00000000..a6fdaffe --- /dev/null +++ b/src/switchroot/ostree-mount-util.h @@ -0,0 +1,27 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * + * Copyright (C) 2011,2013 Colin Walters <walters@verbum.org> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + */ + +#ifndef _OSTREE_MOUNT_UTIL_H +#define _OSTREE_MOUNT_UTIL_H + +int perrorv (const char *format, ...) __attribute__ ((format (printf, 1, 2))); + +#endif diff --git a/src/switchroot/ostree-prepare-root.c b/src/switchroot/ostree-prepare-root.c index 470ed3c7..e16d79e5 100644 --- a/src/switchroot/ostree-prepare-root.c +++ b/src/switchroot/ostree-prepare-root.c @@ -39,30 +39,7 @@ #include <ctype.h> #include <dirent.h> -static int -perrorv (const char *format, ...) __attribute__ ((format (printf, 1, 2))); - -static int -perrorv (const char *format, ...) -{ - va_list args; - char buf[PATH_MAX]; - char *p; - - p = strerror_r (errno, buf, sizeof (buf)); - - va_start (args, format); - - vfprintf (stderr, format, args); - fprintf (stderr, ": %s\n", p); - fflush (stderr); - - va_end (args); - - sleep (3); - - return 0; -} +#include "ostree-mount-util.h" static void parse_ostree_cmdline (char **out_osname, @@ -77,6 +54,9 @@ parse_ostree_cmdline (char **out_osname, if (getline (&cmdline, &len, f) < 0) return; + if (cmdline[len-1] == '\n') + cmdline[len-1] = '\0'; + iter = cmdline; while (iter != NULL) { diff --git a/src/switchroot/ostree-remount.c b/src/switchroot/ostree-remount.c new file mode 100644 index 00000000..ff5a06da --- /dev/null +++ b/src/switchroot/ostree-remount.c @@ -0,0 +1,79 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * + * Copyright (C) 2011 Colin Walters <walters@verbum.org> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Author: Colin Walters <walters@verbum.org> + */ + +#define _GNU_SOURCE + +#include <string.h> +#include <stdio.h> +#include <stdarg.h> +#include <stdint.h> +#include <sys/param.h> +#include <sys/mount.h> +#include <fcntl.h> +#include <stdlib.h> +#include <unistd.h> +#include <sys/stat.h> +#include <errno.h> + +#include "ostree-mount-util.h" + +int +main(int argc, char *argv[]) +{ + const char *remounts[] = { "/sysroot", "/etc", "/home", "/root", "/tmp", "/var", NULL }; + struct stat stbuf; + int i; + + if (access ("/", W_OK) == -1) + { + /* If / isn't writable, don't do any remounts; we don't want + * to clear the readonly flag in that case. + */ + exit (0); + } + + for (i = 0; remounts[i] != NULL; i++) + { + const char *target = remounts[i]; + if (lstat (target, &stbuf) < 0) + continue; + /* Silently ignore symbolic links; we expect these to point to + * /sysroot, and thus there isn't a bind mount there. + */ + if (S_ISLNK (stbuf.st_mode)) + continue; + if (mount (target, target, NULL, MS_REMOUNT | MS_SILENT, NULL) < 0) + { + /* Also ignore ENINVAL - if the target isn't a mountpoint + * already, then assume things are OK. + */ + if (errno != EINVAL) + { + perrorv ("failed to remount %s", target); + exit (1); + } + } + } + + exit (0); +} + diff --git a/src/switchroot/ostree-switch-root.c b/src/switchroot/ostree-switch-root.c index 98c62342..14b8cc24 100644 --- a/src/switchroot/ostree-switch-root.c +++ b/src/switchroot/ostree-switch-root.c @@ -39,30 +39,7 @@ #include <ctype.h> #include <dirent.h> -static int -perrorv (const char *format, ...) __attribute__ ((format (printf, 1, 2))); - -static int -perrorv (const char *format, ...) -{ - va_list args; - char buf[PATH_MAX]; - char *p; - - p = strerror_r (errno, buf, sizeof (buf)); - - va_start (args, format); - - vfprintf (stderr, format, args); - fprintf (stderr, ": %s\n", p); - fflush (stderr); - - va_end (args); - - sleep (3); - - return 0; -} +#include "ostree-mount-util.h" /* remove all files/directories below dirName -- don't cross mountpoints */ static int |