在 Linux 或 macOS 上运行一条命令即可安装 Kiln,再次运行即可升级。脚本会检测平台、选择可用的下载源、校验 SHA256SUMS,再以原子方式替换二进制。默认无需 sudo;写入任何文件前,脚本都会先显示完整计划并等待确认。
一行安装
curl -fsSL https://raw.githubusercontent.com/babywbx/Kiln/main/install.sh | sh -s -- --lang zh拉取超时或失败时,换镜像地址:
curl -fsSL https://ghfast.top/https://raw.githubusercontent.com/babywbx/Kiln/main/install.sh | sh -s -- --lang zhWindows 不在脚本支持范围内,脚本检测到 Windows 环境会直接退出并提示改用发行包,见手动安装与 Windows 服务。
脚本做了什么
探测平台与依赖
识别 uname -s 与 uname -m,映射到发行产物的平台与架构;确认 curl 或 wget、tar、mktemp,以及 sha256sum 或 shasum 都在。缺哪个就按当前系统的包管理器给出安装命令并退出。
选择安装目录
未显式指定时优先 /usr/local/bin,不可写则回退到 $HOME/.local/bin。
读取已安装状态
目标目录已有可执行的 kiln 时,运行 kiln -version 解析出 version= 与 variant=,据此判断这次是安装、升级、降级还是切换变体。
解析版本与下载源
未指定 --version 时解析最新 Release,再并行探测所有候选下载源。
展示计划并确认
把版本、变体、平台、安装位置、下载源、解码器状态列成一张表,确认后才开始写入。
下载、校验、原子替换
下载压缩包并核对 SHA256SUMS。解包后先写入同目录的暂存文件,确认可以正常启动,再以原子操作替换旧文件。
确认前展示的计划形如:
即将执行:
版本 vX.Y.Z(最新)
变体 full
平台 linux/amd64
位置 /usr/local/bin/kiln
下载源 github.com(直连)
解码器 未检测到 ffmpeg(使用原生引擎,无需安装)「解码器」一行只是环境体检:Kiln 的原生引擎不依赖 ffmpeg,检测结果不会改变安装内容,详见媒体引擎。
状态感知
同一条命令在不同状态下行为不同,不需要记两套参数。
| 当前状态 | 脚本行为 |
|---|---|
| 未安装 | 直接安装,确认提示默认为 Y |
| 已装旧版本 | 升级,确认提示默认为 Y |
| 已装同版本同变体 | 提示已是最新;交互模式下菜单默认选「取消」,带 --yes 时直接以 0 退出 |
| 已装同版本不同变体 | 切换变体(例如 full 换 lite) |
| 已装更新版本 | 降级,确认提示默认为 N |
检测到已有安装且处于交互模式时,脚本给出三选一菜单:升级或重装、卸载、取消。选「卸载」会直接进入卸载流程,等价于 --uninstall。
命令行选项
| 选项 | 说明 | 默认 |
|---|---|---|
--yes、-y |
非交互模式,所有提示取默认值 | 交互确认 |
--version <v> |
固定版本,写不写前导 v 都行;支持 SemVer 核心版本和预发布标识符,不支持 +build 元数据 |
最新 Release |
--lite |
安装 lite 变体,仅 Linux 提供构建 | full |
--dir <path> |
指定安装目录;显式给出后不再回退到别处 | 见安装位置 |
--mirror <base> |
手动指定 GitHub 代理镜像,跳过探测;必须是 https:// 开头且不含空白字符,结尾多余的斜杠会被去掉 |
自动探测 |
--no-mirror |
只走直连,不使用任何镜像;与 --mirror 互斥 |
关闭 |
--lang |
强制输出语言,只接受 zh 或 en |
跟随 LC_ALL、LANG |
--service |
安装 systemd unit,配置就绪时启用并启动;需要 Linux、systemd 与 root | 关闭 |
--uninstall |
卸载已安装的二进制,存在服务时一并移除 | — |
--dry-run |
演练:展示并模拟每一步,不写入任何文件 | 关闭 |
--help、-h |
打印用法后退出 | — |
未知选项、缺少取值的选项、非法的 --lang 取值,以及 --mirror 与 --no-mirror 同时出现,都会立刻以 1 退出,不会执行任何后续动作。
下列安装选项也可通过环境变量设置,命令行参数优先级更高:
| 环境变量 | 等价选项 |
|---|---|
KILN_YES |
--yes |
KILN_VERSION |
--version |
KILN_VARIANT |
--lite(取值只接受 full 或 lite) |
KILN_INSTALL_DIR |
--dir |
KILN_MIRROR |
--mirror |
KILN_NO_MIRROR |
--no-mirror |
KILN_LANG |
--lang |
KILN_DRY_RUN |
--dry-run |
镜像与下载源
脚本内置三个 GitHub 代理镜像:ghfast.top、ghproxy.net、gh-proxy.com。
未指定 --mirror 时,脚本对「直连 + 三个镜像」同时发出 HEAD 探测,单个探测超时 3 秒,然后按优先级取第一个可用的:直连排在最前,镜像按内置顺序排在其后。也就是说直连能用就一定走直连,只有直连不通才会落到镜像,并在输出里明确标注当前用的是镜像。
--mirror 会跳过整个探测过程,直接使用给定地址;--no-mirror 则把候选集合缩减为只有直连,探测不通就报错退出,不做任何回退。
解析最新版本走同一套逻辑:先试直连的 Release 跳转地址,再退到 GitHub API;仍拿不到且允许镜像时,按顺序逐个试内置镜像。
安装位置与 PATH
未指定 --dir 时:
/usr/local/bin存在且可写就装在那里,root 运行通常落在这里;- 否则回退到
$HOME/.local/bin,普通用户无需 sudo 即可完成安装; HOME也没有设置时直接报错退出。
--dir 是显式选择,不会回退。给出的路径若已存在必须是目录,且最近的一层已存在的父目录必须可写,否则报错退出。
安装目录不在 PATH 中时,脚本会按当前 shell 打印一行可直接粘贴的命令:zsh 追加到 ~/.zshrc,fish 用 fish_add_path,其余写入 ~/.bashrc。
版本选择与升级
重复运行脚本就是升级。版本比较覆盖 SemVer 核心版本和预发布标识符,因此 1.0.0-rc.1 会被正确判定为早于 1.0.0。
curl -fsSL https://raw.githubusercontent.com/babywbx/Kiln/main/install.sh | sh -s -- --lang zh --version 1.0.0版本号格式非法时以 1 退出;格式合法但没有对应 Release 时,探测阶段找不到产物,以 3 退出。
想要静默升级,加 --yes:已经是最新版本时脚本打印一行提示并以 0 退出,适合放进定时任务。
curl -fsSL https://raw.githubusercontent.com/babywbx/Kiln/main/install.sh | sh -s -- --lang zh --yeslite 变体只有 Linux 构建,在 macOS 上加 --lite 会以 2 退出。变体差异见 Lite、Core 与 Full。
systemd 服务
--service 会在安装二进制之后注册一个开机自启的系统服务。它需要 root,而管道运行时不便于提权,所以推荐先下载再执行:
curl -fsSL https://raw.githubusercontent.com/babywbx/Kiln/main/install.sh -o /tmp/kiln-install.sh
sudo sh /tmp/kiln-install.sh --yes --service --lang zh网络受限时把第一行换成镜像地址即可,第二行不变。
前置条件有三条,任何一条不满足都会在写入前退出:
- 系统是 Linux 且
systemctl可用; - 以 root 身份运行;
- 安装目录是绝对路径,不含空白字符,且不在
/home、/root、/tmp、/var/tmp之下。默认的/usr/local/bin满足要求。
满足后脚本会:
准备服务账户
系统中没有 kiln 用户时,用 useradd -r -U -d /var/lib/kiln 创建同名系统用户与用户组,登录 shell 取 /usr/sbin/nologin、/sbin/nologin、/bin/false 中第一个可用的。
创建目录
建立 /etc/kiln 与 /var/lib/kiln,后者的属主设为服务账户。
写入 unit 并加载
写入 /etc/systemd/system/kiln.service,随后 systemctl daemon-reload。
按配置状态决定是否启用
/etc/kiln/kiln.toml 存在则 systemctl enable --now kiln;不存在则保持 unit 未启用,并提示先写配置再手动启用。
写入的 unit 是加固过的:
[Unit]
Description=Kiln
After=network-online.target
Wants=network-online.target
[Service]
User=kiln
Group=kiln
ExecStart=/usr/local/bin/kiln -config /etc/kiln/kiln.toml
WorkingDirectory=/var/lib/kiln
Restart=on-failure
RestartSec=3
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=true
PrivateTmp=true
ReadWritePaths=/var/lib/kiln
[Install]
WantedBy=multi-user.targetProtectSystem=strict 意味着整个文件系统对服务只读,唯一可写的是 ReadWritePaths 列出的 /var/lib/kiln。把 data_dir 指到别处就要同步补充这一项。配置写法见配置参考。
首次安装后的典型顺序是:写好 /etc/kiln/kiln.toml,启用服务,然后看状态与日志。
sudo systemctl enable --now kiln
systemctl status kiln
journalctl -u kiln -f卸载
curl -fsSL https://raw.githubusercontent.com/babywbx/Kiln/main/install.sh | sh -s -- --lang zh --uninstall查找顺序是:给了 --dir 就只看该目录下的 kiln;否则依次看 /usr/local/bin/kiln 与 $HOME/.local/bin/kiln,且只认普通文件,符号链接会被跳过。装在自定义目录时必须显式带上 --dir。
两者都没有、也没有 systemd unit 时,脚本提示未检测到安装并以 0 退出。找到后会先确认,确认提示默认为 N,带 --yes 才默认 Y。
存在 systemd 服务时,卸载必须以 root 执行,脚本会先 systemctl disable --now kiln、删除 unit、systemctl daemon-reload,再删二进制。权限不足时不会删除任何东西,只提示手动执行:
sudo systemctl disable --now kiln && sudo rm /etc/systemd/system/kiln.service && sudo systemctl daemon-reload试运行
--dry-run 会完整走一遍决策与展示,但不创建临时目录、不下载、不写入任何文件,也不检查依赖工具,每一步结尾都标注「(试运行)」。
curl -fsSL https://raw.githubusercontent.com/babywbx/Kiln/main/install.sh | sh -s -- --lang zh --dry-run --service它适合确认安装位置、下载源和 systemd 前置条件的判断结果。注意演练不联网:没有配合 --version 时,计划里的版本号是占位值而非真实的最新版本。
校验和与原子替换
下载完成后,脚本先取 SHA256SUMS(直连超时 5 秒,失败则改用当前下载源,超时 10 秒),从中取出本次产物对应的那一行做比对。不匹配就立即丢弃下载的文件并以 4 退出,不触碰已有安装。
校验通过后才解包,并且不直接覆盖目标文件:
- 在目标目录下创建
.kiln.new.XXXXXX暂存文件,写入二进制并chmod 0755; - 执行一次
-version作为冒烟测试,能跑起来才算数; - 用
mv原子替换到最终路径。
任一步失败都会删掉暂存文件,原有安装保持可用。冒烟失败通常意味着目标目录挂了 noexec,或者下载到了架构不匹配的构建。脚本被中断时同样会清理暂存文件与临时目录。
支持的平台与架构
| 系统 | 架构 | 变体 |
|---|---|---|
| Linux | amd64、arm64、armv7、armv6 |
full、lite |
| macOS | amd64、arm64 |
full |
uname -m 的取值按下表映射:x86_64 与 amd64 归入 amd64,aarch64 与 arm64 归入 arm64,armv7l 与 armv8l 归入 armv7,armv6l 归入 armv6。其余架构以 2 退出。
macOS 上还有一层额外判断:uname -m 返回 x86_64 时,脚本会读 sysctl hw.optional.arm64,为 1 说明当前只是跑在 Rosetta 下的终端,实际是 Apple Silicon,于是改装 arm64 产物,避免装成转译执行的 x86 版本。
Windows 与其他系统直接以 2 退出,并提示改用发行包。
退出码
| 退出码 | 含义 |
|---|---|
0 |
成功;也包括主动取消、--help、已是最新版本、以及未检测到可卸载的安装 |
1 |
参数错误、缺少依赖工具、目录不可写或不是目录、HOME 未设置、版本号格式非法、写入失败、安装后二进制无法执行、systemd 配置或移除失败 |
2 |
平台或架构不受支持,包括 Windows,以及在非 Linux 上请求 lite |
3 |
网络问题:无法解析版本,或所有候选下载源都不可用 |
4 |
SHA256 校验不匹配,下载的文件已丢弃 |
130 |
收到中断信号 |