Added cp-R, added support for devtmpfs

This commit is contained in:
Carl D. Roth
2016-10-24 13:11:42 -07:00
parent ead42bc860
commit 8d9bedd92e

View File

@@ -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)