我的 3 Tb 硬盘有问题。有很多坏块,但仍然有大约 2.6 Tb 可用空间,我想利用它作为垃圾存储(音乐、视频等)。起初我偶然发现了一个人的手册。他将磁盘分成几个分区,然后制作 JBOD(只是一堆磁盘)RAID(如果您有兴趣,有一个链接(俄语): https://habr.com/ru/post/252211)。但是在那篇文章的评论中有人提到,mkfs 本身也可以用 '-c' 键完成同样的操作。现在我想知道,它是如何工作的?是的,有一个手册页,它告诉我们:
-c 在创建文件系统之前检查设备是否有坏块。如果指定该选项两次,则使用较慢的读写测试而不是快速的只读测试。
有一篇 arch wiki 文章讲述了几乎相同的内容。它检查设备是否有坏块,然后呢?互联网上到处都有人说它标记了坏块,但操作系统不使用它们。我该如何检查它?是否有任何实用程序可以显示标记的块以供进一步使用(可能是将来创建分区)?
答案1
您所引用的内容确实如此man mkfs.ext4
( ):man 8 mke2fs
-c
在创建文件系统之前检查设备是否有坏块。如果指定此选项两次,则使用较慢的读写测试而不是快速的只读测试。
但还有-l
:
-l filename
从 filename 读取坏块列表。请注意,坏块列表中的块号必须使用 所用的相同块大小生成mke2fs
。因此,-c
选项mke2fs
是一种更简单且更不容易出错的方法,可以在格式化磁盘之前检查磁盘是否有坏块,因为mke2fs
会自动将正确的参数传递给badblocks
程序。
让我们来调查一下man 8 badblocks
:
重要提示:如果要将 的输出
badblocks
输入到e2fsck
或mke2fs
程序,则必须正确指定块大小,因为生成的块号非常依赖于文件系统使用的块大小。因此,强烈建议用户不要badblocks
直接运行,而是使用和程序-c
的选项。e2fsck
mke2fs
它提到e2fsck
(又名fsck.ext4
ext4 的情况),所以让我们检查一下man 8 e2fsck
[强调我的]:
-c
此选项使e2fsck
使用badblocks(8)
程序对设备进行只读扫描,以查找任何坏块。如果发现任何坏块,则将其添加到坏块 inode 以防止将其分配给文件或目录。如果指定该选项两次,则将使用非破坏性读写测试进行坏块扫描。
由于和mke2fs
是e2fsck
同一工具包的一部分,我预计 -c
mke2fs
尽管它的描述没有明确说明这一点,但它仍然以相同的方式工作。
然后检查文件系统知道的坏块dumpe2fs
。来自man 8 dumpe2fs
:
-b
打印文件系统中保留为坏的块。
(致谢这个答案)。
请注意,文件系统存储了这些信息。要将其用于未来的文件系统,您需要在销毁当前文件系统之前保存它。如果您更改分区表或为新文件系统选择不同的块大小,则需要重新计算数字。