
简介rEFInd 引导管理器二进制发布包面向 Linux/macOS 下需要修复或维护 UEFI 引导的进阶用户解决多系统共存时启动项丢失、引导顺序错乱、进不了图形引导菜单等常见痛点。包体仅 3.22MB共 61 个文件核心由 23 个 efi 可执行文件、24 个 icns 图标、2 个 shell 脚本组成另有 plist/conf 配置和 rtf 说明文档按引导分区、图标主题、安装工具分目录存放便于定位。部署时可直接运行 refind-install 脚本它会自动把 rEFInd 复制到 ESP 或其他目标位置并修改固件 NVRAM 设置让 rEFInd 在下次启动时接管引导若遇到安全启动或准备制作 USB 闪存启动盘配套文档给出了更稳妥的手动配置与排障思路。包内还保留了 rEFIt 时代的若干辅助组件可帮助理解引导器工作原理适合熟悉命令行、希望摆脱 Windows 工具链维护双系统引导的用户既能快速部署也可作为 UEFI 启动异常的排查参考。目前已有 347 人学习下载简洁实用。1. refin-bin-0.14.tar解压前先弄明白的一件小事拿到 refin-bin-0.14.tar 这种包大多数人的第一反应是 tar -zxvf然后去 bin 目录里找可执行文件。这个流程没错但带版本号、带 bin 的发布包解压前值得多花 30 秒确认两件事压缩格式对不对、包内顶层目录会不会污染当前路径。否则轻则报一次gzip: stdin: not in gzip format重则把整个目录结构拆乱。refin-bin-0.14.tar 是 refin 0.14 的二进制发布包面向要在 Linux 服务器openEuler、CentOS、Ubuntu 都算上安装、升级和排查 refin 的运维与开发。它不含源码解压、配置 PATH、验证版本就能用。这篇就按我日常落地的顺序从拆包说到排障再说到怎么自己打一个同样规范的包。2. 拆包前 30 秒压缩格式、校验和与包内结构预检先纠正一个常见错觉文件名叫 .tar里面不一定就是未压缩的 tar 归档。发布系统命名不规范是常态明明用 gzip 压过扩展名却只写 .tar反过来包确实没压缩名称却充满迷惑性。所以不要拿扩展名当依据拆包前的 30 秒检查能挡掉后面一大半的麻烦。2.1 用 file 而不是扩展名判断压缩格式-zxvf 不是万能钥匙# 解压之前先用 file 读取文件头确认归档格式 file refin-bin-0.14.tar逻辑说明file 命令不看扩展名而是读文件开头的魔数。gzip 的开头两个字节是 1F 8Bxz 是 FD 37 7A 58 5A 00bzip2 是 42 5A 68未压缩的 POSIX tar 则直接以文件名字符串开头。只要 file 输出能对上格式后面选参数就不会翻车。参数说明一旦确认是 gzip解压参数就是 -xzf是 bzip2 就用 -xjf是 xz 用 -xJf未压缩的 POSIX tar 直接 -xf不需要带任何解压缩标志。如果包是未压缩 tar你偏偏加了 -ztar 会先按 gzip 流去读读不到魔数就退出报错信息非常误导人。反过来gzip 包用 -xf 解tar 会把压缩流当普通文件落盘最后得到一个巨大的单文件看起来解压成功但目录结构完全不对。file 输出关键字真实格式对应解压参数gzip compressed datagzip-xzfbzip2 compressed databzip2-xjfXZ compressed dataxz-xJfPOSIX tar archive未压缩 tar-xfdata文件头损坏先修文件源注意file 输出 data 是最危险的情况它说明二进制文件头已经被破坏。这种包后面多半会解压出坏文件运行就段错误原因大概率是传输环节出了问题我在第 5 章会展开讲。2.2 解压前校验完整性sha256sum -c 的用法和输出长什么样# 假设发布方同时给了校验文件先过校验再解压 sha256sum -c refin-bin-0.14.tar.sha256 # 如果只有包没有校验文件至少先算出现有哈希 sha256sum refin-bin-0.14.tar逻辑说明sha256sum -c 会解析校验文件里的哈希值 空格 文件名记录逐条对当前目录下的文件做比对。输出有三类文件名后跟 OK 说明完整跟 FAILED 说明哈希不一致文件要么下载不完整要么被改动过还有一类提示未找到是校验文件里的文件名和实际文件不匹配常见于上传时被改过名。这一条命令的退出码直接反映了包的可用性非 0 时坚决不要继续解压。参数说明校验文件里如果有多条记录sha256sum -c 会全部执行任何一条失败都会让最终状态变成失败。在脚本里这一句必须放在 mkdir 和 tar 之前因为哈希不过后面所有操作都没有意义。没有 sha256 文件时md5sum 也能做快速比对只是抗碰撞能力弱适合内网传输后做前后一致性确认不适合作为对外发布的安全校验。2.3 tar -tvf 预检先看包内第一层目录再决定要不要解压# 只列包内内容不释放文件先看前 20 条 tar -tvf refin-bin-0.14.tar | head -20 # 提取所有条目的顶层目录去重排序一眼看清解压后会落在哪 tar -tvf refin-bin-0.14.tar | awk {print $6} | cut -d/ -f1 | sort -u逻辑说明tar -tvf 中 -t 表示列出内容-v 显示权限、属主和大小等详细信息-f 指定包文件。输出行里第 6 列是路径前 20 条足够看出第一条是 refin-bin/ 还是 ./ 开头。第二段命令把第 6 列交给 awk按斜杠切出第一段再排序去重整个包的顶层结构就出来了。参数说明cut -d/ -f1 表示按斜杠切分并取第一段。如果输出只有一条 refin-bin说明包结构干净所有文件都在这个目录里如果输出里有 . 或空行说明包内存在散落文件解压会把内容直接铺到当前目录。这种包解压前最好先建一个临时目录在里面拆完再搬迁。还有一种要直接拉黑的包条目里出现 .. 路径有目录穿越风险绝对不要解压。检查方法tar -tvf refin-bin-0.14.tar | grep -E (^|/)\.\.说明这条命令把包内所有路径扫一遍出现 .. 就说明包被手工改动过来源可疑宁可放弃也不要冒险。生产环境里一个 tar 包要在多台机器上落地这一步 10 秒能完成值得养成习惯。3. 解压并安装 refin 0.14目录、PATH 与 openEuler 上的 tar包本身没问题接下来才是安装。我一般不用解压到当前目录这种方式而是统一放到 /opt/refin 下再用软链管理版本。这样后续升级、回滚都清楚不会出现一台机器上有十几个散落的 refin。3.1 建立安装目录并解压-C 参数的正确用法# 统一把包释放到 /opt/refin sudo mkdir -p /opt/refin sudo tar -xzf refin-bin-0.14.tar -C /opt/refin逻辑说明-C 让 tar 在释放前先切到指定目录。先 mkdir 是为了确保目标目录存在tar 不会自动创建深层目标如果目录不存在解压会直接报 Cannot open: No such file or directory。解压完成后/opt/refin 下会出现 refin-bin/ 这个包内顶层目录后面的安装步骤都以它为基准不要强行把它拆开平铺。参数说明x 是解压-z 按第 2 章判断出的 gzip 格式加上f 指定包文件。第一次解压不建议加 -v因为文件多时输出会刷屏反而盖住真正的错误信息。解压完先确认关键文件有没有到位ls -l /opt/refin/refin-bin/bin/说明这一步看的是可执行文件是否真的落在预期位置。如果 bin 目录为空或不存在回头查 pack 阶段是否把目录结构打错了不要贸然重复解压。3.2 PATH 配置与版本软链接两个方案任选方案一写进 profile.d每次登录自动生效sudo tee /etc/profile.d/refin.sh EOF export PATH/opt/refin/refin-bin/bin:$PATH EOF source /etc/profile.d/refin.sh which refin逻辑说明tee 配合 heredoc 往 /etc/profile.d/refin.sh 写入内容。EOF 用单引号包住防止 shell 在当前会话里展开变量。source 让配置立即生效新开的登录终端也会自动加载。which refin 验证 PATH 里能找到程序这一步能确认环境变量拼接没有出错。方案二用软链做版本切换sudo ln -sfn /opt/refin/refin-bin /opt/refin/current export PATH/opt/refin/current/bin:$PATH参数说明-s 创建符号链接-f 覆盖已有链接-n 在目标是目录名时避免让链接递归进目录。以后升级到新版本把新包解压到 /opt/refin/refin-0.15-bin再执行一次同样的 ln -sfnPATH 不用改动。这个方式对生产环境最友好回滚也快一条命令切回旧目录。3.3 openEuler 等最小化系统上没有 tar 命令应急方案与推荐方案现象很典型服务器是 openEuler 最小化安装或者刚起的容器里只有 busybox执行 tar -xzf refin-bin-0.14.tarbash 直接回一句 tar: command not found。这不是包的问题是系统里根本没装 tar。推荐方案直接用包管理器安装# openEuler 用 dnfCentOS 7/8 也可以用 yum sudo dnf install -y tar说明dnf 是 openEuler 的默认包管理器装上 tar 后所有参数和 GNU tar 保持一致后面排障章里提到的命令都能用。容器内如果 dnf 也起不来就在宿主机上准备好 tar 的 rpm 包用 rpm -ivh 手动装进去效果相同。应急方案用 busybox 自带 tarbusybox tar -xzf refin-bin-0.14.tar -C /opt/refin说明busybox tar 是精简版基础解压参数和 GNU tar 兼容拆一个发布包够用。但它的参数覆盖面很窄像 --owner、--no-same-owner 这类选项不一定支持。所以 busybox 只适合临时排查真正的安装和重打包还是要回到 GNU tar 上。4. 跑通 refin 0.14最小验证命令与三个必查点tar 解压成功只代表文件放到位了进程能不能跑是另一回事。现实中不少包解压顺利一运行就报缺少动态库、权限不对或版本不对。这一章把验证顺序固定下来每台机器都按这个走。4.1 版本号验证与日志输出0.14 装没装对这个命令说了算# 先保证可执行权限再查版本 chmod x /opt/refin/refin-bin/bin/refin /opt/refin/refin-bin/bin/refin --version # 或者进入目录后用相对路径执行 cd /opt/refin/refin-bin/bin ./refin -v逻辑说明--version 是绝大多数 CLI 工具的通用参数输出里应该包含 refin 0.14 的字样。如果输出一个完全不同的版本号说明 PATH 里存在旧版本 refin 被优先找到这时用 which refin 看它落在哪再核对 3.2 的 PATH 配置。有些命令的版本参数是 -V 或 -v具体看包内 README 或 help 输出不在执行前猜。参数说明chmod x 是先发制人解决执行位问题。二进制包在打包时通常会带执行权限但如果你之前用 unzip 或 Windows 自带解压处理过执行位会丢。给执行权限后用绝对路径运行能避开 PATH 干扰直接验证刚装好的这个 0.14。4.2 ldd 检查动态库not found 比解压报错更值得看ldd /opt/refin/refin-bin/bin/refin | grep -i not found逻辑说明refin 如果是动态链接绝大多数二进制默认如此ldd 会列出它依赖的所有 .so 以及解析后的路径。grep not found 只保留缺失项。最常见的两个缺失库是 libstdc.so.6 和 libssl.so.1.1前者说明系统里的 gcc/glibc 版本与编译环境差距太大后者说明 OpenSSL 版本对不上。这些错误如果不提前查运行时会以段错误或启动失败的形式出现排起来更费劲。参数说明ldd 只是诊断工具不要试图把包内自带的 .so 手工复制到系统目录去补。混用不同工具链编出来的 C 运行库轻则告警重则一运行就崩。正确做法是到对应发行版仓库装兼容的运行库比如 libstdc或者用一个版本匹配的基础镜像跑 refin。这个原则在容器化环境里尤其重要容器里的 glibc 和构建机不一致最容易出现 not found。4.3 执行位和文件属主解压后 Permission denied 的补救# 修复以 refin 开头的可执行文件 find /opt/refin/refin-bin -type f -name refin* -exec chmod x {} \; # 修复包内所有 shell 脚本 find /opt/refin/refin-bin -type f -name *.sh -exec chmod x {} \;逻辑说明tar 包本身能保留权限位但经历过 unzip、FTP 文本模式传输或 Windows 解压后执行位大概率会丢。两条 find 分别处理程序文件和脚本文件。-type f 限定只处理普通文件避免误伤目录-exec chmod x {} 对命中的每个文件执行一次 chmod; 是 find 执行动作的结尾标记。参数说明不要图省事对整个目录 chmod -R 777。生产环境的日志、配置、密钥文件被放开到 777安全审计一查一个准而且后续排障也没法判断原本权限是什么。按文件名精确修复既解决执行问题又不会破坏其他文件的权限。这个习惯在点多台机器时尤其重要统一命令比手工逐个 chmod 更不容易遗漏。5. 解压与运行避坑5 个真实翻车现场和处理顺序这一章写的都是实操里最容易卡住的位置按出现的概率从高到低排。前两条最典型后三条是长期血泪经验。5.1 解压返回 status 1先分内因还是外因现象服务器上执行 tar -xzf refin-bin-0.14.tar命令报错退出shell 返回 status 1。网上搜 linux tar包解压命令status 1会看到各种说法但关键字很多对不上。原因status 1 是 GNU tar 的通用失败码具体原因要看 stderr 的最后几行归纳下来最常见是三类。第一类是 gzip 流损坏报 gzip: stdin: unexpected end of file说明包在传输或存储时坏了。第二类是目标目录里有同名文件或权限不足报 Cannot open: Permission denied常见于重复解压到同一目录。第三类是包条目本身有问题tar 拒绝继续。解决先把包内世界读一遍区分内外因tar -tzf refin-bin-0.14.tar /dev/null echo $?说明-t 只读列表不释放能完整读完说明归档结构没问题错误出在释放阶段读到一半退出说明包已经损坏。释放阶段的问题再换一个干净空目录试一次把目标路径因素隔离开。内因重新下载或找回最初的包外因调整目标目录权限两步走完再正常解压。5.2 运行报 can not connect to target要求 connect under reset 模式现象refin 包里对目标设备操作的子命令第一次运行控制台输出 can not connect to target! please select connect under reset mode from tar随后退出。原因目标设备开发板、单板、MCU上电后处于未知总线状态通信口握手时序对不上。说白了就是设备没在正确的时间点响应主机。很多调试工具要求主机在复位瞬间发起连接确保设备从复位向量开始就被接管否则连接建立不了。解决在命令行参数或配置文件里打开 connect under reset 选项常见形式是 --connect-under-reset或把配置里的 ConnectMode 改成 UnderReset。不同工具参数名不同但思路一致先让设备复位再拉起连接。排查时先确认目标板供电和复位引脚硬件问题别先动软件省得白调半天参数。5.3 解压后属主错乱root 所有和普通用户告警现象普通用户执行 tar -xzf 后屏幕不断刷出 Changing ownership to uid0或者解出来的文件 ls -l 显示 root root普通用户连日志目录都改不了。原因tar 包默认保存了打包时的属主和属组。CI 机器上打出的 refin-bin-0.14.tar属主是 root 或某个固定 uid普通用户解压时没有权限把属主改成 roottar 就会告警或者按 uid 数字保留产生一串看起来莫名其妙的属主显示。解决已知这包需要写入时用 --no-same-owner 强制当前用户接管tar --no-same-owner -xzf refin-bin-0.14.tar -C /home/me/refin说明--no-same-owner 让包内所有条目属主变成当前执行用户适合装到用户目录或个人工作区。生产环境更推荐的做法是root 解压后用 3.2 的软链管理不在属主上反复折腾。如果发现包内所有文件的属主在每台机器解压后都不一样多半是没有用这个参数加上就能固定下来。5.4 解压后磁盘满了tar 包大小没有参考性现象refin-bin-0.14.tar 只有 80MB解压到一半报 No space left on devicedf 一看 /opt 已经 100%。原因gzip 是压缩态包内装的是未压缩的二进制和库文件解压后体积往往是压缩态的 2 到 4 倍。静态链接的二进制更夸张动辄上百 MB。所以拿 tar 包的 ls -lh 大小去预估磁盘是典型的错误习惯。解决解压前先估算实际占用tar -tvf refin-bin-0.14.tar | awk {s$3} END {printf %.0f MiB\n, s/1024/1024} df -h /opt说明tar -tvf 输出中第 3 列是每个条目的字节数awk 累加后得到未压缩总大小这个值接近真实占用。预留空间按这个值的 1.5 倍算比较稳。如果 /opt 确实放不下改装到 /data 下再用符号链接把 /opt/refin 指过去这是不用重新解压的后悔药sudo ln -s /data/refin /opt/refin说明前提是先把包解压到 /data/refin然后在 /opt 下做链接。之后所有按 /opt/refin 写的 PATH 配置都不需要改。5.5 从 Windows 传上来的包二进制损坏先查传输方式现象tar -tzf 能正常列出文件解压也顺利但运行 refin 一直段错误 segmentation fault。回看传输过程发现包是从 Windows 机器用 FTP 文本模式传上来的。原因文本模式传输会把换行符做转换二进制数据流中任何换行字节都被改写。gzip 流的整体结构还在tar 列表能读出来但内部数据已被污染解压出来的可执行文件实际是坏的。这种损坏最坑人因为每一条前置检查看起来都正常。解决重新用二进制模式传输传完先用 file 和 sha256sum 确认file refin-bin-0.14.tar sha256sum refin-bin-0.14.tar说明file 输出是 gzip compressed data 至少说明文件头没被破坏sha256 和发布方公布的一致才算真正可靠。判断传输方式还有一种办法用 Windows 自带解压工具解过的包文件里的换行会被转成 CRLF而 tar 是纯二进制流不应该有统一换行。从这类事故之后我的习惯变成任何跨机器传输的 tar 包落盘第一件事就是校验哈希这个顺序能挡掉后面所有玄学排障。6. 反向打包用 tar zcvf 造一个干净的 refin-bin-0.14.tar前面都在拆别人的包最后一章反过来讲怎么把编译产物整理成可以发布出去的 tar 包。参数设置会直接影响别人解压时的体验。6.1 用 --exclude 和 --owner0 控制包内容tar czf /tmp/refin-bin-0.14.tar \ --owner0 --group0 \ --exclude*.log \ --excludetmp/ \ -C /tmp/build \ refin-bin逻辑说明-c 表示创建归档-z 用 gzip 压缩-f 指定输出文件路径。--owner0 --group0 把包内所有条目属主固定为 root别人解压时不会出现属主震荡。--exclude 排掉日志、临时目录和本地调试产物。最后的 refin-bin 是相对 -C 指定的根目录的目录名这样打出来的包解开第一层就是 refin-bin/没有任何散文件。参数说明-C 的位置很关键它让 tar 在打包前先切到 /tmp/build然后看到的是相对路径 refin-bin而不是 /tmp/build/refin-bin 这种带绝对路径的包。别人解压这种包时不需要手工剥一层目录也不会有 Removing leading / 的告警。6.2 用 tar 的列表做包间 difftar|xargs 的实际用法# 对比自打包和官方包先比文件清单 diff (tar -tf official.tar) (tar -tf my.tar) | head # 再对单个文件做内容比对不落盘直接算哈希 tar -tf my.tar | grep bin/refin$ | xargs -I{} tar -xOf my.tar {} | sha256sum逻辑说明( ) 是进程替换两条 tar -tf 的文件清单交给 diff 逐行比对第一时间发现多了哪些、少了哪些。第二段命令中tar -tf 输出文件名grep 筛出目标路径xargs -I{} 把文件名替换到后面 tar 命令的路径参数里-xOf 表示只提取该文件到 stdout 而不真正落盘再交给 sha256sum 计算。整个链条就是 tar|xargs 的日常用法把包内列表变成命令输入不产生临时文件完成二进制一致性验证。我早期习惯是解压完直接翻目录后来在一个烧录工具包上吃过亏解压一切正常运行就段错误查了一整天才发现是文件传输环节坏了文件。从那以后我的顺序固定在 file → sha256sum → tar -tvf → 解压 → ldd一条都不省。这套顺序走下来refin-bin-0.14.tar 从拿到手到跑起来一般不会超过十分钟思路也能直接套到下一个 tar 包上希望帮到你。本文还有配套的精品资源点击获取