Ubuntu 外置机械硬盘老是被唤醒?让我来帮你搞定它!
大家好,今天想和大家分享一个我最近遇到的烦心事——我的 Ubuntu 系统总是无缘无故唤醒外置机械硬盘。
你懂的,那种“咔哒咔哒”的声音,在夜深人静的时候格外刺耳。而且每次唤醒后,硬盘的指示灯就开始闪烁,让人担心它的寿命会不会被这种无意义的访问消耗掉。
问题初现
事情是这样的:我把一块 4TB 的机械硬盘通过 USB 3.0 接口连接到了我的 Ubuntu 工作站上,用来存储一些不常用的资料和备份。按理说,不用的时候硬盘应该安静地休眠才对,但它却像个调皮的孩子,每隔一会儿就“醒”过来活动一下。
我一开始以为是系统正常的维护任务,没太在意。但连续几天后,我发现这货几乎是不定时就醒一次!这还得了?不仅浪费电,对硬盘的寿命也是个考验。
开始调查
作为一个喜欢刨根问底的技术人,我决定找出幕后黑手。我打开终端,开始我的侦探工作:
sudo journalctl -S -20min | grep -E "(sdb|Wake-up|spinning|activity)" -i
输出结果让我恍然大悟:
12月 06 21:00:00 xiaotian systemd[1]: Starting sysstat-collect.service - system activity accounting tool...
12月 06 21:00:00 xiaotian systemd[1]: Finished sysstat-collect.service - system activity accounting tool.
12月 06 21:10:00 xiaotian systemd[1]: Starting sysstat-collect.service - system activity accounting tool...
12月 06 21:10:00 xiaotian systemd[1]: Finished sysstat-collect.service - system activity accounting tool.
看!凶手就是它——sysstat-collect.service!这个“系统活动统计工具”每隔10分钟就运行一次,收集系统性能数据,结果把我的外置硬盘也给“收集”醒了。
对症下药
找到了问题根源,解决起来就简单了。Systemd 管理的服务,就用 systemctl 来处理:
sudo systemctl stop sysstat-collect.timer
sudo systemctl disable sysstat-collect.timer
然后我还一不做二不休,把 sysstat 的其他相关服务也停了:
sudo systemctl stop sysstat
sudo systemctl disable sysstat
为了确认效果,我检查了一下还有哪些定时器在运行:
systemctl list-timers
结果发现,除了 sysstat 之外,系统里还有不少“勤劳”的服务可能会打扰硬盘的美梦:
- apt-daily.timer - 自动检查更新
- apt-daily-upgrade.timer - 自动升级
- man-db.timer - 更新手册页索引
- fstrim.timer - SSD优化(对机械硬盘完全没用)
- fwupd-refresh.timer - 固件更新检查
全面清理
既然要解决,就解决得彻底一点。我把这些可能唤醒硬盘的服务都禁用了:
# 禁用 apt 自动更新(我更喜欢手动控制)
sudo systemctl disable --now apt-daily.timer apt-daily-upgrade.timer
# 禁用手册页更新(反正我查手册的频率不高)
sudo systemctl disable --now man-db.timer
# 禁用 fstrim(机械硬盘不需要这个)
sudo systemctl disable --now fstrim.timer
# 禁用固件更新检查(需要时手动更新就行)
sudo systemctl disable --now fwupd-refresh.timer
哦对了,如果你用的是 GNOME 桌面,可能还需要处理一下 tracker 文件索引服务:
sudo systemctl disable --now tracker-miner-fs tracker-store
验证成果
禁用完这些服务后,我让系统运行了一段时间。再次检查日志:
sudo journalctl -S -1hour | grep -E "(sdb|Starting.*service)" -i
太好了!硬盘唤醒的日志记录消失了。我又用 hdparm 命令检查硬盘状态:
sudo hdparm -C /dev/sdb
显示 drive state is: standby(驱动器状态:待机)。完美!硬盘终于可以安静地休息了。
一些额外的思考
在解决这个问题的过程中,我还学到了一些小技巧:
1. 如何监控磁盘访问
如果你想知道到底是什么程序在访问磁盘,可以试试这些命令:
# 实时查看 I/O 使用率
sudo iotop -o
# 监控文件访问
sudo fatrace | grep sdb
# 查看哪些进程打开了磁盘文件
sudo lsof /dev/sdb
2. 手动管理挂载
如果你的外置硬盘真的只是偶尔使用,可以考虑完全手动管理:
# 需要时挂载
sudo mount /dev/sdb1 /mnt/my_hdd
# 用完后卸载
sudo umount /mnt/my_hdd
这样系统服务就完全不会打扰到它了。
3. 创建方便的挂载脚本
为了省事,我写了个小脚本:
#!/bin/bash
# 保存为 mount-hdd.sh
if mount | grep -q "/dev/sdb1"; then
sudo umount /dev/sdb1
echo "硬盘已卸载"
else
sudo mount /dev/sdb1 /mnt/my_hdd
echo "硬盘已挂载到 /mnt/my_hdd"
fi
总结
经过这一番折腾,我的外置硬盘终于可以安安静静地休眠了。整个过程让我再次感受到 Linux 系统的透明和可控——只要你愿意去探索,总能找到问题的根源并解决它。
当然,每个人的使用习惯不同,你可能不需要禁用所有我提到的服务。关键是理解每个服务的作用,然后根据自己的需求做调整。
希望我的经验能帮到遇到类似问题的你。如果你有更好的方法或者不同的见解,欢迎在评论区分享!
最后的小提示:在禁用系统服务之前,最好先了解一下它们的作用,确保不会影响到你正常的工作流程。毕竟,稳定性和便利性需要找一个平衡点。
祝大家都能有一个安静的工作环境!🖥️💾✨