Linux老手也踩的5个Unix环境搭建坑
|
我原以为装个 OpenBSD 7.4 做 JumpHost 就是敲三行 sysupgrade、改两行 pf.conf 的事——结果在 /etc/ssl/certs 目录里卡了十八秒,就因为 openssl rehash 生成的 hash symlink 名字里带了个冒号,而 pkg_add -I 检查时用的是 strncmp(3) 硬比前二十位,不是用 stat() 看 inode。这个我敢打包票,小张当时蹲在机柜前用 strace -f -p 跟了三遍,连他手里的肉夹馍掉渣都没顾上拍。
文章配图,仅供参考 空调又滴水了,啪嗒,正落在我脚边那块翘起来的防静电地板缝里。老陈端着黄焖鸡进来,油星子溅到我刚改完的 rc.conf.sample 上,他抬手就抹——抹完还说“你这注释写得跟 docker-compose.yml 似的,全靠缩进猜逻辑”。我盯着他指甲缝里的孜然粒,心想:Linux 老手踩 Unix 坑,不就卡在这儿?——你信 Linux 的文档,Unix 的 manpage 就偏不给你留活路;你信 pkgsrc 的 checksum,它偏在 tarball 里塞个 timezone 文件,mtime 是 1970 年 1 月 1 日零点零分零秒,但 sha256sum 在不同 glibc 版本下对这个时间戳解析不一样,导致 verify 失败。这不是玄学,是优胜劣汰:活下来的系统,早把人当变量处理了。打印机卡纸了,在走廊尽头“咔…咔…”地喘气,像没调好相位的 rsync daemon。小李从隔壁工位探头喊:“哥,那个‘FreeBSD 集群平滑迁移’选题又被毙了。”我没抬头,只说:“哦,标题党那条线吧?”他嗯一声,转头去捅打印机,顺手把废纸篓里我昨天撕掉的草稿拿走了——就是那张写着“别碰 /var/db/pkg/local.sqlite”的便签,背面还画了个歪歪扭扭的 init 依赖环。被毙了的选题就半句,不值当提。 我自己。不是骂甲方,也不是怪平台规则——是自己。2026 年 3 月那个周三,我把一份 NetBSD 容器运行时的 patch 提交到 gnats,填的 Synopsis 是“add support for cgroup v2 in rumpkernel mode”,结果 reviewer 回邮件说:“请确认 /usr/src/sys/compat/common/kern_sysctl.c 中 sysctl_kern_proc2 是否已同步更新 kinfo_proc 的 layout”。我愣了三秒:我根本没动 proc,我只动了 sched ——可人家说得对,你改调度,proc 就得吐新字段,哪怕没人读。我原以为只要跑过 build.sh -u -U 就能 merge,结果 build.sh 不校验 kinfo_proc 对齐方式。这坑哪是 Unix 给的?是我自己用 Linux 思维给 Unix 打补丁时,膝盖先软了。 微信弹了个群消息:【运维夜话】@所有人 今晚八点线上同步 chroot vs proot vs unshare 测评结论。我没回,把手机扣桌上,屏幕朝下。老陈坐回来,把黄焖鸡盒子叠成方块,拿笔在盒盖上画流程图:左边写“用户要 ssh 进来”,中间是“ssh -> doas -> execvpe(/usr/bin/bash)”,右边画了个爆炸符号,旁边标注“/usr/bin/bash 是 bash-5.1,但 /usr/pkg/bin/bash 是 bash-5.2,PATH 优先级设错了”。他敲桌面三下,“你记得上次 prod 服务器上 crontab 里那个 /bin/sh 脚本吗?其实执行的是 dash,不是 bash,但它没报错,直到它遇到 ‘local -A arr’ ——dash 说:命令未找到。而你 grep -r 'local -A' 找了一小时,最后发现 PATH 里 /usr/pkg/bin 在 /bin 前面,bash 自己偷偷替换了 sh。这种事,Linux 老手闭眼都能绕开,Unix 偏要你在第十七次 reboot 后才让你看见 shell 的脸。” 我说不准是不是所有 BSD 都这样,但 OpenBSD 里 sysctl kern.nfile 默认值改过两次,一次在 6.9,一次在 7.3,改的不是数值,是它的单位:从“文件描述符总数”悄悄变成“进程能打开的最大 fd 数 × 当前运行进程数”,而 man sysctl 里那行小字“values may vary per arch”下面,压根没提这个换算逻辑。我们组老周试过写监控告警脚本,跑了两个月才意识到:他用的是 kstat.sysctl.kern_nfile.value,但脚本里用的还是旧算法,所以阈值永远差四百七十二。他现在改名叫“四百七十二”,钉钉昵称,后缀带个括号(已修正)。 还有一次是 mount -t cd9660 的事儿。不是说光盘,是某国产固件包解压出来一个 ISO,里面 /etc/fstab 写着 UUID=xxx,但 FreeBSD 的 camcontrol 报 UUID unknown,openbsd 的 cd9660fs 又说 label too long。我们仨对着 /dev/cd0c 敲了一下午 dd if=/dev/cd0c bs=2048 skip=16 count=1 | hexdump -C,就为了确认那个 “CDROM” 字符串末尾到底有没有 \\0。结果小张手抖多敲了一个空格,输出多了三行乱码,老陈立刻指着第三行说:“停!这是 volume descriptor,长度域在 offset 十六——等等,这十六是十进制还是十六进制?” 我当时正在喝冰美式,差点呛住。后来查源码才发现:iso9660 spec 里写“length field is 2-byte integer”,没说大小端,而 NetBSD 的 cd9660_mount() 用的是 le16toh(),FreeBSD 用 be16toh()……这玩意儿,编译时候都对,跑起来才露馅。 行了,不写了。我现在要重刷一遍 /etc/rc.d/dnsmasq,把它拆成三个 service:dnsmasq-bin、dnsmasq-config-check、dnsmasq-reload-on-change——反正 openrc 没人管,supervise 就 supervisord,我明天直接上 runit。对了,谁有 /usr/src/sys/conf/files 的最新注释版?想确认一下 genassym 生成的那个 assym.h 里 ASYM_TSS_IST 是否还指向 tss->ist[0]……算了,先吃口饭。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


嵌入式Linux开发者Unix环境搭建避坑指南
Unix高效包管理:创业者的技术提效必修课
Linux下H5开发环境与数据库一键配置
Linux深度学习环境全流程搭建指南