Esempio n. 1
0
def chroot(target):
    """
    Chroot into a target directory. This also affects the working directory, make sure
    to call os.chdir() afterwards.
    """
    # We need to use pivot_root and not only chroot
    # (cf. https://unix.stackexchange.com/a/456777/15398).
    # These three steps together are the easiest way for calling pivot_root as chroot
    # replacement (cf. the 'pivot_root(".", ".")' section of
    # http://man7.org/linux/man-pages/man2/pivot_root.2.html):
    os.chdir(target)
    # Make "." (the target) our new root and put the old root at ".":
    libc.pivot_root(b".", b".")
    # Now both the host file system (old root) and the target are at "/" (stacked).
    # We umount one of them, which will be the host file system, making it inaccessible:
    libc.umount2(b"/", libc.MNT_DETACH)
Esempio n. 2
0
def chroot(target):
    """
    Chroot into a target directory. This also affects the working directory, make sure
    to call os.chdir() afterwards.
    """
    # We need to use pivot_root and not only chroot, and for this we need a place below
    # target where to move the old root directory.
    # Explanation: https://unix.stackexchange.com/a/456777/15398
    old_root = b"/proc"  # Does not matter, just needs to exist.
    # These three steps together are the recommended sequence for calling pivot_root
    # (http://man7.org/linux/man-pages/man8/pivot_root.8.html)
    os.chdir(target)
    libc.pivot_root(target, target + old_root)
    os.chroot(".")
    # Now the container file system is at /,
    # and the outer file system is visible at old_root in the container.
    # We can just unmount old_root and finally make it inaccessible from container.
    libc.umount2(old_root, libc.MNT_DETACH)