[ostree] dracut: Add ostree-remount



commit 7e882cc2cff988c128b0b3dba9092c220ab52c75
Author: Colin Walters <walters verbum org>
Date:   Tue Jun 4 13:18:36 2013 -0400

    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.

 Makefile-dracut.am                   |    9 ++++
 Makefile-libostree.am                |    3 +-
 Makefile-switchroot.am               |   19 +++++++-
 Makefile.am                          |    2 +
 src/dracut/ostree-remount.service    |   33 ++++++++++++++
 src/switchroot/ostree-mount-util.c   |   50 +++++++++++++++++++++
 src/switchroot/ostree-mount-util.h   |   27 ++++++++++++
 src/switchroot/ostree-prepare-root.c |   28 ++----------
 src/switchroot/ostree-remount.c      |   79 ++++++++++++++++++++++++++++++++++
 src/switchroot/ostree-switch-root.c  |   25 +----------
 10 files changed, 224 insertions(+), 51 deletions(-)
---
diff --git a/Makefile-dracut.am b/Makefile-dracut.am
index 92a4895..a81dd78 100644
--- a/Makefile-dracut.am
+++ b/Makefile-dracut.am
@@ -23,8 +23,17 @@ dracutmoddir = $(prefix)/lib/dracut/modules.d/98ostree
 dracutmod_SCRIPTS = src/dracut/module-setup.sh
 dracutmod_DATA = src/dracut/ostree-prepare-root.service
 
+systemdunitdir = $(prefix)/lib/systemd/system
+systemdunit_DATA = src/dracut/ostree-remount.service
+
+INSTALL_DATA_HOOKS += install-remount-service-data-hook
+install-remount-service-data-hook:
+       mkdir -p $(DESTDIR)$(systemdunitdir)/local-fs.target.wants/
+       ln -s ../ostree-remount.service 
$(DESTDIR)$(systemdunitdir)/local-fs.target.wants/ostree-remount.service
+
 dracutconfdir = $(sysconfdir)/dracut.conf.d
 dracutconf_DATA = src/dracut/ostree.conf
 endif
 
 EXTRA_DIST += $(dracutmod_DATA) $(dracutmod_SCRIPTS)
+
diff --git a/Makefile-libostree.am b/Makefile-libostree.am
index c528a26..21b9199 100644
--- a/Makefile-libostree.am
+++ b/Makefile-libostree.am
@@ -59,5 +59,6 @@ libostree_la_CFLAGS += $(OT_DEP_LIBARCHIVE_CFLAGS)
 libostree_la_LIBADD += $(OT_DEP_LIBARCHIVE_LIBS)
 endif
 
-install-data-hook:
+INSTALL_DATA_HOOKS += install-libostree-data-hook
+install-libostree-data-hook: 
        rm -f $(DESTDIR)$(privlibdir)/libostree.la
diff --git a/Makefile-switchroot.am b/Makefile-switchroot.am
index c75f709..a1f05cc 100644
--- a/Makefile-switchroot.am
+++ b/Makefile-switchroot.am
@@ -17,11 +17,26 @@
 
 if !TRIGGERS_ONLY
 sbin_PROGRAMS += ostree-switch-root
+if BUILDOPT_DRACUT
 sbin_PROGRAMS += ostree-prepare-root
+sbin_PROGRAMS += ostree-remount
+noinst_LTLIBRARIES += libswitchroot-mountutil.la
 endif
+endif
+
+libswitchroot_mountutil_la_SOURCES = \
+       src/switchroot/ostree-mount-util.c \
+       src/switchroot/ostree-mount-util.h \
+       $(NULL)
 
 ostree_prepare_root_SOURCES = src/switchroot/ostree-prepare-root.c
-ostree_prepare_root_CFLAGS = $(AM_CFLAGS)
+ostree_prepare_root_LDADD = libswitchroot-mountutil.la
+ostree_prepare_root_CFLAGS = $(AM_CFLAGS) -Isrc/switchroot
 
 ostree_switch_root_SOURCES = src/switchroot/ostree-switch-root.c
-ostree_switch_root_CFLAGS = $(AM_CFLAGS)
+ostree_switch_root_LDADD = libswitchroot-mountutil.la
+ostree_switch_root_CFLAGS = $(AM_CFLAGS) -Isrc/switchroot
+
+ostree_remount_SOURCES = src/switchroot/ostree-remount.c
+ostree_remount_LDADD = libswitchroot-mountutil.la
+ostree_remount_CFLAGS = $(AM_CFLAGS) -Isrc/switchroot
diff --git a/Makefile.am b/Makefile.am
index 722ac77..2f1a793 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -29,6 +29,7 @@ SUBDIRS = .
 endif
 
 NULL = 
+INSTALL_DATA_HOOKS =
 BUILT_SOURCES =
 MANPAGES =
 CLEANFILES =
@@ -88,6 +89,7 @@ include Makefile-triggers.am
 include Makefile-tests.am
 include Makefile-dracut.am
 
+install-data-hook: $(INSTALL_DATA_HOOKS)
 
 #  Docbook generation copied from systemd/Makefile.am
 #
diff --git a/src/dracut/ostree-remount.service b/src/dracut/ostree-remount.service
new file mode 100644
index 0000000..0c813cc
--- /dev/null
+++ b/src/dracut/ostree-remount.service
@@ -0,0 +1,33 @@
+# Copyright (C) 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.
+
+[Unit]
+Description=OSTree Remount OS/ bind mounts
+DefaultDependencies=no
+ConditionKernelCommandLine=ostree
+OnFailure=emergency.service
+Conflicts=umount.target
+After=-.mount
+After=systemd-remount-fs.service
+Before=local-fs.target umount.target
+
+[Service]
+Type=oneshot
+ExecStart=/usr/sbin/ostree-remount
+StandardInput=null
+StandardOutput=syslog
+StandardError=syslog+console
diff --git a/src/switchroot/ostree-mount-util.c b/src/switchroot/ostree-mount-util.c
new file mode 100644
index 0000000..c993c23
--- /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 0000000..a6fdaff
--- /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 470ed3c..e16d79e 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 0000000..ff5a06d
--- /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 98c6234..14b8cc2 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


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]