Linux中的时间命名空间允许对系统单调时钟和开机时间时钟进行每个命名空间的偏移。它通常用于Linux容器中,在容器内更改日期/时间并在从检查点或快照恢复后调整时钟。
复制 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命名空间后fork一个新进程。
执行%unshare -fp /bin/bash%
确保unshare
命令本身成为新命名空间中的PID 1。然后,/bin/bash
及其子进程安全地包含在此新命名空间中,防止PID 1过早退出,并允许正常的PID分配。
通过确保unshare
使用-f
标志运行,可以正确维护新的PID命名空间,使/bin/bash
及其子进程能够正常运行,而不会遇到内存分配错误。
复制 docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
复制 ls -l /proc/self/ns/time
lrwxrwxrwx 1 root root 0 Apr 4 21:16 /proc/self/ns/time - > 'time:[4026531834]'
复制 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 >
复制 nsenter -T TARGET_PID --pid /bin/bash