Talos Linux SwapVolumeConfig 配置指南自动化磁盘交换分区swap volume的声明式管理【免费下载链接】talosTalos Linux is a modern Linux distribution built for Kubernetes.项目地址: https://gitcode.com/gh_mirrors/ta/talos导读SwapVolumeConfig是 Talos Linux 提供的一种配置文档config document用于以声明式方式在指定磁盘上自动分配并激活交换分区swap。它完全接管了 swap 的生命周期创建配置文档后Talos 会自动在磁盘选择器匹配的磁盘上划分分区分区标签自动生成为s-name、格式化为 swap 并激活删除配置文档则会自动停用 swap 并释放分区。本文将以 SwapVolumeConfig 参考文档 为骨架结合仓库源码配置类型定义、校验逻辑、卷控制器实现深入讲解其字段语义、CEL 磁盘选择器语法、LUKS2 加密选项与完整的可运行配置示例帮助你掌握在 Talos Linux 节点上安全、可重复地配置 swap 的全部技能。SwapVolumeConfig 是什么SwapVolumeConfig 是 Talos Linux 的 block 卷配置家族VolumeConfig、UserVolumeConfig、RawVolumeConfig、ExistingVolumeConfig、ExternalVolumeConfig、SwapVolumeConfig等中的一员专门用于交换空间。其核心特性是自动分配交换卷会在diskSelector匹配的磁盘上自动以分区形式分配自动激活分配完成后自动格式化为 swap 文件系统并swapon激活自动回收删除 SwapVolumeConfig 文档会停用deactivateswap 并移除分区标签自动生成分区标签由s-前缀与卷名拼接而成即s-name。从源码可以看到Talos 为 swap 卷专门定义了前缀常量 SwapVolumePrefix s-分区标签长度上限为 PartitionLabelLength 36。由于标签需要容纳s-前缀卷名长度被限制为134 个字符maxSwapVolumeNameLength PartitionLabelLength - len(SwapVolumePrefix)见 swap_volume_config.go。完整配置示例以下是最基本的 SwapVolumeConfig 文档等价于源码中exampleSwapVolumeConfigV1Alpha1()的示例见 swap_volume_config.goapiVersion: v1alpha1 kind: SwapVolumeConfig name: swap1 # Name of the volume. # The provisioning describes how the volume is provisioned. provisioning: # The disk selector expression. diskSelector: match: disk.transport nvme # The Common Expression Language (CEL) expression to match the disk. minSize: 3GiB # The minimum size of the volume. maxSize: 4GiB # The maximum size of the volume, if not specified the volume can grow to the size of the disk. # The encryption describes how the volume is encrypted. encryption: provider: luks2 # Encryption provider to use for the encryption. # Defines the encryption keys generation and storage method. keys: - slot: 0 # Key slot number for LUKS2 encryption. # Key which value is stored in the configuration file. static: passphrase: swapsecret # Defines the static passphrase value. # # KMS managed encryption key. # kms: # endpoint: https://192.168.88.21:4443 # KMS endpoint to Seal/Unseal the key. # # Cipher to use for the encryption. Depends on the encryption provider. # cipher: aes-xts-plain64 # # Defines the encryption sector size. # blockSize: 4096 # # Additional --perf parameters for the LUKS2 encryption. # options: # - no_read_workqueue # - no_write_workqueue顶层字段参考字段类型说明取值namestring卷名称。长度须在 134 个字符之间且只能包含大小写 ASCII 字母、数字和连字符-。分区标签自动生成s-name。provisioningProvisioningSpec描述卷如何被分配provisioned。encryptionEncryptionSpec描述卷如何被加密。name的校验规则在源码 swap_volume_config.go 中逐条实现name必填长度必须在 1 与maxSwapVolumeNameLength之间字符仅限a-z、A-Z、0-9与-。对应的测试用例TestSwapVolumeConfigValidateswap_volume_config_test.go覆盖了缺 name、name 过长35 个字符、非法字符some/name等失败场景错误信息分别为name is required、name must be between 1 and 34 characters long、name can only contain lowercase and uppercase ASCII letters, digits, and hyphens。provisioning定义交换卷的分配方式ProvisioningSpec描述交换卷如何被分配字段定义见 volume_config.go。字段类型说明diskSelectorDiskSelector磁盘选择器表达式。growbool卷是否尽可能增长到磁盘大小。minSizeByteSize卷的最小大小。以字节为单位指定但可写成人性化格式例如100MB、2.5GiB。maxSizeSize卷的最大大小如果不指定卷可以增长到磁盘大小。以字节或百分比指定例如50GiB或80%。对 SwapVolumeConfig 而言diskSelector与minSize/maxSize为必填约束ProvisioningSpec.Validate(true, true)见 volume_config.go 与 swap_volume_config.go。校验逻辑包括磁盘选择器缺失时返回disk selector is requiredminSize与maxSize同时缺失时返回min size or max size is requiredminSize大于maxSize时返回min size is greater than max size百分比形式的maxSize不参与该比较minSize为负时返回min size cannot be negative磁盘选择器表达式本身也会用celenv.DiskLocator()环境重新解析非法表达式直接报错如disk.size 120会得到 CEL 类型不匹配错误found no matching overload for __ applied to (uint, int)。仓库自带的测试夹具展示了实际可用的配置testdata/swapvolumeconfig_diskselector.yamlapiVersion: v1alpha1 kind: SwapVolumeConfig name: big provisioning: diskSelector: match: disk.transport nvme !system_disk minSize: 10GiB maxSize: 100GiBdiskSelectorCEL 表达式选择目标磁盘DiskSelector通过Common Expression LanguageCEL表达式选择承载交换卷的磁盘diskSelector: match: disk.transport nvmeCEL 求值环境由 celenv.DiskLocator() 提供包含以下可用对象与函数disk磁盘对象类型为block.DiskSpec其字段来自 api/block/block.proto 中 DiskSpec 的 Proto 定义常用属性包括size字节、transport如nvme、sata、virtio、usb、rotational是否机械盘、name、model、serial、wwn等system_disk布尔变量标识系统盘承载 Talos 系统分区的磁盘用于避免把 swap 分配到系统盘glob(pattern, string)glob 匹配函数可用于按名称、型号或序列号模式匹配单位乘数常量KB、MB、GB、TB、KiB、MiB、GiB、TiB等可与整数相乘构造字节数。参考文档中给出的两个典型表达式匹配大小在 120GB 到 1TB 之间的磁盘match: disk.size 120u * GB disk.size 1u * TB匹配非机械盘SSD且非系统盘的 SATA 磁盘match: disk.transport sata !disk.rotational !system_disk注意表达式必须严格使用环境支持的重载例如整数与单位相乘要写成120u * GBu表示无符号整数字面量否则会出现 CEL 类型不匹配错误。encryption交换卷的 LUKS2 加密EncryptionSpec描述交换卷的加密设置其示例与字段定义见 encryption.goencryption: provider: luks2 # Encryption provider to use for the encryption. # Defines the encryption keys generation and storage method. keys: - slot: 0 # Key slot number for LUKS2 encryption. # Key which value is stored in the configuration file. static: passphrase: exampleKey # Defines the static passphrase value. # # KMS managed encryption key. # kms: # endpoint: https://192.168.88.21:4443 # KMS endpoint to Seal/Unseal the key. - slot: 1 # Key slot number for LUKS2 encryption. # KMS managed encryption key. kms: endpoint: https://example-kms-endpoint.com # KMS endpoint to Seal/Unseal the key. cipher: aes-xts-plain64 # Cipher to use for the encryption. Depends on the encryption provider. blockSize: 4096 # Defines the encryption sector size. # # Additional --perf parameters for the LUKS2 encryption. # options: # - no_read_workqueue # - no_write_workqueue字段类型说明取值providerEncryptionProviderType加密提供者。luks2keys[EncryptionKey]加密密钥的生成与存储方式。cipherstring加密算法取决于加密提供者。aes-xts-plain64、xchacha12,aes-adiantum-plain64、xchacha20,aes-adiantum-plain64keySizeuint加密密钥长度。blockSizeuint64加密扇区大小。如4096options[]stringLUKS2 加密的额外--perf参数。如no_read_workqueue、no_write_workqueueallowDiscardsbool打开加密卷时是否允许 TRIM/discard 请求透传到底层设备默认false。keys[]加密密钥EncryptionKey表示磁盘加密密钥的配置每个密钥占用一个 LUKS2 key slot字段类型说明slotintLUKS2 加密的密钥槽位号。staticEncryptionKeyStatic密钥值直接存储在配置文件中的静态密钥。nodeIDEncryptionKeyNodeID由节点 UUID 与分区标签确定性生成的密钥。kmsEncryptionKeyKMS由 KMS 服务器托管seal/unseal的密钥。tpmEncryptionKeyTPM基于 TPM 的磁盘加密密钥。lockToStatebool将磁盘加密密钥锁定到 STATE 分区中存储的随机盐。这可以防止卷在 STATE 分区被入侵或替换后被解锁推荐在非 STATE 卷上配合 TPM 加密使用。校验器encryption.go会强制provider只能是luks2其他值报unsupported encryption provider必须至少配置一个密钥否则报encryption keys are requiredkey slot 不允许重复报duplicate key slot N每个 slot 至少指定static/nodeID/kms/tpm中的一种否则报at least one encryption key type must be specified for slot NTPM PCR 号必须在 023 范围内。static静态密钥类型密钥值明文存储在配置文件中字段类型说明passphrasestring静态口令值。由于该值属于敏感信息SwapVolumeConfigV1Alpha1实现了config.SecretDocument接口swap_volume_config.goRedact()会在输出配置时用占位符替换所有静态口令。nodeID由节点 UUID 与分区标签确定性生成的密钥。相同节点上重建卷可得到相同密钥因此适合需要可重复解锁的卷密钥无需在配置中保存。kms密钥由 KMS 服务器生成并通过 seal/unseal 方式托管encryption: keys: - kms: endpoint: https://192.168.88.21:4443 # KMS endpoint to Seal/Unseal the key.字段类型说明endpointstring用于 Seal/Unseal 密钥的 KMS 端点。tpm密钥由 TPM 芯片生成并封存seal/unseal字段类型说明optionsEncryptionKeyTPMOptionsTPM 密钥保护选项。checkSecurebootStatusOnEnrollbool注册enroll密钥时检查 EFI 固件是否启用了 Secure Boot若未启用则注册失败。optionsTPM 密钥保护选项字段类型说明pcrs[]int绑定密钥的 PCR 列表。不设置时默认绑定 PCR 7传空列表可禁用 PCR 绑定。从源码 encryption.go 可以看到未显式指定pcrs时Talos 默认使用constants.SecureBootStatePCRPCR 7此外 TPM 密钥始终还会额外锁定到 PCR 11UKI PCR见PubKeyPCRs()。综合加密示例TPM 静态口令双槽位仓库测试夹具 testdata/swapvolumeconfig_encrypted.yaml 展示了一个同时使用 TPM 与静态口令的加密交换卷配置与TestSwapVolumeConfigMarshalUnmarshal测试相互印证swap_volume_config_test.goapiVersion: v1alpha1 kind: SwapVolumeConfig name: secret-swap provisioning: diskSelector: match: !system_disk minSize: 10GiB encryption: provider: luks2 keys: - slot: 0 tpm: {} - slot: 1 static: passphrase: topsecret cipher: aes-xts-plain64该示例说明交换卷也可以加密。slot 0 使用 TPM 密钥保证在节点上自动解锁slot 1 使用静态口令作为应急解锁手段cipher明确指定为aes-xts-plain64。底层实现从配置到 swap 激活理解 SwapVolumeConfig 的声明式语义后看一下 Talos 内部如何把它落地为真实的 swap 分区。在卷配置控制器中SwapVolumeTransformeruser_volumes.go负责将每个 SwapVolumeConfig 文档转换为一组卷资源卷 ID 由SwapVolumePrefixs- 卷名拼接而成volumeID : constants.SwapVolumePrefix swapVolumeConfig.Name()这正是分区标签s-name的来源卷类型固定为block.VolumeTypePartition并通过labelVolumeMatch(volumeID)定位已存在的分区分区规格继承文档中的minSize、maxSize含百分比相对值与负值、grow与磁盘选择器当minSize未显式设置时回退到MinUserVolumeSize 100MiB见 user_volumes.go分区类型 UUID 固定为partition.LinkSwap文件系统类型固定为block.FilesystemTypeSwap——即该分区专用于 swap加密配置通过WithConvertEncryptionConfiguration统一转换为底层加密资源挂载变换使用DefaultMountTransform空操作swap 的激活/停用由 volume manager 层处理。在运行期SwapStatusController 通过轮询/proc/swaps每分钟一次持续提供当前激活的 swap 设备视图。因此SwapVolumeConfig 文档的增删会触发 Talos 卷管理器的分配/回收流程新增文档 → 创建并格式化分区 → 激活 swap删除文档 → 停用 swap → 移除分区。这一完整闭环由控制器自动完成无需手工执行fdisk、mkswap或swapon。实践要点与限制命名约束name只能使用大小写 ASCII 字母、数字和连字符长度 134 字符分区标签自动加上s-前缀后仍须满足内核分区标签 36 字符的上限。磁盘选择器是必填项SwapVolumeConfig 要求显式提供diskSelector.match与VolumeConfig不同swap 卷没有系统卷那样的隐含默认磁盘同时minSize与maxSize至少指定其一。建议排除系统盘在match中加上!system_disk可避免把 swap 分区建到承载 Talos 系统分区的磁盘上测试夹具与集成测试均采用该写法。加密交换卷provider目前仅支持luks2allowDiscards默认关闭若底层设备为 SSD/NVMe 且希望 TRIM 透传需显式开启。配置验证talosctl validate会在应用配置前执行上述全部校验name、选择器、大小关系、加密槽位等错误信息与TestSwapVolumeConfigValidate中的断言一一对应可直接据此排查。适用于集群初始化与节点配置SwapVolumeConfig 作为独立配置文档可随机器配置machine config一起通过talosctl apply-config或集群引导流程下发实现 swap 策略的版本化、可审计管理。相关配置文档SwapVolumeConfig 是 Talos 块卷配置家族的一员配套文档还包括VolumeConfig管理STATE、EPHEMERAL、IMAGECACHE、ETCD、CRI、KUBELET、LOG等系统卷UserVolumeConfig/RawVolumeConfig用户自定义数据卷与原始块卷ExistingVolumeConfig挂载已存在的分区ExternalVolumeConfig挂载 virtiofs / NFS 等外部卷。它们的实现共享同一套ProvisioningSpec/EncryptionSpec结构与校验逻辑掌握了 SwapVolumeConfig 之后即可举一反三地配置其他卷类型。相关类型定义与测试位于 pkg/machinery/config/types/block 目录控制器实现位于 internal/app/machined/pkg/controllers/block集成测试见 internal/integration/api/volumes.go。【免费下载链接】talosTalos Linux is a modern Linux distribution built for Kubernetes.项目地址: https://gitcode.com/gh_mirrors/ta/talos创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
