问题描述
-
该问题在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
,改8101
为8000
。
如果找到的特征串是03010100
,改为03010000
。
我在自己的系统中找到的特征串为03010102
,改为03010000
。
dirty bit即被清除。
据实验,对WIN7、8、10的修改即刻生效,XP需要重启。
参考:
- 《ArchLinux(或Linux系统)与Win10双系统修复grub引导》
- 《不使用CHKDSK,手动重置或清除Windows中的 dirty bit (脏位)》
- 《Linux下NTFS分区的修复和恢复》
- 《kde无法挂载特定的NTFS分区》
- 《无法在kde dolphin中挂载特定的磁盘分区》
版权声明:本文由 Duter2016 在 2023年10月20日发表。本文采用CC BY-NC-SA 4.0许可协议,非商业转载请注明出处,不得用于商业目的。
文章题目及链接:《linux清除Windows文件系统中的dirty bit脏位》