ignition
📈

ignition

官网地址

介绍

Ignition 是一个实用程序,用于在 initramfs 期间操作磁盘。这包括对磁盘进行分区、格式化分区、写入文件(常规文件、systemd 单元等)以及配置用户。首次启动时,Ignition 会从真实来源(远程 URL、网络元数据服务、虚拟机管理程序桥等)读取其配置并应用该配置。

由 CORE OS 提出的

通过 Ignition 文件描述修改机器配置(描述文件需要使用 Butane 工具)[我个人的理解]

Butane

(以前称为 Fedora CoreOS 配置转换器,FCCT)将人类可读的 Butane 配置转换为机器可读的Ignition配置。请参阅入门指南以了解如何使用 Butane 以及Butane 配置支持的所有内容的配置规范。

官方网址

使用

容器方式

其它方式(请参考官网地址,没有什么太大区别)
拉取最新版本镜像
podman pull quay.io/coreos/butane:release
设置别名(短的命令名)
vim /etc/profile # 在最后添加以下内容 alias butane='podman run --rm --interactive \ --security-opt label=disable \ --volume "${PWD}":/pwd --workdir /pwd \ quay.io/coreos/butane:release'
验证
butane --version

先暂停,看一看 ignition 文件格式

配置规格(v3.2.0)

链接地址:
(懒得看了,需要什么找什么就行)

使用


继续接着使用 butane 工具生成 ignition 文件。

例子1 设置文件

目标:在系统 /etc/ras/dimm_labels.d/ 目录下生成asus 文件。
文件内容为(在当前目录中此文件):
Vendor: Great Wall Model: GWMSSE2GL1T MemoryCardSlot_0: 0.0; MemoryCardSlot_1: 0.1; MemoryCardSlot_2: 0.2; MemoryCardSlot_3: 0.3; MemoryCardSlot_4: 0.4; MemoryCardSlot_5: 0.5; MemoryCardSlot_6: 0.6; MemoryCardSlot_7: 0.7; MemoryCardSlot_8: 0.8; MemoryCardSlot_9: 0.9; MemoryCardSlot_10: 0.10; MemoryCardSlot_11: 0.11; MemoryCardSlot_12: 0.12; MemoryCardSlot_13: 0.13; MemoryCardSlot_14: 0.14; MemoryCardSlot_15: 0.15;
示例文件如下(文件名:99_master_asus.bu):
variant: fcos version: 1.2.0 storage: files: - path: /etc/ras/dimm_labels.d/asus contents: local: asus mode: 0644
通过 Butane 生成 ignition 文件。
butane 99_master_asus.bu -d . > 99_master_asus.ignition
查看结果
notion image
通过 JSON 格式化
{ "ignition": { "version": "3.2.0" }, "storage": { "files": [ { "path": "/etc/ras/dimm_labels.d/asus", "contents": { "compression": "gzip", "source": "data:;base64,H4sIAAAAAAAC/3TQL67CQBSFcd9V3BW89PR/p/plDFUlVJImHTehScMWwOGxKBRLYDnDOkjuoMhB/9T37dxhXlYjdnXTUcbJ+6RfZueN2LEfhv/MbrBNRML5FB7XcLm97s99akTSv7QTEfk2qIFappZRy9VyaoVaQa1UK6lVahW1Wq2m1qg11Fq1lrfHMfhx5rOGv0GcA34HcQ/4H8RB4IcQF6HskncAAAD//2xEcmHuAQAA" }, "mode": 420 } ] } }
生成的文件与配置规格(v3.2.0)描述一致。

例子2

目标:将 python 脚本程序通过 system 自启动。
最终位置:/var/uer/sbin/getRasMcLog.py
import http.server import socketserver import subprocess import argparse class MemStatusHandler(http.server.SimpleHTTPRequestHandler): def do_GET(self): if self.path == '/getMemStatus': result = subprocess.check_output(['ras-mc-ctl', '--error-count']).decode('utf-8') self.send_response(200) self.end_headers() self.wfile.write(result.encode('utf-8')) else: self.send_response(404) self.end_headers() self.wfile.write(b'Not Found') def main(): parser = argparse.ArgumentParser(description='Start the HTTP server') args = parser.parse_args() PORT = 18080 with socketserver.TCPServer(("", PORT), MemStatusHandler) as httpd: print("Server started at localhost:" + str(PORT)) httpd.serve_forever() if __name__ == "__main__": main()
自启动 service 内容如下:
[Unit] Description=Collect hardware information agent service [Service] Type=simple RemainAfterExit=yes ExecStart=/usr/bin/python3 /usr/bin/getRasMcLog.py Restart=always WorkingDirectory=/var/uer/sbin [Install] WantedBy=multi-user.target
示例文件如下(文件名:99_master_asus.bu):
variant: fcos version: 1.2.0 systemd: units: - name: CollectHardwareInfoAgentd.service enabled: true contents: | [Unit] Description=collect hardware information agent service [Service] Type=simple RemainAfterExit=yes ExecStart=/usr/bin/python3 /usr/bin/getRasMcLog.py Restart=always [Install] WantedBy=multi-user.target storage: files: - path: /usr/bin/getRasMcLog.py contents: local: getRasMcLog.py mode: 0644
注意:我发现上面这个文件中的 tab 不能识别,只能用空格。
通过 Butane 生成 ignition 文件。
butane 99_master_asus.bu -d . > 99_master_asus.ignition
查看结果
notion image
{ "ignition": { "version": "3.2.0" }, "storage": { "files": [ { "path": "/usr/bin/getRasMcLog.py", "contents": { "compression": "gzip", "source": "data:;base64,H4sIAAAAAAAC/6RST4/TPhC951OMcomjX5NfhfZQVcoBIWAvQLXtDSHLG08aaxM7zEzo10d2wnYLK3HAh/x5nj9P7z03ToEEepGpZqQfSNkKcWifUH7D5seJQovMvxBD58kQY5a1g2GGTzgexcjM98bbAUm9mFwf3TgNeH86HR7w+4wsa1G5zwAALHZgg/74/qQYh25F43EdRKSejPTQNFD8f0Z5XlVcC+Mh5HkQaF6wrdse2ycdZplmUV8LMlyNbdXKUGygqCokClS1YfZSfCtri22wqIpZumpXlDfTEw9GbzUhT8Ezqjfb7Ss1saRHY5FYvXJ96dyA9YWcoFoY1+hv1l6bcGDc/43F3fbu31g8Fp+DwIcwe1uUWRbdGI3zavUh2UzQPFtev6XzPKKXQ7pRFrklN4kLvimOYkhAeoRoNywBWKU0dGZo1oF1eumIrQTT4/Dl4QQN7La7bfq/OOlvIlmf3h2O6UupPN+khnLzR/5KMJzSba8CTuS8qHzpBo5M0YIRGEJrhj6w7HP4D1hIpalX3dKgJc26C4Rxe5llrgOtvRlR65jOXOsonNb5snNRMfsZAAD//+ccn15rAwAA" }, "mode": 420 } ] }, "systemd": { "units": [ { "contents": "[Unit]\nDescription=collect hardware information agent service\n[Service]\nType=oneshot\nRemainAfterExit=yes\nExecStart=/usr/bin/python3 /usr/bin/getRasMcLog.py\nrestart=always\n[Install]\nWantedBy=multi-user.target\n", "enabled": true, "name": "CollectHardwareInfoAgentd.service" } ] } }
其它例子请查看

需要注意的地方

版本号的问题

Butane 内的版本号
对应 ignition 版本号
1.1.0
3.1.0
1.2.0
3.2.0
其它的版本,还没有测试,我这边只想用 3.2.0 版本,就没有继续找依据文件了。