meaning to not mount some specific parts witch cause trouble.

The patch is based on previous work of *containercraft* to combine
OpenWrt with lxc[0]. This patch however adds a detection copied from
*virt-what* to check /proc/1/environment for "container=lxc".

[0]: 
https://github.com/containercraft/openwrt-lxd/blob/master/patches/procd-openwrt-18.06/001_lxd_no_mounts.patch

Signed-off-by: Paul Spooren <m...@aparcar.org>
---
 initd/early.c   | 19 +++++++++++--------
 initd/zram.c    | 10 ++++++----
 plug/coldplug.c | 13 ++++++++-----
 procd.c         |  7 ++++++-
 4 files changed, 31 insertions(+), 18 deletions(-)

diff --git a/initd/early.c b/initd/early.c
index 2e15112..4018e63 100644
--- a/initd/early.c
+++ b/initd/early.c
@@ -56,14 +56,17 @@ early_mounts(void)
 {
        unsigned int oldumask = umask(0);
 
-       mount("proc", "/proc", "proc", MS_NOATIME | MS_NODEV | MS_NOEXEC | 
MS_NOSUID, 0);
-       mount("sysfs", "/sys", "sysfs", MS_NOATIME | MS_NODEV | MS_NOEXEC | 
MS_NOSUID, 0);
-       mount("cgroup", "/sys/fs/cgroup", "cgroup",  MS_NODEV | MS_NOEXEC | 
MS_NOSUID, 0);
-       mount("tmpfs", "/dev", "tmpfs", MS_NOATIME | MS_NOSUID, 
"mode=0755,size=512K");
-       ignore(symlink("/tmp/shm", "/dev/shm"));
-       mkdir("/dev/pts", 0755);
-       mount("devpts", "/dev/pts", "devpts", MS_NOATIME | MS_NOEXEC | 
MS_NOSUID, "mode=600");
-       early_dev();
+       if (!container) {
+               mount("proc", "/proc", "proc", MS_NOATIME | MS_NODEV | 
MS_NOEXEC | MS_NOSUID, 0);
+               mount("sysfs", "/sys", "sysfs", MS_NOATIME | MS_NODEV | 
MS_NOEXEC | MS_NOSUID, 0);
+               mount("cgroup", "/sys/fs/cgroup", "cgroup",  MS_NODEV | 
MS_NOEXEC | MS_NOSUID, 0);
+               mount("tmpfs", "/dev", "tmpfs", MS_NOATIME | MS_NOSUID, 
"mode=0755,size=512K");
+               ignore(symlink("/tmp/shm", "/dev/shm"));
+               mkdir("/dev/pts", 0755);
+               mount("devpts", "/dev/pts", "devpts", MS_NOATIME | MS_NOEXEC | 
MS_NOSUID, "mode=600");
+
+               early_dev();
+       }
 
        early_console("/dev/console");
        if (mount_zram_on_tmp()) {
diff --git a/initd/zram.c b/initd/zram.c
index b41bfd9..e8d71c2 100644
--- a/initd/zram.c
+++ b/initd/zram.c
@@ -116,10 +116,12 @@ mount_zram_on_tmp(void)
                waitpid(pid, NULL, 0);
        }
 
-       ret = mount("/dev/zram0", "/tmp", "ext4", MS_NOSUID | MS_NODEV | 
MS_NOATIME, "errors=continue,noquota");
-       if (ret < 0) {
-               ERROR("Can't mount /dev/zram0 on /tmp: %m\n");
-               return errno;
+       if (!container) {
+               ret = mount("/dev/zram0", "/tmp", "ext4", MS_NOSUID | MS_NODEV 
| MS_NOATIME, "errors=continue,noquota");
+               if (ret < 0) {
+                       ERROR("Can't mount /dev/zram0 on /tmp: %m\n");
+                       return errno;
+               }
        }
 
        LOG("Using up to %ld kB of RAM as ZRAM storage on /mnt\n", zramsize);
diff --git a/plug/coldplug.c b/plug/coldplug.c
index c6a89c3..aabe379 100644
--- a/plug/coldplug.c
+++ b/plug/coldplug.c
@@ -43,13 +43,16 @@ void procd_coldplug(void)
        char *argv[] = { "udevtrigger", NULL };
        unsigned int oldumask = umask(0);
 
-       umount2("/dev/pts", MNT_DETACH);
-       umount2("/dev/", MNT_DETACH);
-       mount("tmpfs", "/dev", "tmpfs", MS_NOSUID, "mode=0755,size=512K");
+       if (!container) {
+               umount2("/dev/pts", MNT_DETACH);
+               umount2("/dev/", MNT_DETACH);
+               mount("tmpfs", "/dev", "tmpfs", MS_NOSUID, 
"mode=0755,size=512K");
+               mkdir("/dev/pts", 0755);
+               mount("devpts", "/dev/pts", "devpts", MS_NOEXEC | MS_NOSUID, 0);
+       }
+
        ignore(symlink("/tmp/shm", "/dev/shm"));
-       mkdir("/dev/pts", 0755);
        umask(oldumask);
-       mount("devpts", "/dev/pts", "devpts", MS_NOEXEC | MS_NOSUID, 0);
        udevtrigger.cb = udevtrigger_complete;
        udevtrigger.pid = fork();
        if (!udevtrigger.pid) {
diff --git a/procd.c b/procd.c
index 3de6208..b938a2f 100644
--- a/procd.c
+++ b/procd.c
@@ -26,7 +26,7 @@
 #include "plug/hotplug.h"
 
 unsigned int debug;
-
+unsigned int container = 0;
 static int usage(const char *prog)
 {
        fprintf(stderr, "Usage: %s [options]\n"
@@ -50,6 +50,11 @@ int main(int argc, char **argv)
                unsetenv("DBGLVL");
        }
 
+       char *env_container = getenv("container");
+       if (strcmp("lxc",env_container) != 0) {
+               container = 1;
+       }
+
        while ((ch = getopt(argc, argv, "d:s:h:S")) != -1) {
                switch (ch) {
                case 'h':
-- 
2.20.1


_______________________________________________
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel

Reply via email to