我的根分区和主分区是 LUKS 加密的。我希望对它们启用丢弃/修剪(我知道安全隐患)。如果我的理解是正确的,这应该会导致原始磁盘设备上的丢弃区域为零,而 cryptsetup 映射设备上的丢弃区域则为乱码。
我做了一些配置更改,运行了fstrim
,现在我想验证丢弃是否正常工作。为此,我想计算分区上有多少字节为零。在修剪过的磁盘上,我期望:
count of 0 bytes
÷total partition size
≈percentage of free space
在未修剪的加密分区上:(假设所有字节至少写入一次)
count of 0 bytes
≈total partition size
÷ 256
灵感来自如何收集二进制文件中字节出现的统计信息?,我尝试过这种方法:
sudo pv /dev/disk/by-label/ESP | od -vtu1 -An -w1 | grep -Fx ' 0' | wc -l
但结果令人失望:处理一个 500 MB 的分区花费了近 3 分钟。那是 3 MB/秒,而我的 SSD 可以达到 360 MB/秒的连续读取速度。我还注意到我的一个 CPU 核心以 100% 的速度运行,而其他核心则处于空闲状态,因此我想这可以从并行化中受益。 ( 的影响pv
可以忽略不计,与 相比几乎没有区别cat
)
0
计算分区上的字节数最快的方法是什么?
答案1
如果您能够访问原始磁盘(未加密),您可以执行以下操作:
dd if=/dev/sda bs=1M count=100 2>/dev/null | tr -d '\0' | wc -c
这将从磁盘读取 100Mega 字节,删除所有零并计算剩余字节数。
我不知道这是否是最快的方法,但假设零比数据多,它应该相当快。
上面的命令将读取 100 次1Mega byte
或100*2^20
(104857600) 字节(如果可用)。尝试使用较小的数字(10 或 100)来测试速度以及命令的运行情况。要读取整个磁盘,只需删除计数选项,让磁盘的一侧限制命令。
提取两个重要的值(完整磁盘字节数和非零字节数)命令变得更加复杂:
$ time { { { sudo dd if=/dev/sdX bs=100M 2> >(grep -oP '[0-9]+(?=\s*bytes)' 1>&2 ) | tr -d '\0' | wc -c; } 2>&1; } | { read -d '' a b; echo "$b/$a"; }; }
这会将两个值打印为:non-zero/disk
,例如:
766568020/999292928
计算1-766568020/999292928
找出零字节的百分比:
$ bc <<<'(1-766568020/999292928)*100'
23.28895776994831289400