容器是完全虚拟机(vm)的轻量级替代方案。它们使用运行在其上的主机系统的内核,而不是模拟一个完整的操作系统(OS)。这意味着容器可以直接访问主机系统上的资源。

容器的运行时成本很低,通常可以忽略不计。然而,也有一些缺点需要考虑:

  • 只有Linux发行版可以在Proxmox容器中运行。它不可能在容器中运行其他操作系统,例如FreeBSD或Microsoft Windows。

  • 出于安全原因,需要限制对主机资源的访问。因此,容器运行在它们自己独立的名称空间中。此外,容器内不允许某些系统调用(对Linux内核的用户空间请求)。

Proxmox VE使用Linux容器LXC作为其底层容器技术。“Proxmox容器工具包”(pct)通过提供一个抽象复杂任务的接口简化了LXC的使用和管理。

容器与Proxmox VE紧密集成。这意味着它们知道集群设置,它们可以使用与虚拟机相同的网络和存储资源。您还可以使用Proxmox VE防火墙,或者使用HA框架管理容器。

我们的主要目标是提供一个能够提供使用VM的好处,但又不会带来额外开销的环境。这意味着Proxmox容器可以被归类为“系统容器”,而不是“应用程序容器”。

  1. 请注意
  2. 如果要运行应用程序容器(例如Docker映像),建议在Proxmox Qemu虚拟机中运行它们。这将为您提供应用程序容器化的所有优点,同时也提供VMs所提供的优点,例如与主机的强隔离以及动态迁移的能力,否则容器就不可能做到这一点。

11.1、技术概述

  • LXC
  • 集成到Proxmox VE图形web用户界面(GUI)
  • 易于使用的命令行工具pct
  • 通过Proxmox VE REST API访问
  • lxcfs提供容器化/proc文件系统
  • 用于隔离和限制资源的控制组(cgroup)
  • apmoror和seccomp提高安全性
  • 现代Linux内核
  • 基于镜像的部署(模板)
  • 使用Proxmox VE存储库 (第七章)
  • 从主机设置容器(网络,DNS,存储等)

11.2、容器的镜像

容器映像(有时也称为“模板”或“工具”)是tar存档,其中包含运行容器所需的所有内容。

Proxmox VE本身为最常见的Linux发行版提供了各种基本模板。可以使用GUI或pveam (Proxmox VE Appliance Manager的缩写)命令行工具下载。此外,还可以下载交钥匙Linux容器模板。

可用模板列表每天通过pve-daily-update计时器更新。你也可以通过执行以下命令手动触发更新:

# pveam update

要查看可用的图像列表,运行:

# pveam available

你可以通过指定你感兴趣的部分来限制这个大列表,例如基本系统映像:

列出可用的系统映像

  1. # pveam available --section system
  2. system alpine-3.10-default_20190626_amd64.tar.xz
  3. system alpine-3.9-default_20190224_amd64.tar.xz
  4. system archlinux-base_20190924-1_amd64.tar.gz
  5. system centos-6-default_20191016_amd64.tar.xz
  6. system centos-7-default_20190926_amd64.tar.xz
  7. system centos-8-default_20191016_amd64.tar.xz
  8. system debian-10.0-standard_10.0-1_amd64.tar.gz
  9. system debian-8.0-standard_8.11-1_amd64.tar.gz
  10. system debian-9.0-standard_9.7-1_amd64.tar.gz
  11. system fedora-30-default_20190718_amd64.tar.xz
  12. system fedora-31-default_20191029_amd64.tar.xz
  13. system gentoo-current-default_20190718_amd64.tar.xz
  14. system opensuse-15.0-default_20180907_amd64.tar.xz
  15. system opensuse-15.1-default_20190719_amd64.tar.xz
  16. system ubuntu-16.04-standard_16.04.5-1_amd64.tar.gz
  17. system ubuntu-18.04-standard_18.04.1-1_amd64.tar.gz
  18. system ubuntu-19.04-standard_19.04-1_amd64.tar.gz
  19. system ubuntu-19.10-standard_19.10-1_amd64.tar.gz

在使用这样的模板之前,您需要将它们下载到您的一个存储中。如果不确定是哪一个,可以简单地使用本地命名存储来实现这个目的。对于集群安装,最好使用共享存储,这样所有节点都可以访问这些映像。

# pveam download local debian-10.0-standard_10.0-1_amd64.tar.gz

现在你已经准备好使用该映像创建容器了,你可以在storage local上列出所有下载的映像:

# pveam list local
local:vztmpl/debian-10.0-standard_10.0-1_amd64.tar.gz219.95MB

  1. 提示
  2. 您还可以使用Proxmox VE web界面GUI下载、列出和删除容器模板。

pct使用它们来创建一个新的容器,例如:

# pct create 999 local:vztmpl/debian-10.0-standard_10.0-1_amd64.tar.gz

上面的命令显示了完整的Proxmox VE卷标识符。它们包括存储名称,大多数其他Proxmox VE命令都可以使用它们。例如,你可以用下面的命令删除这张图片:

# pveam remove local:vztmpl/debian-10.0-standard_10.0-1_amd64.tar.gz

11.3、容器设置

11.3.1、一般设置

image.png
容器的一般设置包括

  • 节点:运行容器的物理服务器
  • CT ID:在这个Proxmox VE安装中用来标识您的容器的唯一编号
  • Hostname:容器的主机名
  • 资源池:容器和虚拟机的逻辑分组
  • 密码:容器的root密码
  • SSH公钥:SSH连接root帐号时使用的公钥
  • 非特权容器:该选项允许在创建时选择是否创建特权或非特权容器。

非特权容器

非特权容器使用一种称为用户名称空间的新内核特性。容器内的根UID 0映射到容器外的非特权用户。这意味着这些容器中的大多数安全问题(容器转逃、资源滥用等)将影响随机的非特权用户,并将是一个通用的内核安全漏洞,而不是LXC问题。LXC团队认为,从设计上看,非特权容器是安全的。

这是创建新容器时的默认选项。

  1. 请注意
  2. 如果容器使用systemd作为init系统,请注意在容器中运行的systemd版本应该等于或大于220.

享有特权的容器

容器中的安全性是通过使用强制访问控制AppArmor限制、seccomp过滤器和Linux内核名称空间来实现的。LXC团队认为这种容器是不安全的,他们不会认为新的容器逃脱漏洞是值得使用CVE和快速修复的安全问题。这就是为什么特权容器只应该在受信任的环境中使用。

11.3.2、CPU

image.png
可以使用cores选项限制容器内可见cpu的数量。这是使用Linux cpuset cgroup (control group)实现的。pvestatd中的一个特殊任务试图定期将正在运行的容器分发到可用的cpu中。使用实例查看已分配的cpu。

# pct cpusets
---------------------
102: 6 7
105: 2 3 4 5
108:0 1
---------------------

容器直接使用宿主内核。容器内的所有任务都由主机CPU调度器处理。Proxmox VE默认使用Linux CFS(完全公平调度程序)调度程序,它有额外的带宽控制选项。

cpulimit: 可以使用此选项进一步限制分配的CPU时间。请注意,这是一个浮点数,因此将两个核分配给一个容器是完全有效的,但将总体CPU消耗限制为半个核。

核心:2
cpulimit: 0.5

cpuunits: 这是传递给内核调度器的相对权重。数字越大,则
这个容器获得的更多CPU时间。数量与所有其他运行容器的重量相关。缺省值为1024。您可以使用此设置对某些容器进行优先级排序。

11.3.3、内存

image.png
容器内存使用cgroup内存控制器控制。

内存: 限制总体内存使用。这对应 memory.limit_in_bytes cgroup设置。

swap: 允许容器使用来自主机交换空间的额外交换内存。这对应于memory.memsw.limit_in_bytes cgroup设置,它被设置为两个值(内存+ swap)的和。

11.3.4、挂载点

image.png
根挂载点配置了rootfs属性。您可以配置最多256个额外的挂载点。相应的选项称为mp0到mp255。它们可以包含以下设置:

rootfs: [volume=] [,acl=<1|0>][,mountoptions=] [,quota=<1|0>] [,replicate=<1|0>][,ro=<1|0>] [,shared=<1|0>] [,size=]
使用volume作为容器根。请参阅下面所有选项的详细描述。

mp[n]: [volume=] ,mp= [,acl=<1|0>] [,backup=<1|0>][,mountoptions=] [,quota=<1|0>] [,replicate=<1|0>][,ro=<1|0>] [,shared=<1|0>] [,size=]
使用容积作为容器安装点。

acl=
显式启用或禁用ACL支持。

backup=
是否在备份中包含挂载点(仅用于卷挂载点)。

mountoptions=
额外的挂载选项为rootfs/mps。

mp=
从容器内部看到的到挂载点的路径。

  1. 请注意
  2. 出于安全考虑,不能包含任何符号链接。

quota=
在容器内启用用户配额(zfs子卷不支持)

replicate= (default = 1)
将该卷包含到存储复制作业中。

ro=
只读的挂载点

shared= (default = 0)
将这个非卷挂载点标记为在所有节点上可用。

  1. 警告
  2. 这个选项不会自动共享挂载点,它假设已经共享了这个挂载点

size=
卷大小(只读值)。

volume=
要装入容器的卷、设备或目录。

目前有三种类型的挂载点:存储备份挂载点、绑定挂载和设备挂载。

典型的容器rootfs配置
**
rootfs: thin1:base-100-disk-1,size=8G

存储支持的挂载点
**
存储支持的挂载点由Proxmox VE存储子系统管理,有三种不同的方式:

  • 基于图像:这些是原始图像包含一个单独的ext4格式文件系统。
  • ZFS子卷:从技术上讲,这些子卷是绑定挂载,但是有托管存储,因此允许调整大小和进行快照。
  • 目录:传递size=0会触发一个特殊情况,即不是创建一个原始映像,而是创建一个目录。
    1. 请注意
    2. 特殊选项语法STORAGE_ID:SIZE_IN_GB用于存储备份挂载点卷将在指定的存储上自动分配指定大小的卷。例如,调用
    pct set 100 -mp0 thin1:10,mp=/path/in/container

是否会在thin1上分配一个10GB的卷,用分配的卷ID替换卷ID位置持有人10,并在/path/in/container的容器中设置挂载点

绑定挂载点

绑定挂载允许您从容器中的Proxmox VE主机访问任意目录。一些潜在的用例是:

  • 在guest中访问您的主目录
  • 访问客户端的USB设备目录
  • 在客户端中访问NFS挂载

绑定挂载被认为不受存储子系统的管理,因此不能在容器内创建快照或处理配额。使用非特权容器,您可能会遇到由用户映射引起的权限问题,不能使用acl。

  1. 请注意
  2. 使用vzdump时,不会备份绑定挂载点的内容。
  3. 警告
  4. 出于安全原因,绑定挂载应该只使用专为此目的保留的源目录建立,例如/mnt/bindmounts目录层次结构。永远不要把挂载系统目录(如/,/var或/etc)绑定到一个容器中——这会带来很大的安全风险。
  5. 请注意
  6. 绑定挂载的源路径不能包含任何符号链接。

例如,要使/shared目录下ID为100的容器中的目录/mnt/bindmounts/shared可以访问,可以在/etc/pve/lxc/100.conf中使用mp0:/mnt/bindmounts/shared,mp=/shared。或者,使用pct set 100 -mp0 /mnt/bindmounts/shared,mp=/shared来达到相同的结果。

设备挂载点

设备挂载点允许将主机的块设备直接挂载到容器中。与绑定挂载类似,设备挂载不由Proxmox VE的存储子系统管理,但配额和acl选项将受到尊重。

  1. 请注意
  2. 设备挂载点只能在特殊情况下使用。在大多数情况下,存储支持的挂载点提供了同样的性能和更多的特性。
  3. 请注意
  4. 使用vzdump时,不会备份设备挂载点的内容。

11.3.5、网络

image.png
一个容器最多可以配置10个网络接口。对应的选项称为net0到net9,它们可以包含以下设置:

net[n]: name= [,bridge=] [,firewall=<1|0>]
[,gw=] [,gw6=]
[,hwaddr=] [,ip=<(IPv4/CIDR|dhcp|manual)>]
[,ip6=<(IPv6/CIDR|auto|dhcp|manual)>] [,mtu=]
[,rate=] [,tag=] [,trunks=]
[,type=]
指定容器的网络接口。

bridge=
网桥连接网络设备。

firewall=
控制是否应该使用该接口的防火墙规则。

gw=
IPv4流量的默认网关。

gw6=
IPv6流量的默认网关。

hwaddr=
一个没有设置I/G(个人/组)位的通用MAC地址。

ip=<(IPv4/CIDR|dhcp|manual)>
IPv4 CIDR格式地址。

ip6=<(IPv6/CIDR|auto|dhcp|manual)>
CIDR格式的IPv6地址。

mtu= (64 - N)
接口的最大传输单元。(lxc.network.mtu)

name=
从容器内部看到的网络设备名称。(lxc.network.name)

rate=
对接口进行速率限制

tag= (1 - 4094)
接口的VLAN tag。

trunks=
接口需要通过的VLAN id

type=
网络接口类型。

11.3.6、自动启动和关闭容器

如果需要在主机系统启动时自动启动容器,请在web界面的容器选项面板中选择“start at boot”选项或执行以下命令:

# pct set CTID -onboot 1

启停指令
image.png
如果你想调整容器的引导顺序,你可以使用以下参数:

  • Start/Shutdown order:定义启动顺序优先级。例如,如果希望第一个启动CT,则将其设置为1。(我们使用反向的启动顺序来关闭,因此一个启动顺序为1的容器将是最后一个关闭的容器)

  • Startup delay:定义了这个容器启动和后续容器启动之间的时间间隔。例如,如果您希望在启动其他容器之前等待240秒,则将其设置为240。

  • Shutdown timeout:在发出Shutdown命令后,Proxmox VE应该等待容器离线的时间,以秒为单位。默认情况下,此值被设置为60,这意味着Proxmox VE将发出关机请求,等待60秒直到机器脱机,如果超过60秒机器仍然在线,则将通知关闭操作失败。

请注意,没有启动/关闭顺序参数的容器总是在设置了该参数的容器之后启动,而且该参数只在主机上本地运行的机器之间有意义,而不是在集群范围内。

11.3.7、挂钩脚本

您可以通过配置属性hookscript向CTs添加一个钩子脚本。

# pct set 100 -hookscript local:snippets/hookscript.pl

它将在来宾生命周期的各个阶段被调用。有关示例和文档,请参阅/usr/share/pve-docs/examples/guest-example-hookscript.pl下的示例脚本。

11.4、安全注意事项

容器使用主机系统的内核。这为恶意用户暴露了一个攻击面。通常,完整的虚拟机提供更好的隔离。如果集装箱是提供给未知或不可信的人,就应该考虑这一点。

为了减少攻击面,LXC使用了许多安全特性,如AppArmor、CGroups和内核名称空间。

11.4.1、AppArmor

AppArmor轮廓用于限制可能危险的行为。一些系统调用,例如mount,被禁止执行。

追踪AppArmor活动,使用:

# dmesg | grep apparmor

虽然不推荐,但可以禁用容器的AppArmor。这也带来了安全风险。如果系统配置错误,或者存在LXC或Linux内核漏洞,在容器内执行某些系统调用可能导致特权升级。

要禁用容器的AppArmor,在/etc/pve/ lxcc / ctid .conf文件中添加以下一行:

lxc.apparmor.profile = unconfined

  1. 警告
  2. 请注意,不建议在生产环境中使用。

11.5、客户操作系统设置

Proxmox VE尝试检测容器中的Linux发行版,并修改一些文件。以下是在container startup公司所做的一些事情:

set /etc/hostname
设置容器名称

modify /etc/hosts
允许查找本地主机名

network setup
将完整的网络设置传递给容器

configure DNS
传递关于DNS服务器的信息

adapt the init system
例如,确定生成的getty进程的数量

set the root password
当创建一个新的容器时

rewrite ssh_host_keys
这样每个容器都有唯一的键

randomize crontab
这样cron就不会在所有容器上同时启动

Proxmox VE所做的更改被注释标记括起来:

# --- BEGIN PVE ---
<data>
# --- END PVE ---

这些标记将被插入到文件中的一个合理位置。如果这样的部分已经存在,它将被更新到位,不会被移动。

可以通过添加.pve-ignore来阻止对文件的修改。文件。例如,如果文件/etc/.pve-ignore.host存在,那么/etc/hosts文件将不会被修改。这可以是一个简单的空文件,通过以下方式创建:

# touch /etc/.pve-ignore.hosts

大多数修改都与操作系统相关,因此它们在不同的发行版和版本之间有所不同。您可以通过手动将ostype设置为非托管来完全禁用修改。

OS类型检测是通过测试容器内的某些文件来完成的。Proxmox VE首先检查/etc/os-release文件。如果该文件不存在,或者它不包含清晰可识别的发行版标识符,那么将检查以下特定于发行版的发行版文件。

Ubuntu
检查/etc/lsb-release (DISTRIB_ID = Ubuntu)

Debian
测试/etc/debian_version

Fedora
测试/etc/fedora-release

RedHat or CentOS
测试/etc/redhat-release

ArchLinux
测试/etc/arch-release

Alpine
测试/etc/alpine-release

Gentoo
测试/etc/gentoo-release

  1. 请注意
  2. 如果配置的ostype与自动检测到的类型不同,则容器启动失败。

11.6、容器存储

Proxmox VE LXC容器存储模型比传统的容器存储模型更灵活。一个容器可以有多个挂载点。这使得为每个应用程序使用最适合的存储成为可能。

例如,容器的根文件系统可以处于缓慢且廉价的存储状态,而数据库可以通过第二个挂载点处于快速且分布式的存储状态。有关更多细节,请参阅挂载点一节。

可以使用Proxmox VE存储库支持的任何存储类型。这意味着容器可以存储在本地(例如lvm、zfs或目录)、共享外部(如iSCSI、NFS)或甚至分布式存储系统(如Ceph)上。如果底层存储支持快照或克隆等高级存储特性,则可以使用它们。vzdump备份工具可以使用快照提供一致的容器备份。

此外,可以使用绑定挂载直接挂载本地设备或本地目录。这使得访问容器内的本地资源的开销几乎为零。绑定挂载可以作为在容器之间共享数据的一种简单方式。

11.6.1、FUSE挂载

  1. 警告
  2. 由于Linux内核的freeze子系统中存在一些问题,所以强烈建议不要在容器中使用FUSE,因为容器需要被冻结以进行挂起或快照模式备份。

如果其他安装机制或存储技术无法替换FUSE安装,则可以在Proxmox主机上建立FUSE安装,并使用绑定安装点使其在容器内可访问。

11.6.2、在容器内使用配额

配额允许在容器内为每个用户可以使用的磁盘空间数量设置限制。

  1. 请注意
  2. 这只适用于基于ext4映像的存储类型,并且目前只适用于特权容器。

激活配额选项将导致对一个挂载点使用以下挂载选项:usrjquota=aquota.user,grpjquota=aquota。这允许像在任何其他系统上一样使用配额。可以初始化 /aquota.user和/aquota.group文件通过运行:

# quotacheck -cmug /
# quotaon /

然后使用edquota命令编辑配额。有关详细信息,请参阅在容器内运行的发行版的文档。

  1. 请注意
  2. 您需要为每个挂载点运行上述命令,传递挂载点的路径,而不只是/。

11.6.3、在容器内使用acl

标准Posix访问控制列表也可以在容器内部使用。与传统的用户/组/其他人模型相比,acl允许您设置更详细的文件所有权。

11.6.4、备份容器挂载点

要在backups中包含一个挂载点,请在容器配置中为它启用备份选项。对于现有的挂载点mp0

mp0: guests:subvol-100-disk-1,mp=/root/files,size=8G

添加backup=1来启用它。

mp0: guests:subvol-100-disk-1,mp=/root/files,size=8G,backup=1

  1. 请注意
  2. GUI中创建新的挂载点时,默认情况下启用此选项。

要禁用挂载点的备份,按照上面描述的方式添加backup=0,或者在GUI上取消选中backup复选框。

11.6.5、复制容器挂载点

默认情况下,在复制根磁盘时复制附加的挂载点。如果希望Proxmox VE存储复制机制跳过某个挂载点,可以为该挂载点设置skip replication选项。在Proxmox VE 5.0中,复制需要zfspool类型的存储。当容器配置了复制时,向不同类型的存储添加一个挂载点需要为该挂载点启用跳过复制。

11.7、备份和恢复

11.7.1、容器的备份

可以使用vzdump工具进行容器备份。详情请参考vzdump手册页面。

11.7.2、容器恢复备份

可以使用pct restore命令还原vzdump所做的容器备份,默认情况下,pct restore将尝试还原尽可能多的已备份的容器配置。可以通过在命令行上手动设置容器选项来覆盖备份的配置(详细信息请参阅pct手册页)。

  1. 请注意
  2. pvesm extractconfig可用于查看vzdump归档文件中包含的备份配置。

有两种基本的恢复模式,只是不同于它们对挂载点的处理:

“简单”恢复模式
**
如果没有显式设置rootfs参数和任何可选的mpX参数,则使用以下步骤从备份的配置文件中恢复挂载点配置:

  1. 从备份中提取挂载点及其选项
    2. 为存储创建卷支持的挂载点(在带有storage参数的存储上,如果没有设置,则在默认的本地存储上)
    3.从备份存档中提取文件
    4. 向恢复的配置添加绑定点和设备挂载点(仅限于root用户)
    1. 请注意
    2. 由于绑定和设备挂载点永远不会备份,所以在最后一步中不会恢复任何文件,而只恢复配置选项。假设这样的挂载点要么用另一种机制进行备份(例如,绑定挂载到许多容器中的NFS空间),要么根本不打算进行备份。
    web界面中的容器恢复操作也使用这种简单模式。

“高级”恢复模式

通过设置rootfs参数(或者mpX参数的任意组合),pct restore命令会自动切换到高级模式。这种高级模式完全忽略rootfs和mpX配置选项包含在备份存档中,而只是使用显式提供的选项作为参数。

该模式允许在恢复时灵活配置挂载点设置,例如:

  • 为每个挂载点分别设置目标存储、卷大小和其他选项
  • 根据新的挂载点方案重新分发备份文件
  • 恢复到设备和/或绑定挂载点(仅限于root用户)

11.8、使用pct管理容器

“Proxmox容器工具箱”(pct)是管理Proxmox VE容器的命令行工具。它允许您创建或销毁容器,以及控制容器的执行(启动、停止、重启、迁移等)。它可以用于在容器的配置文件中设置参数,例如网络配置或内存限制。

11.8.1、CLI用法示例

基于Debian模板创建一个容器(前提是您已经通过web界面下载了模板)

# pct create 100 /var/lib/vz/template/cache/debian-10.0-standard_10.0-1_amd64.tar.gz

启动容器100

# pct start 100

通过getty启动登录会话

# pct console 100

输入LXC名称空间并以root用户的身份运行shell

# pct enter 100

显示配置

# pct config 100

添加一个名为eth0的网络接口,它桥接到主机桥vmbr0,在它运行时设置地址和网关

# pct set 100 -net0 name=eth0,bridge=vmbr0,ip=192.168.15.147/24,gw=192.168.15.1

将容器内存减少到512MB

# pct set 100 -memory 512

11.8.2、获取调试日志

如果pct start无法启动特定的容器,通过运行lxc-start(用容器的ID替换ID)收集调试输出可能会有帮助:

# lxc-start -n ID -F -l DEBUG -o /tmp/lxc-ID.log

这个命令将尝试以前台模式启动容器,为了停止容器,在第二个终端中运行pct shutdown ID或pct stop ID。

收集到的调试日志写入“/tmp/lxc-ID.log”。

  1. 请注意
  2. 如果自上次尝试使用pct start以来更改了容器的配置,则需要至少运行pct start一次,以更新lxc-start使用的配置。

11.9、迁移

如果你有一个集群,你可以用它来迁移你的容器

# pct migrate <ctid> <target>

只要您的容器处于脱机状态,这就可以工作。如果它定义了本地卷或挂载点,那么如果在目标主机上定义了相同的存储,那么迁移将通过网络将内容复制到目标主机。

由于技术限制,运行的容器不能实时迁移。您可以执行重新启动迁移,即关闭、移动和再次启动目标节点上的容器。由于容器是非常轻量级的,这通常只会导致数百毫秒的停机时间。

重新启动迁移可以通过web接口或使用pct migrate命令中的——restart标志来完成。

重新启动迁移将关闭容器,并在指定超时(默认为180秒)之后终止它。然后,它将像脱机迁移一样迁移容器,完成后,在目标节点上启动容器。

11.10、配置

/etc/pve/ lxcx /.conf文件保存了容器的配置信息,其中是给定容器的数字ID。与存储在/etc/pve/中的所有其他文件一样,它们会自动复制到所有其他集群节点。

  1. 请注意
  2. < 100ctid保留给内部使用,并且ctid必须是集群范围内唯一的。

容器配置示例

  1. ostype: debian
  2. arch: amd64
  3. hostname: www
  4. memory: 512
  5. swap: 512
  6. net0: bridge=vmbr0,hwaddr=66:64:66:64:64:36,ip=dhcp,name=eth0,type=veth
  7. rootfs: local:107/vm-107-disk-1.raw,size=7G

配置文件是简单的文本文件。您可以使用普通的文本编辑器(例如vi或nano)编辑它们。有时,这对于进行小的修改是有用的,但是请记住,您需要重新启动容器来应用这些更改。

由于这个原因,使用pct命令来生成和修改这些文件,或者使用GUI完成整个操作通常是更好的。我们的工具箱足够聪明,可以立即对运行中的容器应用大多数更改。该特性称为“热插拔”,在这种情况下不需要重新启动容器。

在不能热插拔更改的情况下,它将被注册为一个挂起的更改(在GUI中以红色显示)。它们只会在重新启动容器后应用。

11.10.1、文件格式

容器配置文件使用一个简单的冒号分隔的键/值格式。每行有以下格式:

# this is a comment
OPTION: value

这些文件中的空行会被忽略,以#字符开头的行会被视为注释,也会被忽略。

可以直接添加低级的LXC样式配置,例如:

lxc.init_cmd: /sbin/my_own_init

lxc.init_cmd = /sbin/my_own_init

设置直接传递给LXC低级工具。

11.10.2、快照

当您创建一个快照时,pct在快照时将配置存储到同一个配置文件中的一个单独的快照部分中。例如,在创建一个名为“testsnapshot”的快照后,您的配置文件将如下所示:

带有快照的容器配置

  1. memory: 512
  2. swap: 512
  3. parent: testsnaphot
  4. ...
  5. [testsnaphot]
  6. memory: 512
  7. swap: 512
  8. snaptime: 1457170803
  9. ...

有一些快照相关的属性,如parent和snaptime。parent属性用于存储快照之间的父/子关系。snaptime是快照创建时间戳(Unix epoch)。

11.10.3、选项

arch: (default = amd64)
操作系统体系结构类型。

cmode: (default = tty)
控制台模式。默认情况下,控制台命令尝试打开到一个可用tty设备的连接。通过将cmode设置为console,它会尝试连接到/dev/console。如果您将cmode设置为shell,它只是在容器内调用shell(无需登录)。

console: (default = 1)
将一个控制台设备(/dev/console)连接到容器上。

cores: (1 - 8192)
分配给容器的内核数。默认情况下,容器可以使用所有可用的核心。

cpulimit: (0 - 8192) (default = 0)
CPU使用限制。

  1. 请注意
  2. 如果计算机有2CPU,它总共有2CPU时间。取值为0表示不做CPU限制。


cpuunits: (0 - 500000) (default = 1024)**
虚拟机的CPU权重。参数在内核公平调度程序中使用。这个数字越大,虚拟机获得的CPU时间就越多。“数量”相对于其他所有运行中的虚拟机的权重。

  1. 请注意
  2. 您可以通过将此设置为0来禁用公平调度程序配置。

debug: (default = 0)
尽量啰嗦些。目前,这仅在启动时启用调试日志级别。

description:
容器的描述。仅用于web配置界面。

features: [force_rw_sys=<1|0>] [,fuse=<1|0>] [,keyctl=<1|0>]
[,mknod=<1|0>] [,mount=] [,nesting=<1|0>]
允许容器访问高级功能。

force_rw_sys= (default = 0)
在非特权容器中,将/sys挂载为rw,而不是mixed。这可能会破坏在较新的(>= v245)系统网络使用下的网络。

fuse= (default = 0)
允许在容器中使用fuse文件系统。注意,fuse和冻结器c组之间的交互可能会潜在地导致I/O死锁。

keyctl= (default = 0)
仅对非特权容器:允许使用keyctl()系统调用。这是在容器中使用docker所必需的。默认情况下,非特权容器将认为这个系统调用不存在。这主要是systemd-networkd的一种解决方案,因为当内核由于缺乏权限而拒绝某些keyctl()操作时,它会将其视为致命错误。本质上,你可以选择运行systemd-networkd还是docker。

mknod= (default = 0)
允许非特权容器使用mknod()来添加某些设备节点。这需要一个具有seccomp陷阱的内核来支持用户空间(5.3或更新版本)。这是实验。

mount=
允许挂载特定类型的文件系统。这应该是与mount命令一起使用的文件系统类型列表。请注意,这可能会对容器的安全性产生负面影响。通过访问循环设备,挂载文件可以绕过设备cgroup的mknod权限,挂载NFS文件系统可以完全阻塞主机的I/O并阻止它重新启动,等等。

nesting= (default = 0)
允许嵌套。最好用于带有附加id映射的非特权容器。注意,这将向客户公开主机的procfs和sysfs内容。

hookscript:
将在容器生存期内的各个步骤中执行的脚本。

hostname:
设置容器的主机名。

lock: <backup | create | destroyed | disk | fstrim | migrate |
mounted | rollback | snapshot | snapshot-delete>
锁定/解锁VM。

memory: (16 - N) (default = 512)
虚拟机的内存量(MB)。

mp[n]: [volume=] ,mp= [,acl=<1|0>] [,backup=<1|0>]
[,mountoptions=] [,quota=<1|0>] [,replicate=<1|0>]
[,ro=<1|0>] [,shared=<1|0>] [,size=]
使用容积作为容器安装点。

acl=
显式启用或禁用ACL支持。

backup=
是否在备份中包含挂载点(仅用于卷挂载点)。

mountoptions=
额外的挂载选项为rootfs/mps。

mp=
从容器内部看到的到挂载点的路径。

  1. 请注意
  2. 出于安全考虑,不能包含任何符号链接。

quota=
在容器内启用用户配额(zfs子卷不支持)

replicate= (default = 1)
将该卷包含到存储复制作业中。

ro=
只读的挂载点

shared= (default = 0)
将这个非卷挂载点标记为在所有节点上可用。

  1. 警告
  2. 这个选项不会自动共享挂载点,它假设它已经被共享了!

size=
卷大小(只读值)。

volume=
要装入容器的卷、设备或目录。

nameserver:
设置容器的DNS服务器IP地址。如果您既不设置searchdomain也不设置nameserver, Create将自动从主机使用设置。

net[n]: name= [,bridge=] [,firewall=<1|0>]
[,gw=] [,gw6=]
[,hwaddr=] [,ip=<(IPv4/CIDR|dhcp|manual)>]
[,ip6=<(IPv6/CIDR|auto|dhcp|manual)>] [,mtu=]
[,rate=] [,tag=] [,trunks=]
[,type=]
指定容器的网络接口。

bridge=
网桥连接网络设备。

firewall=**
控制是否应该使用该接口的防火墙规则。

gw=
IPv4流量的默认网关。

gw6=
IPv6流量的默认网关。

hwaddr=
一个没有设置I/G(个人/组)位的通用MAC地址。

ip=<(IPv4/CIDR|dhcp|manual)>
IPv4 CIDR格式地址。

ip6=<(IPv6/CIDR|auto|dhcp|manual)>
CIDR格式的IPv6地址。

mtu= (64 - N)
接口的最大传输单元。(lxc.network.mtu)

name=
从容器内部看到的网络设备名称。(lxc.network.name)

rate=
对接口进行速率限制

tag= (1 - 4094)
接口的VLAN tag。

trunks=
接口需要通过的VLAN id

type=
网络接口类型。

onboot: (default = 0)
虚拟机是否在系统启动时启动。

ostype: <alpine | archlinux | centos | debian | fedora | gentoo |
opensuse | ubuntu | unmanaged>
操作系统类型。这用于在容器内设置配置,对应于/usr/share/ lxcc /config/.common.conf中的lxc设置脚本。值unmanaged可用于跳过和操作系统特定的设置。

protection: (default = 0)
设置容器的保护标志。这将阻止CT或CT的磁盘移除/更新操作。

rootfs: [volume=] [,acl=<1|0>]
[,mountoptions=] [,quota=<1|0>] [,replicate=<1|0>]
[,ro=<1|0>] [,shared=<1|0>] [,size=]
使用volume作为容器根。

acl=
显式启用或禁用ACL支持。

mountoptions=
额外的挂载选项为rootfs/mps。

quota=
在容器内启用用户配额(zfs子卷不支持)

replicate= (default = 1)
将该卷包含到存储复制作业中。

ro=
只读的挂载点

shared= (default = 0)
将这个非卷挂载点标记为在所有节点上可用。

  1. 警告
  2. 这个选项不会自动共享挂载点,它假设它已经被共享了!

size=
卷大小(只读值)。

volume=
要装入容器的卷、设备或目录。

searchdomain:
为容器设置DNS搜索域。如果您既不设置searchdomain也不设置nameserver, Create将自动从主机使用设置。

startup: [[order=]\d+] [,up=\d+] [,down=\d+]
启动和关闭行为。Order是一个非负数,定义了一般启动顺序

用倒序完成关机。此外,您还可以设置以秒为单位的启动或关闭延迟时间,即在下一个虚拟机启动或停止前的等待时间。

swap: (0 - N) (default = 512)
虚拟机的交换空间大小(MB)。

tags:
容器的标签。这只是元信息。

template: (default = 0)
启用/禁用模板。

timezone:
容器使用的时区。如果没有设置option,则不会执行任何操作。可以设置为host以匹配主机时区,或者从/usr/share/zoneinfo/zone.tab中任意设置时区选项

tty: (0 - 6) (default = 2)
指定容器可用tty的数量

unprivileged: (default = 0)
使容器作为非特权用户运行。(不应该手动修改。)

unused[n]: [volume=]
引用未使用的卷。这是内部使用的,不应该手动修改。

volume=
当前未使用的卷。

11.11、锁

容器迁移、快照和备份(vzdump)设置一个锁,以防止受影响的容器上不兼容的并发操作。有时您需要手动移除这样的锁(例如,在电源故障后)。

# pct unlock <CTID>

  1. 谨慎
  2. 只有当您确定设置锁的操作不再运行时,才执行此操作。