diff --git a/Makefile-dracut.am b/Makefile-dracut.am index 92a48955..a81dd780 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 c528a26c..21b91996 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 c75f709b..a1f05cc2 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 722ac770..2f1a7935 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 00000000..0c813ccb --- /dev/null +++ b/src/dracut/ostree-remount.service @@ -0,0 +1,33 @@ +# Copyright (C) 2013 Colin Walters +# +# 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 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 + * + * 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 + */ + +#define _GNU_SOURCE + +#include +#include +#include +#include + +#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 + * + * 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 #include -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 + * + * 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 + */ + +#define _GNU_SOURCE + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#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 #include -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