<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>运维 on 随手记</title><link>https://www.bufio.cn/tags/%E8%BF%90%E7%BB%B4/</link><description>Recent content in 运维 on 随手记</description><generator>Hugo</generator><language>zh-cn</language><copyright>© 2026 &lt;a href="https://beian.miit.gov.cn/" target="_blank" rel="noopener"&gt;苏ICP备2023022553号-1&lt;/a&gt;</copyright><lastBuildDate>Wed, 20 May 2026 09:30:04 +0800</lastBuildDate><atom:link href="https://www.bufio.cn/tags/%E8%BF%90%E7%BB%B4/index.xml" rel="self" type="application/rss+xml"/><item><title>USB-SATA 桥接芯片的 UAS 兼容性问题排查</title><link>https://www.bufio.cn/posts/usb-sata-uas-compatibility/</link><pubDate>Wed, 20 May 2026 09:30:04 +0800</pubDate><guid>https://www.bufio.cn/posts/usb-sata-uas-compatibility/</guid><description>&lt;p&gt;通过 USB 外接硬盘时，如果遇到磁盘看起来一直很忙，但实际吞吐很低，问题不一定出在文件系统或硬盘本体上。一次比较典型的场景是：USB-SATA 桥接芯片声称支持 UAS，但它的固件实现不稳定，Linux 自动启用 UAS 后反而触发命令超时、USB 设备重置，最终表现成系统层面的 I/O 卡顿。&lt;/p&gt;
&lt;p&gt;这篇文章记录一次这类问题的现象、原因和处理方式。&lt;/p&gt;
&lt;h2 id="问题现象"&gt;问题现象&lt;/h2&gt;
&lt;p&gt;故障最直观的表现是：外接硬盘几乎不可用，但监控上又看不出正常的高吞吐。&lt;/p&gt;
&lt;p&gt;常见现象包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;iostat&lt;/code&gt; 中磁盘 &lt;code&gt;%util&lt;/code&gt; 长时间接近或等于 &lt;code&gt;100%&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;实际 &lt;code&gt;r/s&lt;/code&gt;、&lt;code&gt;w/s&lt;/code&gt;、&lt;code&gt;rkB/s&lt;/code&gt;、&lt;code&gt;wkB/s&lt;/code&gt; 并不高；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;await&lt;/code&gt;、&lt;code&gt;svctm&lt;/code&gt; 或应用侧读写延迟异常升高；&lt;/li&gt;
&lt;li&gt;文件复制、解压、数据库读写、备份任务间歇性卡住；&lt;/li&gt;
&lt;li&gt;偶尔出现 &lt;code&gt;Input/output error&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dmesg&lt;/code&gt; 或 &lt;code&gt;journalctl -k&lt;/code&gt; 中反复出现 UAS abort、SCSI timeout、USB reset。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;可以先用下面这些命令观察：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;iostat -xz &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dmesg -T &lt;span class="p"&gt;|&lt;/span&gt; grep -Ei &lt;span class="s1"&gt;&amp;#39;uas|usb|reset|abort|I/O error|blk_update_request&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;journalctl -k -b &lt;span class="p"&gt;|&lt;/span&gt; grep -Ei &lt;span class="s1"&gt;&amp;#39;uas|usb|reset|abort|I/O error&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;比较典型的内核日志类似这样：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;uas_eh_abort_handler ...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;scsi host... uas_eh_device_reset_handler
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;usb ... reset SuperSpeed USB device number ...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;blk_update_request: I/O error, dev sdX, sector ...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果这些日志和外接硬盘卡顿时间点高度重合，就要怀疑 USB 存储协议层的问题。&lt;/p&gt;</description></item><item><title>Docker 日常维护、运行调试与排错教程：从 Compose 到 Swarm</title><link>https://www.bufio.cn/posts/docker-maintenance-debugging-compose-swarm/</link><pubDate>Wed, 29 Apr 2026 16:25:00 +0800</pubDate><guid>https://www.bufio.cn/posts/docker-maintenance-debugging-compose-swarm/</guid><description>&lt;p&gt;Docker 用久以后，问题通常不在“会不会启动一个容器”，而在日常维护和排错：容器为什么退出、日志在哪里看、端口为什么不通、磁盘为什么爆了、Compose 更新为什么没生效、Swarm 服务为什么一直 Pending。&lt;/p&gt;
&lt;p&gt;这篇文章按实际运维顺序整理：先看单机 Docker 的容器、镜像、日志、网络、存储和资源排查，再看 Compose 的项目级管理，最后看 Swarm 的集群级服务维护。&lt;/p&gt;
&lt;h2 id="总览docker-排错先分清三种运行层级"&gt;总览：Docker 排错先分清三种运行层级&lt;/h2&gt;
&lt;p&gt;Docker 相关问题先不要急着敲命令，先判断当前应用跑在哪一层：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;层级&lt;/th&gt;
 &lt;th&gt;常见命令&lt;/th&gt;
 &lt;th&gt;管理对象&lt;/th&gt;
 &lt;th&gt;适合场景&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;单机 Docker&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;docker run&lt;/code&gt;、&lt;code&gt;docker ps&lt;/code&gt;、&lt;code&gt;docker logs&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;container、image、volume、network&lt;/td&gt;
 &lt;td&gt;单机服务、临时调试、本地开发&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Docker Compose&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;docker compose up&lt;/code&gt;、&lt;code&gt;docker compose logs&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;一个项目里的多服务&lt;/td&gt;
 &lt;td&gt;开发环境、小型部署、依赖编排&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Docker Swarm&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;docker service&lt;/code&gt;、&lt;code&gt;docker stack&lt;/code&gt;、&lt;code&gt;docker node&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;service、task、stack、node&lt;/td&gt;
 &lt;td&gt;多节点集群、滚动更新、副本调度&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;排错时也按这个顺序看：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;服务不可用
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -&amp;gt; 容器是否存在、是否在运行
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -&amp;gt; 日志里有没有启动失败或业务异常
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -&amp;gt; 端口映射和网络是否正确
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -&amp;gt; volume、配置、环境变量是否正确
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -&amp;gt; CPU、内存、磁盘是否打满
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -&amp;gt; 如果是 Compose，看 project/service 维度
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -&amp;gt; 如果是 Swarm，看 node/service/task 维度
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="一日常巡检先看-docker-基本状态"&gt;一、日常巡检：先看 Docker 基本状态&lt;/h2&gt;
&lt;p&gt;先确认 Docker daemon 是否正常：&lt;/p&gt;</description></item><item><title>Fail2Ban 工作原理与常用运维操作</title><link>https://www.bufio.cn/posts/fail2ban-principles-and-operations/</link><pubDate>Tue, 28 Apr 2026 17:35:00 +0800</pubDate><guid>https://www.bufio.cn/posts/fail2ban-principles-and-operations/</guid><description>&lt;p&gt;Fail2Ban 是 Linux 服务器上很常见的一类安全防护工具，主要用来应对 SSH、Web 登录、邮件服务等场景里的暴力破解和重复异常请求。它不会替代防火墙、密钥登录、最小权限这些基础安全措施，但非常适合做一层自动化封禁：发现某个 IP 在短时间内频繁失败，就把它临时加入黑名单，过一段时间后再自动释放。&lt;/p&gt;
&lt;p&gt;这篇记录一下 Fail2Ban 的工作原理、安装和开机启动方式、常用规则配置，以及误封后如何把某个 IP 从黑名单里移出来。&lt;/p&gt;
&lt;h2 id="fail2ban-的工作原理"&gt;Fail2Ban 的工作原理&lt;/h2&gt;
&lt;p&gt;Fail2Ban 的核心逻辑可以概括成四步：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;监听日志文件或 systemd journal。&lt;/li&gt;
&lt;li&gt;用 filter 里的正则表达式匹配失败行为。&lt;/li&gt;
&lt;li&gt;在指定时间窗口内统计同一个 IP 的失败次数。&lt;/li&gt;
&lt;li&gt;达到阈值后执行 action，把 IP 加入防火墙黑名单。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这里有几个关键概念。&lt;/p&gt;
&lt;h2 id="jail"&gt;jail&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;jail&lt;/code&gt; 是 Fail2Ban 的规则单元。一个 jail 通常对应一个服务，例如 SSH、Nginx、Postfix、Dovecot 等。每个 jail 会指定：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;监控哪个服务。&lt;/li&gt;
&lt;li&gt;读取哪个日志。&lt;/li&gt;
&lt;li&gt;使用哪个 filter。&lt;/li&gt;
&lt;li&gt;允许失败多少次。&lt;/li&gt;
&lt;li&gt;统计时间窗口是多少。&lt;/li&gt;
&lt;li&gt;封禁多久。&lt;/li&gt;
&lt;li&gt;使用什么 action 封禁 IP。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;例如 SSH 的 jail 就是监听 SSH 登录日志，匹配登录失败记录，当同一个 IP 在一段时间内失败太多，就通过防火墙封禁。&lt;/p&gt;
&lt;h2 id="filter"&gt;filter&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;filter&lt;/code&gt; 负责识别“什么日志算失败”。它通常放在：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/etc/fail2ban/filter.d/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;例如 SSH 常见 filter 是：&lt;/p&gt;</description></item></channel></rss>