switchroot: Ensure /run/ostree-booted is created even without initramfs
See https://mail.gnome.org/archives/ostree-list/2018-March/msg00012.html If ostree-prepare-root is run as pid 1 (i.e we're not using an initramfs), then anything we write outside the target sysroot (such as `/run/ostree-booted`) will be lost. Since `ostree-remount.service` runs fairly early in boot, and is triggered via `ConditionKernelCommandLine=ostree`, we can just touch the file there in addition. Closes: #1508 Approved by: akiernan
This commit is contained in:
parent
246a7a5cc2
commit
38cf31f6a7
|
|
@ -104,4 +104,19 @@ read_proc_cmdline_ostree (void)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* This is an API for other projects to determine whether or not the
|
||||||
|
* currently running system is ostree-controlled.
|
||||||
|
*/
|
||||||
|
static inline void
|
||||||
|
touch_run_ostree (void)
|
||||||
|
{
|
||||||
|
int fd = open ("/run/ostree-booted", O_CREAT | O_WRONLY | O_NOCTTY | O_CLOEXEC, 0640);
|
||||||
|
/* We ignore failures here in case /run isn't mounted...not much we
|
||||||
|
* can do about that, but we don't want to fail.
|
||||||
|
*/
|
||||||
|
if (fd == -1)
|
||||||
|
return;
|
||||||
|
(void) close (fd);
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* __OSTREE_MOUNT_UTIL_H_ */
|
#endif /* __OSTREE_MOUNT_UTIL_H_ */
|
||||||
|
|
|
||||||
|
|
@ -48,23 +48,6 @@
|
||||||
|
|
||||||
#include "ostree-mount-util.h"
|
#include "ostree-mount-util.h"
|
||||||
|
|
||||||
/* This is an API for other projects to determine whether or not the
|
|
||||||
* currently running system is ostree-controlled.
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
touch_run_ostree (void)
|
|
||||||
{
|
|
||||||
int fd;
|
|
||||||
|
|
||||||
fd = open ("/run/ostree-booted", O_CREAT | O_WRONLY | O_NOCTTY | O_CLOEXEC, 0640);
|
|
||||||
/* We ignore failures here in case /run isn't mounted...not much we
|
|
||||||
* can do about that, but we don't want to fail.
|
|
||||||
*/
|
|
||||||
if (fd == -1)
|
|
||||||
return;
|
|
||||||
(void) close (fd);
|
|
||||||
}
|
|
||||||
|
|
||||||
static char*
|
static char*
|
||||||
resolve_deploy_path (const char * root_mountpoint)
|
resolve_deploy_path (const char * root_mountpoint)
|
||||||
{
|
{
|
||||||
|
|
@ -205,7 +188,13 @@ main(int argc, char *argv[])
|
||||||
err (EXIT_FAILURE, "failed to bind mount (class:readonly) /usr");
|
err (EXIT_FAILURE, "failed to bind mount (class:readonly) /usr");
|
||||||
}
|
}
|
||||||
|
|
||||||
touch_run_ostree ();
|
|
||||||
|
/* We only stamp /run now if we're running in an initramfs, i.e. we're
|
||||||
|
* not pid 1. Otherwise it's handled later via ostree-remount.service.
|
||||||
|
* https://mail.gnome.org/archives/ostree-list/2018-March/msg00012.html
|
||||||
|
*/
|
||||||
|
if (getpid () != 1)
|
||||||
|
touch_run_ostree ();
|
||||||
|
|
||||||
if (strcmp(root_mountpoint, "/") == 0)
|
if (strcmp(root_mountpoint, "/") == 0)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -46,6 +46,16 @@ main(int argc, char *argv[])
|
||||||
struct stat stbuf;
|
struct stat stbuf;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
/* See comments in ostree-prepare-root.c for this.
|
||||||
|
*
|
||||||
|
* This service is triggered via
|
||||||
|
* ConditionKernelCommandLine=ostree
|
||||||
|
* but it's a lot easier for various bits of userspace to check for
|
||||||
|
* a file versus parsing the kernel cmdline. So let's ensure
|
||||||
|
* the stamp file is created here too.
|
||||||
|
*/
|
||||||
|
touch_run_ostree ();
|
||||||
|
|
||||||
/* The /sysroot mount needs to be private to avoid having a mount for e.g. /var/cache
|
/* The /sysroot mount needs to be private to avoid having a mount for e.g. /var/cache
|
||||||
* also propagate to /sysroot/ostree/deploy/$stateroot/var/cache
|
* also propagate to /sysroot/ostree/deploy/$stateroot/var/cache
|
||||||
*
|
*
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue