linux清除Windows文件系统中的dirty bit脏位

linux下用ntfsfix,windows下用WinHex修复

作者: Duter2016 | 2023-10-20 | 阅读
「编辑」 「本文源码」

问题描述

  • 该问题在Arch Linux中上报有该bug: https://bugs.archlinux.org/task/78596

  • 该bug导致无法挂载windows下ntfs文件系统中存在dirty bit脏位的分区,在util-linux更新到2.39-3之后可修复。我现在的系统中util-linux版本是2.39.2-1,无法挂载的问题出现,未升级到2.39-3前可以使用本文方法修复。

我的Windows有5个NTFS分区,其中2个卷标分区无法在Dolphin中通过点击图标的方式挂载,但可以在命令行手动挂载,挂载之后可以在Dolphin中正常访问。其他3个分区可以正常挂载。

该分区上安装的Windows可以正常启动,因此分区本身应没有错误。Windows没有处在休眠状态,且关闭了快速启动。

Dolphin给出的错误提示信息如下:

访问 时发生错误,系统返回信息:请求的操作已失败: Error mounting wrong fs type, bad option, bad superblock on missing codepage or helper program, or other error

在终端中使用

sudo mount /dev/sda7

则没有任何错误。手动挂载之后亦可在Dolphin中访问。

解决方法

Dolphin 报错之后,使用如下命令查看内核日志:

journalctl -k -n 100

我们可以在日志中找到类似如下的输出:

10月 20 22:33:59 ThinkPad kernel: ntfs3: sda5: volume is dirty and "force" flag is not set!
10月 20 22:34:01 ThinkPad kernel: ntfs3: sda7: volume is dirty and "force" flag is not set!

该错误分析如下:

Windows 系统通常能很好的处理异常的“冷重启”(断电,关闭插线板的电源,或家里的小人儿手指随意按导致关机)。事实上,至今为止,最有效的修复Windows桌面问题的方法就是简单的重启系统。但是,Windows分区偶尔会显示系统需要进行驱动器一致性检测。不这么做的话,在几次重启后可能会引起文件系统状况恶化而使系统变得更糟。众所周知,Windows文件系统检查超级慢,而且经常不得不做好几次才能清理掉文件系统的“脏(dirty)”标志。

然而在dirty bit没有被清理掉前,在linux下读取win下相关分区会出现如上错误提示。

1.linux系统下清除dirty bit脏位

下面介绍一个叫“ntfsfix”的小工具。

① 在Arch Linux中,无需安装,可以直接使用。用如下命令修复存在问题的分区(以/dev/sda7为例):

ntfsfix -d /dev/sda7

② 在基于Debian的系统(如 Ubuntu)可以通过下面的命令下载安装:

sudo apt-get install ntfsfix

③ 或者在基于RPM的系统(如 Red Hat 或 CentOS)中通过下面的命令下载安装:

sudo yum install ntfsfix

这个‘ntfsfix’工具能快速的修复常见的错误以及NTFS分区不一致的问题。最常用的命令不用带任何参数。 它也可以报出来那些没有修复掉的项,然后我们能通过以下选项来修复它们:

  • -b: 清除磁盘上的坏的扇区 (可以在从一个旧磁盘往新的磁盘上克隆之后使用)
  • -d: 清除“脏”标志。“脏”标志是Linux不能挂载一个Windows分区的最常见的原因,通常发生在Windows断电前没有正常关机的情况。
  • -n: 除了在标准输出上显示它要完成的(换句话说,就是需要修复哪些)之外不做任何事。

过去Windows在启动前,用NTFS Disk Check来重置“脏”标志,常常要花几个小时。而‘ntfsfix’完成这个仅仅只需要大约三秒的时。

2.windows系统下清除dirty bit脏位

Windows中有一个名为fsutil.exe的工具可用于检查卷是否“脏了”,甚至可用于手动将卷设置为“脏”,这会导致请求扫描驱动器,但奇怪的是它不能清除dirty bit。

在win下使用管理员身份运行cmd,然后输入如下命令查看分区是否存在dirty bit:

fsutil dirty query f:

可以用两种方法清除dirty bit:进行磁盘检查(在管理员身份打开cmd,运行chkdsk d:/f,d为盘符),或者格式化驱动器(之前先备份数据)。前者会生成一些​ ​后缀为CHK的文件​​,这些文件不知所谓,有可能让你丢失数据,后者更稳妥一些,但如果数据量很大,拷贝文件需要花很多时间。

本文介绍第三种方法。先在 NTFS 和 FAT16/32 文件系统上找到dirty bit,然后再用十六进制编辑器手动清除dirty bit。正如之前所说,dirty bit只是一个十六进制数值。

我们使用十六进制编辑器WinHex。下载WinHex:

链接: ​ ​https://pan.baidu.com/s/12sDF8QCdolNKgaAgxrSxqA​​​​​​​​​​​​​​​​​
提取码: 4v56

开始清除dirty bit:

(1)下载WinHex,只有注册版才能往硬盘里写回数据。

(2)以管理员权限运行WinHex.exe,点击工具-打开磁盘,选择你将要编辑的盘符。

FATA32卷的dirty bit偏移量是0x41,该位置01为脏卷,置00为干净,所以将其置为00,按Ctrl+W或点软盘按钮写入驱动器,以后将不再提示检查磁盘。

FAT16卷dirty bit的偏移量是0x25,修改方法同上。

点击$Volume文件可以找到NTFS卷的dirty bit,但偏移量有所不同。首先找13个字节的特征串,它是下列两者之一:

03 01 01 00 00 00 00 00 80 00 00 00 18

或者:03 01 81 01 00 00 00 00 80 00 00 00 18

本例是找到了特征串03018101,改81018000

如果找到的特征串是03010100,改为03010000

我在自己的系统中找到的特征串为03010102,改为03010000

dirty bit即被清除。

据实验,对WIN7、8、10的修改即刻生效,XP需要重启。

参考:


版权声明:本文由 Duter2016 在 2023年10月20日发表。本文采用CC BY-NC-SA 4.0许可协议,非商业转载请注明出处,不得用于商业目的。
文章题目及链接:《linux清除Windows文件系统中的dirty bit脏位》




  相关文章:

「游客及非Github用户留言」:

「Github登录用户留言」:

TOP