Linux老手也常踩的5个Unix环境搭建坑
|
跟人吵架——就昨天,客户现场,我蹲在机柜前调SSH密钥,对方架构师站我斜后方三步远,手一直摸自己后颈,指甲缝里有蓝漆。我说“/etc/ssh/sshd_config你改过PermitRootLogin没”,他点头说“关了”,结果tail -f /var/log/secure里全是invalid user root login attempts。我原以为是他漏改了Match块里的覆盖逻辑,结果扯着网线去翻他本地的Ansible playbooks——发现他把sshd_config.j2模板里那行写成了PermitRootLogin noooo(三个o)。 机房顶灯滋啦响了十七次,中间停了四秒,再亮起来时比之前黄。那个穿灰夹克的IDC小哥端着半杯冷咖啡从A07通道经过,杯沿磕在金属架上,一声脆。我们都没抬头。但那个“noooo”我就记死了,Linux老手也常踩的5个Unix环境搭建坑,第一个就是:文本拼写不报错、不校验、不提示、不拦截、不rollback。它就在那里,像没拔掉的电源线,等着你重启sshd——然后连接全断。 第二个坑是PATH污染。上周五下午三点零七分,我在给新集群配Python 3.11.9的venv,用pyenv install装完,pip list正常,python -c "import numpy"也过。但CI流水线里跑pytest死活找不到pkg_resources。查了四十三分钟,最后发现jenkins用户家目录下的.bashrc里有句export PATH="/usr/local/bin:$PATH",而/usr/local/bin底下躺着一个八年前的setuptools-28.8.0-py2.7.egg-info,连着软链到/usr/lib/python2.7/site-packages/。Python解释器优先读了这个旧egg-info里的namespace包定义,就把新venv里刚pip install的pytest-8.2.2给吞掉了。不是版本冲突,是路径顺序吃掉了命名空间注册。这个我敢打包票,不信你删掉那行export PATH,CI立马变绿。 桌上的麻辣烫盒盖掀着,红油已经凝成半透明琥珀色,筷子斜插在里面。旁边手机震动了一下,是运维群弹出一条消息:“线上DNS解析延迟突增”,我瞥了一眼没回。第三个坑——DNS缓存滥用。老鸟都记得systemd-resolved,也记得nscd,但没人记得/etc/resolv.conf里那行options timeout:1 rotate,它在resolver库启动时就锁死了glibc对nameserver的轮询策略,而你在做consul+dnsmasq双层转发时,这行参数会让resolver跳过所有上游健康检查直接fallback——不是宕机才fail,是慢到300ms就failover,但日志里连WARN都不打。这个我说不准是不是OpenWrt默认也这样,但CentOS 7.9起,/usr/lib/systemd/resolved.conf.d/下任何以.conf结尾的文件,只要带[Resolve]节,都会被加载……不管它是不是空的。 第四坑最贱:umask继承混乱。那天凌晨两点,我远程接手一个交付失败的K8s节点,发现/var/lib/kubelet/pods目录下大量子目录权限是700而不是755,导致volume mount时报permission denied。查systemd unit,ExecStartPre里写了mkdir -p /var/lib/kubelet/pods;但忘了看kubelet.service所在的slice——它跑在system.slice下,而该slice的DefaultUmask=0022,在宿主机init时就被继承进来了。结果mkdir -p执行时用的是root身份,却用了非root用户的umask(因为slice里设置了UMask=0002)。不是命令写错,是systemd的Umask和bash的umask打架,而且bash不会告诉你它被override了。这个事后来拉了三个白板,画了四遍父子进程树,才在第六次strace里看到setfsgid()之后紧跟着的umask()系统调用返回值是2——也就是0002。 窗外雨忽然大了,噼啪砸在机房通风口百叶窗上,声音像炒豆子。我伸手把窗边的防静电垫往里拽了半尺,露出底下磨损的胶皮边。第五个坑其实根本不算坑:SELinux上下文批量恢复时,restorecon -Rv /var/lib/docker会递归扫所有子目录,但遇到overlay2的merged子目录——那些符号链接指向/dev/mapper/lvm-xxxx的设备节点——就会卡住十秒以上,然后静默跳过。不是报错,不是警告,是直接跳。你得加-F参数强制重标,可-F在RHEL 8.6之前的版本根本不存在。所以现在我只要看到restorecon跑完没提merged,就手动touch /var/lib/docker/overlay2//merged && restorecon -v。这事没文档写,只在某个内核mailing list的第3124封邮件里被某人顺嘴提过一次:“it's not a bug, it's an optimization”。我信了,直到看见kubelet容器里proc/self/cwd指向了/stale/merged路径还挂着挂载点。
文章配图,仅供参考 对了,今天早上有人问我能不能把~/.ssh/config里的Host 下面加个ProxyJump,我说可以,但别放在最上面——得塞在第一个真实Host块之后,否则ssh-client解析顺序会把通配符当成默认入口,结果跳转链里多了个不存在的中间跳板机,超时时间堆叠到两分钟。说完我就后悔了,这事儿根本不该出现在运维手册里,它该出现在酒局第三瓶青岛倒到一半的时候,由一个右手小指缺了半截的人,用烟灰缸边沿敲着桌面讲出来。 我现在在等一个补丁:OpenSSH 9.9要加个--parse-only参数,让配置语法检测能脱离网络环境独立跑。目前还没合进main,但他们的PR编号是#472,提交作者邮箱后缀是@kth.se。我先盯着,盯到合并为止。或者盯到我换工作。无所谓。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


Windows数据科学环境搭建:18年导航师亲授避坑与高效配置