容器是完全虚拟化机 (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. 技术概览
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.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。常规设置
-
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. 中央处理器
您可以使用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。记忆
内存: |
限制总体内存使用。这对应于 memory.limit_in_bytes cgroup 设置。 |
交换: |
允许容器使用主机交换空间中的额外交换内存。这对应于memory.memsw.limit_in_bytes cgroup 设置,该设置设置为两个值的总和(内存 + 交换)。 |
11.4.4。挂载点
- 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: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。网络
- 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
-
启动/关闭顺序:定义启动顺序优先级。例如,如果您希望首先启动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还用于在拍摄快照之前“冻结”容器。
从 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 环境中运行,您可以
|
更改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 存储库支持的任何存储类型。这意味着容器可以存储在本地(例如lvm、zfs或目录)、共享外部(例如iSCSI、NFS)甚至分布式存储系统(例如 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参数均未显式设置,则使用以下步骤恢复备份配置文件中的挂载点配置:
-
从备份中提取安装点及其选项
-
在使用storage参数 提供的存储上为存储支持的安装点创建卷(默认值:local)。
-
从备份存档中提取文件
-
将绑定和设备挂载点添加到恢复的配置(仅限 root 用户)
由于绑定和设备安装点永远不会备份,因此最后一步中不会恢复任何文件,而只会恢复配置选项。假设此类安装点要么使用其他机制进行备份(例如,绑定安装到许多容器中的 NFS 空间),要么根本不打算进行备份。 |
Web 界面中的容器恢复操作也使用这种简单模式。
“高级”恢复模式
通过设置rootfs参数(以及可选的mpX参数的任意组合 ),pct Restore命令会自动切换到高级模式。此高级模式完全忽略 备份存档中包含的rootfs和mpX配置选项,而仅使用明确提供的选项作为参数。
此模式允许在恢复时灵活配置挂载点设置,例如:
-
为每个安装点单独设置目标存储、卷大小和其他选项
-
根据新的挂载点方案重新分发备份文件
-
恢复到设备和/或绑定安装点(仅限 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 CTID或pct 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
配置文件是简单的文本文件。您可以使用普通文本编辑器(例如vi或nano )编辑它们。有时这对于进行小的更正很有用,但请记住,您需要重新启动容器才能应用此类更改。
因此,通常最好使用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 ...
有一些与快照相关的属性,例如parent和snaptime。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>