summaryrefslogtreecommitdiff
path: root/src/switchroot
diff options
context:
space:
mode:
authorColin Walters <walters@verbum.org>2013-06-04 13:18:36 -0400
committerColin Walters <walters@verbum.org>2013-06-04 15:59:52 -0400
commit7e882cc2cff988c128b0b3dba9092c220ab52c75 (patch)
treea6e821184aef7f68aa05fd1ab71cb798857fff38 /src/switchroot
parent26baee6c3b16d35db28de1b8d3e62ae57856496f (diff)
downloadostree-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.c50
-rw-r--r--src/switchroot/ostree-mount-util.h27
-rw-r--r--src/switchroot/ostree-prepare-root.c28
-rw-r--r--src/switchroot/ostree-remount.c79
-rw-r--r--src/switchroot/ostree-switch-root.c25
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