Systemd 服务单元限制导致守护进程启动失败

2025-09-20

Linux系统管理员常遇到守护进程在正常系统配置下无法启动,但手动以root身份运行却能正常工作的问题。传统原因包括环境变量$PATH设置不完整以及SELinux或AppArmor限制。如今,systemd服务单元限制成为越来越普遍的原因,它会在systemd.exec中设置各种保护指令,例如ProtectHome和PrivateTmp,导致权限被拒或文件找不到等错误,甚至可能导致间接的故障,例如阻止DNS查询。解决方法是移除systemd服务文件中的限制进行测试,但未来一些守护进程可能依赖这些限制,增加调试难度。

阅读更多
开发 守护进程

网页的客户端困境:被忽视的抱怨

2025-08-23

本文探讨了网站对客户端体验的忽视。作者指出,尽管服务器端问题常被讨论,但客户端的缓慢加载、糟糕的UI等问题却常被忽略。以Github最近的更新为例,许多用户反映速度缓慢,但网站运营者更关注服务器端问题。作者认为,网站拥有话语权,用户只能通过抵制来表达不满,但效果甚微。网站通常缺乏对用户流失的有效衡量,导致他们对客户端体验漠不关心。最终,作者承认自己也做出了可能损害用户体验的决定,但认为这是权衡利弊后的选择。

阅读更多
开发

在 Linux 上复制 OpenBSD 的 pflog 功能:使用 nftables 和 ulogd2

2025-08-16

本文介绍了如何在 Linux 系统上使用 nftables 和 ulogd2 来模拟 OpenBSD 和 FreeBSD 的 pflog 功能,实现对网络封包的日志记录和分析。通过在 nftables 规则中添加 'log group' 语句,并将日志信息转发到不同的 netlink socket,可以分别使用 tcpdump 实时监控和 ulogd2 将封包记录到磁盘。文章详细讲解了配置 ulogd2,以及使用 pcap 格式存储日志文件的步骤,并指出了 ulogd2 的一些限制和替代方案。

阅读更多
开发 nftables ulogd2

传统Unix登录服务器的意外持久力

2025-08-03

作者探讨了在现代化绿色环保的计算环境重建中,传统Unix登录服务器的意外持续使用。尽管容器化技术盛行,他们仍然拥有两种类型的登录服务器:一种是通用型,限制CPU和内存使用;另一种是计算型,允许用户尽情使用资源。虽然使用率下降,但仍然被广泛使用,尤其是在SSH到内部机器或运行VSCode等开发环境后端时。作者还注意到,部分用户使用登录服务器运行cron任务,以及将代码存储在文件服务器上的原因,这与SLURM集群和计算服务器的使用密切相关。

阅读更多
开发 Unix服务器

递归下降解析器:简单易用胜过复杂工具?

2025-07-28

作者探讨了编程语言解析方法,特别是递归下降解析器与LR解析器生成器的优劣。虽然LR解析器生成器能处理更复杂的语法,但作者更倾向于递归下降解析器,因为它易于使用,无需额外工具,且能直接用目标语言编写,从而减少学习成本和调试难度。作者认为,对于偶尔需要编写小型语言解析器的开发者来说,递归下降解析器的简单性和易用性弥补了其在处理复杂语法方面的不足。

阅读更多
开发 递归下降

Bash脚本调试技巧:优雅地处理`set -e`错误

2025-07-27

本文介绍了一种在Bash脚本中优雅处理`set -e`引发的错误的技巧。通过使用`trap 'echo "Exit status $? at line $LINENO from: $BASH_COMMAND"' ERR`,可以在脚本出错时打印出错行号、错误命令和退出状态等信息,方便调试。该技巧利用了Bash特有的`$LINENO`、`$BASH_COMMAND`环境变量和`ERR` trap条件。其他shell如sh的实现存在差异,可能无法完全实现该功能。

阅读更多
开发 脚本调试

Linux errno(3) 的奇怪限制:成功调用也可能修改 errno

2025-07-04

Linux 的 errno(3) 手册页揭示了一个奇怪的限制:即使函数调用成功,errno 也可能被修改,且系统调用或库函数永远不会将 errno 设置为零。这源于 Unix 系统的传统设计,系统调用通常只在失败时返回 errno,成功时则不修改 errno。C 库函数可能调用多个系统调用,其中一些调用可能失败而不影响库函数本身的成功,导致 errno 保持失败时的值。ANSI C 和 POSIX 继承了这一行为,只要求在函数失败且文档说明会设置 errno 时,errno 的值才有意义。

阅读更多
开发 errno

X终端的意外诞生:并非X窗口系统的初始构想

2025-06-23

X窗口系统最初并非设计为与X终端一起使用。早期的X运行在功能齐全的工作站上,即使部分工作站依赖服务器进行繁重任务,它们仍然拥有完整的本地Unix环境。X终端的出现要晚得多,直到X系统在跨厂商Unix窗口系统中获得成功后才出现。NCD公司在1987年成立,可能是最早生产X终端的公司之一,但其产品直到1989年才上市。XDM(X显示管理器)的出现也佐证了这一点,它直到1988年才随X11R3发布。虽然没有XDM也能使用X终端,但XDM极大地简化了使用流程。这说明X终端的普及远晚于X系统本身的成熟。

阅读更多

开源维护者反叛:libxml2 维护者不再区别对待安全漏洞

2025-06-19

libxml2 的唯一维护者宣布将不再区别对待安全问题和普通 bug,这一举动在开源社区引发热议。文章认为,这反映了越来越多的开源维护者对公司利用开源软件现状的不满。作者区分了个人合作式开源和公司利用开源两种模式:前者如 Debian 和 BSD,以社区协作为主;后者则以公司盈利为目的,对开源贡献者缺乏责任感。作者预测,未来开源社区将越来越重视这种区别,并可能调整与公司之间的互动模式。

阅读更多
开发

WireGuard:1G 网络带宽饱和测试成功

2025-06-17

作者以往认为加密技术速度慢,无法达到网络饱和,即使在千兆以太网连接上也是如此。但最近一次测试中,作者发现 WireGuard 在普通的服务器硬件(Xeon E-2226G)上,无需特殊调优即可轻松饱和 1G 网络带宽,CPU 占用率也相当低。这颠覆了作者对加密速度的认知,表明许多加密方法理论上可以饱和 1G 网络连接,并暗示现有的 VPN 服务器可能需要性能调优。

阅读更多

Argparse 的互斥组嵌套限制:一个令人沮丧的难题

2025-06-14

Python 的 argparse 模块用于处理命令行参数,其互斥组功能允许用户仅选择一组选项中的一个。然而,当涉及到多个互斥选项组的嵌套时,argparse 存在限制。例如,一个程序有多个超时设置,用户既可以调整超时值,也可以完全禁用超时。argparse 不支持将一个'禁用超时'选项与多个超时设置选项组合成互斥组,这使得配置变得复杂且不直观。虽然可以在常规组内嵌套互斥组,但反之则不行,并且官方文档也明确指出不支持此功能。这给开发者带来了不便,需要手动检查用户是否使用了特定的开关,增加了代码复杂性。

阅读更多

Unix文件系统中的inode 0:一个被遗忘的角落

2025-06-02

本文探讨了早期Unix系统中inode编号的限制以及inode 0的特殊性。作者发现,尽管POSIX标准未明确禁止inode 0的使用,但在实际应用中,许多系统和程序可能依赖于非零inode编号。使用inode 0可能会导致意外行为,因为一些程序可能将它解释为'不存在文件'的信号。虽然在用户空间创建文件系统可以尝试使用inode 0,但这并不被推荐,因为兼容性问题可能导致不可预知的结果。

阅读更多
开发

对抗LLM爬虫:JavaScript的“工作证明”困境

2025-05-28

网站使用JavaScript的“工作证明”系统来对抗激进的LLM和网络爬虫,例如Xe Iaso的Anubis。但LLM爬虫可能利用被入侵的机器获得大量CPU时间来解决这些挑战。然而,LLM爬虫面临着恶意环境:难以区分真正的“工作证明”和恶意JavaScript代码,可能导致CPU被用于挖矿或其他恶意活动。LLM爬虫试图识别“工作证明”系统,但这如同与狡猾的对手博弈,因为对方有动机伪装自己。最终,这变成了一场LLM爬虫与网站之间的军备竞赛,双方不断调整策略,试图在保护自身利益的同时,最大限度地利用资源。

阅读更多
开发

Unix文件名长度限制的演变史

2025-05-25

Unix早期版本的文件名长度限制令人惊讶地短:最初只有8字节,后来才增加到14字节。这与Unix简单的目录结构设计有关。文章深入探讨了Unix V4及之前版本的目录结构,解释了文件名长度限制的演变原因以及16字节目录项如何更好地适应512字节磁盘块。此外,文章还提到了早期Unix中inode数量的限制,这反映了早期Unix系统的一些固有限制。

阅读更多
开发

用Unix命令行工具排序IPv6地址的挑战

2025-05-19

本文探讨了使用Unix命令行工具(如sort)排序IPv6地址的难题。IPv6地址的十六进制表示法、缺少前导零以及'::'缩写表示法,使得直接使用sort命令进行排序变得复杂。作者指出,解决这个问题需要将IPv6地址转换为完整形式,或者使用编程语言(如Perl或Python)进行排序,因为现有Unix工具难以直接处理IPv6地址的特殊格式。

阅读更多

单进程架构的优雅:简化现代Web开发的利器

2025-04-21

作者在维护博客软件的过程中,发现单进程架构比CGI架构更易于处理现代Web的复杂性。单进程架构允许轻松访问共享状态,从而简化了诸如检测恶意流量、限制请求频率以及实现缓存等任务。虽然存在内存和CPU使用方面的考量,但单进程架构的易于实现性使其在应对各种滥用行为时更具优势,尤其是在应对未知攻击类型时。作者认为,随着网络滥用行为的持续增加,单进程架构将成为越来越重要的解决方案。

阅读更多

ZFS压缩下的文件大小悖论:逻辑块与物理块之争

2025-04-17

在ZFS文件系统启用压缩的情况下,一个256KB的零文件(使用`dd`命令创建)展现出令人费解的现象:`ls -l`显示其大小为256KB,但`ls -s`和`ls -slh`却显示其大小远小于实际大小,甚至接近于0。这是因为ZFS的高效压缩使得物理块数量极少。文章探讨了文件大小的三种度量方式:逻辑大小(字节数)、物理块数和逻辑块数,并指出POSIX标准的`st_blocks`字段并没明确规定应该报告哪种大小,导致文件在不同文件系统间移动时,`st_blocks`值可能发生变化,甚至可能导致文件大小膨胀无法适应新的文件系统。

阅读更多
开发

个人Unix软件包管理方案

2025-04-13

作者分享了其在Unix系统上管理个人软件包的巧妙方法。他使用`~/lib/`目录树存储不同架构的软件,每个软件安装在独立的版本化子目录中(例如,`emacs-30.1`)。`~/bin/bin.`目录则存放指向这些软件的符号链接或启动脚本,方便切换使用不同版本。对于像pipx和Cargo这类工具,作者选择保留其默认安装路径,并在`~/bin/bin.`中创建链接,避免路径冲突。该方案并非完美无缺,但对于管理那些无法通过系统包管理器获取或版本较旧的软件非常实用。

阅读更多
开发 软件管理

Ubuntu 24.04 SSH 密码禁用失效的诡异Bug

2025-04-06

在Ubuntu 24.04服务器上禁用互联网SSH密码访问,同时允许局域网密码访问,看似简单的sshd_config配置却出现问题。作者尝试在/etc/ssh/sshd_config.d/目录下添加配置文件,但重启SSH服务后失效。原因在于sshd_config的“先到先得”配置规则,以及系统自动生成的50-cloud-init.conf文件中的PasswordAuthentication yes配置项,该文件优先加载,覆盖了作者的配置。将自定义配置文件命名为10-no-passwords.conf,使其优先加载后,问题解决。

阅读更多

超前部署光纤:宁多勿少

2025-03-25

在规划内部或相邻建筑物之间的光纤布线时,宁可多布设一些光纤,也不要等到需要时才发现不够。未来需求扩展、带宽升级、新协议接入等都可能需要更多光纤。此外,光纤也可能出现故障,预留冗余光纤可以快速恢复服务,避免因修复而造成的时间和经济损失。虽然单模和多模光纤各有优劣,但根据实际情况选择并预留足够数量是关键。

阅读更多

Loki 的结构化元数据:一场与系统日志的较量

2025-03-19

Grafana Loki,号称日志领域的 Prometheus,其早期数据模型却在处理系统日志(syslog 或 systemd journal)时暴露出致命缺陷。它将每个标签值组合分别存储,且不压缩日志存储,导致高基数标签引发存储爆炸。为解决这个问题,Loki 引入了“结构化元数据”,但目前(3.0.0 版本)仍不成熟。结构化元数据标签并非真正的 Loki 标签,查询方式不同,且与现有标签的迁移困难重重,甚至可能导致高基数标签的意外创建。升级需谨慎,旧数据迁移代价巨大,建议新项目使用时充分考虑其局限性。

阅读更多

JSON:Unix系统中机器可读输出的最佳实践

2025-02-24

作者通过在Postfix邮件队列中删除邮件的经历,阐述了使用JSON作为机器可读输出格式的优势。JSON并非完美,但其在Unix系统中拥有诸多实用优点:清晰易懂、兼容性强、工具支持丰富,且易于转换为其他格式。作者认为,对于新程序,仅使用JSON作为机器可读输出格式是最便捷的选择,避免了自定义格式设计的复杂性,并促进了Unix程序间的互操作性。

阅读更多

隐藏的巨型缓存:为什么你的磁盘空间不翼而飞?

2025-02-08

许多Unix程序将缓存数据存储在隐藏的`.cache`和`.local`目录中,导致用户难以发现并清理这些占用大量磁盘空间的缓存文件。作者在共享文件服务器环境中,亲眼目睹研究生们因这些隐藏的缓存而困惑,甚至数百GB的磁盘空间被不知不觉地占用。文章呼吁程序开发者将缓存存储在可见的目录中,并建议磁盘空间使用工具应明确显示这些隐藏目录的内容,方便用户管理磁盘空间。

阅读更多

高阶钓鱼邮件攻击:VPN 成为攻击跳板

2025-01-29

多伦多大学计算机系遭遇了一起精心策划的钓鱼邮件攻击。攻击者伪造了系里的邮件地址,发送钓鱼邮件,成功窃取了一个用户的密码。令人震惊的是,攻击者利用窃取的密码在极短时间内注册了该用户的VPN账户,并通过内部SMTP网关发送垃圾邮件。这表明攻击者事先对目标系统的VPN和邮件环境进行了充分的调研,并制定了完善的攻击计划,体现了日益精进的攻击手段,凸显了加强网络安全防御的重要性。

阅读更多
科技 VPN攻击

禁用互联网SSH密码认证:安全增强还是过度谨慎?

2025-01-18

本文探讨了禁用互联网SSH密码认证的利弊。作者认为,虽然强密码可以有效抵御暴力破解,但禁用密码认证可以额外防止密码被窃取、SSH服务器漏洞利用以及预设账户被入侵等风险。然而,禁用密码认证也存在不便之处,例如在无法使用密钥对的情况下无法登录。作者建议根据自身情况权衡利弊,选择合适的安全策略。

阅读更多

早期Unix中的/etc/glob:Shell通配符的幕后故事

2025-01-13

本文讲述了早期Unix系统中`/etc/glob`程序的历史和作用。在V7 Bourne Shell之前,Unix的Shell通配符功能并非由Shell本身实现,而是委托给外部程序`/etc/glob`处理。`/etc/glob`接收命令和参数,展开通配符后执行命令。文章详细解释了不同Unix版本中`/etc/glob`的工作机制,包括如何处理转义字符,以及为什么采用这种外部程序的方式,可能与早期系统资源限制有关。

阅读更多

WireGuard:从简单到复杂的配置指南

2025-01-05

本文介绍了WireGuard的几种不同配置方式,从最简单的完全隔离的内部IP地址空间到最复杂的“VPN”模式,其中内部和外部网络都可访问相同的IP地址。作者详细阐述了每种配置的难度和潜在问题,例如路由冲突和递归路由。文章强调了提前规划的重要性,并建议在设计WireGuard环境时,尽量选择简单的配置以避免复杂的路由设置。

阅读更多
开发

Linux OpenZFS 的 zpool import/export 潜在问题

2024-12-26

Linux OpenZFS 版本(截至 2.3.0)在导入或导出 ZFS 池时存在一个潜在问题。即使 ZFS 池中没有设置 sharenfs 属性的文件系统,`zpool import` 和 `zpool export` 命令仍然会运行 `exportfs -ra`,这可能会清除手动添加或修改的 NFS 导出设置,从而影响使用自定义 NFS 导出配置的高可用性系统等环境。这个问题是由于 OpenZFS 代码盲目执行 `exportfs -ra` 造成的,即使无需更改 NFS 导出也如此。

阅读更多
开发 NFS

服务器重启失效:冷却重启解决内核崩溃

2024-12-25

作者遇到了两台相同型号的服务器出现内核崩溃的问题,简单的重启无法解决。崩溃时,服务器在系统固件阶段打印出一系列机器检查异常错误。这些错误提示指向CPU硬件问题。作者尝试关闭服务器电源几分钟后再重启,问题得以解决。这说明即使短暂的断电,部分x86系统组件可能不会完全重置,需要冷却时间才能完全恢复正常。

阅读更多

十年老服务器的“第二春”:廉价高效的存储方案

2024-12-17

一家公司仍在生产环境中运行一台使用了十多年的旧文件服务器。这台服务器虽然老旧,BMC 甚至需要 Java 来支持 KVM-over-IP 功能,但由于其拥有 16 个磁盘托架和 10G 以太网端口,以及公司对低成本大容量存储的需求,它被重新利用作为“自带磁盘”的廉价存储服务器。尽管速度和内存较低,但满足了用户的低性能、大容量需求。这体现了在特定情况下,老旧硬件通过合理利用依然可以发挥价值的理念。

阅读更多
← 前页 1