我想要测试硬盘的可靠性(大部分是 SSD)来检查它们何时发生故障。
(我认为这个问题最适合超级用户,而不是 stackoverflow 或服务器故障。)
我知道有类似的工具badblocks
,而且我也在使用它们。
我的测试脚本
另外我正在使用我自己的测试脚本,简而言之执行以下操作:
- 卸载设备
- 使用 NTFS 格式化驱动器
- 安装设备
- 使用随机数据创建 1GB 文件
- 使用剩余空间创建一个文件
- 比较所有文件的校验和
据我所知,NTFS 需要为每个文件创建 4 KB(至少在我的测试中是这样的)。也许是因为簇大小(我们只测试了 <2TB)。
测试在 Ubuntu Linux 上使用 Python / Bash 进行:
1GB 文件是使用 ThreadPool 创建的,如下所示:
with ThreadPoolExecutor() as executor:
for i in range(1, file_count + 1):
executor.submit(_create_file_task, device, i)
之后,对于最后一个文件,我在 Python 中所做的是(减去 4KB 以留出足够的空间):
remaining_kb = int(shutil.disk_usage(mount_directory).free / 1024 - 4)
result = execute_script(".write-read.sh " + device + " " + str(remaining_kb) + "K" + " " + str(i))
这些文件是用 bash 文件(write-read.sh)写入的,如下所示(这里为了更容易理解,使用 /dev/zero 作为非随机源):
head -c $FILESIZE /dev/zero | tee $STORAGE_FILE | sha512sum > $CHECKSUM_FILE
该execute_script
函数(也用于_create_file_task
函数中)基本上只是调用subprocess.run
和管道+将输出解码到日志文件中。
对于最后一个文件,我有时(并非总是)收到出现错误消息,驱动器上没有剩余空间(在德国:tee: /mnt/nvme1n1p1/239.bin: Auf dem Gerät ist kein Speicherplatz mehr verfügbar
)
会发生什么
我检查了好几次,溢出始终为 16KB我考虑再减去 16 KB,将剩余的 KB 计算改为:
remaining_kb = int(shutil.disk_usage(mount_directory).free / 1024 - 4 - 16)
这是为什么?我是不是漏掉了什么?
更新:我也用这个选项测试了,但错误仍然发生。请参阅最后的更新。
为了安全起见,我还添加了一个ThreadPool 后延迟 3 秒,并比较了延迟前后的剩余空间。但这并没有改变任何东西(正如预期的那样)。
所以在最后一次测试中到底发生了什么曾是:
剩余 KB 计算为 421620KB
tee
再次说,驱动器上没有足够的空间。脚本完成后,剩余空间
2109440 Bytes free of 256059109376B
显示为:使用以下代码disk_usage = shutil.disk_usage(mount_directory) logger.debug(str(disk_usage.free) + " Bytes free of " + str(disk_usage.total) + "B")
ll /mnt/nvme1n1p1/ | grep 239
给出了以下结果(因此写入 429633536B = 419564 KB):rwxrwxrwx 1 root root 429633536 Nov 24 17:34 239.bin*
df /dev/nvme1n1p1
向我展示了以下内容(德语翻译)Filesystem 1K-Blocks Used Available Perc% Mounted on /dev/nvme1n1p1 250057724 250055664 2060 100% /mnt/nvme1n1p1
因此,先前显示的从shutil / 1024释放的2109440B与df显示的2060KB相匹配。
如果我将 239.bin 文件移动到另一个驱动器(释放 nvme1 上的空间),我会得到以下用法
Filesystem 1K-Blocks Used Available Perc% Mounted on
/dev/nvme1n1p1 250057724 249636100 421624 100% /mnt/nvme1n1p1
因此之前计算的剩余 421620KB + 4 = 用 df 显示的 421624KB。
现在,如果我尝试再次使用以下命令直接使用该空间,它会再次失败:
head -c 421620K /dev/zero | tee /mnt/nvme1n1p1/239a.bin | sha512sum > /mnt/otherdrive/239a-checksum.txt
更新(使用比可用空间少 20KB)
我还使用剩余空间 -20KB 运行了脚本:
在 /mnt/nvme1n1p1 中再次创建大小为 421604KB 的 239.bin 文件,
出现错误消息,表示剩余空间不足
ll /mnt/nvme1n1p1/ -v
total 249977604
drwxrwxrwx 1 root root 368 Nov 26 20:35 ./
drwxr-xr-x 7 root root 4096 Nov 24 09:05 ../
-rwxrwxrwx 1 root root 1073741840 Nov 26 20:13 1.bin*
-rwxrwxrwx 1 root root 1073741840 Nov 26 20:13 2.bin*
-rwxrwxrwx 1 root root 1073741840 Nov 26 20:13 3.bin*
....
-rwxrwxrwx 1 root root 425533440 Nov 26 20:35 239.bin*
df | grep 1n1
/dev/nvme1n1p1 250057724 250051660 6064 100% /mnt/nvme1n1p1
问题
我猜想这和簇大小或块大小或类似的东西有关,但搞不清楚。我需要做什么才能使用所有剩余空间?这可能吗?谢谢!