删除和重新创建 NTFS 日志(或如何正确运行“fsutil usn”命令)

Iqb*_*mid 4 filesystems ntfs window corruption fsutil

我遇到了chkdsk第 3 阶段错误(与 NTFS usn 日志和安全描述符相关)。

损坏的 NTFS 日志会阻止chkdsk /f运行卷修复。因此chkdsk修复将无法进行,这不是解决方案。

但是,我听说可以通过删除并重新创建 NTFS 日志来修复损坏。这可以通过在命令提示符或具有管理员权限的 PowerShell 中执行以下命令来完成:

fsutil usn deletejournal /d /n
Run Code Online (Sandbox Code Playgroud)

其次是

fsutil usn createjournal m=<maxsize> a=<allocationdelta> <volumepath>
Run Code Online (Sandbox Code Playgroud)

但是,有关这些命令的开关和参数的 Microsoft 文档非常少。任何人都可以请建议:

  1. /d 和 /n 开关的实际作用。它们是永久性的吗?如果我创建新日记,是否需要重新启用它们?如果必须的话我该如何重新启用?
  2. <maxsize>和参数是什么<allocationdelta>
  3. 我如何确定要设置哪些<maxsize><allocationdelta>?默认值是多少?

最后,以这种方式删除 NTFS 日志有多安全?

谢谢。

在此输入图像描述

Iqb*_*mid 12

好的,为了他人的利益,我将向您提供我所获得的所有知识,这些知识帮助我解决了这个问题。

要重新创建 NTFS USN 日志,请先删除日志,然后重新创建日志。

删除日志
您可以使用以下命令删除 NTFS USN 日志...

fsutil usn deletejournal /d /n c:
Run Code Online (Sandbox Code Playgroud)

/d 和 /n 开关的记录很少。此处的Microsoft 文档 与您在命令提示符处查询该命令的使用情况时显示的信息相冲突:

在此输入图像描述

两者都不准确!命令提示符文档是错误的,因为两个开关都删除了日志,而不仅仅是 /d。Microsoft 网页文档具有误导性,因为该日志实际上是被删除而不是被禁用。这些开关决定了如何删除它。

由于删除日志可能需要很长时间,因此这些开关允许您控制它是在进程内还是在进程外运行。/n 开关在锁定句柄的过程中执行删除日志(将其视为“锁定计算机”)。这迫使您等待它完成。/d 开关在进程外执行并允许您继续工作。删除日志可能需要几个小时才能运行,并且将在连续重新启动后继续,直到完成。我见过人们在两个开关相互排斥时将它们一起使用。

删除日志几乎总是安全的,但有时可能会对备份过程产生影响。使用日志的应用程序不会看到应用程序上次运行和删除日志之间的文件更改。精心编程的应用程序将检测到日志已被删除,并将恢复到查找更改的文件或重新创建它的替代方法。我建议无论后果如何,删除都是安全的,因为在最坏的情况下,您只会损害备份的增量能力。您仍然可以进行完整备份并重新开始;至少你的数据没有丢失!

重新创建日志
我被告知没有必要手动重新创建日志,因为运行备份(例如通过控制面板的 Windows-7 备份选项)将自动重新创建 NTFS 日志。

但是,如果您确实想要手动重新创建日志,则可以在命令提示符处通过使用提升的权限运行以下命令来执行 createjournal 命令

fsutil usn [createjournal] m=<maxsize> a=<allocationdelta> <volumepath>
Run Code Online (Sandbox Code Playgroud)

什么是<maxsize>?什么是<allocationdelta>

<maxsize>确定日志的文件大小。通常在 30Mb 到 40Mb 之间。在我的带有 2TB 驱动器的 Windows 8.1 电脑上:

<maxsize>= 0x2000000 字节(十六进制) = 33,554,432 字节 = 33Mb

<allocationdelta>= 1/4 <maxsize>= 0x800000 字节(十六进制) = 8,388,608 字节 = 8Mb

但是,对于较大的 值,我可能建议设置<allocationdelta>为 1/8 。<maxsize><maxsize>

仅供参考:您可以通过在命令提示符下使用提升的权限键入以下命令来查询日志的当前大小:

C:\Windows\system32> fsutil usn queryjournal C:
Run Code Online (Sandbox Code Playgroud)

您将得到与此类似的输出:

在此输入图像描述

和参数以十六进制aBYTES 形式m提供。

<maxsize>因此,我建议和 取以下值<allocationdelta>

如果您有一个非常大的驱动器(4TB+,包含 400,000+ 个文件),请使用:

fsutil usn createjournal m=536870912 a=67108864 C:
Run Code Online (Sandbox Code Playgroud)

对于较小的驱动器 (<=2TB)、文件较少(<=400,000 个文件),请运行:

fsutil usn createjournal m=67108864 a=8388608 C:
Run Code Online (Sandbox Code Playgroud)

如果您好奇这些数字的来源,它们是位状态数的足够幂,可以提供日志日志的字节大小。IE:这些数字是 2^x,它给出了您想要的大小的精确大小(以字节为单位) 。日志的大小通常在 30MB 到 40MB 之间。因此,我将 (m) 参数提高到下一个最大可用大小 (67Mb) <maxSize>

2^25 字节 x 2 = 33Mb x 2 = 67Mb

(a)参数<allocationDelta>需要约为 m 的 1/8,即 8Mb 左右。

您在互联网上的其他任何地方都找不到这个解释!尤其是微软,可耻的是未能充分记录这两个日志命令的使用。

您可以通过在命令提示符下使用提升的权限执行以下命令来查询系统上的文件数量:

C:\Windows\system32> dir C:\ /s /a /w
Run Code Online (Sandbox Code Playgroud)

你会看到这样的输出......

在此输入图像描述

将文件和目录的数量加在一起就是总量;在此示例中为 1,616,718。

然后,您可以使用下表(转载自本页)作为替代指南来查找“最大大小”和“分配增量”的适当值。

在此输入图像描述

请参阅此处创建日记的指南:另请参阅此处的一些好的建议: