]> git.ipfire.org Git - thirdparty/man-pages.git/blobdiff - man2/pivot_root.2
des_crypt.3: Minor wording fix in VERSIONS
[thirdparty/man-pages.git] / man2 / pivot_root.2
index 2ccb2678a51aa2749be125673e271b55948d8fc9..1995361616b0153117a7dc31c46f67a084caae09 100644 (file)
@@ -1,14 +1,30 @@
-.\" Copyright (C) 2000 by Werner Almesberger
-.\" and Copyright (C) 2019 Michael Kerrisk <mtk.manpages@gmail.com>
+.\" Copyright (C) 2019 Michael Kerrisk <mtk.manpages@gmail.com>
+.\" A very few fragments remain from an earlier page written by
+.\" Werner Almesberger in 2000
 .\"
-.\" %%%LICENSE_START(GPL_NOVERSION_ONELINE)
-.\" May be distributed under GPL
-.\" %%%LICENSE_END
+.\" %%%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.
 .\"
-.\" Written 2000-02-23 by Werner Almesberger
-.\" Modified 2004-06-17 Michael Kerrisk <mtk.manpages@gmail.com>
+.\" 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.
 .\"
-.TH PIVOT_ROOT 2 2019-08-02 "Linux" "Linux Programmer's Manual"
+.\" Formatted or processed versions of this manual, if unaccompanied by
+.\" the source, must acknowledge the copyright and authors of this work.
+.\" %%%LICENSE_END
+.\"
+.TH PIVOT_ROOT 2 2019-11-19 "Linux" "Linux Programmer's Manual"
 .SH NAME
 pivot_root \- change the root mount
 .SH SYNOPSIS
@@ -51,9 +67,10 @@ and
 must not be on the same mount as the current root.
 .IP \-
 \fIput_old\fP must be at or underneath \fInew_root\fP;
-that is, adding a nonnegative
-number of \fI/..\fP to the string pointed to by \fIput_old\fP must yield
-the same directory as \fInew_root\fP.
+that is, adding some nonnegative
+number of "\fI/..\fP" prefixes to the pathname pointed to by
+.I put_old
+must yield the same directory as \fInew_root\fP.
 .IP \-
 .I new_root
 must be a path to a mount point, but can't be
@@ -165,12 +182,13 @@ or current working directory on the old root directory to the
 new root frees the old root directory of users,
 allowing the old root mount to be unmounted more easily.)
 .PP
-A typical use of
+One use of
 .BR pivot_root ()
 is during system startup, when the
-system mounts a temporary root filesystem (e.g., an \fBinitrd\fP), then
-mounts the real root filesystem, and eventually turns the latter into
-the current root of all relevant processes or threads.
+system mounts a temporary root filesystem (e.g., an
+.BR initrd (4)),
+then mounts the real root filesystem, and eventually turns the latter into
+the root directory of all relevant processes and threads.
 A modern use is to set up a root filesystem during
 the creation of a container.
 .PP
@@ -179,7 +197,7 @@ The fact that
 modifies process root and current working directories in the
 manner noted in DESCRIPTION
 is necessary in order to prevent kernel threads from keeping the old
-root directory busy with their root and current working directory,
+root mount busy with their root and current working directories,
 even if they never access
 the filesystem in any way.
 .PP
@@ -307,6 +325,7 @@ hello world
 #include <sys/mount.h>
 #include <sys/stat.h>
 #include <limits.h>
+#include <sys/mman.h>
 
 #define errExit(msg)    do { perror(msg); exit(EXIT_FAILURE); \e
                         } while (0)
@@ -374,9 +393,10 @@ main(int argc, char *argv[])
 {
     /* Create a child process in a new mount namespace */
 
-    char *stack = malloc(STACK_SIZE);
-    if (stack == NULL)
-        errExit("malloc");
+    char *stack = mmap(NULL, STACK_SIZE, PROT_READ | PROT_WRITE,
+                       MAP_PRIVATE | MAP_ANONYMOUS | MAP_STACK, \-1, 0);
+    if (stack == MAP_FAILED)
+        errExit("mmap");
 
     if (clone(child, stack + STACK_SIZE,
                 CLONE_NEWNS | SIGCHLD, &argv[1]) == \-1)