我想是否可以通过限速的方法避免爆盘变只读,只要写入速度低于硬盘自身写入真实盘体的速度应该就不会爆盘了,下面内容是deepseek教的,指定写入速度,我限制在25M,现在在用fastcopy复制了300G,暂时还没事。
使用 Cgroup 这类内核级通用限速方案,核心原理是通过 Linux 内核自带的 Block I/O 控制器(blkio),为特定进程组设定一个“I/O 配额”,精确地控制该组内所有进程对指定物理磁盘的写入上限。
它不依赖网络协议,因此能直接作用于本机的所有磁盘写入行为。Cgroup 分为 v1 和 v2 两个版本,它们的限速方法有所不同。考虑到飞牛NAS基于Debian 12(内核6.x),原生支持并默认启用 Cgroup v2,所以会重点介绍 v2 的 io.max 控制器。
⚖️ Cgroup v1 与 v2 对比
| 特性 |
Cgroup v1 (blkio子系统) |
Cgroup v2 (io控制器) |
| 配置路径 |
/sys/fs/cgroup/blkio/ |
/sys/fs/cgroup/ |
| 限速接口 |
blkio.throttle.write_bps_device |
io.max |
| 限速格式 |
: |
: wbps= |
| Buffered I/O限制 |
不支持 |
支持(通过 io.max) |
| 内核要求 |
旧版内核 (2.6.24+) |
新版内核 (5.0+) |
以下是在飞牛NAS上,使用 Cgroup v2 io.max 控制器限制特定进程写入速率的具体操作步骤。
📋 准备工作:确认设备号与系统支持
-
SSH连接到飞牛NAS:获取 root 权限。
sudo -i
-
确认 Cgroup v2 已启用:执行 mount | grep cgroup,如果输出包含 type cgroup2,则说明系统正在使用 Cgroup v2。
-
查找目标磁盘的设备号:这是限速的核心。
ls -l /dev/disk/by-path/ | grep -v part
根据设备连接的物理位置(如 PCIe、SATA 接口)和设备型号找到对应的设备,例如 sdc。然后,获取它的主次设备号:
ls -l /dev/sdc
# 输出示例: brw-rw---- 1 root disk 8, 32 Sep 1 10:00 /dev/sdc
这里,8, 32 就是设备号。务必记录,后续将 8:32 作为目标地址。
⚙️ 操作步骤:创建Cgroup并限速
-
创建一个Cgroup:在 Cgroup v2 的统一层级下创建一个名为 smr_limit 的控制组。
mkdir -p /sys/fs/cgroup/smr_limit
-
设定写入速率上限:使用上一步获取的设备号 8:32,将写入带宽上限设为 60MB/s。
echo "8:32 wbps=62914560" > /sys/fs/cgroup/smr_limit/io.max
- 60MiB/s 换算为字节是 60 * 1024 * 1024 = 62914560。
- 若需同时限制读带宽,格式为
echo "8:32 rbps=62914560" > ...。
-
将目标进程移入Cgroup:将Samba服务进程的PID写入该控制组,使其后续的所有操作都受规则约束。
echo $(pidof smbd) > /sys/fs/cgroup/smr_limit/cgroup.procs
-
验证限速是否生效:从客户端向飞牛NAS的SMB共享拷贝一个大文件,同时用 iostat 监控。
# -x 显示详细统计, 1 表示每秒刷新一次
iostat -x 1
观察 sdc 对应的 wkB/s 列,数值应在 61440(60MB/s)左右,说明限速生效。
-
(可选)自动生效:以上操作重启后失效。如需开机自启,可创建一个systemd服务。
cat > /etc/systemd/system/smr-io-limit.service <
[Service] Type=oneshot RemainAfterExit=yes ExecStart=/bin/bash -c 'mkdir -p /sys/fs/cgroup/smr_limit
[Install] WantedBy=multi-user.target EOF
systemctl daemon-reload systemctl enable smr-io-limit.service systemctl start smr-io-limit.service
code