[ostree] dracut: Add ostree-remount
- From: Colin Walters <walters src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [ostree] dracut: Add ostree-remount
- Date: Tue, 4 Jun 2013 20:10:22 +0000 (UTC)
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]