diff options
author | Karel Zak | 2008-11-19 11:07:58 +0100 |
---|---|---|
committer | Karel Zak | 2008-11-19 12:38:43 +0100 |
commit | 5947572d5e527b842210e67d07e53eed5d95fbb2 (patch) | |
tree | 53b6e80c2280325d069cc3972d64e98345cfb568 /sys-utils | |
parent | losetup: add warning about read-only mode (diff) | |
download | kernel-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/.gitignore | 29 | ||||
-rw-r--r-- | sys-utils/Makefile.am | 5 | ||||
-rw-r--r-- | sys-utils/pivot_root.8 | 68 | ||||
-rw-r--r-- | sys-utils/pivot_root.c | 32 |
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; +} |