I had trouble using an ext4 extroot overlay on my Zyxel NBG6817 running 18.06.2, so I took a closer look at the way libfstools and its block tool setup the extroot overlay during PREINIT and found some things broke extroot mounting on certain devices.
The issue and logs are documented in the following ticket: https://bugs.openwrt.org/index.php?do=details&task_id=2231 What I found was that the main_extroot code would only look for "rootfs_data" partitions on MTD storage (specifically only JFFS2 and UBIFS partitions), before defaulting to calling mount_extroot with no configuration path prefix. mount_extroot would then try to load the fstab uci config at /etc/config/fstab, which would fail as this isn't present on the normal r/o squashfs eMMC partition. With a /etc/config/fstab uci config be pre-placed on the squashfs, mount_extroot would continue after loading it and successfully finding an /overlay extroot entry, but fail during check_extroot when no MTD partition or UBIFS volume can be found. With the attached patch the behaviour of main_extroot and check_extroot is expanded to allow detection of rootfs overlays on block devices such as eMMC, without compromising the behavior for JFFS2 and UBIFS rootfs discovery: 1. The default mount_extroot call now uses '/tmp/overlay' as a default parameter should no MTD partition be detected. This results in config_load attempting to load a uci fstab with this prefix before defaulting to /etc/config/fstab. 2. UBIFS_EXTROOT now acts as a supplementary option instead of an exclusionary one and will allow rootfs discovery on block devices even when it fails to find UBIFS rootfs volumes. (IMHO the best design decision as this option defaults to 'y' in the fstools package configuration)
>From 9daabc73ed804fe969e0318dfe533794d6da73b6 Mon Sep 17 00:00:00 2001 From: Ken Miller <k...@miller.ec> Date: Tue, 9 Apr 2019 01:03:26 +0200 Subject: [PATCH] block: make extroot mount preparation more robust The extroot mount preparation code for r/w rootfs overlay discovery, and determining the user-defined /etc/config/fstab location within, would only discover overlays residing on JFFS2 or UBIFS MTD storage. This led to attempts at loading the uci fstab configuration without the required /tmp/overlay directory prefix on devices with a non-MTD r/w rootfs overlay, and thus failure to find any custom fstab /overlay extroot entries on PREINIT. (example: the default openwrt eMMC partition layout on the zyxel nbg6817) Futher, with UBIFS_EXTROOT enabled (fstools package default), and no MTD rootfs partitions present, check_extroot would not attempt rootfs discovery on block devices, such as the ext4 mmcblk rootfs overlay on the nbg6817. With this patch: 1) main_extroot now attempts to load uci fstab configuration from an already mounted overlay, before defaulting to the prefix-less uci config dir when no MTD rootfs partitions are detected. 2) check_extroot now also attempts to find rootfs partitions on block devices when no MTD rootfs partitions are detected. --- block.c | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/block.c b/block.c index 39212d2..3dfc4a5 100644 --- a/block.c +++ b/block.c @@ -1301,7 +1301,7 @@ static int find_block_ubi_RO(libubi_t libubi, char *name, char *part, int plen) return err; } -#else +#endif static int find_root_dev(char *buf, int len) { @@ -1332,8 +1332,6 @@ static int find_root_dev(char *buf, int len) return -1; } -#endif - static int test_fs_support(const char *name) { char line[128], *p; @@ -1363,25 +1361,20 @@ static int check_extroot(char *path) struct probe_info *pr = NULL; char devpath[32]; -#ifdef UBIFS_EXTROOT if (find_block_mtd("\"rootfs\"", devpath, sizeof(devpath))) { int err = -1; +#ifdef UBIFS_EXTROOT libubi_t libubi; libubi = libubi_open(); err = find_block_ubi_RO(libubi, "rootfs", devpath, sizeof(devpath)); libubi_close(libubi); - if (err) - return -1; - } -#else - if (find_block_mtd("\"rootfs\"", devpath, sizeof(devpath))) { - if (find_root_dev(devpath, sizeof(devpath))) { +#endif + if (err && find_root_dev(devpath, sizeof(devpath))) { ULOG_ERR("extroot: unable to determine root device\n"); return -1; } } -#endif list_for_each_entry(pr, &devices, list) { if (!strcmp(pr->dev, devpath)) { @@ -1585,7 +1578,7 @@ static int main_extroot(int argc, char **argv) } #endif - return mount_extroot(NULL); + return mount_extroot("/tmp/overlay"); } static int main_mount(int argc, char **argv) -- 2.21.0
_______________________________________________ openwrt-devel mailing list openwrt-devel@lists.openwrt.org https://lists.openwrt.org/mailman/listinfo/openwrt-devel