Merge pull request #25280 from keszybz/initrd-with-overlayfs
Initrd with overlayfs
This commit is contained in:
@@ -0,0 +1,40 @@
|
||||
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include "libmount-util.h"
|
||||
|
||||
int libmount_parse(
|
||||
const char *path,
|
||||
FILE *source,
|
||||
struct libmnt_table **ret_table,
|
||||
struct libmnt_iter **ret_iter) {
|
||||
|
||||
_cleanup_(mnt_free_tablep) struct libmnt_table *table = NULL;
|
||||
_cleanup_(mnt_free_iterp) struct libmnt_iter *iter = NULL;
|
||||
int r;
|
||||
|
||||
/* Older libmount seems to require this. */
|
||||
assert(!source || path);
|
||||
|
||||
table = mnt_new_table();
|
||||
iter = mnt_new_iter(MNT_ITER_FORWARD);
|
||||
if (!table || !iter)
|
||||
return -ENOMEM;
|
||||
|
||||
/* If source or path are specified, we use on the functions which ignore utab.
|
||||
* Only if both are empty, we use mnt_table_parse_mtab(). */
|
||||
|
||||
if (source)
|
||||
r = mnt_table_parse_stream(table, source, path);
|
||||
else if (path)
|
||||
r = mnt_table_parse_file(table, path);
|
||||
else
|
||||
r = mnt_table_parse_mtab(table, NULL);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
*ret_table = TAKE_PTR(table);
|
||||
*ret_iter = TAKE_PTR(iter);
|
||||
return 0;
|
||||
}
|
||||
@@ -1,8 +1,6 @@
|
||||
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
||||
#pragma once
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
/* This needs to be after sys/mount.h */
|
||||
#include <libmount.h>
|
||||
|
||||
@@ -11,37 +9,8 @@
|
||||
DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(struct libmnt_table*, mnt_free_table, NULL);
|
||||
DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(struct libmnt_iter*, mnt_free_iter, NULL);
|
||||
|
||||
static inline int libmount_parse(
|
||||
int libmount_parse(
|
||||
const char *path,
|
||||
FILE *source,
|
||||
struct libmnt_table **ret_table,
|
||||
struct libmnt_iter **ret_iter) {
|
||||
|
||||
_cleanup_(mnt_free_tablep) struct libmnt_table *table = NULL;
|
||||
_cleanup_(mnt_free_iterp) struct libmnt_iter *iter = NULL;
|
||||
int r;
|
||||
|
||||
/* Older libmount seems to require this. */
|
||||
assert(!source || path);
|
||||
|
||||
table = mnt_new_table();
|
||||
iter = mnt_new_iter(MNT_ITER_FORWARD);
|
||||
if (!table || !iter)
|
||||
return -ENOMEM;
|
||||
|
||||
/* If source or path are specified, we use on the functions which ignore utab.
|
||||
* Only if both are empty, we use mnt_table_parse_mtab(). */
|
||||
|
||||
if (source)
|
||||
r = mnt_table_parse_stream(table, source, path);
|
||||
else if (path)
|
||||
r = mnt_table_parse_file(table, path);
|
||||
else
|
||||
r = mnt_table_parse_mtab(table, NULL);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
*ret_table = TAKE_PTR(table);
|
||||
*ret_iter = TAKE_PTR(iter);
|
||||
return 0;
|
||||
}
|
||||
struct libmnt_iter **ret_iter);
|
||||
|
||||
@@ -193,6 +193,7 @@ shared_sources = files(
|
||||
'libcrypt-util.h',
|
||||
'libfido2-util.c',
|
||||
'libfido2-util.h',
|
||||
'libmount-util.c',
|
||||
'libmount-util.h',
|
||||
'linux/auto_dev-ioctl.h',
|
||||
'linux/bpf.h',
|
||||
|
||||
@@ -718,20 +718,18 @@ int mount_option_mangle(
|
||||
_cleanup_free_ char *ret = NULL;
|
||||
int r;
|
||||
|
||||
/* This extracts mount flags from the mount options, and store
|
||||
/* This extracts mount flags from the mount options, and stores
|
||||
* non-mount-flag options to '*ret_remaining_options'.
|
||||
* E.g.,
|
||||
* "rw,nosuid,nodev,relatime,size=1630748k,mode=700,uid=1000,gid=1000"
|
||||
* is split to MS_NOSUID|MS_NODEV|MS_RELATIME and
|
||||
* "size=1630748k,mode=700,uid=1000,gid=1000".
|
||||
* See more examples in test-mount-utils.c.
|
||||
* See more examples in test-mount-util.c.
|
||||
*
|
||||
* Note that if 'options' does not contain any non-mount-flag options,
|
||||
* If 'options' does not contain any non-mount-flag options,
|
||||
* then '*ret_remaining_options' is set to NULL instead of empty string.
|
||||
* Note that this does not check validity of options stored in
|
||||
* '*ret_remaining_options'.
|
||||
* Note that if 'options' is NULL, then this just copies 'mount_flags'
|
||||
* to '*ret_mount_flags'. */
|
||||
* The validity of options stored in '*ret_remaining_options' is not checked.
|
||||
* If 'options' is NULL, this just copies 'mount_flags' to *ret_mount_flags. */
|
||||
|
||||
assert(ret_mount_flags);
|
||||
assert(ret_remaining_options);
|
||||
|
||||
+12
-10
@@ -32,7 +32,6 @@ int switch_root(const char *new_root,
|
||||
|
||||
_cleanup_free_ char *resolved_old_root_after = NULL;
|
||||
_cleanup_close_ int old_root_fd = -1;
|
||||
bool old_root_remove;
|
||||
int r;
|
||||
|
||||
assert(new_root);
|
||||
@@ -42,12 +41,16 @@ int switch_root(const char *new_root,
|
||||
return 0;
|
||||
|
||||
/* Check if we shall remove the contents of the old root */
|
||||
old_root_remove = in_initrd();
|
||||
if (old_root_remove) {
|
||||
old_root_fd = open("/", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_NOCTTY|O_DIRECTORY);
|
||||
if (old_root_fd < 0)
|
||||
return log_error_errno(errno, "Failed to open root directory: %m");
|
||||
}
|
||||
old_root_fd = open("/", O_RDONLY | O_CLOEXEC | O_DIRECTORY);
|
||||
if (old_root_fd < 0)
|
||||
return log_error_errno(errno, "Failed to open root directory: %m");
|
||||
r = fd_is_temporary_fs(old_root_fd);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to stat root directory: %m");
|
||||
if (r > 0)
|
||||
log_debug("Root directory is on tmpfs, will do cleanup later.");
|
||||
else
|
||||
old_root_fd = safe_close(old_root_fd);
|
||||
|
||||
/* Determine where we shall place the old root after the transition */
|
||||
r = chase_symlinks(old_root_after, new_root, CHASE_PREFIX_ROOT|CHASE_NONEXISTENT, &resolved_old_root_after, NULL);
|
||||
@@ -117,9 +120,8 @@ int switch_root(const char *new_root,
|
||||
struct stat rb;
|
||||
|
||||
if (fstat(old_root_fd, &rb) < 0)
|
||||
log_warning_errno(errno, "Failed to stat old root directory, leaving: %m");
|
||||
else
|
||||
(void) rm_rf_children(TAKE_FD(old_root_fd), 0, &rb); /* takes possession of the dir fd, even on failure */
|
||||
return log_error_errno(errno, "Failed to stat old root directory: %m");
|
||||
(void) rm_rf_children(TAKE_FD(old_root_fd), 0, &rb); /* takes possession of the dir fd, even on failure */
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
Reference in New Issue
Block a user