计算分区上零字节的最快方法

计算分区上零字节的最快方法

我的根分区和主分区是 LUKS 加密的。我希望对它们启用丢弃/修剪(我知道安全隐患)。如果我的理解是正确的,这应该会导致原始磁盘设备上的丢弃区域为零,而 cryptsetup 映射设备上的丢弃区域则为乱码。

我做了一些配置更改,运行了fstrim,现在我想验证丢弃是否正常工作。为此,我想计算分区上有多少字节为零。在修剪过的磁盘上,我期望:

count of 0 bytes÷ total partition sizepercentage of free space

在未修剪的加密分区上:(假设所有字节至少写入一次)

count of 0 bytestotal 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 byte100*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

相关内容