summaryrefslogtreecommitdiffstats
path: root/sys-utils
diff options
context:
space:
mode:
authorKarel Zak2008-11-19 11:07:58 +0100
committerKarel Zak2008-11-19 12:38:43 +0100
commit5947572d5e527b842210e67d07e53eed5d95fbb2 (patch)
tree53b6e80c2280325d069cc3972d64e98345cfb568 /sys-utils
parentlosetup: add warning about read-only mode (diff)
downloadkernel-qcow2-util-linux-5947572d5e527b842210e67d07e53eed5d95fbb2.tar.gz
kernel-qcow2-util-linux-5947572d5e527b842210e67d07e53eed5d95fbb2.tar.xz
kernel-qcow2-util-linux-5947572d5e527b842210e67d07e53eed5d95fbb2.zip
build-sys: move pivot_root(8) to sys-utils
This patch moves pivot_root.{8,c) from mount/ to sys-utils/ directory. There is not ant relation between pivot_root source code and the rest of code in the mount. Signed-off-by: Karel Zak <kzak@redhat.com>
Diffstat (limited to 'sys-utils')
-rw-r--r--sys-utils/.gitignore29
-rw-r--r--sys-utils/Makefile.am5
-rw-r--r--sys-utils/pivot_root.868
-rw-r--r--sys-utils/pivot_root.c32
4 files changed, 120 insertions, 14 deletions
diff --git a/sys-utils/.gitignore b/sys-utils/.gitignore
index fb6e433b6..c47cd077a 100644
--- a/sys-utils/.gitignore
+++ b/sys-utils/.gitignore
@@ -1,40 +1,41 @@
+arch
ctrlaltdel
cytune
dmesg
flock
+i386.8
+ia64.8
+ipcmk
ipcrm
ipcs
-ipcmk
ldattach
-readprofile
-renice
-rtcwake
-lscpu
-setarch
-setsid
-tunelp
-arch
-vidmode.8
-ramsize.8
-rdev
-i386.8
-ia64.8
linux32.8
linux64.8
+lscpu
mips32.8
mips64.8
mips.8
parisc32.8
parisc64.8
parisc.8
+pivot_root
ppc32.8
ppc64.8
ppc.8
+ramsize.8
+rdev
+readprofile
+renice
rootflags.8
+rtcwake
s390.8
s390x.8
+setarch
+setsid
sparc32.8
sparc32bash.8
sparc64.8
sparc.8
+tunelp
+vidmode.8
x86_64.8
diff --git a/sys-utils/Makefile.am b/sys-utils/Makefile.am
index 0dbbb482c..b4c6ac601 100644
--- a/sys-utils/Makefile.am
+++ b/sys-utils/Makefile.am
@@ -23,6 +23,11 @@ tunelp_SOURCES = tunelp.c lp.h
info_TEXINFOS = ipc.texi
+if HAVE_PIVOT_ROOT
+sbin_PROGRAMS += pivot_root
+dist_man_MANS += pivot_root.8
+endif
+
if BUILD_ARCH
bin_PROGRAMS += arch
dist_man_MANS += arch.1
diff --git a/sys-utils/pivot_root.8 b/sys-utils/pivot_root.8
new file mode 100644
index 000000000..92b12555d
--- /dev/null
+++ b/sys-utils/pivot_root.8
@@ -0,0 +1,68 @@
+.TH PIVOT_ROOT 8 "Feb 23, 2000" "Linux" "Maintenance Commands"
+.SH NAME
+pivot_root \- change the root file system
+.SH SYNOPSIS
+.B pivot_root
+.RB \fInew_root\fP
+.RB \fIput_old\fP
+.SH DESCRIPTION
+\fBpivot_root\fP moves the root file system of the current process to the
+directory \fIput_old\fP and makes \fInew_root\fP the new root file system.
+Since \fBpivot_root(8)\fP simply calls \fBpivot_root(2)\fP, we refer to
+the man page of the latter for further details.
+
+Note that, depending on the implementation of \fBpivot_root\fP, root and
+cwd of the caller may or may not change. The following is a sequence for
+invoking \fBpivot_root\fP that works in either case, assuming that
+\fBpivot_root\fP and \fBchroot\fP are in the current \fBPATH\fP:
+.sp
+cd \fInew_root\fP
+.br
+pivot_root . \fIput_old\fP
+.br
+exec chroot . \fIcommand\fP
+.sp
+Note that \fBchroot\fP must be available under the old root and under the new
+root, because \fBpivot_root\fP may or may not have implicitly changed the
+root directory of the shell.
+
+Note that \fBexec chroot\fP changes the running executable, which is
+necessary if the old root directory should be unmounted afterwards.
+Also note that standard input, output, and error may still point to a
+device on the old root file system, keeping it busy. They can easily be
+changed when invoking \fBchroot\fP (see below; note the absence of
+leading slashes to make it work whether \fBpivot_root\fP has changed the
+shell's root or not).
+.SH EXAMPLES
+Change the root file system to /dev/hda1 from an interactive shell:
+.sp
+.nf
+mount /dev/hda1 /new-root
+cd /new-root
+pivot_root . old-root
+exec chroot . sh <dev/console >dev/console 2>&1
+umount /old-root
+.fi
+.sp
+Mount the new root file system over NFS from 10.0.0.1:/my_root and run
+\fBinit\fP:
+.sp
+.nf
+ifconfig lo 127.0.0.1 up # for portmap
+# configure Ethernet or such
+portmap # for lockd (implicitly started by mount)
+mount -o ro 10.0.0.1:/my_root /mnt
+killall portmap # portmap keeps old root busy
+cd /mnt
+pivot_root . old_root
+exec chroot . sh -c 'umount /old_root; exec /sbin/init' \\
+ <dev/console >dev/console 2>&1
+.fi
+.SH "SEE ALSO"
+.BR chroot(1),
+.BR mount(8),
+.BR pivot_root(2),
+.BR umount(8)
+.SH AVAILABILITY
+The pivot_root command is part of the util-linux-ng package and is available from
+ftp://ftp.kernel.org/pub/linux/utils/util-linux-ng/.
diff --git a/sys-utils/pivot_root.c b/sys-utils/pivot_root.c
new file mode 100644
index 000000000..ba2dbbed0
--- /dev/null
+++ b/sys-utils/pivot_root.c
@@ -0,0 +1,32 @@
+/* pivot_root.c - Change the root file system */
+
+/* Written 2000 by Werner Almesberger */
+
+#include <stdio.h>
+#include <sys/syscall.h>
+#include <unistd.h>
+
+#define pivot_root(new_root,put_old) syscall(SYS_pivot_root,new_root,put_old)
+
+#if 0
+/*
+ * With kernelheaders 2.3.41 or later, and ancient libc, try the following.
+ */
+#include <errno.h>
+#include <linux/unistd.h>
+static
+_syscall2(int,pivot_root,const char *,new_root,const char *,put_old)
+#endif
+
+int main(int argc, const char **argv)
+{
+ if (argc != 3) {
+ fprintf(stderr, "usage: %s new_root put_old\n", argv[0]);
+ return 1;
+ }
+ if (pivot_root(argv[1],argv[2]) < 0) {
+ perror("pivot_root");
+ return 1;
+ }
+ return 0;
+}