我的测试脚本

我的测试脚本

我想要测试硬盘的可靠性(大部分是 SSD)来检查它们何时发生故障。

(我认为这个问题最适合超级用户,而不是 stackoverflow 或服务器故障。)

我知道有类似的工具badblocks,而且我也在使用它们。

我的测试脚本

另外我正在使用我自己的测试脚本,简而言之执行以下操作

  1. 卸载设备
  2. 使用 NTFS 格式化驱动器
  3. 安装设备
  4. 使用随机数据创建 1GB 文件
  5. 使用剩余空间创建一个文件
  6. 比较所有文件的校验和

据我所知,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

问题

我猜想这和簇大小或块大小或类似的东西有关,但搞不清楚。我需要做什么才能使用所有剩余空间?这可能吗?谢谢!

相关内容