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

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

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

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

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

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

我们的主要目标是提供一个环境,该环境可以提供使用虚拟机的优势,但不会产生额外的开销。这意味着 Proxmox 容器可以归类为“系统容器”,而不是“应用程序容器”。

笔记 如果您想运行应用程序容器,例如Docker映像,建议您在 Proxmox QEMU VM 中运行它们。这将为您提供应用程序容器化的所有优势,同时还提供虚拟机提供的优势,例如与主机的强隔离以及实时迁移的能力,而这是容器所无法实现的。

11.1. 技术概览

  • LXC(https://linuxcontainers.org/

  • 集成到 Proxmox VE 图形 Web 用户界面 (GUI)

  • 易于使用的命令行工具pct

  • 通过 Proxmox VE REST API 访问

  • lxcfs提供容器化/proc文件系统

  • 用于资源隔离和限制的 控制组(cgroup )

  • AppArmorseccomp提高安全性

  • 现代 Linux 内核

  • 基于镜像的部署(模板

  • 使用Proxmox VE存储库

  • 从主机(网络、DNS、存储等)进行容器设置

11.2. 支持的发行版

官方支持的发行版列表可以在下面找到。

以下发行版的模板可通过我们的存储库获取。您可以使用pveam工具或图形用户界面来下载它们。

11.2.1. 阿尔卑斯Linux

Alpine Linux 是一个面向安全的、基于 musl libc 和 busybox 的轻量级 Linux 发行版。

对于当前支持的版本,请参阅:

11.2.2. 架构Linux

Arch Linux,一个轻量级且灵活的 Linux® 发行版,力求保持简单。

Arch Linux 使用滚动发布模型,请参阅其 wiki 了解更多详细信息:

11.2.3。CentOS、Almalinux、Rocky Linux

CentOS / CentOS 流

CentOS Linux 发行版是一个稳定、可预测、可管理和可复制的平台,源自 Red Hat Enterprise Linux (RHEL) 的源代码

对于当前支持的版本,请参阅:

阿尔玛Linux

一个开源、社区拥有和管理、永远免费的企业 Linux 发行版,专注于长期稳定性,提供强大的生产级平台。AlmaLinux 操作系统与 RHEL® 和 pre-Stream CentOS 1:1 二进制兼容。

对于当前支持的版本,请参阅:

洛基Linux

Rocky Linux 是一个社区企业操作系统,旨在与美国顶级企业 Linux 发行版 100% 兼容,因为其下游合作伙伴已经改变了方向。

对于当前支持的版本,请参阅:

11.2.4。德班

Debian 是一个免费操作系统,由 Debian 项目开发和维护。一个免费的 Linux 发行版,拥有数千个应用程序,可以满足用户的需求。

对于当前支持的版本,请参阅:

11.2.5。德瓦安

Devuan GNU+Linux 是 Debian 的一个没有 systemd 的分支,它允许用户通过避免不必要的纠缠和确保 Init Freedom 来重新获得对系统的控制权。

对于当前支持的版本,请参阅:

11.2.6。软呢帽

Fedora 为硬件、云和容器创建了一个创新、免费和开源的平台,使软件开发人员和社区成员能够为其用户构建量身定制的解决方案。

对于当前支持的版本,请参阅:

11.2.7。根图

高度灵活、基于源代码的 Linux 发行版。

Gentoo 使用滚动发布模型。

11.2.8。开放SUSE

制造商为系统管理员、开发人员和桌面用户选择的产品。

对于当前支持的版本,请参阅:

11.2.9。乌班图

Ubuntu 是 Linux 上的现代开源操作系统,适用于企业服务器、桌面、云和物联网。

对于当前支持的版本,请参阅:

11.3。容器镜像

容器映像有时也称为“模板”或“设备”,是包含运行容器的所有内容的tar存档。

Proxmox VE 本身为最常见的 Linux 发行版提供了多种基本模板 。可以使用 GUI 或pveam(Proxmox VE Appliance Manager 的缩写)命令行实用程序下载它们。此外,TurnKey Linux容器模板也可供下载。

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

#pveam更新

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

# pveam 可用

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

列出可用的系统映像
# pveam可用 --section 系统
系统 alpine-3.12-default_20200823_amd64.tar.xz
系统 alpine-3.13-default_20210419_amd64.tar.xz
系统 alpine-3.14-default_20210623_amd64.tar.xz
系统 archlinux-base_20210420-1_amd64.tar.gz
系统centos- 7-default_20190926_amd64.tar.xz
系统 centos-8-default_20201210_amd64.tar.xz
系统 debian-9.0-standard_9.7-1_amd64.tar.gz
系统 debian-10-standard_10.7-1_amd64.tar.gz
系统 devuan-3.0- standard_3.0_amd64.tar.gz
系统 fedora-33-default_20201115_amd64.tar.xz
系统 fedora-34-default_20210427_amd64.tar.xz
系统 gentoo-current-default_20200310_amd64.tar.xz
系统 opensuse-15.2-default_20200824_amd64.tar .xz
系统ubuntu- 16.04-standard_16.04.5-1_amd64.tar.gz
系统 ubuntu-18.04-standard_18.04.1-1_amd64.tar.gz
系统 ubuntu-20.04-standard_20.04-1_amd64.tar.gz
系统 ubuntu-20.10-standard_20.10-1_amd64。 tar.gz
系统 ubuntu-21.04-standard_21.04-1_amd64.tar.gz

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

# pveam下载本地debian-10.0-standard_10.0-1_amd64.tar.gz

您现在已准备好使用该映像创建容器,并且可以使用以下命令列出本地存储上所有下载的映像:

# pveam 列表本地 local 
:vztmpl/debian-10.0-standard_10.0-1_amd64.tar.gz 219.95MB
提示 您还可以使用 Proxmox VE Web 界面 GUI 下载、列出和删除容器模板。

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

# pct 创建 999 本地:vztmpl/debian-10.0-standard_10.0-1_amd64.tar.gz

上述命令显示完整的 Proxmox VE 卷标识符。它们包括存储名称,大多数其他 Proxmox VE 命令可以使用它们。例如,您可以稍后使用以下命令删除该图像:

# pveam 删除本地:vztmpl/debian-10.0-standard_10.0-1_amd64.tar.gz

11.4。容器设置

11.4.1。常规设置

截图/gui-create-ct-general.png

容器的常规设置包括

  • Node :容器将运行的物理 服务器

  • CT ID:Proxmox VE 安装中的唯一编号,用于识别您的容器

  • 主机名:容器的主机名

  • 资源池:容器和虚拟机的逻辑组

  • 密码:容器的root密码

  • SSH 公钥:用于通过 SSH 连接到 root 帐户的公钥

  • 非特权容器:此选项允许在创建时选择是否要创建特权容器或非特权容器。

非特权容器

非特权容器使用称为用户命名空间的新内核功能。容器内部的 root UID 0 被映射到容器外部的非特权用户。这意味着这些容器中的大多数安全问题(容器逃逸、资源滥用等)将影响随机的非特权用户,并且将是通用内核安全错误而不是 LXC 问题。LXC 团队认为非特权容器在设计上是安全的。

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

笔记 如果容器使用systemd作为init系统,请注意容器内运行的systemd版本应等于或大于220。
特权容器

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

11.4.2. 中央处理器

截图/gui-create-ct-cpu.png

您可以使用cores选项限制容器内可见 CPU 的数量 。这是使用 Linux cpuset cgroup(控制)实现的。pvestatd内部的一个特殊任务尝试定期在可用的 CPU 之间分配正在运行的容器。要查看分配的 CPU,请运行以下命令:

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

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

CPU限制

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

核心:2 
cpu限制:0.5
中央处理器单元

这是传递给内核调度程序的相对权重。数字越大,该容器获得的 CPU 时间就越多。数量是相对于所有其他正在运行的容器的重量而言的。默认值为100( 如果主机使用旧版 cgroup v1,则为1024 )。您可以使用此设置来确定某些容器的优先级。

11.4.3。记忆

截图/gui-create-ct-memory.png

容器内存使用 cgroup 内存控制器进行控制。

内存

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

交换

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

11.4.4。挂载点

截图/gui-create-ct-root-disk.png

根挂载点是使用rootfs属性配置的。您最多可以配置 256 个附加安装点。相应的选项称为mp0mp255。它们可以包含以下设置:

rootfs : [volume=]<volume> [,acl=<1|0>] [,mountoptions=<opt[;opt…]>] [,quota=<1|0>] [,replicate=<1 |0>] [,ro=<1|0>] [,共享=<1|0>] [,size=<磁盘大小>]

使用卷作为容器根。有关所有选项的详细说明,请参阅下文。

mp[n] : [卷=]<卷> ,mp=<路径> [,acl=<1|0>] [,备份=<1|0>] [,mountoptions=<opt[;opt… ]>] [,配额=<1|0>] [,复制=<1|0>] [,ro=<1|0>] [,共享=<1|0>] [,大小=<磁盘大小> ]

使用卷作为容器挂载点。使用特殊语法 STORAGE_ID:SIZE_IN_GiB 分配新卷。

acl = <布尔值>

显式启用或禁用 ACL 支持。

备份<布尔值>

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

mountoptions = <opt[;opt…]>

rootfs/mps 的额外安装选项。

mp = <路径>

从容器内部看到的安装点路径。

笔记 出于安全原因,不得包含任何符号链接。
配额<布尔值>

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

复制<布尔值>默认 = 1

将此卷包含到存储副本作业中。

ro = <布尔值>

只读挂载点

共享<布尔值>默认= 0

将此非卷安装点标记为在所有节点上可用。

警告 此选项不会自动共享挂载点,它假设它已经共享!
大小<磁盘大小>

卷大小(只读值)。

音量<音量>

要安装到容器中的卷、设备或目录。

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

典型容器rootfs配置
rootfs:thin1:base-100-disk-1,大小=8G
存储支持的安装点

存储支持的挂载点由 Proxmox VE 存储子系统管理,具有三种不同的风格:

  • 基于图像:这些是包含单个 ext4 格式文件系统的原始图像。

  • ZFS 子卷:这些在技术上是绑定安装,但具有托管存储,因此允许调整大小和快照。

  • 目录:传递size=0会触发一种特殊情况,即创建目录而不是原始图像。

笔记 用于存储支持的安装点卷的特殊选项语法STORAGE_ID:SIZE_IN_GB将自动在指定存储上分配指定大小的卷。例如,调用
pct 设置 100 -mp0 Thin1:10,mp=/path/in/container

将在存储Thin1上分配一个 10GB 卷,并将卷 ID 占位符10替换为分配的卷 ID,并在容器中设置 moutpoint(位于/path/in/container)

绑定挂载点

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

  • 访问来宾中的主目录

  • 访问来宾中的 USB 设备目录

  • 从来宾中的主机访问 NFS 挂载

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

笔记 使用vzdump时,不会备份绑定安装点的内容。
警告 出于安全原因,只能使用专门为此目的保留的源目录来建立绑定安装,例如/mnt/bindmounts下的目录层次结构。切勿将//var/etc等挂载系统目录绑定 到容器中 – 这会带来很大的安全风险。
笔记 绑定安装源路径不得包含任何符号链接。

例如,要使路径/ shared下ID 为100的容器中的目录/mnt/bindmounts/shared可访问,请添加如下配置行:

mp0: /mnt/bindmounts/shared,mp=/shared

进入/etc/pve/lxc/100.conf

或者使用pct工具:

pct 设置 100 -mp0 /mnt/bindmounts/shared,mp=/shared

达到同样的结果。

设备安装点

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

笔记 设备安装点只能在特殊情况下使用。在大多数情况下,存储支持的安装点提供相同的性能和更多的功能。
笔记 使用vzdump时不会备份设备装入点的内容 。

11.4.5。网络

截图/gui-create-ct-network.png

您最多可以为单个容器配置 10 个网络接口。相应的选项称为net0net9,它们可以包含以下设置:

net[n] : name=<字符串> [,bridge=<bridge>] [,firewall=<1|0>] [,gw=<GatewayIPv4>] [,gw6=<GatewayIPv6>] [,hwaddr=<XX :XX:XX:XX:XX:XX>] [,ip=<(IPv4/CIDR|dhcp|手动)>] [,ip6=<(IPv6/CIDR|自动|dhcp|手动)>] [,link_down= <1|0>] [,mtu=<整数>] [,速率=<mbps>] [,标记=<整数>] [,trunks=<vlanid[;vlanid…]>] [,type=<韦斯>]

指定容器的网络接口。

<桥>

用于连接网络设备的桥接器。

防火墙<布尔值>

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

gw = <网关IPv4>

IPv4 流量的默认网关。

gw6 = <网关IPv6>

IPv6 流量的默认网关。

hwaddr = <XX:XX:XX:XX:XX:XX>

未设置 I/G(个体/组)位的通用 MAC 地址。

ip = <(IPv4/CIDR|dhcp|手动)>

CIDR 格式的 IPv4 地址。

ip6 = <(IPv6/CIDR|自动|dhcp|手动)>

CIDR 格式的 IPv6 地址。

link_down = <布尔值>

是否应断开此接口(如拔掉插头)。

mtu = <整数> (64 – 65535)

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

名称<字符串>

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

速率<mbps>

对接口应用速率限制

标签<整数> (1 – 4094)

该接口的 VLAN 标记。

trunks = <vlanid[;vlanid…]>

接口通过的VLAN ID

类型<veth>

网络接口类型。

11.4.6。容器自动启动和关闭

要在主机系统启动时自动启动容器,请在Web 界面中容器的“选项”面板中选择“启动时启动”选项或运行以下命令:

# pct 设置 CTID -onboot 1
截图/gui-qemu-edit-start-order.png
启动和关闭顺序

如果您想微调容器的启动顺序,可以使用以下参数:

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

  • 启动延迟:定义此容器启动和后续容器启动之间的时间间隔。例如,如果您想在启动其他容器之前等待 240 秒,请将其设置为 240。

  • 关闭超时:定义 Proxmox VE 在发出关闭命令后应等待容器离线的持续时间(以秒为单位)。默认情况下,该值设置为 60,这意味着 Proxmox VE 将发出关闭请求,等待 60 秒让机器离线,如果 60 秒后机器仍然在线,则会通知关闭操作失败。

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

如果您需要在主机启动和第一个容器启动之间有延迟,请参阅 Proxmox VE 节点管理部分。

11.4.7。钩子脚本

您可以使用配置属性 hookscript 将挂钩脚本添加到CT

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

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

11.5。安全考虑

容器使用主机系统的内核。这暴露了恶意用户的攻击面。一般来说,完整虚拟机提供更好的隔离。如果容器被提供给未知或不受信任的人,则应考虑这一点。

为了减少攻击面,LXC 使用了许多安全功能,例如 AppArmor、CGroup 和内核命名空间。

11.5.1。应用装甲

AppArmor 配置文件用于限制对可能危险操作的访问。某些系统调用(即mount)被禁止执行。

要跟踪 AppArmor 活动,请使用:

# dmesg | grep apparmor

尽管不建议这样做,但可以对容器禁用 AppArmor。这带来了安全风险。如果系统配置错误或者存在 LXC 或 Linux 内核漏洞,某些系统调用在容器内执行时可能会导致权限提升。

要禁用容器的 AppArmor,请将以下行添加到位于/etc/pve/lxc/CTID.conf的容器配置文件中:

lxc.apparmor.profile = 无限制
警告 请注意,不建议将其用于生产用途。

11.5.2。对照组(cgroup

cgroup是一种内核机制,用于分层组织进程和分配系统资源。

通过cgroup控制的主要资源是 CPU 时间、内存和交换限制以及对设备节点的访问。cgroup还用于在拍摄快照之前“冻结”容器。

目前 有 2 个版本的cgroup可用: legacy 和 cgroupv2

从 Proxmox VE 7.0 开始,默认是纯cgroupv2环境。以前使用的是“混合”设置,其中资源控制主要在cgroupv1中完成,并 带有一个附加的cgroupv2控制器,该控制器可以通过cgroup_no_v1内核命令行参数接管某些子系统。( 详细信息请参阅内核参数文档。)

CGroup版本兼容性

纯cgroupv2和旧的 Proxmox VE 混合环境之间的主要区别在于, cgroupv2内存和交换现在是独立控制的。容器的内存和交换设置可以直接映射到这些值,而以前只能限制内存限制以及 内存和交换总和的限制。

另一个重要的区别是设备控制器的配置方式完全不同。因此,目前在纯cgroupv2环境中不支持文件系统配额。

要在纯cgroupv2环境中运行,需要容器操作系统的cgroupv2支持 。运行systemd版本 231 或更新版本的容器支持 cgroupv2 50 ] ,不使用systemd作为 init 系统的容器也是如此51 ]

笔记

CentOS 7 和 Ubuntu 16.10 是两个著名的 Linux 发行版,它们的systemd版本太旧,无法在cgroupv2 环境中运行,您可以

  • 将整个发行版升级到更新版本。对于上面的示例,可能是 Ubuntu 18.04 或 20.04 以及 CentOS 8(或 RHEL/CentOS 衍生版本,如 AlmaLinux 或 Rocky Linux)。这样做的好处是可以获得最新的错误和安全修复,通常还有新功能,并将 EOL 日期推迟到未来。

  • 升级容器systemd版本。如果发行版提供了向后移植存储库,这可能是一种简单而快速的权宜之计。

  • 将容器或其服务移至虚拟机。虚拟机与主机的交互要少得多,这就是为什么人们可以在那里安装几十年前的操作系统版本。

  • 切换回旧版cgroup控制器。请注意,虽然它可能是一种有效的解决方案,但它不是永久性的。从 Proxmox VE 9.0 开始,将不再支持旧版控制器。

更改CGroup版本
提示 如果不需要文件系统配额并且所有容器都支持cgroupv2,建议坚持使用新的默认值。

要切换回以前的版本,可以使用以下内核命令行参数:

systemd.unified_cgroup_hierarchy=0

有关在何处添加参数的信息,请参阅有关编辑内核引导命令行的部分。

11.6。来宾操作系统配置

Proxmox VE尝试检测容器中的Linux发行版,并修改一些文件。以下是容器启动时所做的事情的简短列表:

设置/etc/主机名

设置容器名称

修改/etc/hosts

允许查找本地主机名

网络设置

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

配置DNS

传递有关 DNS 服务器的信息

调整初始化系统

例如,修复生成的 getty 进程的数量

设置root密码

创建新容器时

重写 ssh_host_keys

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

随机化 crontab

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

Proxmox VE 所做的更改包含在注释标记中:

# --- PVE 开始 --- 
<数据> 
# --- PVE 结束 ---

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

可以通过添加 .pve-ignore 来防止修改文件为其归档。例如,如果文件/etc/.pve-ignore.hosts存在,则/etc/hosts 文件将不会被触及。这可以是通过以下方式创建的简单空文件:

# 触摸 /etc/.pve-ignore.hosts

大多数修改都依赖于操作系统,因此不同发行版和版本之间的修改有所不同。您可以通过手动将ostype设置为unmanaged来完全禁用修改。

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

乌班图

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

德班

测试 /etc/debian_version

软呢帽

测试 /etc/fedora-release

红帽或 CentOS

测试 /etc/redhat-release

ArchLinux

测试 /etc/arch-release

阿尔卑斯山

测试 /etc/alpine-release

根图

测试 /etc/gentoo-release

笔记 如果配置的操作系统类型与自动检测到的类型不同,容器启动将失败。

11.7。集装箱储存

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

例如,容器的根文件系统可以位于缓慢且廉价的存储上,而数据库可以通过第二个安装点位于快速且分布式的存储上。有关更多详细信息,请参阅安装点部分。

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

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

11.7.1。保险丝安装座

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

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

11.7.2。在容器内使用配额

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

笔记 目前这需要使用旧版cgroup
笔记 这仅适用于基于 ext4 映像的存储类型,并且当前仅适用于特权容器。

激活配额选项会导致以下安装选项用于安装点: usrjquota=aquota.user,grpjquota=aquota.group,jqfmt=vfsv0

这允许像在任何其他系统上一样使用配额。您可以通过运行以下命令来初始化 /aquota.user/aquota.group文件:

#quotacheck-cmug/ 
#quotaon/

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

笔记 您需要通过传递安装点的路径而不是仅/来为每个安装点运行上述命令。

11.7.3。在容器内使用 ACL

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

11.7.4。容器挂载点的备份

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

mp0: 客人:subvol-100-disk-1,mp=/root/files,大小=8G

添加backup=1来启用它。

mp0: 来宾:subvol-100-disk-1,mp=/root/files,大小=8G,备份=1
笔记 在 GUI 中创建新的安装点时,默认情况下启用此选项。

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

11.7.5。容器挂载点的复制

默认情况下,复制根磁盘时会复制其他安装点。如果您希望 Proxmox VE 存储复制机制跳过某个安装点,您可以为该安装点设置“跳过复制”选项。从 Proxmox VE 5.0 开始,复制需要zfspool类型的存储。当容器配置了复制时,将安装点添加到不同类型的存储需要为该安装点启用“跳过复制” 。

11.8。备份还原

11.8.1。容器备份

可以使用vzdump工具进行容器备份。详细信息请参阅vzdump手册页。

11.8.2。恢复容器备份

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

笔记 pvesm extractconfig可用于查看 vzdump 存档中包含的备份配置。

有两种基本的恢复模式,仅在对挂载点的处理上有所不同:

“简单”恢复模式

如果rootfs参数和任何可选mpX参数均未显式设置,则使用以下步骤恢复备份配置文件中的挂载点配置:

  1. 从备份中提取安装点及其选项

  2. 在使用storage参数 提供的存储上为存储支持的安装点创建卷(默认值:local)。

  3. 从备份存档中提取文件

  4. 将绑定和设备挂载点添加到恢复的配置(仅限 root 用户)

笔记 由于绑定和设备安装点永远不会备份,因此最后一步中不会恢复任何文件,而只会恢复配置选项。假设此类安装点要么使用其他机制进行备份(例如,绑定安装到许多容器中的 NFS 空间),要么根本不打算进行备份。

Web 界面中的容器恢复操作也使用这种简单模式。

“高级”恢复模式

通过设置rootfs参数(以及可选的mpX参数的任意组合 ),pct Restore命令会自动切换到高级模式。此高级模式完全忽略 备份存档中包含的rootfsmpX配置选项,而仅使用明确提供的选项作为参数。

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

  • 为每个安装点单独设置目标存储、卷大小和其他选项

  • 根据新的挂载点方案重新分发备份文件

  • 恢复到设备和/或绑定安装点(仅限 root 用户)

11.9。使用pct管理容器

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

11.9.1。CLI 使用示例

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

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

启动容器100

# pct 起始 100

通过 getty 启动登录会话

# pct 控制台 100

进入 LXC 命名空间并以 root 用户身份运行 shell

#% 输入 100

显示配置

#%配置100

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

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

将容器内存减少到512MB

# pct 设置 100 -内存 512

销毁容器始终会将其从访问控制列表中删除,并且始终会删除容器的防火墙配置。如果您想另外从复制作业、备份作业和 HA 资源配置中删除容器,则必须激活 –purge 。

# pct 销毁 100 --purge

将装载点卷移动到不同的存储。

# pct move-volume 100 mp0 other-storage

将卷重新分配给不同的 CT。这将从源 CT 中删除卷mp0并将其作为mp1连接到目标 CT。在后台,卷将被重命名,以便名称与新所有者匹配。

# pct move-volume 100 mp0 --target-vmid 200 --target-volume mp1

11.9.2。获取调试日志

如果pct start无法启动特定容器,通过传递–debug标志(将CTID替换为容器的 CTID)来收集调试输出可能会有所帮助:

# pct 启动 CTID --debug

或者,您可以使用以下lxc-start命令,该命令会将调试日志保存到-o输出选项指定的文件中:

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

此命令将尝试在前台模式下启动容器,以在第二个终端中运行pct shutdown CTIDpct stop CTID来停止容器。

收集的调试日志写入/tmp/lxc-CTID.log

笔记 如果自上次尝试使用pct start启动以来更改了容器的配置,则需要至少运行一次pct start来更新lxc-start使用的配置。

11.10。移民

如果您有集群,则可以使用以下命令迁移容器

# pct migrate <ctid> <目标>

只要您的容器处于离线状态,此操作就有效。如果定义了本地卷或安装点,则迁移将通过网络将内容复制到目标主机(如果那里定义了相同的存储)。

由于技术限制,正在运行的容器无法实时迁移。您可以执行重新启动迁移,这会在目标节点上关闭、移动然后再次启动容器。由于容器非常轻量,因此通常只会导致数百毫秒的停机时间。

可以通过 Web 界面或使用 –restart标志和pct migrate命令来完成重新启动迁移。

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

11.11。配置

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

笔记 CTID < 100 保留用于内部目的,并且 CTID 需要在集群范围内是唯一的。
容器配置示例
ostype:debian 
arch:amd64
主机名:www
内存:512
交换:512 
net0:bridge = vmbr0,hwaddr = 66:64:66:64:64:36,ip = dhcp,name = eth0,type = veth rootfs:本地
: 107/vm-107-disk-1.raw,大小=7G

配置文件是简单的文本文件。您可以使用普通文本编辑器(例如vinano )编辑它们。有时这对于进行小的更正很有用,但请记住,您需要重新启动容器才能应用此类更改。

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

如果更改无法热插拔,它将被注册为待处理更改(在 GUI 中以红色显示)。它们仅在重新启动容器后才会应用。

11.11.1。文件格式

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

# 这是一条评论
OPTION: value

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

可以直接添加低级、LXC 风格的配置,例如:

lxc.init_cmd:/sbin/my_own_init

或者

lxc.init_cmd = /sbin/my_own_init

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

11.11.2。快照

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

带快照的容器配置
内存:512
交换:512
父级:testsnaphot 
... 

[testsnaphot]
内存:512
交换:512 
snaptime:1457170803 
...

有一些与快照相关的属性,例如parentsnaptime。Parent 属性用于存储快照之间的父/子关系snaptime是快照创建时间戳(Unix 纪元)。

11.11.3。选项

拱门<amd64 | ARM64 | 手臂hf | i386 | RISCV32 | riscv64>默认 = amd64

操作系统架构类型。

cmode<控制台| 壳 | tty>默认 = tty

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

控制台<布尔值>默认= 1

将控制台设备 (/dev/console) 连接到容器。

核心<整数> (1 – 8192)

分配给容器的核心数量。默认情况下,容器可以使用所有可用的核心。

cpulimit : <数字> (0 – 8192) (默认 = 0 )

CPU 使用限制。

笔记 如果计算机有 2 个 CPU,则总共有2 个CPU 时间。值0表示没有 CPU 限制。
cpuunits : <整数> (0 – 500000) (默认 = cgroup v1: 1024, cgroup v2: 100 )

容器的 CPU 重量。参数用于内核公平调度程序。数字越大,该容器获得的 CPU 时间就越多。数字是相对于所有其他跑步嘉宾的体重而言的。

调试<布尔值>默认 = 0

尝试更详细一些。目前,这仅在启动时启用调试日志级别。

描述<字符串>

容器的描述。显示在网络界面 CT 的摘要中。这将作为注释保存在配置文件中。

功能[force_rw_sys=<1|0>] [,fuse=<1|0>] [,keyctl=<1|0>] [,mknod=<1|0>] [,mount=<fstype;fstype; …>] [,嵌套=<1|0>]

允许容器访问高级功能。

force_rw_sys = <布尔值>默认 = 0

在非特权容器中将 /sys 挂载为rw而不是mix。这可能会破坏较新(> = v245)systemd-network 使用下的网络。

保险丝<布尔值>默认 = 0

允许在容器中 使用熔断文件系统。请注意,fuse 和 freeze cgroup 之间的交互可能会导致 I/O 死锁。

keyctl = <布尔值>默认 = 0

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

mknod = <布尔值>默认 = 0

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

挂载<fstype;fstype;…>

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

嵌套<布尔值>默认 = 0

允许嵌套。最好与具有附加 id 映射的非特权容器一起使用。请注意,这会将主机的 procfs 和 sysfs 内容公开给来宾。

钩子脚本<字符串>

将在容器生命周期的各个步骤中执行的脚本。

主机名<字符串>

设置容器的主机名。

锁定<备份| 创建 | 被摧毁| 磁盘| fstrim| 迁移 | 安装 | 回滚| 快照| 快照删除>

锁定/解锁容器。

内存<整数> (16 – N)默认 = 512

容器的 RAM 量(以 MB 为单位)。

mp[n] : [卷=]<卷> ,mp=<路径> [,acl=<1|0>] [,备份=<1|0>] [,mountoptions=<opt[;opt… ]>] [,配额=<1|0>] [,复制=<1|0>] [,ro=<1|0>] [,共享=<1|0>] [,大小=<磁盘大小> ]

使用卷作为容器挂载点。使用特殊语法 STORAGE_ID:SIZE_IN_GiB 分配新卷。

acl = <布尔值>

显式启用或禁用 ACL 支持。

备份<布尔值>

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

mountoptions = <opt[;opt…]>

rootfs/mps 的额外安装选项。

mp = <路径>

从容器内部看到的安装点路径。

笔记 出于安全原因,不得包含任何符号链接。
配额<布尔值>

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

复制<布尔值>默认 = 1

将此卷包含到存储副本作业中。

ro = <布尔值>

只读挂载点

共享<布尔值>默认= 0

将此非卷安装点标记为在所有节点上可用。

警告 此选项不会自动共享挂载点,它假设它已经共享!
大小<磁盘大小>

卷大小(只读值)。

音量<音量>

要安装到容器中的卷、设备或目录。

名称服务器<字符串>

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

net[n] : name=<字符串> [,bridge=<bridge>] [,firewall=<1|0>] [,gw=<GatewayIPv4>] [,gw6=<GatewayIPv6>] [,hwaddr=<XX :XX:XX:XX:XX:XX>] [,ip=<(IPv4/CIDR|dhcp|手动)>] [,ip6=<(IPv6/CIDR|自动|dhcp|手动)>] [,link_down= <1|0>] [,mtu=<整数>] [,速率=<mbps>] [,标记=<整数>] [,trunks=<vlanid[;vlanid…]>] [,type=<韦斯>]

指定容器的网络接口。

<桥>

用于连接网络设备的桥接器。

防火墙<布尔值>

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

gw = <网关IPv4>

IPv4 流量的默认网关。

gw6 = <网关IPv6>

IPv6 流量的默认网关。

hwaddr = <XX:XX:XX:XX:XX:XX>

未设置 I/G(个体/组)位的通用 MAC 地址。

ip = <(IPv4/CIDR|dhcp|手动)>

CIDR 格式的 IPv4 地址。

ip6 = <(IPv6/CIDR|自动|dhcp|手动)>

CIDR 格式的 IPv6 地址。

link_down = <布尔值>

是否应断开此接口(如拔掉插头)。

mtu = <整数> (64 – 65535)

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

名称<字符串>

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

速率<mbps>

对接口应用速率限制

标签<整数> (1 – 4094)

该接口的 VLAN 标记。

trunks = <vlanid[;vlanid…]>

接口通过的VLAN ID

类型<veth>

网络接口类型。

onboot : <布尔值>默认 = 0

指定容器是否在系统启动期间启动。

操作系统类型<阿尔卑斯山| ArchLinux | Centos | Debian | 德瓦安 | 软呢帽 | 巴布亚 | 尼克索斯 | 开放使用| ubuntu | 非托管>

操作系统类型。这用于在容器内设置配置,对应于 /usr/share/lxc/config/<ostype>.common.conf 中的 lxc 设置脚本。非托管值可用于跳过特定于操作系统的设置。

保护<布尔值>默认= 0

设置容器的保护标志。这将阻止 CT 或 CT 的磁盘删除/更新操作。

rootfs : [volume=]<volume> [,acl=<1|0>] [,mountoptions=<opt[;opt…]>] [,quota=<1|0>] [,replicate=<1 |0>] [,ro=<1|0>] [,共享=<1|0>] [,size=<磁盘大小>]

使用卷作为容器根。

acl = <布尔值>

显式启用或禁用 ACL 支持。

mountoptions = <opt[;opt…]>

rootfs/mps 的额外安装选项。

配额<布尔值>

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

复制<布尔值>默认 = 1

将此卷包含到存储副本作业中。

ro = <布尔值>

只读挂载点

共享<布尔值>默认= 0

将此非卷安装点标记为在所有节点上可用。

警告 此选项不会自动共享挂载点,它假设它已经共享!
大小<磁盘大小>

卷大小(只读值)。

音量<音量>

要安装到容器中的卷、设备或目录。

搜索域<字符串>

设置容器的 DNS 搜索域。如果您既没有设置 searchdomain 也没有设置 nameserver,Create 将自动使用主机中的设置。

启动: `[[order=]\d+] [,up=\d+] [,down=\d+] `

启动和关闭行为。Order 是一个非负数,定义一般启动顺序。关闭已按相反顺序完成。此外,您还可以设置启动关闭延迟(以秒为单位),这指定了下一个虚拟机启动或停止之前等待的延迟。

交换<整数>(0 – N)默认= 512

容器的交换量(以 MB 为单位)。

标签<字符串>

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

模板<布尔值>默认 = 0

启用/禁用模板。

时区<字符串>

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

tty : <整数> (0 – 6)默认 = 2

指定容器可用的tty数量

非特权<布尔值>默认 = 0

使容器以非特权用户身份运行。(不应手动修改。)

未使用[n][卷=]<卷>

参考未使用的卷。这是内部使用的,不应手动修改。

音量<音量>

当前未使用的卷。

11.12。锁具

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

# pct 解锁 <CTID>

作者 Lin-Tech

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注