mirror of
https://git.proxmox.com/git/systemd
synced 2025-06-03 21:40:57 +00:00
455 lines
17 KiB
Groff
455 lines
17 KiB
Groff
'\" t
|
|
.TH "SYSTEMD\-NSPAWN" "1" "" "systemd 215" "systemd-nspawn"
|
|
.\" -----------------------------------------------------------------
|
|
.\" * Define some portability stuff
|
|
.\" -----------------------------------------------------------------
|
|
.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
.\" http://bugs.debian.org/507673
|
|
.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html
|
|
.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
.ie \n(.g .ds Aq \(aq
|
|
.el .ds Aq '
|
|
.\" -----------------------------------------------------------------
|
|
.\" * set default formatting
|
|
.\" -----------------------------------------------------------------
|
|
.\" disable hyphenation
|
|
.nh
|
|
.\" disable justification (adjust text to left margin only)
|
|
.ad l
|
|
.\" -----------------------------------------------------------------
|
|
.\" * MAIN CONTENT STARTS HERE *
|
|
.\" -----------------------------------------------------------------
|
|
.SH "NAME"
|
|
systemd-nspawn \- Spawn a namespace container for debugging, testing and building
|
|
.SH "SYNOPSIS"
|
|
.HP \w'\fBsystemd\-nspawn\fR\ 'u
|
|
\fBsystemd\-nspawn\fR [OPTIONS...] [\fICOMMAND\fR\ [ARGS...]]
|
|
.HP \w'\fBsystemd\-nspawn\fR\ 'u
|
|
\fBsystemd\-nspawn\fR \-b [OPTIONS...] [ARGS...]
|
|
.SH "DESCRIPTION"
|
|
.PP
|
|
\fBsystemd\-nspawn\fR
|
|
may be used to run a command or OS in a light\-weight namespace container\&. In many ways it is similar to
|
|
\fBchroot\fR(1), but more powerful since it fully virtualizes the file system hierarchy, as well as the process tree, the various IPC subsystems and the host and domain name\&.
|
|
.PP
|
|
\fBsystemd\-nspawn\fR
|
|
limits access to various kernel interfaces in the container to read\-only, such as
|
|
/sys,
|
|
/proc/sys
|
|
or
|
|
/sys/fs/selinux\&. Network interfaces and the system clock may not be changed from within the container\&. Device nodes may not be created\&. The host system cannot be rebooted and kernel modules may not be loaded from within the container\&.
|
|
.PP
|
|
Note that even though these security precautions are taken
|
|
\fBsystemd\-nspawn\fR
|
|
is not suitable for secure container setups\&. Many of the security features may be circumvented and are hence primarily useful to avoid accidental changes to the host system from the container\&. The intended use of this program is debugging and testing as well as building of packages, distributions and software involved with boot and systems management\&.
|
|
.PP
|
|
In contrast to
|
|
\fBchroot\fR(1)\ \&\fBsystemd\-nspawn\fR
|
|
may be used to boot full Linux\-based operating systems in a container\&.
|
|
.PP
|
|
Use a tool like
|
|
\fByum\fR(8),
|
|
\fBdebootstrap\fR(8), or
|
|
\fBpacman\fR(8)
|
|
to set up an OS directory tree suitable as file system hierarchy for
|
|
\fBsystemd\-nspawn\fR
|
|
containers\&.
|
|
.PP
|
|
Note that
|
|
\fBsystemd\-nspawn\fR
|
|
will mount file systems private to the container to
|
|
/dev,
|
|
/run
|
|
and similar\&. These will not be visible outside of the container, and their contents will be lost when the container exits\&.
|
|
.PP
|
|
Note that running two
|
|
\fBsystemd\-nspawn\fR
|
|
containers from the same directory tree will not make processes in them see each other\&. The PID namespace separation of the two containers is complete and the containers will share very few runtime objects except for the underlying file system\&. Use
|
|
\fBmachinectl\fR(1)\*(Aqs
|
|
\fBlogin\fR
|
|
command to request an additional login prompt in a running container\&.
|
|
.PP
|
|
\fBsystemd\-nspawn\fR
|
|
implements the
|
|
\m[blue]\fBContainer Interface\fR\m[]\&\s-2\u[1]\d\s+2
|
|
specification\&.
|
|
.PP
|
|
As a safety check
|
|
\fBsystemd\-nspawn\fR
|
|
will verify the existence of
|
|
/usr/lib/os\-release
|
|
or
|
|
/etc/os\-release
|
|
in the container tree before starting the container (see
|
|
\fBos-release\fR(5))\&. It might be necessary to add this file to the container tree manually if the OS of the container is too old to contain this file out\-of\-the\-box\&.
|
|
.SH "OPTIONS"
|
|
.PP
|
|
If option
|
|
\fB\-b\fR
|
|
is specified, the arguments are used as arguments for the init binary\&. Otherwise,
|
|
\fICOMMAND\fR
|
|
specifies the program to launch in the container, and the remaining arguments are used as arguments for this program\&. If
|
|
\fB\-b\fR
|
|
is not used and no arguments are specifed, a shell is launched in the container\&.
|
|
.PP
|
|
The following options are understood:
|
|
.PP
|
|
\fB\-D\fR, \fB\-\-directory=\fR
|
|
.RS 4
|
|
Directory to use as file system root for the container\&. If neither
|
|
\fB\-\-directory=\fR
|
|
nor
|
|
\fB\-\-image=\fR
|
|
are specified, the current directory will be used\&. May not be specified together with
|
|
\fB\-\-image=\fR\&.
|
|
.RE
|
|
.PP
|
|
\fB\-i\fR, \fB\-\-image=\fR
|
|
.RS 4
|
|
Disk image to mount the root directory for the container from\&. Takes a path to a regular file or to a block device node\&. The file or block device must contain a GUID Partition Table with a root partition which is mounted as the root directory of the container\&. Optionally, it may contain a home and/or a server data partition which are mounted to the appropriate places in the container\&. All these partitions must be identified by the partition types defined by the
|
|
\m[blue]\fBDiscoverable Partitions Specification\fR\m[]\&\s-2\u[2]\d\s+2\&. Any other partitions, such as foreign partitions, swap partitions or EFI system partitions are not mounted\&. May not be specified together with
|
|
\fB\-\-directory=\fR\&.
|
|
.RE
|
|
.PP
|
|
\fB\-b\fR, \fB\-\-boot\fR
|
|
.RS 4
|
|
Automatically search for an init binary and invoke it instead of a shell or a user supplied program\&. If this option is used, arguments specified on the command line are used as arguments for the init binary\&. This option may not be combined with
|
|
\fB\-\-share\-system\fR\&.
|
|
.RE
|
|
.PP
|
|
\fB\-u\fR, \fB\-\-user=\fR
|
|
.RS 4
|
|
After transitioning into the container, change to the specified user\-defined in the container\*(Aqs user database\&. Like all other systemd\-nspawn features, this is not a security feature and provides protection against accidental destructive operations only\&.
|
|
.RE
|
|
.PP
|
|
\fB\-M\fR, \fB\-\-machine=\fR
|
|
.RS 4
|
|
Sets the machine name for this container\&. This name may be used to identify this container on the host, and is used to initialize the container\*(Aqs hostname (which the container can choose to override, however)\&. If not specified, the last component of the root directory of the container is used\&.
|
|
.RE
|
|
.PP
|
|
\fB\-\-uuid=\fR
|
|
.RS 4
|
|
Set the specified UUID for the container\&. The init system will initialize
|
|
/etc/machine\-id
|
|
from this if this file is not set yet\&.
|
|
.RE
|
|
.PP
|
|
\fB\-\-slice=\fR
|
|
.RS 4
|
|
Make the container part of the specified slice, instead of the default
|
|
machine\&.slice\&.
|
|
.RE
|
|
.PP
|
|
\fB\-\-private\-network\fR
|
|
.RS 4
|
|
Disconnect networking of the container from the host\&. This makes all network interfaces unavailable in the container, with the exception of the loopback device and those specified with
|
|
\fB\-\-network\-interface=\fR
|
|
and configured with
|
|
\fB\-\-network\-veth\fR\&. If this option is specified, the CAP_NET_ADMIN capability will be added to the set of capabilities the container retains\&. The latter may be disabled by using
|
|
\fB\-\-drop\-capability=\fR\&.
|
|
.RE
|
|
.PP
|
|
\fB\-\-network\-interface=\fR
|
|
.RS 4
|
|
Assign the specified network interface to the container\&. This will remove the specified interface from the calling namespace and place it in the container\&. When the container terminates, it is moved back to the host namespace\&. Note that
|
|
\fB\-\-network\-interface=\fR
|
|
implies
|
|
\fB\-\-private\-network\fR\&. This option may be used more than once to add multiple network interfaces to the container\&.
|
|
.RE
|
|
.PP
|
|
\fB\-\-network\-macvlan=\fR
|
|
.RS 4
|
|
Create a
|
|
"macvlan"
|
|
interface of the specified Ethernet network interface and add it to the container\&. A
|
|
"macvlan"
|
|
interface is a virtual interface that adds a second MAC address to an existing physical Ethernet link\&. The interface in the container will be named after the interface on the host, prefixed with
|
|
"mv\-"\&. Note that
|
|
\fB\-\-network\-macvlan=\fR
|
|
implies
|
|
\fB\-\-private\-network\fR\&. This option may be used more than once to add multiple network interfaces to the container\&.
|
|
.RE
|
|
.PP
|
|
\fB\-\-network\-veth\fR
|
|
.RS 4
|
|
Create a virtual Ethernet link ("veth") between host and container\&. The host side of the Ethernet link will be available as a network interface named after the container\*(Aqs name (as specified with
|
|
\fB\-\-machine=\fR), prefixed with
|
|
"ve\-"\&. The container side of the Ethernet link will be named
|
|
"host0"\&. Note that
|
|
\fB\-\-network\-veth\fR
|
|
implies
|
|
\fB\-\-private\-network\fR\&.
|
|
.RE
|
|
.PP
|
|
\fB\-\-network\-bridge=\fR
|
|
.RS 4
|
|
Adds the host side of the Ethernet link created with
|
|
\fB\-\-network\-veth\fR
|
|
to the specified bridge\&. Note that
|
|
\fB\-\-network\-bridge=\fR
|
|
implies
|
|
\fB\-\-network\-veth\fR\&. If this option is used, the host side of the Ethernet link will use the
|
|
"vb\-"
|
|
prefix instead of
|
|
"ve\-"\&.
|
|
.RE
|
|
.PP
|
|
\fB\-Z\fR, \fB\-\-selinux\-context=\fR
|
|
.RS 4
|
|
Sets the SELinux security context to be used to label processes in the container\&.
|
|
.RE
|
|
.PP
|
|
\fB\-L\fR, \fB\-\-selinux\-apifs\-context=\fR
|
|
.RS 4
|
|
Sets the SELinux security context to be used to label files in the virtual API file systems in the container\&.
|
|
.RE
|
|
.PP
|
|
\fB\-\-capability=\fR
|
|
.RS 4
|
|
List one or more additional capabilities to grant the container\&. Takes a comma\-separated list of capability names, see
|
|
\fBcapabilities\fR(7)
|
|
for more information\&. Note that the following capabilities will be granted in any way: CAP_CHOWN, CAP_DAC_OVERRIDE, CAP_DAC_READ_SEARCH, CAP_FOWNER, CAP_FSETID, CAP_IPC_OWNER, CAP_KILL, CAP_LEASE, CAP_LINUX_IMMUTABLE, CAP_NET_BIND_SERVICE, CAP_NET_BROADCAST, CAP_NET_RAW, CAP_SETGID, CAP_SETFCAP, CAP_SETPCAP, CAP_SETUID, CAP_SYS_ADMIN, CAP_SYS_CHROOT, CAP_SYS_NICE, CAP_SYS_PTRACE, CAP_SYS_TTY_CONFIG, CAP_SYS_RESOURCE, CAP_SYS_BOOT, CAP_AUDIT_WRITE, CAP_AUDIT_CONTROL\&. Also CAP_NET_ADMIN is retained if
|
|
\fB\-\-private\-network\fR
|
|
is specified\&. If the special value
|
|
"all"
|
|
is passed, all capabilities are retained\&.
|
|
.RE
|
|
.PP
|
|
\fB\-\-drop\-capability=\fR
|
|
.RS 4
|
|
Specify one or more additional capabilities to drop for the container\&. This allows running the container with fewer capabilities than the default (see above)\&.
|
|
.RE
|
|
.PP
|
|
\fB\-\-link\-journal=\fR
|
|
.RS 4
|
|
Control whether the container\*(Aqs journal shall be made visible to the host system\&. If enabled, allows viewing the container\*(Aqs journal files from the host (but not vice versa)\&. Takes one of
|
|
"no",
|
|
"host",
|
|
"guest",
|
|
"auto"\&. If
|
|
"no", the journal is not linked\&. If
|
|
"host", the journal files are stored on the host file system (beneath
|
|
/var/log/journal/\fImachine\-id\fR) and the subdirectory is bind\-mounted into the container at the same location\&. If
|
|
"guest", the journal files are stored on the guest file system (beneath
|
|
/var/log/journal/\fImachine\-id\fR) and the subdirectory is symlinked into the host at the same location\&. If
|
|
"auto"
|
|
(the default), and the right subdirectory of
|
|
/var/log/journal
|
|
exists, it will be bind mounted into the container\&. If the subdirectory does not exist, no linking is performed\&. Effectively, booting a container once with
|
|
"guest"
|
|
or
|
|
"host"
|
|
will link the journal persistently if further on the default of
|
|
"auto"
|
|
is used\&.
|
|
.RE
|
|
.PP
|
|
\fB\-j\fR
|
|
.RS 4
|
|
Equivalent to
|
|
\fB\-\-link\-journal=guest\fR\&.
|
|
.RE
|
|
.PP
|
|
\fB\-\-read\-only\fR
|
|
.RS 4
|
|
Mount the root file system read\-only for the container\&.
|
|
.RE
|
|
.PP
|
|
\fB\-\-bind=\fR, \fB\-\-bind\-ro=\fR
|
|
.RS 4
|
|
Bind mount a file or directory from the host into the container\&. Either takes a path argument \-\- in which case the specified path will be mounted from the host to the same path in the container \-\-, or a colon\-separated pair of paths \-\- in which case the first specified path is the source in the host, and the second path is the destination in the container\&. The
|
|
\fB\-\-bind\-ro=\fR
|
|
option creates read\-only bind mounts\&.
|
|
.RE
|
|
.PP
|
|
\fB\-\-tmpfs=\fR
|
|
.RS 4
|
|
Mount a tmpfs file system into the container\&. Takes a single absolute path argument that specifies where to mount the tmpfs instance to (in which case the directory access mode will be chosen as 0755, owned by root/root), or optionally a colon\-separated pair of path and mount option string, that is used for mounting (in which case the kernel default for access mode and owner will be chosen, unless otherwise specified)\&. This option is particularly useful for mounting directories such as
|
|
/var
|
|
as tmpfs, to allow state\-less systems, in particular when combined with
|
|
\fB\-\-read\-only\fR\&.
|
|
.RE
|
|
.PP
|
|
\fB\-\-setenv=\fR
|
|
.RS 4
|
|
Specifies an environment variable assignment to pass to the init process in the container, in the format
|
|
"NAME=VALUE"\&. This may be used to override the default variables or to set additional variables\&. This parameter may be used more than once\&.
|
|
.RE
|
|
.PP
|
|
\fB\-\-share\-system\fR
|
|
.RS 4
|
|
Allows the container to share certain system facilities with the host\&. More specifically, this turns off PID namespacing, UTS namespacing and IPC namespacing, and thus allows the guest to see and interact more easily with processes outside of the container\&. Note that using this option makes it impossible to start up a full Operating System in the container, as an init system cannot operate in this mode\&. It is only useful to run specific programs or applications this way, without involving an init system in the container\&. This option implies
|
|
\fB\-\-register=no\fR\&. This option may not be combined with
|
|
\fB\-\-boot\fR\&.
|
|
.RE
|
|
.PP
|
|
\fB\-\-register=\fR
|
|
.RS 4
|
|
Controls whether the container is registered with
|
|
\fBsystemd-machined\fR(8)\&. Takes a boolean argument, defaults to
|
|
"yes"\&. This option should be enabled when the container runs a full Operating System (more specifically: an init system), and is useful to ensure that the container is accessible via
|
|
\fBmachinectl\fR(1)
|
|
and shown by tools such as
|
|
\fBps\fR(1)\&. If the container does not run an init system, it is recommended to set this option to
|
|
"no"\&. Note that
|
|
\fB\-\-share\-system\fR
|
|
implies
|
|
\fB\-\-register=no\fR\&.
|
|
.RE
|
|
.PP
|
|
\fB\-\-keep\-unit\fR
|
|
.RS 4
|
|
Instead of creating a transient scope unit to run the container in, simply register the service or scope unit
|
|
\fBsystemd\-nspawn\fR
|
|
has been invoked in with
|
|
\fBsystemd-machined\fR(8)\&. This has no effect if
|
|
\fB\-\-register=no\fR
|
|
is used\&. This switch should be used if
|
|
\fBsystemd\-nspawn\fR
|
|
is invoked from within a service unit, and the service unit\*(Aqs sole purpose is to run a single
|
|
\fBsystemd\-nspawn\fR
|
|
container\&. This option is not available if run from a user session\&.
|
|
.RE
|
|
.PP
|
|
\fB\-\-personality=\fR
|
|
.RS 4
|
|
Control the architecture ("personality") reported by
|
|
\fBuname\fR(2)
|
|
in the container\&. Currently, only
|
|
"x86"
|
|
and
|
|
"x86\-64"
|
|
are supported\&. This is useful when running a 32\-bit container on a 64\-bit host\&. If this setting is not used, the personality reported in the container is the same as the one reported on the host\&.
|
|
.RE
|
|
.PP
|
|
\fB\-q\fR, \fB\-\-quiet\fR
|
|
.RS 4
|
|
Turns off any status output by the tool itself\&. When this switch is used, the only output from nspawn will be the console output of the container OS itself\&.
|
|
.RE
|
|
.PP
|
|
\fB\-h\fR, \fB\-\-help\fR
|
|
.RS 4
|
|
Print a short help text and exit\&.
|
|
.RE
|
|
.PP
|
|
\fB\-\-version\fR
|
|
.RS 4
|
|
Print a short version string and exit\&.
|
|
.RE
|
|
.SH "EXAMPLE 1"
|
|
.sp
|
|
.if n \{\
|
|
.RS 4
|
|
.\}
|
|
.nf
|
|
# yum \-y \-\-releasever=19 \-\-nogpg \-\-installroot=/srv/mycontainer \-\-disablerepo=\*(Aq*\*(Aq \-\-enablerepo=fedora install systemd passwd yum fedora\-release vim\-minimal
|
|
# systemd\-nspawn \-bD /srv/mycontainer
|
|
.fi
|
|
.if n \{\
|
|
.RE
|
|
.\}
|
|
.PP
|
|
This installs a minimal Fedora distribution into the directory
|
|
/srv/mycontainer/
|
|
and then boots an OS in a namespace container in it\&.
|
|
.SH "EXAMPLE 2"
|
|
.sp
|
|
.if n \{\
|
|
.RS 4
|
|
.\}
|
|
.nf
|
|
# debootstrap \-\-arch=amd64 unstable ~/debian\-tree/
|
|
# systemd\-nspawn \-D ~/debian\-tree/
|
|
.fi
|
|
.if n \{\
|
|
.RE
|
|
.\}
|
|
.PP
|
|
This installs a minimal Debian unstable distribution into the directory
|
|
~/debian\-tree/
|
|
and then spawns a shell in a namespace container in it\&.
|
|
.SH "EXAMPLE 3"
|
|
.sp
|
|
.if n \{\
|
|
.RS 4
|
|
.\}
|
|
.nf
|
|
# pacstrap \-c \-d ~/arch\-tree/ base
|
|
# systemd\-nspawn \-bD ~/arch\-tree/
|
|
.fi
|
|
.if n \{\
|
|
.RE
|
|
.\}
|
|
.PP
|
|
This installs a mimimal Arch Linux distribution into the directory
|
|
~/arch\-tree/
|
|
and then boots an OS in a namespace container in it\&.
|
|
.SH "EXAMPLE 4"
|
|
.sp
|
|
.if n \{\
|
|
.RS 4
|
|
.\}
|
|
.nf
|
|
# mv ~/arch\-tree /var/lib/container/arch
|
|
# systemctl enable systemd\-nspawn@arch\&.service
|
|
# systemctl start systemd\-nspawn@arch\&.service
|
|
.fi
|
|
.if n \{\
|
|
.RE
|
|
.\}
|
|
.PP
|
|
This makes the Arch Linux container part of the
|
|
multi\-user\&.target
|
|
on the host\&.
|
|
.SH "EXAMPLE 5"
|
|
.sp
|
|
.if n \{\
|
|
.RS 4
|
|
.\}
|
|
.nf
|
|
# btrfs subvolume snapshot / /\&.tmp
|
|
# systemd\-nspawn \-\-private\-network \-D /\&.tmp \-b
|
|
.fi
|
|
.if n \{\
|
|
.RE
|
|
.\}
|
|
.PP
|
|
This runs a copy of the host system in a btrfs snapshot\&.
|
|
.SH "EXAMPLE 6"
|
|
.sp
|
|
.if n \{\
|
|
.RS 4
|
|
.\}
|
|
.nf
|
|
# chcon system_u:object_r:svirt_sandbox_file_t:s0:c0,c1 \-R /srv/container
|
|
# systemd\-nspawn \-L system_u:object_r:svirt_sandbox_file_t:s0:c0,c1 \-Z system_u:system_r:svirt_lxc_net_t:s0:c0,c1 \-D /srv/container /bin/sh
|
|
.fi
|
|
.if n \{\
|
|
.RE
|
|
.\}
|
|
.PP
|
|
This runs a container with SELinux sandbox security contexts\&.
|
|
.SH "EXIT STATUS"
|
|
.PP
|
|
The exit code of the program executed in the container is returned\&.
|
|
.SH "SEE ALSO"
|
|
.PP
|
|
\fBsystemd\fR(1),
|
|
\fBchroot\fR(1),
|
|
\fByum\fR(8),
|
|
\fBdebootstrap\fR(8),
|
|
\fBpacman\fR(8),
|
|
\fBsystemd.slice\fR(5),
|
|
\fBmachinectl\fR(1)
|
|
.SH "NOTES"
|
|
.IP " 1." 4
|
|
Container Interface
|
|
.RS 4
|
|
\%http://www.freedesktop.org/wiki/Software/systemd/ContainerInterface
|
|
.RE
|
|
.IP " 2." 4
|
|
Discoverable Partitions Specification
|
|
.RS 4
|
|
\%http://www.freedesktop.org/wiki/Specifications/DiscoverablePartitionsSpec/
|
|
.RE
|