]> git.proxmox.com Git - pve-docs.git/blame - pct.adoc
pct: supported distros: move a heading-level up to own section
[pve-docs.git] / pct.adoc
CommitLineData
80c0adcb 1[[chapter_pct]]
0c6b782f 2ifdef::manvolnum[]
b2f242ab 3pct(1)
7e2fdb3d 4======
5f09af76
DM
5:pve-toplevel:
6
0c6b782f
DM
7NAME
8----
9
10pct - Tool to manage Linux Containers (LXC) on Proxmox VE
11
12
49a5e11c 13SYNOPSIS
0c6b782f
DM
14--------
15
16include::pct.1-synopsis.adoc[]
17
18DESCRIPTION
19-----------
20endif::manvolnum[]
21
22ifndef::manvolnum[]
23Proxmox Container Toolkit
24=========================
194d2f29 25:pve-toplevel:
0c6b782f 26endif::manvolnum[]
5f09af76 27ifdef::wiki[]
cb84ed18 28:title: Linux Container
5f09af76 29endif::wiki[]
4a2ae9ed 30
14e97811
OB
31Containers are a lightweight alternative to fully virtualized machines (VMs).
32They use the kernel of the host system that they run on, instead of emulating a
33full operating system (OS). This means that containers can access resources on
34the host system directly.
4a2ae9ed 35
6d718b9b
TL
36The runtime costs for containers is low, usually negligible. However, there are
37some drawbacks that need be considered:
4a2ae9ed 38
fd7fb228
DW
39* Only Linux distributions can be run in Proxmox Containers. It is not possible to run
40 other operating systems like, for example, FreeBSD or Microsoft Windows
6d718b9b 41 inside a container.
4a2ae9ed 42
6d718b9b 43* For security reasons, access to host resources needs to be restricted.
fd7fb228
DW
44 Therefore, containers run in their own separate namespaces. Additionally some
45 syscalls (user space requests to the Linux kernel) are not allowed within containers.
4a2ae9ed 46
fd7fb228 47{pve} uses https://linuxcontainers.org/lxc/introduction/[Linux Containers (LXC)] as its underlying
6d718b9b 48container technology. The ``Proxmox Container Toolkit'' (`pct`) simplifies the
fd7fb228
DW
49usage and management of LXC, by providing an interface that abstracts
50complex tasks.
4a2ae9ed 51
14e97811
OB
52Containers are tightly integrated with {pve}. This means that they are aware of
53the cluster setup, and they can use the same network and storage resources as
54virtual machines. You can also use the {pve} firewall, or manage containers
55using the HA framework.
4a2ae9ed 56
fd7fb228
DW
57Our primary goal is to offer an environment that provides the benefits of using a
58VM, but without the additional overhead. This means that Proxmox Containers can
59be categorized as ``System Containers'', rather than ``Application Containers''.
4a2ae9ed 60
fd7fb228
DW
61NOTE: If you want to run application containers, for example, 'Docker' images, it
62is recommended that you run them inside a Proxmox Qemu VM. This will give you
63all the advantages of application containerization, while also providing the
64benefits that VMs offer, such as strong isolation from the host and the ability
65to live-migrate, which otherwise isn't possible with containers.
4a2ae9ed
DM
66
67
99f6ae1a
DM
68Technology Overview
69-------------------
70
71* LXC (https://linuxcontainers.org/)
72
6d718b9b 73* Integrated into {pve} graphical web user interface (GUI)
99f6ae1a
DM
74
75* Easy to use command line tool `pct`
76
77* Access via {pve} REST API
78
6d718b9b 79* 'lxcfs' to provide containerized /proc file system
99f6ae1a 80
6d718b9b 81* Control groups ('cgroups') for resource isolation and limitation
99f6ae1a 82
6d718b9b 83* 'AppArmor' and 'seccomp' to improve security
99f6ae1a 84
14e97811 85* Modern Linux kernels
99f6ae1a 86
a645c907 87* Image based deployment (xref:pct_supported_distributions[templates])
99f6ae1a 88
6d718b9b 89* Uses {pve} xref:chapter_storage[storage library]
99f6ae1a 90
14e97811 91* Container setup from host (network, DNS, storage, etc.)
99f6ae1a 92
69ab602f 93
a645c907
OB
94[[pct_supported_distributions]]
95Supported Distributions
109ca764 96-----------------------
a645c907
OB
97
98List of officially supported distributions can be found below.
99
100Templates for the following distributions are available through our
101repositories. You can use xref:pct_container_images[pveam] tool or the
102Graphical User Interface to download them.
103
104Alpine Linux
109ca764 105~~~~~~~~~~~~
a645c907
OB
106
107[quote, 'https://alpinelinux.org']
108____
109"Alpine Linux is a security-oriented, lightweight Linux distribution based on
110musl libc and busybox."
111____
112
113https://alpinelinux.org/releases/
114
109ca764
TL
115Arch Linux
116~~~~~~~~~~
a645c907
OB
117
118[quote, 'https://wiki.archlinux.org/title/Arch_Linux']
119____
120"a lightweight and flexible Linux® distribution that tries to Keep It Simple."
121____
122
123
124CentOS, Almalinux, Rocky Linux
109ca764 125~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
a645c907 126
109ca764
TL
127CentOS / CentOS Stream
128^^^^^^^^^^^^^^^^^^^^^^
a645c907
OB
129
130[quote, 'https://centos.org']
131____
132"The CentOS Linux distribution is a stable, predictable, manageable and
133reproducible platform derived from the sources of Red Hat Enterprise Linux
134(RHEL)"
135____
136
137https://wiki.centos.org/About/Product
138
109ca764
TL
139Almalinux
140^^^^^^^^^
a645c907
OB
141
142[quote, 'https://almalinux.org']
143____
144"An Open Source, community owned and governed, forever-free
145enterprise Linux distribution, focused on long-term stability, providing a
146robust production-grade platform. AlmaLinux OS is 1:1 binary compatible with
147RHEL® and pre-Stream CentOS."
148____
149
150
151https://en.wikipedia.org/wiki/AlmaLinux#Releases
152
109ca764
TL
153Rocky Linux
154^^^^^^^^^^^
a645c907
OB
155
156[quote, 'https://rockylinux.org']
157____
158"Rocky Linux is a community enterprise operating system designed
159to be 100% bug-for-bug compatible with America's top enterprise Linux
160distribution now that its downstream partner has shifted direction."
161____
162
163https://en.wikipedia.org/wiki/Rocky_Linux#Releases
164
a645c907 165Debian
109ca764 166~~~~~~
a645c907
OB
167
168[quote, 'https://www.debian.org/intro/index#software']
169____
170"Debian is a free operating system, developed and maintained by the Debian
171project. A free Linux distribution with thousands of applications to meet our
172users' needs."
173____
174
175https://www.debian.org/releases/stable/releasenotes
176
177Devuan
109ca764 178~~~~~~
a645c907
OB
179
180[quote, 'https://www.devuan.org']
181____
182"Devuan GNU+Linux is a fork of Debian without systemd that allows users to
183reclaim control over their system by avoiding unnecessary entanglements and
184ensuring Init Freedom."
185____
186
187
188Fedora
109ca764 189~~~~~~
a645c907
OB
190
191[quote, 'https://getfedora.org']
192____
193"Fedora creates an innovative, free, and open source platform for hardware,
194clouds, and containers that enables software developers and community members
195to build tailored solutions for their users."
196____
197
198https://fedoraproject.org/wiki/Releases
199
200Gentoo
109ca764 201~~~~~~
a645c907
OB
202
203[quote, 'https://www.gentoo.org']
204____
205"a highly flexible, source-based Linux distribution."
206____
207
208OpenSUSE
109ca764 209~~~~~~~~
a645c907
OB
210
211[quote, 'https://www.opensuse.org']
212____
213"The makers' choice for sysadmins, developers and desktop users."
214____
215
216https://get.opensuse.org/leap/
217
218Ubuntu
109ca764 219~~~~~~
a645c907
OB
220
221[quote, 'https://docs.ubuntu.com/']
222____
223"The world’s most popular Linux for desktop computing."
224____
225
226https://wiki.ubuntu.com/Releases
227
80c0adcb 228[[pct_container_images]]
d61bab51
DM
229Container Images
230----------------
231
8c1189b6 232Container images, sometimes also referred to as ``templates'' or
69ab602f 233``appliances'', are `tar` archives which contain everything to run a container.
d61bab51 234
a645c907
OB
235{pve} itself provides a variety of basic templates for the
236xref:pct_supported_distributions[most common Linux distributions]. They can be
237downloaded using the GUI or the `pveam` (short for {pve} Appliance Manager)
238command line utility. Additionally, https://www.turnkeylinux.org/[TurnKey
239Linux] container templates are also available to download.
d61bab51 240
2a368b1e
TL
241The list of available templates is updated daily through the 'pve-daily-update'
242timer. You can also trigger an update manually by executing:
3a6fa247 243
14e97811
OB
244----
245# pveam update
246----
3a6fa247 247
14e97811 248To view the list of available images run:
3a6fa247 249
14e97811
OB
250----
251# pveam available
252----
3a6fa247 253
8c1189b6
FG
254You can restrict this large list by specifying the `section` you are
255interested in, for example basic `system` images:
3a6fa247
DM
256
257.List available system images
258----
259# pveam available --section system
151bbda8
TL
260system alpine-3.12-default_20200823_amd64.tar.xz
261system alpine-3.13-default_20210419_amd64.tar.xz
262system alpine-3.14-default_20210623_amd64.tar.xz
263system archlinux-base_20210420-1_amd64.tar.gz
14e97811 264system centos-7-default_20190926_amd64.tar.xz
151bbda8 265system centos-8-default_20201210_amd64.tar.xz
14e97811 266system debian-9.0-standard_9.7-1_amd64.tar.gz
151bbda8
TL
267system debian-10-standard_10.7-1_amd64.tar.gz
268system devuan-3.0-standard_3.0_amd64.tar.gz
269system fedora-33-default_20201115_amd64.tar.xz
270system fedora-34-default_20210427_amd64.tar.xz
271system gentoo-current-default_20200310_amd64.tar.xz
272system opensuse-15.2-default_20200824_amd64.tar.xz
14e97811
OB
273system ubuntu-16.04-standard_16.04.5-1_amd64.tar.gz
274system ubuntu-18.04-standard_18.04.1-1_amd64.tar.gz
151bbda8
TL
275system ubuntu-20.04-standard_20.04-1_amd64.tar.gz
276system ubuntu-20.10-standard_20.10-1_amd64.tar.gz
277system ubuntu-21.04-standard_21.04-1_amd64.tar.gz
3a6fa247
DM
278----
279
69ab602f 280Before you can use such a template, you need to download them into one of your
2a368b1e
TL
281storages. If you're unsure to which one, you can simply use the `local` named
282storage for that purpose. For clustered installations, it is preferred to use a
283shared storage so that all nodes can access those images.
3a6fa247 284
14e97811
OB
285----
286# pveam download local debian-10.0-standard_10.0-1_amd64.tar.gz
287----
3a6fa247 288
69ab602f
TL
289You are now ready to create containers using that image, and you can list all
290downloaded images on storage `local` with:
24f73a63
DM
291
292----
293# pveam list local
14e97811 294local:vztmpl/debian-10.0-standard_10.0-1_amd64.tar.gz 219.95MB
24f73a63
DM
295----
296
2a368b1e
TL
297TIP: You can also use the {pve} web interface GUI to download, list and delete
298container templates.
299
300`pct` uses them to create a new container, for example:
301
302----
303# pct create 999 local:vztmpl/debian-10.0-standard_10.0-1_amd64.tar.gz
304----
305
69ab602f
TL
306The above command shows you the full {pve} volume identifiers. They include the
307storage name, and most other {pve} commands can use them. For example you can
308delete that image later with:
24f73a63 309
14e97811
OB
310----
311# pveam remove local:vztmpl/debian-10.0-standard_10.0-1_amd64.tar.gz
312----
d61bab51 313
690cd737 314
f3afbb70 315[[pct_settings]]
4f785ca7
DM
316Container Settings
317------------------
318
304eb5a9
EK
319[[pct_general]]
320General Settings
321~~~~~~~~~~~~~~~~
322
1ff5e4e8 323[thumbnail="screenshot/gui-create-ct-general.png"]
2225402c 324
304eb5a9
EK
325General settings of a container include
326
327* the *Node* : the physical server on which the container will run
69ab602f
TL
328* the *CT ID*: a unique number in this {pve} installation used to identify your
329 container
304eb5a9
EK
330* *Hostname*: the hostname of the container
331* *Resource Pool*: a logical group of containers and VMs
332* *Password*: the root password of the container
333* *SSH Public Key*: a public key for connecting to the root account over SSH
334* *Unprivileged container*: this option allows to choose at creation time
69ab602f 335 if you want to create a privileged or unprivileged container.
304eb5a9 336
14e97811
OB
337Unprivileged Containers
338^^^^^^^^^^^^^^^^^^^^^^^
339
69ab602f
TL
340Unprivileged containers use a new kernel feature called user namespaces.
341The root UID 0 inside the container is mapped to an unprivileged user outside
342the container. This means that most security issues (container escape, resource
14e97811
OB
343abuse, etc.) in these containers will affect a random unprivileged user, and
344would be a generic kernel security bug rather than an LXC issue. The LXC team
345thinks unprivileged containers are safe by design.
346
347This is the default option when creating a new container.
348
69ab602f
TL
349NOTE: If the container uses systemd as an init system, please be aware the
350systemd version running inside the container should be equal to or greater than
351220.
14e97811 352
304eb5a9
EK
353
354Privileged Containers
355^^^^^^^^^^^^^^^^^^^^^
356
c02ac25b
TL
357Security in containers is achieved by using mandatory access control 'AppArmor'
358restrictions, 'seccomp' filters and Linux kernel namespaces. The LXC team
359considers this kind of container as unsafe, and they will not consider new
360container escape exploits to be security issues worthy of a CVE and quick fix.
361That's why privileged containers should only be used in trusted environments.
304eb5a9 362
304eb5a9 363
9a5e9443 364[[pct_cpu]]
9a5e9443
DM
365CPU
366~~~
367
1ff5e4e8 368[thumbnail="screenshot/gui-create-ct-cpu.png"]
097aa949 369
14e97811
OB
370You can restrict the number of visible CPUs inside the container using the
371`cores` option. This is implemented using the Linux 'cpuset' cgroup
69ab602f
TL
372(**c**ontrol *group*).
373A special task inside `pvestatd` tries to distribute running containers among
374available CPUs periodically.
375To view the assigned CPUs run the following command:
9a5e9443
DM
376
377----
378# pct cpusets
379 ---------------------
380 102: 6 7
381 105: 2 3 4 5
382 108: 0 1
383 ---------------------
384----
385
14e97811
OB
386Containers use the host kernel directly. All tasks inside a container are
387handled by the host CPU scheduler. {pve} uses the Linux 'CFS' (**C**ompletely
388**F**air **S**cheduler) scheduler by default, which has additional bandwidth
389control options.
9a5e9443
DM
390
391[horizontal]
0725e3c6 392
69ab602f
TL
393`cpulimit`: :: You can use this option to further limit assigned CPU time.
394Please note that this is a floating point number, so it is perfectly valid to
395assign two cores to a container, but restrict overall CPU consumption to half a
396core.
9a5e9443
DM
397+
398----
399cores: 2
400cpulimit: 0.5
401----
402
69ab602f
TL
403`cpuunits`: :: This is a relative weight passed to the kernel scheduler. The
404larger the number is, the more CPU time this container gets. Number is relative
405to the weights of all the other running containers. The default is 1024. You
406can use this setting to prioritize some containers.
9a5e9443
DM
407
408
409[[pct_memory]]
410Memory
411~~~~~~
412
1ff5e4e8 413[thumbnail="screenshot/gui-create-ct-memory.png"]
097aa949 414
9a5e9443
DM
415Container memory is controlled using the cgroup memory controller.
416
417[horizontal]
418
69ab602f
TL
419`memory`: :: Limit overall memory usage. This corresponds to the
420`memory.limit_in_bytes` cgroup setting.
9a5e9443 421
69ab602f
TL
422`swap`: :: Allows the container to use additional swap memory from the host
423swap space. This corresponds to the `memory.memsw.limit_in_bytes` cgroup
424setting, which is set to the sum of both value (`memory + swap`).
9a5e9443 425
4f785ca7
DM
426
427[[pct_mount_points]]
9e44e493
DM
428Mount Points
429~~~~~~~~~~~~
eeecce95 430
1ff5e4e8 431[thumbnail="screenshot/gui-create-ct-root-disk.png"]
097aa949 432
14e97811 433The root mount point is configured with the `rootfs` property. You can
69ab602f
TL
434configure up to 256 additional mount points. The corresponding options are
435called `mp0` to `mp255`. They can contain the following settings:
01639994
FG
436
437include::pct-mountpoint-opts.adoc[]
438
69ab602f
TL
439Currently there are three types of mount points: storage backed mount points,
440bind mounts, and device mounts.
9e44e493 441
5eba0743 442.Typical container `rootfs` configuration
4c3b5c77
DM
443----
444rootfs: thin1:base-100-disk-1,size=8G
445----
446
447
5eba0743 448Storage Backed Mount Points
4c3b5c77 449^^^^^^^^^^^^^^^^^^^^^^^^^^^
01639994 450
9e44e493 451Storage backed mount points are managed by the {pve} storage subsystem and come
eeecce95
WB
452in three different flavors:
453
5eba0743 454- Image based: these are raw images containing a single ext4 formatted file
eeecce95 455 system.
5eba0743 456- ZFS subvolumes: these are technically bind mounts, but with managed storage,
eeecce95
WB
457 and thus allow resizing and snapshotting.
458- Directories: passing `size=0` triggers a special case where instead of a raw
459 image a directory is created.
460
03782251
FG
461NOTE: The special option syntax `STORAGE_ID:SIZE_IN_GB` for storage backed
462mount point volumes will automatically allocate a volume of the specified size
69ab602f
TL
463on the specified storage. For example, calling
464
465----
466pct set 100 -mp0 thin1:10,mp=/path/in/container
467----
468
469will allocate a 10GB volume on the storage `thin1` and replace the volume ID
470place holder `10` with the allocated volume ID, and setup the moutpoint in the
471container at `/path/in/container`
03782251 472
4c3b5c77 473
5eba0743 474Bind Mount Points
4c3b5c77 475^^^^^^^^^^^^^^^^^
01639994 476
9baca183
FG
477Bind mounts allow you to access arbitrary directories from your Proxmox VE host
478inside a container. Some potential use cases are:
479
480- Accessing your home directory in the guest
481- Accessing an USB device directory in the guest
acccc49b 482- Accessing an NFS mount from the host in the guest
9baca183 483
eeecce95 484Bind mounts are considered to not be managed by the storage subsystem, so you
9baca183 485cannot make snapshots or deal with quotas from inside the container. With
eeecce95 486unprivileged containers you might run into permission problems caused by the
9baca183
FG
487user mapping and cannot use ACLs.
488
8c1189b6 489NOTE: The contents of bind mount points are not backed up when using `vzdump`.
eeecce95 490
69ab602f
TL
491WARNING: For security reasons, bind mounts should only be established using
492source directories especially reserved for this purpose, e.g., a directory
493hierarchy under `/mnt/bindmounts`. Never bind mount system directories like
494`/`, `/var` or `/etc` into a container - this poses a great security risk.
9baca183
FG
495
496NOTE: The bind mount source path must not contain any symlinks.
497
498For example, to make the directory `/mnt/bindmounts/shared` accessible in the
499container with ID `100` under the path `/shared`, use a configuration line like
8c1189b6
FG
500`mp0: /mnt/bindmounts/shared,mp=/shared` in `/etc/pve/lxc/100.conf`.
501Alternatively, use `pct set 100 -mp0 /mnt/bindmounts/shared,mp=/shared` to
9baca183 502achieve the same result.
6b707f2c 503
4c3b5c77 504
5eba0743 505Device Mount Points
4c3b5c77 506^^^^^^^^^^^^^^^^^^^
fe154a4f 507
7432d78e
FG
508Device mount points allow to mount block devices of the host directly into the
509container. Similar to bind mounts, device mounts are not managed by {PVE}'s
510storage subsystem, but the `quota` and `acl` options will be honored.
511
512NOTE: Device mount points should only be used under special circumstances. In
513most cases a storage backed mount point offers the same performance and a lot
514more features.
515
69ab602f
TL
516NOTE: The contents of device mount points are not backed up when using
517`vzdump`.
01639994 518
4c3b5c77 519
80c0adcb 520[[pct_container_network]]
f5c351f0
DM
521Network
522~~~~~~~
04c569f6 523
1ff5e4e8 524[thumbnail="screenshot/gui-create-ct-network.png"]
097aa949 525
69ab602f
TL
526You can configure up to 10 network interfaces for a single container.
527The corresponding options are called `net0` to `net9`, and they can contain the
528following setting:
bac8c385
DM
529
530include::pct-network-opts.adoc[]
04c569f6
DM
531
532
139a9019
DM
533[[pct_startup_and_shutdown]]
534Automatic Start and Shutdown of Containers
535~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
536
14e97811
OB
537To automatically start a container when the host system boots, select the
538option 'Start at boot' in the 'Options' panel of the container in the web
539interface or run the following command:
139a9019 540
14e97811
OB
541----
542# pct set CTID -onboot 1
543----
139a9019 544
4dbeb548
DM
545.Start and Shutdown Order
546// use the screenshot from qemu - its the same
1ff5e4e8 547[thumbnail="screenshot/gui-qemu-edit-start-order.png"]
4dbeb548 548
69ab602f
TL
549If you want to fine tune the boot order of your containers, you can use the
550following parameters:
139a9019 551
69ab602f
TL
552* *Start/Shutdown order*: Defines the start order priority. For example, set it
553 to 1 if you want the CT to be the first to be started. (We use the reverse
554 startup order for shutdown, so a container with a start order of 1 would be
555 the last to be shut down)
556* *Startup delay*: Defines the interval between this container start and
557 subsequent containers starts. For example, set it to 240 if you want to wait
558 240 seconds before starting other containers.
139a9019 559* *Shutdown timeout*: Defines the duration in seconds {pve} should wait
69ab602f
TL
560 for the container to be offline after issuing a shutdown command.
561 By default this value is set to 60, which means that {pve} will issue a
562 shutdown request, wait 60s for the machine to be offline, and if after 60s
563 the machine is still online will notify that the shutdown action failed.
139a9019 564
69ab602f
TL
565Please note that containers without a Start/Shutdown order parameter will
566always start after those where the parameter is set, and this parameter only
139a9019
DM
567makes sense between the machines running locally on a host, and not
568cluster-wide.
569
0f7778ac
DW
570If you require a delay between the host boot and the booting of the first
571container, see the section on
572xref:first_guest_boot_delay[Proxmox VE Node Management].
573
574
c2c8eb89
DC
575Hookscripts
576~~~~~~~~~~~
577
578You can add a hook script to CTs with the config property `hookscript`.
579
14e97811
OB
580----
581# pct set 100 -hookscript local:snippets/hookscript.pl
582----
c2c8eb89 583
69ab602f
TL
584It will be called during various phases of the guests lifetime. For an example
585and documentation see the example script under
c2c8eb89 586`/usr/share/pve-docs/examples/guest-example-hookscript.pl`.
139a9019 587
bf7f598a
TL
588Security Considerations
589-----------------------
590
591Containers use the kernel of the host system. This exposes an attack surface
592for malicious users. In general, full virtual machines provide better
656d8b21 593isolation. This should be considered if containers are provided to unknown or
bf7f598a
TL
594untrusted people.
595
596To reduce the attack surface, LXC uses many security features like AppArmor,
597CGroups and kernel namespaces.
598
c02ac25b
TL
599AppArmor
600~~~~~~~~
601
bf7f598a
TL
602AppArmor profiles are used to restrict access to possibly dangerous actions.
603Some system calls, i.e. `mount`, are prohibited from execution.
604
605To trace AppArmor activity, use:
606
607----
608# dmesg | grep apparmor
609----
610
c02ac25b
TL
611Although it is not recommended, AppArmor can be disabled for a container. This
612brings security risks with it. Some syscalls can lead to privilege escalation
613when executed within a container if the system is misconfigured or if a LXC or
614Linux Kernel vulnerability exists.
615
616To disable AppArmor for a container, add the following line to the container
617configuration file located at `/etc/pve/lxc/CTID.conf`:
618
619----
76aaaeab 620lxc.apparmor.profile = unconfined
c02ac25b
TL
621----
622
623WARNING: Please note that this is not recommended for production use.
624
625
17238cd3
WB
626[[pct_cgroup]]
627Control Groups ('cgroup')
628~~~~~~~~~~~~~~~~~~~~~~~~~
629
630'cgroup' is a kernel
631mechanism used to hierarchically organize processes and distribute system
632resources.
633
634The main resources controlled via 'cgroups' are CPU time, memory and swap
635limits, and access to device nodes. 'cgroups' are also used to "freeze" a
636container before taking snapshots.
637
638There are 2 versions of 'cgroups' currently available,
639https://www.kernel.org/doc/html/v5.11/admin-guide/cgroup-v1/index.html[legacy]
640and
641https://www.kernel.org/doc/html/v5.11/admin-guide/cgroup-v2.html['cgroupv2'].
642
643Since {pve} 7.0, the default is a pure 'cgroupv2' environment. Previously a
644"hybrid" setup was used, where resource control was mainly done in 'cgroupv1'
645with an additional 'cgroupv2' controller which could take over some subsystems
646via the 'cgroup_no_v1' kernel command line parameter. (See the
647https://www.kernel.org/doc/html/latest/admin-guide/kernel-parameters.html[kernel
648parameter documentation] for details.)
649
75d3c2be
TL
650[[pct_cgroup_compat]]
651CGroup Version Compatibility
652^^^^^^^^^^^^^^^^^^^^^^^^^^^^
17238cd3
WB
653The main difference between pure 'cgroupv2' and the old hybrid environments
654regarding {pve} is that with 'cgroupv2' memory and swap are now controlled
655independently. The memory and swap settings for containers can map directly to
656these values, whereas previously only the memory limit and the limit of the
657*sum* of memory and swap could be limited.
658
659Another important difference is that the 'devices' controller is configured in a
660completely different way. Because of this, file system quotas are currently not
661supported in a pure 'cgroupv2' environment.
662
c80d381a
SI
663'cgroupv2' support by the container's OS is needed to run in a pure 'cgroupv2'
664environment. Containers running 'systemd' version 231 or newer support
665'cgroupv2' footnote:[this includes all newest major versions of container
666templates shipped by {pve}], as do containers not using 'systemd' as init
667system footnote:[for example Alpine Linux].
668
75d3c2be
TL
669[NOTE]
670====
671CentOS 7 and Ubuntu 16.10 are two prominent Linux distributions releases,
672which have a 'systemd' version that is too old to run in a 'cgroupv2'
673environment, you can either
c80d381a 674
75d3c2be
TL
675* Upgrade the whole distribution to a newer release. For the examples above, that
676 could be Ubuntu 18.04 or 20.04, and CentOS 8 (or RHEL/CentOS derivatives like
677 AlmaLinux or Rocky Linux). This has the benefit to get the newest bug and
678 security fixes, often also new features, and moving the EOL date in the future.
679
680* Upgrade the Containers systemd version. If the distribution provides a
681 backports repository this can be an easy and quick stop-gap measurement.
682
683* Move the container, or its services, to a Virtual Machine. Virtual Machines
684 have a much less interaction with the host, that's why one can install
685 decades old OS versions just fine there.
686
687* Switch back to the legacy 'cgroup' controller. Note that while it can be a
688 valid solution, it's not a permanent one. There's a high likelihood that a
689 future {pve} major release, for example 8.0, cannot support the legacy
690 controller anymore.
691====
692
693[[pct_cgroup_change_version]]
694Changing CGroup Version
695^^^^^^^^^^^^^^^^^^^^^^^
696
697TIP: If file system quotas are not required and all containers support 'cgroupv2',
c80d381a 698it is recommended to stick to the new default.
17238cd3
WB
699
700To switch back to the previous version the following kernel command line
701parameter can be used:
702
703----
704systemd.unified_cgroup_hierarchy=0
705----
706
707See xref:sysboot_edit_kernel_cmdline[this section] on editing the kernel boot
708command line on where to add the parameter.
709
710// TODO: seccomp a bit more.
c02ac25b
TL
711// TODO: pve-lxc-syscalld
712
713
0892a2c2
TL
714Guest Operating System Configuration
715------------------------------------
716
717{pve} tries to detect the Linux distribution in the container, and modifies
718some files. Here is a short list of things done at container startup:
719
720set /etc/hostname:: to set the container name
721
722modify /etc/hosts:: to allow lookup of the local hostname
723
724network setup:: pass the complete network setup to the container
725
726configure DNS:: pass information about DNS servers
727
728adapt the init system:: for example, fix the number of spawned getty processes
729
730set the root password:: when creating a new container
731
732rewrite ssh_host_keys:: so that each container has unique keys
733
734randomize crontab:: so that cron does not start at the same time on all containers
735
736Changes made by {PVE} are enclosed by comment markers:
737
738----
739# --- BEGIN PVE ---
740<data>
741# --- END PVE ---
742----
743
744Those markers will be inserted at a reasonable location in the file. If such a
745section already exists, it will be updated in place and will not be moved.
746
747Modification of a file can be prevented by adding a `.pve-ignore.` file for it.
748For instance, if the file `/etc/.pve-ignore.hosts` exists then the `/etc/hosts`
749file will not be touched. This can be a simple empty file created via:
750
751----
752# touch /etc/.pve-ignore.hosts
753----
754
755Most modifications are OS dependent, so they differ between different
756distributions and versions. You can completely disable modifications by
757manually setting the `ostype` to `unmanaged`.
758
759OS type detection is done by testing for certain files inside the
3d5c55fc
TL
760container. {pve} first checks the `/etc/os-release` file
761footnote:[/etc/os-release replaces the multitude of per-distribution
762release files https://manpages.debian.org/stable/systemd/os-release.5.en.html].
763If that file is not present, or it does not contain a clearly recognizable
764distribution identifier the following distribution specific release files are
765checked.
0892a2c2
TL
766
767Ubuntu:: inspect /etc/lsb-release (`DISTRIB_ID=Ubuntu`)
768
769Debian:: test /etc/debian_version
770
771Fedora:: test /etc/fedora-release
772
773RedHat or CentOS:: test /etc/redhat-release
774
775ArchLinux:: test /etc/arch-release
776
777Alpine:: test /etc/alpine-release
778
779Gentoo:: test /etc/gentoo-release
780
781NOTE: Container start fails if the configured `ostype` differs from the auto
782detected type.
783
784
b0df9949
TL
785[[pct_container_storage]]
786Container Storage
787-----------------
788
789The {pve} LXC container storage model is more flexible than traditional
790container storage models. A container can have multiple mount points. This
791makes it possible to use the best suited storage for each application.
792
793For example the root file system of the container can be on slow and cheap
794storage while the database can be on fast and distributed storage via a second
795mount point. See section <<pct_mount_points, Mount Points>> for further
796details.
797
798Any storage type supported by the {pve} storage library can be used. This means
799that containers can be stored on local (for example `lvm`, `zfs` or directory),
800shared external (like `iSCSI`, `NFS`) or even distributed storage systems like
801Ceph. Advanced storage features like snapshots or clones can be used if the
802underlying storage supports them. The `vzdump` backup tool can use snapshots to
803provide consistent container backups.
804
805Furthermore, local devices or local directories can be mounted directly using
806'bind mounts'. This gives access to local resources inside a container with
807practically zero overhead. Bind mounts can be used as an easy way to share data
808between containers.
809
810
811FUSE Mounts
812~~~~~~~~~~~
813
814WARNING: Because of existing issues in the Linux kernel's freezer subsystem the
815usage of FUSE mounts inside a container is strongly advised against, as
816containers need to be frozen for suspend or snapshot mode backups.
817
818If FUSE mounts cannot be replaced by other mounting mechanisms or storage
819technologies, it is possible to establish the FUSE mount on the Proxmox host
820and use a bind mount point to make it accessible inside the container.
821
822
823Using Quotas Inside Containers
824~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
825
826Quotas allow to set limits inside a container for the amount of disk space that
827each user can use.
828
17238cd3
WB
829NOTE: This currently requires the use of legacy 'cgroups'.
830
b0df9949
TL
831NOTE: This only works on ext4 image based storage types and currently only
832works with privileged containers.
833
834Activating the `quota` option causes the following mount options to be used for
835a mount point:
836`usrjquota=aquota.user,grpjquota=aquota.group,jqfmt=vfsv0`
837
838This allows quotas to be used like on any other system. You can initialize the
839`/aquota.user` and `/aquota.group` files by running:
840
841----
842# quotacheck -cmug /
843# quotaon /
844----
845
846Then edit the quotas using the `edquota` command. Refer to the documentation of
847the distribution running inside the container for details.
848
849NOTE: You need to run the above commands for every mount point by passing the
850mount point's path instead of just `/`.
851
852
853Using ACLs Inside Containers
854~~~~~~~~~~~~~~~~~~~~~~~~~~~~
855
856The standard Posix **A**ccess **C**ontrol **L**ists are also available inside
857containers. ACLs allow you to set more detailed file ownership than the
858traditional user/group/others model.
859
860
861Backup of Container mount points
862~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
863
864To include a mount point in backups, enable the `backup` option for it in the
865container configuration. For an existing mount point `mp0`
866
867----
868mp0: guests:subvol-100-disk-1,mp=/root/files,size=8G
869----
870
871add `backup=1` to enable it.
872
873----
874mp0: guests:subvol-100-disk-1,mp=/root/files,size=8G,backup=1
875----
876
877NOTE: When creating a new mount point in the GUI, this option is enabled by
878default.
879
880To disable backups for a mount point, add `backup=0` in the way described
881above, or uncheck the *Backup* checkbox on the GUI.
882
883Replication of Containers mount points
884~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
885
886By default, additional mount points are replicated when the Root Disk is
887replicated. If you want the {pve} storage replication mechanism to skip a mount
888point, you can set the *Skip replication* option for that mount point.
889As of {pve} 5.0, replication requires a storage of type `zfspool`. Adding a
890mount point to a different type of storage when the container has replication
891configured requires to have *Skip replication* enabled for that mount point.
892
893
51e33128
FG
894Backup and Restore
895------------------
896
5eba0743 897
2175e37b
FG
898Container Backup
899~~~~~~~~~~~~~~~~
900
69ab602f
TL
901It is possible to use the `vzdump` tool for container backup. Please refer to
902the `vzdump` manual page for details.
8c1189b6 903
51e33128 904
2175e37b
FG
905Restoring Container Backups
906~~~~~~~~~~~~~~~~~~~~~~~~~~~
907
69ab602f
TL
908Restoring container backups made with `vzdump` is possible using the `pct
909restore` command. By default, `pct restore` will attempt to restore as much of
910the backed up container configuration as possible. It is possible to override
911the backed up configuration by manually setting container options on the
912command line (see the `pct` manual page for details).
2175e37b 913
8c1189b6 914NOTE: `pvesm extractconfig` can be used to view the backed up configuration
2175e37b
FG
915contained in a vzdump archive.
916
917There are two basic restore modes, only differing by their handling of mount
918points:
919
4c3b5c77 920
8c1189b6
FG
921``Simple'' Restore Mode
922^^^^^^^^^^^^^^^^^^^^^^^
2175e37b 923
69ab602f
TL
924If neither the `rootfs` parameter nor any of the optional `mpX` parameters are
925explicitly set, the mount point configuration from the backed up configuration
926file is restored using the following steps:
2175e37b
FG
927
928. Extract mount points and their options from backup
324efba3
FG
929. Create volumes for storage backed mount points on the storage provided with
930 the `storage` parameter (default: `local`).
2175e37b 931. Extract files from backup archive
69ab602f
TL
932. Add bind and device mount points to restored configuration (limited to root
933 user)
2175e37b
FG
934
935NOTE: Since bind and device mount points are never backed up, no files are
936restored in the last step, but only the configuration options. The assumption
937is that such mount points are either backed up with another mechanism (e.g.,
938NFS space that is bind mounted into many containers), or not intended to be
939backed up at all.
940
941This simple mode is also used by the container restore operations in the web
942interface.
943
4c3b5c77 944
8c1189b6
FG
945``Advanced'' Restore Mode
946^^^^^^^^^^^^^^^^^^^^^^^^^
2175e37b
FG
947
948By setting the `rootfs` parameter (and optionally, any combination of `mpX`
8c1189b6 949parameters), the `pct restore` command is automatically switched into an
2175e37b 950advanced mode. This advanced mode completely ignores the `rootfs` and `mpX`
69ab602f
TL
951configuration options contained in the backup archive, and instead only uses
952the options explicitly provided as parameters.
2175e37b 953
69ab602f
TL
954This mode allows flexible configuration of mount point settings at restore
955time, for example:
2175e37b
FG
956
957* Set target storages, volume sizes and other options for each mount point
69ab602f 958 individually
2175e37b
FG
959* Redistribute backed up files according to new mount point scheme
960* Restore to device and/or bind mount points (limited to root user)
961
51e33128 962
8c1189b6 963Managing Containers with `pct`
04c569f6
DM
964------------------------------
965
6d718b9b
TL
966The ``Proxmox Container Toolkit'' (`pct`) is the command line tool to manage
967{pve} containers. It enables you to create or destroy containers, as well as
968control the container execution (start, stop, reboot, migrate, etc.). It can be
969used to set parameters in the config file of a container, for example the
970network configuration or memory limits.
5eba0743 971
04c569f6
DM
972CLI Usage Examples
973~~~~~~~~~~~~~~~~~~
974
69ab602f
TL
975Create a container based on a Debian template (provided you have already
976downloaded the template via the web interface)
04c569f6 977
14e97811
OB
978----
979# pct create 100 /var/lib/vz/template/cache/debian-10.0-standard_10.0-1_amd64.tar.gz
980----
04c569f6
DM
981
982Start container 100
983
14e97811
OB
984----
985# pct start 100
986----
04c569f6
DM
987
988Start a login session via getty
989
14e97811
OB
990----
991# pct console 100
992----
04c569f6
DM
993
994Enter the LXC namespace and run a shell as root user
995
14e97811
OB
996----
997# pct enter 100
998----
04c569f6
DM
999
1000Display the configuration
1001
14e97811
OB
1002----
1003# pct config 100
1004----
04c569f6 1005
69ab602f
TL
1006Add a network interface called `eth0`, bridged to the host bridge `vmbr0`, set
1007the address and gateway, while it's running
04c569f6 1008
14e97811
OB
1009----
1010# pct set 100 -net0 name=eth0,bridge=vmbr0,ip=192.168.15.147/24,gw=192.168.15.1
1011----
04c569f6
DM
1012
1013Reduce the memory of the container to 512MB
1014
14e97811
OB
1015----
1016# pct set 100 -memory 512
1017----
0585f29a 1018
87927c65
DJ
1019Destroying a container always removes it from Access Control Lists and it always
1020removes the firewall configuration of the container. You have to activate
1021'--purge', if you want to additionally remove the container from replication jobs,
1022backup jobs and HA resource configurations.
1023
1024----
1025# pct destroy 100 --purge
1026----
1027
1028
04c569f6 1029
fe57a420
FG
1030Obtaining Debugging Logs
1031~~~~~~~~~~~~~~~~~~~~~~~~
1032
1033In case `pct start` is unable to start a specific container, it might be
59b89a69
OB
1034helpful to collect debugging output by passing the `--debug` flag (replace `CTID` with
1035the container's CTID):
fe57a420 1036
14e97811 1037----
59b89a69
OB
1038# pct start CTID --debug
1039----
1040
97e4455e
TL
1041Alternatively, you can use the following `lxc-start` command, which will save
1042the debug log to the file specified by the `-o` output option:
59b89a69
OB
1043
1044----
1045# lxc-start -n CTID -F -l DEBUG -o /tmp/lxc-CTID.log
14e97811 1046----
fe57a420 1047
69ab602f 1048This command will attempt to start the container in foreground mode, to stop
59b89a69 1049the container run `pct shutdown CTID` or `pct stop CTID` in a second terminal.
fe57a420 1050
59b89a69 1051The collected debug log is written to `/tmp/lxc-CTID.log`.
fe57a420
FG
1052
1053NOTE: If you have changed the container's configuration since the last start
1054attempt with `pct start`, you need to run `pct start` at least once to also
1055update the configuration used by `lxc-start`.
1056
33f50e04
DC
1057[[pct_migration]]
1058Migration
1059---------
1060
1061If you have a cluster, you can migrate your Containers with
1062
14e97811
OB
1063----
1064# pct migrate <ctid> <target>
1065----
33f50e04
DC
1066
1067This works as long as your Container is offline. If it has local volumes or
14e97811 1068mount points defined, the migration will copy the content over the network to
ba021358 1069the target host if the same storage is defined there.
33f50e04 1070
656d8b21 1071Running containers cannot live-migrated due to technical limitations. You can
4c82550d
TL
1072do a restart migration, which shuts down, moves and then starts a container
1073again on the target node. As containers are very lightweight, this results
1074normally only in a downtime of some hundreds of milliseconds.
1075
1076A restart migration can be done through the web interface or by using the
1077`--restart` flag with the `pct migrate` command.
33f50e04 1078
69ab602f
TL
1079A restart migration will shut down the Container and kill it after the
1080specified timeout (the default is 180 seconds). Then it will migrate the
1081Container like an offline migration and when finished, it starts the Container
1082on the target node.
c7bc47af
DM
1083
1084[[pct_configuration]]
1085Configuration
1086-------------
1087
69ab602f
TL
1088The `/etc/pve/lxc/<CTID>.conf` file stores container configuration, where
1089`<CTID>` is the numeric ID of the given container. Like all other files stored
1090inside `/etc/pve/`, they get automatically replicated to all other cluster
1091nodes.
c7bc47af
DM
1092
1093NOTE: CTIDs < 100 are reserved for internal purposes, and CTIDs need to be
1094unique cluster wide.
1095
1096.Example Container Configuration
1097----
1098ostype: debian
1099arch: amd64
1100hostname: www
1101memory: 512
1102swap: 512
1103net0: bridge=vmbr0,hwaddr=66:64:66:64:64:36,ip=dhcp,name=eth0,type=veth
1104rootfs: local:107/vm-107-disk-1.raw,size=7G
1105----
1106
69ab602f 1107The configuration files are simple text files. You can edit them using a normal
da9679b6 1108text editor, for example, `vi` or `nano`.
69ab602f
TL
1109This is sometimes useful to do small corrections, but keep in mind that you
1110need to restart the container to apply such changes.
c7bc47af 1111
69ab602f
TL
1112For that reason, it is usually better to use the `pct` command to generate and
1113modify those files, or do the whole thing using the GUI.
1114Our toolkit is smart enough to instantaneously apply most changes to running
da9679b6 1115containers. This feature is called ``hot plug'', and there is no need to restart
69ab602f 1116the container in that case.
c7bc47af 1117
da9679b6 1118In cases where a change cannot be hot-plugged, it will be registered as a
69ab602f
TL
1119pending change (shown in red color in the GUI).
1120They will only be applied after rebooting the container.
14e97811 1121
c7bc47af
DM
1122
1123File Format
1124~~~~~~~~~~~
1125
69ab602f
TL
1126The container configuration file uses a simple colon separated key/value
1127format. Each line has the following format:
c7bc47af
DM
1128
1129-----
1130# this is a comment
1131OPTION: value
1132-----
1133
69ab602f
TL
1134Blank lines in those files are ignored, and lines starting with a `#` character
1135are treated as comments and are also ignored.
c7bc47af 1136
69ab602f 1137It is possible to add low-level, LXC style configuration directly, for example:
c7bc47af 1138
14e97811
OB
1139----
1140lxc.init_cmd: /sbin/my_own_init
1141----
c7bc47af
DM
1142
1143or
1144
14e97811
OB
1145----
1146lxc.init_cmd = /sbin/my_own_init
1147----
c7bc47af 1148
14e97811 1149The settings are passed directly to the LXC low-level tools.
c7bc47af
DM
1150
1151
1152[[pct_snapshots]]
1153Snapshots
1154~~~~~~~~~
1155
69ab602f
TL
1156When you create a snapshot, `pct` stores the configuration at snapshot time
1157into a separate snapshot section within the same configuration file. For
1158example, after creating a snapshot called ``testsnapshot'', your configuration
1159file will look like this:
c7bc47af
DM
1160
1161.Container configuration with snapshot
1162----
1163memory: 512
1164swap: 512
1165parent: testsnaphot
1166...
1167
1168[testsnaphot]
1169memory: 512
1170swap: 512
1171snaptime: 1457170803
1172...
1173----
1174
69ab602f
TL
1175There are a few snapshot related properties like `parent` and `snaptime`. The
1176`parent` property is used to store the parent/child relationship between
1177snapshots. `snaptime` is the snapshot creation time stamp (Unix epoch).
c7bc47af
DM
1178
1179
1180[[pct_options]]
1181Options
1182~~~~~~~
1183
1184include::pct.conf.5-opts.adoc[]
1185
1186
2a11aa70
DM
1187Locks
1188-----
1189
69ab602f
TL
1190Container migrations, snapshots and backups (`vzdump`) set a lock to prevent
1191incompatible concurrent actions on the affected container. Sometimes you need
1192to remove such a lock manually (e.g., after a power failure).
2a11aa70 1193
14e97811
OB
1194----
1195# pct unlock <CTID>
1196----
2a11aa70 1197
69ab602f
TL
1198CAUTION: Only do this if you are sure the action which set the lock is no
1199longer running.
2a11aa70 1200
fe57a420 1201
0c6b782f 1202ifdef::manvolnum[]
3bd9d0cf
DM
1203
1204Files
1205------
1206
1207`/etc/pve/lxc/<CTID>.conf`::
1208
1209Configuration file for the container '<CTID>'.
1210
1211
0c6b782f
DM
1212include::pve-copyright.adoc[]
1213endif::manvolnum[]