2020-04-04 09:23:02 +00:00
|
|
|
.\" Copyright (c) 2020 by Michael Kerrisk <mtk.manpages@gmail.com>
|
|
|
|
.\"
|
|
|
|
.\" %%%LICENSE_START(VERBATIM)
|
|
|
|
.\" Permission is granted to make and distribute verbatim copies of this
|
|
|
|
.\" manual provided the copyright notice and this permission notice are
|
|
|
|
.\" preserved on all copies.
|
|
|
|
.\"
|
|
|
|
.\" Permission is granted to copy and distribute modified versions of this
|
|
|
|
.\" manual under the conditions for verbatim copying, provided that the
|
|
|
|
.\" entire resulting derived work is distributed under the terms of a
|
|
|
|
.\" permission notice identical to this one.
|
|
|
|
.\"
|
|
|
|
.\" Since the Linux kernel and libraries are constantly changing, this
|
|
|
|
.\" manual page may be incorrect or out-of-date. The author(s) assume no
|
|
|
|
.\" responsibility for errors or omissions, or for damages resulting from
|
|
|
|
.\" the use of the information contained herein. The author(s) may not
|
|
|
|
.\" have taken the same level of care in the production of this manual,
|
|
|
|
.\" which is licensed free of charge, as they might when working
|
|
|
|
.\" professionally.
|
|
|
|
.\"
|
|
|
|
.\" Formatted or processed versions of this manual, if unaccompanied by
|
|
|
|
.\" the source, must acknowledge the copyright and authors of this work.
|
|
|
|
.\" %%%LICENSE_END
|
|
|
|
.\"
|
|
|
|
.\"
|
iconv.1, locale.1, memusage.1, memusagestat.1, pldd.1, sprof.1, _syscall.2, add_key.2, adjtimex.2, bind.2, bpf.2, chown.2, clone.2, close.2, copy_file_range.2, eventfd.2, fanotify_init.2, fanotify_mark.2, fork.2, fsync.2, futex.2, getdents.2, getrlimit.2, getxattr.2, io_cancel.2, io_destroy.2, io_getevents.2, io_setup.2, ioctl_fat.2, ioctl_getfsmap.2, ioctl_ns.2, ioctl_tty.2, ioctl_userfaultfd.2, kcmp.2, keyctl.2, listen.2, listxattr.2, mbind.2, membarrier.2, memfd_create.2, mkdir.2, move_pages.2, mremap.2, msync.2, nfsservctl.2, open.2, perf_event_open.2, pidfd_send_signal.2, pipe.2, pivot_root.2, pkey_alloc.2, process_vm_readv.2, ptrace.2, readlink.2, readv.2, recv.2, recvmmsg.2, rename.2, request_key.2, s390_runtime_instr.2, sched_setaffinity.2, seccomp.2, send.2, sendmmsg.2, sigaltstack.2, signalfd.2, socket.2, socketpair.2, splice.2, spu_create.2, spu_run.2, statfs.2, syscall.2, sysctl.2, sysfs.2, tee.2, timer_getoverrun.2, timer_settime.2, umount.2, userfaultfd.2, utimensat.2, wait4.2, INFINITY.3, __ppc_get_timebase.3, __setfpucw.3, abort.3, aio_cancel.3, aio_error.3, aio_read.3, aio_return.3, atexit.3, backtrace.3, basename.3, bsearch.3, bswap.3, cacos.3, cacosh.3, catan.3, catanh.3, cexp2.3, clock_getcpuclockid.3, clog2.3, cmsg.3, confstr.3, div.3, dl_iterate_phdr.3, dlerror.3, dlinfo.3, dlopen.3, dlsym.3, duplocale.3, encrypt.3, end.3, endian.3, envz_add.3, err.3, expm1.3, fdim.3, flockfile.3, fmtmsg.3, frexp.3, ftw.3, get_nprocs_conf.3, get_phys_pages.3, getaddrinfo_a.3, getauxval.3, getdate.3, getdtablesize.3, getgrent_r.3, getgrouplist.3, gethostbyname.3, getline.3, getnameinfo.3, getopt.3, getprotoent_r.3, getpwent_r.3, getpwnam.3, getservent_r.3, getsubopt.3, getutent.3, glob.3, gnu_get_libc_version.3, hsearch.3, if_nameindex.3, inet.3, inet_net_pton.3, inet_ntop.3, inet_pton.3, insque.3, killpg.3, makecontext.3, mallinfo.3, malloc.3, malloc_hook.3, malloc_info.3, mallopt.3, matherr.3, mbsnrtowcs.3, mbstowcs.3, mcheck.3, mempcpy.3, mq_getattr.3, mq_notify.3, mtrace.3, newlocale.3, nextafter.3, ntp_gettime.3, offsetof.3, open_memstream.3, pow.3, printf.3, pthread_attr_init.3, pthread_attr_setdetachstate.3, pthread_attr_setguardsize.3, pthread_attr_setinheritsched.3, pthread_attr_setschedparam.3, pthread_attr_setschedpolicy.3, pthread_attr_setstack.3, pthread_attr_setstacksize.3, pthread_cancel.3, pthread_cleanup_push.3, pthread_create.3, pthread_detach.3, pthread_getattr_default_np.3, pthread_getattr_np.3, pthread_getcpuclockid.3, pthread_join.3, pthread_mutex_consistent.3, pthread_mutexattr_setrobust.3, pthread_setaffinity_np.3, pthread_setcancelstate.3, pthread_setname_np.3, pthread_setschedparam.3, pthread_sigmask.3, pthread_spin_init.3, pthread_testcancel.3, pthread_tryjoin_np.3, ptsname.3, qsort.3, rand.3, random.3, remainder.3, rpmatch.3, rtime.3, rtnetlink.3, scalb.3, scalbln.3, scandir.3, sem_getvalue.3, sem_wait.3, setaliasent.3, setlogmask.3, sigwait.3, sincos.3, sockatmark.3, stdarg.3, stpcpy.3, strcat.3, strfmon.3, strptime.3, strtod.3, strtok.3, strtol.3, strtoul.3, strverscmp.3, tsearch.3, uselocale.3, wcstok.3, wcstombs.3, wordexp.3, y0.3, loop.4, vcs.4, veth.4, charmap.5, core.5, filesystems.5, gai.conf.5, hosts.5, hosts.equiv.5, locale.5, nss.5, repertoiremap.5, securetty.5, shells.5, ttytype.5, ascii.7, complex.7, cpuset.7, credentials.7, fanotify.7, hier.7, inotify.7, ip.7, mount_namespaces.7, mq_overview.7, netlink.7, network_namespaces.7, pid_namespaces.7, pkeys.7, rtld-audit.7, rtnetlink.7, sem_overview.7, signal-safety.7, sock_diag.7, spufs.7, standards.7, symlink.7, tcp.7, time_namespaces.7, unix.7, user_namespaces.7, xattr.7, ldconfig.8: tstamp
Signed-off-by: Michael Kerrisk <mtk.manpages@gmail.com>
2020-06-09 12:43:54 +00:00
|
|
|
.TH TIME_NAMESPACES 7 2020-06-09 "Linux" "Linux Programmer's Manual"
|
2020-04-04 09:23:02 +00:00
|
|
|
.SH NAME
|
|
|
|
time_namespaces \- overview of Linux time namespaces
|
|
|
|
.SH DESCRIPTION
|
|
|
|
Time namespaces virtualize the values of two system clocks:
|
|
|
|
.IP \(bu 2
|
|
|
|
.BR CLOCK_MONOTONIC
|
|
|
|
(and likewise
|
|
|
|
.BR CLOCK_MONOTONIC_COARSE
|
|
|
|
and
|
|
|
|
.BR CLOCK_MONOTONIC_RAW ),
|
|
|
|
a nonsettable clock that represents monotonic time since\(emas
|
|
|
|
described by POSIX\(em"some unspecified point in the past".
|
|
|
|
.IP \(bu
|
2020-04-11 20:32:33 +00:00
|
|
|
.BR CLOCK_BOOTTIME
|
2020-04-04 09:23:02 +00:00
|
|
|
(and likewise
|
|
|
|
.BR CLOCK_BOOTTIME_ALARM ),
|
2020-04-06 08:26:10 +00:00
|
|
|
a nonsettable clock that is identical to
|
2020-04-04 09:23:02 +00:00
|
|
|
.BR CLOCK_MONOTONIC ,
|
|
|
|
except that it also includes any time that the system is suspended.
|
|
|
|
.PP
|
|
|
|
Thus, the processes in a time namespace share per-namespace values
|
|
|
|
for these clocks.
|
|
|
|
This affects various APIs that measure against these clocks, including:
|
2020-04-07 12:45:00 +00:00
|
|
|
.BR clock_gettime (2),
|
2020-04-04 09:23:02 +00:00
|
|
|
.BR clock_nanosleep (2),
|
|
|
|
.BR nanosleep (2),
|
2020-04-07 12:45:00 +00:00
|
|
|
.BR timer_settime (2),
|
|
|
|
.BR timerfd_settime (2),
|
2020-04-04 09:23:02 +00:00
|
|
|
and
|
|
|
|
.IR /proc/uptime .
|
|
|
|
.PP
|
|
|
|
Currently, the only way to create a time namespace is by calling
|
|
|
|
.BR unshare (2)
|
|
|
|
with the
|
|
|
|
.BR CLONE_NEWTIME
|
|
|
|
flag.
|
|
|
|
This call creates a new time namespace but does
|
|
|
|
.I not
|
|
|
|
place the calling process in the new namespace.
|
|
|
|
Instead, the calling process's
|
|
|
|
subsequently created children are placed in the new namespace.
|
|
|
|
This allows clock offsets (see below) for the new namespace
|
|
|
|
to be set before the first process is placed in the namespace.
|
|
|
|
The
|
|
|
|
.IR /proc/[pid]/ns/time_for_children
|
|
|
|
symbolic link shows the time namespace in which
|
|
|
|
the children of a process will be created.
|
2020-04-07 12:45:00 +00:00
|
|
|
(A process can use a file descriptor opened on
|
|
|
|
this symbolic link in a call to
|
|
|
|
.BR setns (2)
|
|
|
|
in order to move into the namespace.)
|
2020-04-04 09:23:02 +00:00
|
|
|
.\"
|
|
|
|
.SS /proc/PID/timens_offsets
|
|
|
|
Associated with each time namespace are offsets,
|
|
|
|
expressed with respect to the initial time namespace,
|
2020-04-06 08:26:10 +00:00
|
|
|
that define the values of the monotonic and
|
|
|
|
boot-time clocks in that namespace.
|
2020-04-04 09:23:02 +00:00
|
|
|
These offsets are exposed via the file
|
|
|
|
.IR /proc/PID/timens_offsets .
|
|
|
|
Within this file,
|
|
|
|
the offsets are expressed as lines consisting of
|
|
|
|
three space-delimited fields:
|
|
|
|
.PP
|
|
|
|
.in +4n
|
|
|
|
.EX
|
|
|
|
<clock-id> <offset-secs> <offset-nanosecs>
|
|
|
|
.EE
|
|
|
|
.in
|
|
|
|
.PP
|
|
|
|
The
|
|
|
|
.I clock-id
|
2020-04-11 11:32:29 +00:00
|
|
|
is a string that identifies the clock whose offsets are being shown.
|
|
|
|
This field is either
|
|
|
|
.IR monotonic ,
|
|
|
|
for
|
2020-04-04 09:23:02 +00:00
|
|
|
.BR CLOCK_MONOTONIC ,
|
2020-04-11 11:32:29 +00:00
|
|
|
or
|
|
|
|
.IR boottime ,
|
|
|
|
for
|
2020-04-04 09:23:02 +00:00
|
|
|
.BR CLOCK_BOOTTIME .
|
|
|
|
The remaining fields express the offset (seconds plus nanoseconds) for the
|
|
|
|
clock in this time namespace.
|
|
|
|
These offsets are expressed relative to the clock values in
|
|
|
|
the initial time namespace.
|
2020-04-07 12:45:00 +00:00
|
|
|
The
|
|
|
|
.I offset-secs
|
2020-04-07 13:07:51 +00:00
|
|
|
value can be negative, subject to restrictions noted below;
|
|
|
|
.I offset-nanosecs
|
|
|
|
is an unsigned value.
|
2020-04-07 12:45:00 +00:00
|
|
|
.PP
|
|
|
|
In the initial time namespace, the contents of the
|
|
|
|
.I timens_offsets
|
|
|
|
file are as follows:
|
2020-04-04 09:23:02 +00:00
|
|
|
.PP
|
|
|
|
.in +4n
|
|
|
|
.EX
|
|
|
|
$ \fBcat /proc/self/timens_offsets\fP
|
2020-04-11 11:32:29 +00:00
|
|
|
monotonic 0 0
|
|
|
|
boottime 0 0
|
2020-04-04 09:23:02 +00:00
|
|
|
.EE
|
|
|
|
.in
|
|
|
|
.PP
|
|
|
|
In a new time namespace that has had no member processes,
|
|
|
|
the clock offsets can be modified by writing newline-terminated
|
2020-04-07 12:45:00 +00:00
|
|
|
records of the same form to the
|
|
|
|
.I timens_offsets
|
|
|
|
file.
|
2020-04-04 09:23:02 +00:00
|
|
|
The file can be written to multiple times,
|
|
|
|
but after the first process has been created in or has entered the namespace,
|
|
|
|
.BR write (2)s
|
|
|
|
on this file fail with the error
|
|
|
|
.BR EACCES .
|
|
|
|
In order to write to the
|
|
|
|
.IR timens_offsets
|
|
|
|
file, a process must have the
|
|
|
|
.BR CAP_SYS_TIME
|
|
|
|
capability in the user namespace that owns the time namespace.
|
|
|
|
.PP
|
2020-04-07 13:07:51 +00:00
|
|
|
Writes to the
|
|
|
|
.I timens_offsets
|
|
|
|
file can fail with the following errors:
|
|
|
|
.TP
|
|
|
|
.B EINVAL
|
|
|
|
An
|
|
|
|
.I offset-nanosecs
|
|
|
|
value is greater than 999,999,999.
|
|
|
|
.TP
|
|
|
|
.B EINVAL
|
|
|
|
A
|
|
|
|
.I clock-id
|
|
|
|
value is not valid.
|
|
|
|
.TP
|
|
|
|
.B EPERM
|
|
|
|
The caller does not have the
|
|
|
|
.BR CAP_SYS_TIME
|
|
|
|
capability.
|
|
|
|
.TP
|
|
|
|
.B ERANGE
|
|
|
|
An
|
|
|
|
.I offset-secs
|
|
|
|
value is out of range.
|
|
|
|
In particular;
|
|
|
|
.RS
|
|
|
|
.IP \(bu 2
|
|
|
|
.I offset-secs
|
|
|
|
can't be set to a value which would make the current
|
|
|
|
time on the corresponding clock inside the namespace a negative value; and
|
|
|
|
.IP \(bu
|
|
|
|
.I offset-secs
|
|
|
|
can't be set to a value such that the time on the corresponding clock
|
|
|
|
inside the namespace would exceed half of the value of the kernel constant
|
|
|
|
.BR KTIME_SEC_MAX
|
|
|
|
(this limits the clock value to a maximum of approximately 146 years).
|
|
|
|
.RE
|
|
|
|
.PP
|
2020-04-04 09:23:02 +00:00
|
|
|
In a new time namespace created by
|
|
|
|
.BR unshare (2),
|
|
|
|
the contents of the
|
|
|
|
.I timens_offsets
|
|
|
|
file are inherited from the time namespace of the creating process.
|
|
|
|
.SH NOTES
|
|
|
|
Use of time namespaces requires a kernel that is configured with the
|
|
|
|
.B CONFIG_TIME_NS
|
|
|
|
option.
|
|
|
|
.PP
|
|
|
|
Note that time namespaces do not virtualize the
|
|
|
|
.BR CLOCK_REALTIME
|
|
|
|
clock.
|
|
|
|
Virtualization of this clock was avoided for reasons of complexity
|
|
|
|
and overhead within the kernel.
|
|
|
|
.PP
|
2020-04-11 11:32:29 +00:00
|
|
|
For compatibility with the initial implementation, when writing a
|
|
|
|
.I clock-id
|
|
|
|
to the
|
|
|
|
.IR /proc/[pid]/timens_offsets
|
|
|
|
file, the numerical values of the IDs can be written
|
|
|
|
instead of the symbolic names show above; i.e., 1 instead of
|
|
|
|
.IR monotonic ,
|
|
|
|
and 7 instead of
|
|
|
|
.IR boottime .
|
2020-04-12 06:44:50 +00:00
|
|
|
For redability, the use of the symbolic names over the numbers is preferred.
|
2020-04-11 11:32:29 +00:00
|
|
|
.PP
|
2020-04-04 09:23:02 +00:00
|
|
|
The motivation for adding time namespaces was to allow
|
|
|
|
the monotonic and boot-time clocks to maintain consistent values
|
|
|
|
during container migration and checkpoint/restore.
|
2020-05-21 08:00:37 +00:00
|
|
|
.SH EXAMPLES
|
2020-04-04 09:23:02 +00:00
|
|
|
The following shell session demonstrates the operation of time namespaces.
|
|
|
|
We begin by displaying the inode number of the time namespace
|
|
|
|
of a shell in the initial time namespace:
|
|
|
|
.PP
|
|
|
|
.in +4n
|
|
|
|
.EX
|
|
|
|
$ \fBreadlink /proc/$$/ns/time\fP
|
|
|
|
time:[4026531834]
|
|
|
|
.EE
|
|
|
|
.in
|
|
|
|
.PP
|
|
|
|
Continuing in the initial time namespace, we display the system uptime using
|
|
|
|
.BR uptime (1)
|
|
|
|
and use the
|
|
|
|
.I clock_times
|
|
|
|
example program shown in
|
|
|
|
.BR clock_getres (2)
|
|
|
|
to display the values of various clocks:
|
|
|
|
.PP
|
|
|
|
.in +4n
|
|
|
|
.EX
|
|
|
|
$ \fBuptime \-\-pretty\fP
|
|
|
|
up 21 hours, 17 minutes
|
|
|
|
$ \fB./clock_times\fP
|
|
|
|
CLOCK_REALTIME : 1585989401.971 (18356 days + 8h 36m 41s)
|
|
|
|
CLOCK_TAI : 1585989438.972 (18356 days + 8h 37m 18s)
|
|
|
|
CLOCK_MONOTONIC: 56338.247 (15h 38m 58s)
|
|
|
|
CLOCK_BOOTTIME : 76633.544 (21h 17m 13s)
|
|
|
|
.EE
|
|
|
|
.in
|
|
|
|
.PP
|
|
|
|
We then use
|
|
|
|
.BR unshare (1)
|
|
|
|
to create a time namespace and execute a
|
|
|
|
.BR bash (1)
|
|
|
|
shell.
|
|
|
|
From the new shell, we use the built-in
|
|
|
|
.B echo
|
|
|
|
command to write records to the
|
|
|
|
.I timens_offsets
|
|
|
|
file adjusting the offset for the
|
|
|
|
.B CLOCK_MONOTONIC
|
|
|
|
clock forward 2 days
|
|
|
|
and the offset for the
|
|
|
|
.B CLOCK_BOOTTIME
|
|
|
|
clock forward 7 days:
|
|
|
|
.PP
|
|
|
|
.in +4n
|
|
|
|
.EX
|
|
|
|
$ \fBPS1="ns2# " sudo unshare \-T \-\- bash \-\-norc\fP
|
2020-04-11 11:32:29 +00:00
|
|
|
ns2# \fBecho "monotonic $((2*24*60*60)) 0" > /proc/$$/timens_offsets\fP
|
|
|
|
ns2# \fBecho "boottime $((7*24*60*60)) 0" > /proc/$$/timens_offsets\fP
|
2020-04-04 09:23:02 +00:00
|
|
|
.EE
|
|
|
|
.in
|
|
|
|
.PP
|
|
|
|
Above, we started the
|
|
|
|
.BR bash (1)
|
|
|
|
shell with the
|
|
|
|
.B \-\-norc
|
|
|
|
options so that no start-up scripts were executed.
|
|
|
|
This ensures that no child processes are created from the
|
|
|
|
shell before we have a chance to update the
|
|
|
|
.I timens_offsets
|
|
|
|
file.
|
|
|
|
.PP
|
|
|
|
We then use
|
|
|
|
.BR cat (1)
|
|
|
|
to display the contents of the
|
|
|
|
.I timens_offsets
|
|
|
|
file.
|
|
|
|
The execution of
|
|
|
|
.BR cat (1)
|
|
|
|
creates the first process in the new time namespace,
|
|
|
|
after which further attempts to update the
|
|
|
|
.I timens_offsets
|
|
|
|
file produce an error.
|
|
|
|
.PP
|
|
|
|
.in +4n
|
|
|
|
.EX
|
|
|
|
ns2# \fBcat /proc/$$/timens_offsets\fP
|
2020-04-11 11:32:29 +00:00
|
|
|
monotonic 172800 0
|
|
|
|
boottime 604800 0
|
|
|
|
ns2# \fBecho "boottime $((9*24*60*60)) 0" > /proc/$$/timens_offsets\fP
|
2020-04-04 09:23:02 +00:00
|
|
|
bash: echo: write error: Permission denied
|
|
|
|
.EE
|
|
|
|
.in
|
|
|
|
.PP
|
|
|
|
Continuing in the new namespace, we execute
|
|
|
|
.BR uptime (1)
|
|
|
|
and the
|
|
|
|
.I clock_times
|
|
|
|
example program:
|
|
|
|
.PP
|
|
|
|
.in +4n
|
|
|
|
.EX
|
|
|
|
ns2# \fBuptime \-\-pretty\fP
|
|
|
|
up 1 week, 21 hours, 18 minutes
|
|
|
|
ns2# \fB./clock_times\fP
|
|
|
|
CLOCK_REALTIME : 1585989457.056 (18356 days + 8h 37m 37s)
|
|
|
|
CLOCK_TAI : 1585989494.057 (18356 days + 8h 38m 14s)
|
|
|
|
CLOCK_MONOTONIC: 229193.332 (2 days + 15h 39m 53s)
|
|
|
|
CLOCK_BOOTTIME : 681488.629 (7 days + 21h 18m 8s)
|
|
|
|
.EE
|
|
|
|
.in
|
|
|
|
.PP
|
|
|
|
From the above output, we can see that the monotonic
|
2020-04-06 08:26:10 +00:00
|
|
|
and boot-time clocks have different values in the new time namespace.
|
2020-04-04 09:23:02 +00:00
|
|
|
.PP
|
|
|
|
Examining the
|
|
|
|
.I /proc/[pid]/ns/time
|
|
|
|
and
|
|
|
|
.I /proc/[pid]/ns/time_for_children
|
|
|
|
symbolic links, we see that the shell is a member of the initial time
|
2020-04-06 08:26:10 +00:00
|
|
|
namespace, but its children are created in the new namespace.
|
2020-04-04 09:23:02 +00:00
|
|
|
.PP
|
|
|
|
.in +4n
|
|
|
|
.EX
|
|
|
|
ns2# \fBreadlink /proc/$$/ns/time\fP
|
|
|
|
time:[4026531834]
|
|
|
|
ns2# \fBreadlink /proc/$$/ns/time_for_children\fP
|
|
|
|
time:[4026532900]
|
|
|
|
ns2# \fBreadlink /proc/self/ns/time\fP # Creates a child process
|
|
|
|
time:[4026532900]
|
|
|
|
.EE
|
|
|
|
.in
|
|
|
|
.PP
|
|
|
|
Returning to the shell in the initial time namespace,
|
|
|
|
we see that the monotonic and boot-time clocks
|
|
|
|
are unaffected by the
|
|
|
|
.I timens_offsets
|
|
|
|
changes that were made in the other time namespace:
|
|
|
|
.PP
|
|
|
|
.in +4n
|
|
|
|
.EX
|
|
|
|
$ \fBuptime \-\-pretty\fP
|
|
|
|
up 21 hours, 19 minutes
|
|
|
|
$ \fB./clock_times\fP
|
|
|
|
CLOCK_REALTIME : 1585989401.971 (18356 days + 8h 38m 51s)
|
|
|
|
CLOCK_TAI : 1585989438.972 (18356 days + 8h 39m 28s)
|
|
|
|
CLOCK_MONOTONIC: 56338.247 (15h 41m 8s)
|
|
|
|
CLOCK_BOOTTIME : 76633.544 (21h 19m 23s)
|
|
|
|
.EE
|
|
|
|
.in
|
|
|
|
.SH SEE ALSO
|
|
|
|
.BR nsenter (1),
|
|
|
|
.BR unshare (1),
|
2020-04-12 06:43:56 +00:00
|
|
|
.BR clock_settime (2),
|
2020-04-04 09:23:02 +00:00
|
|
|
.\" clone3() support for time namespaces is a work in progress
|
|
|
|
.\" .BR clone3 (2),
|
|
|
|
.BR setns (2),
|
|
|
|
.BR unshare (2),
|
|
|
|
.BR namespaces (7),
|
|
|
|
.BR time (7)
|