diff --git a/packages/base/all/vendor-config-onl/src/python/onl/install/InstallUtils.py b/packages/base/all/vendor-config-onl/src/python/onl/install/InstallUtils.py index 386f318a..9ce429fc 100644 --- a/packages/base/all/vendor-config-onl/src/python/onl/install/InstallUtils.py +++ b/packages/base/all/vendor-config-onl/src/python/onl/install/InstallUtils.py @@ -177,6 +177,27 @@ class SubprocessMixin: # don't believe it self.check_call(cmd, vmode=self.V1) + def cpR(self, srcRoot, dstRoot): + srcRoot = os.path.abspath(srcRoot) + dstRoot = os.path.abspath(dstRoot) + dstRoot = os.path.join(dstRoot, os.path.split(srcRoot)[1]) + for r, dl, fl in os.walk(srcRoot): + + for de in dl: + src = os.path.join(r, de) + subdir = src[len(srcRoot)+1:] + dst = os.path.join(dstRoot, subdir) + if not os.path.exists(dst): + self.log.debug("+ /bin/mkdir -p %s", dst) + os.mkdirs(dst) + + for fe in fl: + src = os.path.join(r, de) + subdir = src[len(srcRoot)+1:] + dst = os.path.join(dstRoot, subdir) + self.log.debug("+ /bin/cp -a %s %s", src, dst) + shutil.copy2(src, dst) + class TempdirContext(SubprocessMixin): def __init__(self, prefix=None, suffix=None, chroot=None, log=None): @@ -678,6 +699,7 @@ class InitrdContext(SubprocessMixin): self.ilog.setLevel(logging.INFO) self.log = self.hlog + self._hasDevTmpfs = False self._detachInitrd = None def _unpack(self): @@ -739,27 +761,28 @@ class InitrdContext(SubprocessMixin): else: self.unlink(dst) - for e in os.listdir("/dev"): - src = os.path.join("/dev", e) - dst = os.path.join(dev2, e) - if os.path.islink(src): - self.symlink(os.readlink(src), dst) - elif os.path.isdir(src): - self.mkdir(dst) - elif os.path.isfile(src): - self.copy2(src, dst) - else: - st = os.stat(src) - if stat.S_ISBLK(st.st_mode): - maj, min = os.major(st.st_rdev), os.minor(st.st_rdev) - self.log.debug("+ mknod %s b %d %d", dst, maj, min) - os.mknod(dst, st.st_mode, st.st_rdev) - elif stat.S_ISCHR(st.st_mode): - maj, min = os.major(st.st_rdev), os.minor(st.st_rdev) - self.log.debug("+ mknod %s c %d %d", dst, maj, min) - os.mknod(dst, st.st_mode, st.st_rdev) + if not self._hasDevTmpfs: + for e in os.listdir("/dev"): + src = os.path.join("/dev", e) + dst = os.path.join(dev2, e) + if os.path.islink(src): + self.symlink(os.readlink(src), dst) + elif os.path.isdir(src): + self.mkdir(dst) + elif os.path.isfile(src): + self.copy2(src, dst) else: - self.log.debug("skipping device %s", src) + st = os.stat(src) + if stat.S_ISBLK(st.st_mode): + maj, min = os.major(st.st_rdev), os.minor(st.st_rdev) + self.log.debug("+ mknod %s b %d %d", dst, maj, min) + os.mknod(dst, st.st_mode, st.st_rdev) + elif stat.S_ISCHR(st.st_mode): + maj, min = os.major(st.st_rdev), os.minor(st.st_rdev) + self.log.debug("+ mknod %s c %d %d", dst, maj, min) + os.mknod(dst, st.st_mode, st.st_rdev) + else: + self.log.debug("skipping device %s", src) dst = os.path.join(self.dir, "dev/pts") if not os.path.exists(dst): @@ -772,6 +795,11 @@ class InitrdContext(SubprocessMixin): def __enter__(self): + with open("/proc/filesystems") as fd: + buf = fd.read() + if "devtmpfs" in buf: + self._hasDevTmpfs = True + if self.initrd is not None: self.log.debug("extracting initrd %s", self.initrd) @@ -792,6 +820,16 @@ class InitrdContext(SubprocessMixin): cmd = ('mount', '-t', 'sysfs', 'sysfs', dst,) self.check_call(cmd, vmode=self.V1) + # maybe mount devtmpfs + if self._hasDevTmpfs: + dst = os.path.join(self.dir, "dev") + cmd = ('mount', '-t', 'devtmpfs', 'devtmpfs', dst,) + self.check_call(cmd, vmode=self.V1) + + dst = os.path.join(self.dir, "dev/pts") + if not os.path.exists(dst): + self.mkdir(dst) + dst = os.path.join(self.dir, "dev/pts") cmd = ('mount', '-t', 'devpts', 'devpts', dst,) self.check_call(cmd, vmode=self.V1)