Linux 中的时间命名空间允许对系统单调时钟和启动时间时钟进行每个命名空间的偏移。它通常用于 Linux 容器中,以更改容器内的日期/时间,并在从检查点或快照恢复后调整时钟。
Copy sudo unshare -T [--mount-proc] /bin/bash
错误:bash: fork: 无法分配内存当 unshare
在没有 -f
选项的情况下执行时,由于 Linux 处理新 PID(进程 ID)命名空间的方式,会遇到错误。以下是关键细节和解决方案:
Linux 内核允许进程使用 unshare
系统调用创建新的命名空间。然而,启动新 PID 命名空间创建的进程(称为“unshare”进程)并不会进入新的命名空间;只有它的子进程会进入。
运行 %unshare -p /bin/bash%
会在与 unshare
相同的进程中启动 /bin/bash
。因此,/bin/bash
及其子进程位于原始 PID 命名空间中。
新命名空间中 /bin/bash
的第一个子进程成为 PID 1。当该进程退出时,如果没有其他进程,它会触发命名空间的清理,因为 PID 1 具有收养孤儿进程的特殊角色。然后,Linux 内核将禁用该命名空间中的 PID 分配。
新命名空间中 PID 1 的退出导致 PIDNS_HASH_ADDING
标志的清理。这导致 alloc_pid
函数在创建新进程时无法分配新的 PID,从而产生“无法分配内存”的错误。
通过在 unshare
中使用 -f
选项可以解决此问题。此选项使 unshare
在创建新 PID 命名空间后分叉一个新进程。
执行 %unshare -fp /bin/bash%
确保 unshare
命令本身在新命名空间中成为 PID 1。/bin/bash
及其子进程随后安全地包含在这个新命名空间中,防止 PID 1 的过早退出,并允许正常的 PID 分配。
通过确保 unshare
以 -f
标志运行,新的 PID 命名空间得以正确维护,允许 /bin/bash
及其子进程在不遇到内存分配错误的情况下运行。
Copy docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
Copy ls -l /proc/self/ns/time
lrwxrwxrwx 1 root root 0 Apr 4 21:16 /proc/self/ns/time - > 'time:[4026531834]'
Copy sudo find /proc -maxdepth 3 -type l -name time -exec readlink {} \; 2> /dev/null | sort -u
# Find the processes with an specific namespace
sudo find /proc -maxdepth 3 -type l -name time -exec ls -l {} \; 2> /dev/null | grep < ns-numbe r >
Copy nsenter -T TARGET_PID --pid /bin/bash