#include "fileio.h"
#include "generator.h"
#include "strv.h"
+#include "virt.h"
static const char *arg_dest = "/tmp";
static bool arg_fstab_enabled = true;
static char *arg_root_options = NULL;
static int arg_root_rw = -1;
+
static int mount_find_pri(struct mntent *me, int *ret) {
char *end, *pri;
unsigned long r;
assert(what);
assert(me);
+ if (detect_container(NULL) > 0) {
+ log_info("Running in a container, ignoring fstab swap entry for %s.", what);
+ return 0;
+ }
+
r = mount_find_pri(me, &pri);
if (r < 0) {
log_error("Failed to parse priority");
return -errno;
}
+ /* use what as where, to have a nicer error message */
+ r = generator_write_timeouts(arg_dest, what, what, me->mnt_opts, NULL);
+ if (r < 0)
+ return r;
+
if (!noauto) {
lnk = strjoin(arg_dest, "/" SPECIAL_SWAP_TARGET ".wants/", name, NULL);
if (!lnk)
_cleanup_free_ char
*name = NULL, *unit = NULL, *lnk = NULL,
- *automount_name = NULL, *automount_unit = NULL;
+ *automount_name = NULL, *automount_unit = NULL,
+ *filtered = NULL;
_cleanup_fclose_ FILE *f = NULL;
int r;
return 0;
if (path_equal(where, "/")) {
+ /* The root disk is not an option */
automount = false;
noauto = false;
nofail = false;
source);
if (post && !noauto && !nofail && !automount)
- fprintf(f,
- "Before=%s\n",
- post);
+ fprintf(f, "Before=%s\n", post);
if (passno != 0) {
r = generator_write_fsck_deps(f, arg_dest, what, where, fstype);
if (!isempty(fstype) && !streq(fstype, "auto"))
fprintf(f, "Type=%s\n", fstype);
- if (!isempty(opts) && !streq(opts, "defaults"))
- fprintf(f, "Options=%s\n", opts);
+ r = generator_write_timeouts(arg_dest, what, where, opts, &filtered);
+ if (r < 0)
+ return r;
+
+ if (!isempty(filtered) && !streq(filtered, "defaults"))
+ fprintf(f, "Options=%s\n", filtered);
fflush(f);
if (ferror(f)) {
return -errno;
}
- if (!noauto) {
- if (post) {
- lnk = strjoin(arg_dest, "/", post, nofail || automount ? ".wants/" : ".requires/", name, NULL);
- if (!lnk)
- return log_oom();
-
- mkdir_parents_label(lnk, 0755);
- if (symlink(unit, lnk) < 0) {
- log_error("Failed to create symlink %s: %m", lnk);
- return -errno;
- }
+ if (!noauto && post) {
+ lnk = strjoin(arg_dest, "/", post, nofail || automount ? ".wants/" : ".requires/", name, NULL);
+ if (!lnk)
+ return log_oom();
+
+ mkdir_parents_label(lnk, 0755);
+ if (symlink(unit, lnk) < 0) {
+ log_error("Failed to create symlink %s: %m", lnk);
+ return -errno;
}
}
if (!what)
return log_oom();
+ if (detect_container(NULL) > 0 && is_device_path(what)) {
+ log_info("Running in a container, ignoring fstab device entry for %s.", what);
+ continue;
+ }
+
where = initrd ? strappend("/sysroot/", me->mnt_dir) : strdup(me->mnt_dir);
if (!where)
return log_oom();
}
static int add_root_mount(void) {
- _cleanup_free_ char *o = NULL, *what = NULL;
- bool noauto, nofail;
+ _cleanup_free_ char *what = NULL;
+ const char *opts;
if (isempty(arg_root_what)) {
log_debug("Could not find a root= entry on the kernel commandline.");
}
if (!arg_root_options)
- o = strdup(arg_root_rw > 0 ? "rw" : "ro");
- else {
- if (arg_root_rw >= 0 ||
- (!mount_test_option(arg_root_options, "ro") &&
- !mount_test_option(arg_root_options, "rw")))
- o = strjoin(arg_root_options, ",", arg_root_rw > 0 ? "rw" : "ro", NULL);
- else
- o = strdup(arg_root_options);
- }
- if (!o)
- return log_oom();
-
- noauto = mount_test_option(arg_root_options, "noauto");
- nofail = mount_test_option(arg_root_options, "nofail");
+ opts = arg_root_rw > 0 ? "rw" : "ro";
+ else if (arg_root_rw >= 0 ||
+ (!mount_test_option(arg_root_options, "ro") &&
+ !mount_test_option(arg_root_options, "rw")))
+ opts = strappenda3(arg_root_options, ",", arg_root_rw > 0 ? "rw" : "ro");
+ else
+ opts = arg_root_options;
log_debug("Found entry what=%s where=/sysroot type=%s", what, strna(arg_root_fstype));
return add_mount(what,
"/sysroot",
arg_root_fstype,
- o,
+ opts,
1,
- noauto, nofail,
+ false,
+ false,
false,
SPECIAL_INITRD_ROOT_FS_TARGET,
"/proc/cmdline");
arg_root_rw = true;
else if (streq(key, "ro") && !value)
arg_root_rw = false;
- else if (startswith(key, "fstab.") || startswith(key, "rd.fstab."))
- log_warning("Unknown kernel switch %s. Ignoring.", key);
return 0;
}
if (arg_fstab_enabled) {
int k;
+ log_debug("Parsing /etc/fstab");
+
/* Parse the local /etc/fstab, possibly from the initrd */
k = parse_fstab(false);
if (k < 0)
/* If running in the initrd also parse the /etc/fstab from the host */
if (in_initrd()) {
+ log_debug("Parsing /sysroot/etc/fstab");
+
k = parse_fstab(true);
if (k < 0)
r = k;