Linux与NTFS的那些事

本文最后更新于 2026年7月8日 中午

写在前面————关闭Windows快速启动

Windows快速启动在Windows8引入,且默认开启。如果开启快速启动,则关闭Windows的时候实际上并没有真正关闭,而是进入了休眠状态。
众所周知,在双系统的计算机上如果休眠一个系统的时候启动另一个系统,则那些已经被挂载在休眠系统上的硬盘一定不能以读/写方式被挂载到另一个系统,否则会出现两个系统的文件系统metadata不匹配,文件系统一定会损坏。以只读挂载可能是安全的。
如果快速启动开启,由于Windows默认挂载所有硬盘,因此意味着几乎永远无法读写Windows的NTFS分区。

现状记录与考古————前7.0时代

ntfs-3g————又不是不能用

稍微翻一下发布历史就能看出来,ntfs-3g这玩意的历史相当悠久。不过好消息是至今仍在积极维护。
在绝大多数的Linux发行版里面,ntfs-3g都在官方软件源提供,且绝大部分开箱即用的发行版安装,都会直接预装ntfs-3g
并且由于ntfs-3g提供了/sbin/mount.ntfs执行文件,对于ntfs分区,直接mount -t ntfs甚至直接不指定类型直接mount走的就是ntfs驱动。
缺点嘛,首先它是用户空间的驱动,要走至少一层fuse开销,性能肯定差一些(可以查看mount之后类型显示为fuseblk);其次驱动的底子毕竟还是比较老旧的实现,功能没那么全,稳定性稍微有点争议,总之不是一个很现代的东西,但是确实是能用就行

ntfs3————更好的性能,更大的稳定性争议

NTFS3驱动在Linux5.15引入,内核态驱动,提供了更强的性能,更完善的功能支持。

Why is NTFS3 called NTFS3 ?
NTFS3 is called NTFS3 because it fully implements the latest version 3.1 of NTFS file system specification. NTFS is unlikely to change in future, thus NTFS3 naming reflects that NTFS3 implements the latest revision of NTFS.

NTFS3的主要优势还是在性能上,内核态驱动意味着它不需要走一层fuse转发,因此效率会强得多。功能上实际上ntfs-3g功能也覆盖的相当全,大部分常见的ntfs特性两边都实现了。

至于二者的取舍,就咱个人的身边统计学来说,似乎很多人都觉得ntfs-3g的实现太老旧,写入不靠谱,建议用ntfs3;但是从发行版社区来看情况似乎不太一样。
最值得玩味的就是Debian的态度:这里可以看到完整的讨论历史,咱大致总结一下要点:

  1. 首先是行为:5.15发布之后debian有不短的时间一直都没有开启ntfs3模块,一直到Debian12发布(使用Linux6.1lts内核),ntfs3是完全不开的:可以直接ls /usr/lib/modules/$(uname -r)/kernel/fs查,然后发现里面根本没有ntfs3内核模块。Debian13 (Linux6.12lts)才开起来。
  2. 看看时间线:Linux5.15发布于2021年11月,Debian12发布于2023年6月,隔了足足一年半的时间Debian社区依然认为”NTFS3 driver is still not in astate making it confident it’s wise to enable it for a stable release. “
  3. 从沟通记录来看,5.15合入ntfs3驱动之后,似乎有很长的一段时间完全没有后续更新,或许这也是Linux社区对它缺乏信任的原因。不过看看现在github上记录的日志(github容易看一点), 看起来至少现在Paragon是有积极维护这个驱动的。

此外mint社区在mint22.1和LMDE7里面屏蔽了该模块:

1
2
3
4
5
6
$ cat /usr/lib/modprobe.d/mint-blacklist-ntfs3.conf 
# Blacklist the ntfs3 driver
# See https://github.com/orgs/linuxmint/discussions/680
# Upstream bug report: https://bugs.launchpad.net/ubuntu/+source/ntfs-3g/+bug/2062972

blacklist ntfs3

理由写在里面了,大体似乎就是”ntfs3会弄坏一些分区,ntfs-3g至少能用”。不过内核里面模块是在的,解除屏蔽就行。咱喜欢用破坏性最小的方式,在/etc/modprobe.d/目录下创建一个同名的mint-blacklist-ntfs3.conf文件,内容直接留空,按照优先级就能覆盖掉。除此之外的方法就只有删掉文件,没有类似unblacklist这种覆写的语法。

咱自己的个人经历吧,在用mint21.3(基于Ubuntu22.04, linux6.5hwe内核)的时候,咱那时没有隔离双系统工作区的习惯,直接把Linux的python venv也建在ntfs分区下了,然后平时用的时候没问题,只要删venv,分区几乎必挂,然后重启回Windows需要跑chkdsk修复,且修复之后会有不少文件恢复到found.000类似目录。后来咱自己的判定就是,Linux下尽量避免删除大量零碎文件。
后来咱去确认了一下mint21时期的设置,ntfs3驱动没有被屏蔽,测试了一下配置,当时大概率用的就是ntfs3,所以说这或许也是一个可能佐证ntfs3不稳定的实例?

Archwiki记录了另一个实例:双系统如果共享同一个游戏文件夹(Windows原生运行+Linux proton),那这个共享文件夹如果位于NTFS分区,Linux侧会经常发生着色器缓存损坏,也很有可能是和ntfs3驱动有关。参见英文/中文

ntfs3内核驱动没有提供任何用户空间工具,因此即使主用ntfs3驱动,通常也需要用到ntfs-3g来提供用户空间工具,包括mkfs.ntfs ntfsresize ntfsfix等等。有的发行版就是ntfs-3g一个包,有的发行版则把ntfs-3g的驱动部分和工具部分拆成两个包并共同依赖libntfs-3g共享库包,具体看各自发行版配置。

我到底用的是哪个驱动?

对于手动使用mount命令的其实很简单,显式-t ntfs3就是用的ntfs3驱动,不加-t就会被识别出文件类型是ntfs后,使用默认-t ntfs然后落到ntfs-3g驱动。

对于大部分桌面环境,大部分GUI文件管理器,用的都是udisks2,所以配置遵循/etc/udisks2下的配置。
/etc/udisks2/mount_options.conf存放个性化配置,/etc/udisks2/mount_options.conf.example里面都是被注释掉的配置,但是默认选项基本遵循这个文件。

可以留意到ntfs部分是这样配置的(多截取一点,保留一个完整的overwrite层次结构):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
### Simple global overrides
# [defaults]
# # common options, applied to any filesystem, always merged with specific filesystem type options
# defaults=ro
# allow=exec,noexec,nodev,nosuid,atime,noatime,nodiratime,ro,rw,sync,dirsync,noload

### Specific filesystem type options
# ntfs_defaults=uid=$UID,gid=$GID,windows_names
# ntfs_allow=uid=$UID,gid=$GID,umask,dmask,fmask,locale,norecover,ignore_case,windows_names,compression,nocompression,big_writes

### For the reference, these are the builtin mount options:
# [defaults]
# allow=exec,noexec,nodev,nosuid,atime,noatime,nodiratime,relatime,strictatime,lazytime,ro,rw,sync,dirsync,noload,acl,nosymfollow

# # 'ntfs' signature, definitions for the legacy ntfs kernel driver and the ntfs-3g fuse driver
# ntfs:ntfs_defaults=uid=$UID,gid=$GID,windows_names
# ntfs:ntfs_allow=uid=$UID,gid=$GID,umask,dmask,fmask,locale,norecover,ignore_case,windows_names,compression,nocompression,big_writes
#
# # 'ntfs' signature, the new 'ntfs3' kernel driver
# ntfs:ntfs3_defaults=uid=$UID,gid=$GID
# ntfs:ntfs3_allow=uid=$UID,gid=$GID,umask,dmask,fmask,iocharset,discard,nodiscard,sparse,nosparse,hidden,nohidden,sys_immutable,nosys_immutable,showmeta,noshowmeta,prealloc,noprealloc,hide_dot_files,nohide_dot_files,windows_names,nocase,case
#
# # define order of filesystem driver priorities for the actual mount call,
# # required definition for non-matching driver names
# ntfs_drivers=ntfs3,ntfs

咱故意保留了完整的结构,这样才能便于看出来配置生效的层次顺序。

其中与驱动选择相关的其实只有最后一行,ntfs_drivers=ntfs3,ntfs优先选择ntfs3驱动挂载,如果ntfs3挂载失败,就改用ntfs-3g,这应该是几乎所有发行版的默认配置。

咱自己当然也直接遵循了这个默认配置。

不过最权威的复查方式是在挂载完成之后使用mount命令直接查挂载类型,ntfs3自然不用说,fuseblk就是走的ntfs-3g。
看起来这里的字样似乎不太好抓,所以直接读完整列表,反正这种手动挂载的分区通常都会位于最底下。
不过通常来说,需要复查的都是通过udisks2挂载的才需要复查,而udisks2会在挂载参数里面留下自己的痕迹,所以用mount | grep udisks2来抓一般是可行的。

几乎不会触及,但是其实还存在的老内核驱动

Linux内核中存在一个历史更为久远的ntfs驱动,历史甚至可以追溯到1997年,一直存在到Linux6.9版本被移除。这个驱动的写入支持极其有限,约等于只读驱动。由于ntfs-3g占据了mount.ntfs的位置,因此几乎不可能有机会使用到它,除非使用mount -i -t ntfs方式,禁用mount helper进行挂载,或者卸载掉ntfs-3g,才能见到这个老驱动。一般它以只读驱动的形式存在,mount命令会显示类型为ntfs。在Linux6.9移除这个驱动之后,这个行为被ntfs3接管,ntfs3会在相同的挂载选项下,模拟这个旧的只读驱动的行为,并表现出几乎完全相同的现象(类型ntfs且只读)。


直到————Linux7.1, 基于这个只读驱动完全重写的ntfs读写驱动,以完全取代ntfs-3g为目标的内核驱动,也是咱这篇文的饺子醋,登场


新的里程碑…吗?————NTFSPLUS,后改名为NTFS

本节涉及到的软件包,安装方式上只有Arch AUR和Debian/Ubuntu咱自己利用github action打的包,其它发行版要么手动make要么自己包吧,学一个debian打包已经学到头大了…

全新的NTFS驱动在2025年10月以NTFSPLUS的名字官宣,12月改名为NTFS,最后在Linux7.1进入内核主线。CachyOS提前把它移植到了自家的7.0内核上。
Linux邮件列表可以看到作者对这个驱动的介绍。

简而言之,新驱动的设计目标是既要又要————更强的性能,更齐全的功能,以及更高的稳定性。至少目前来看,它似乎已经完成了对NTFS3驱动的覆盖式超越。

稍微对比一下维护者吧:

NTFS-3G NTFS3 NTFS(PLUS)
Tuxera Paragon Namjae Jeon/Hyunchul Lee

前二者在文件系统上经验都相当丰富,都有不少跨系统访问文件系统的工具,例如什么Windows访问APFS/HFS+,以及Mac访问NTFS等等。但是NTFS-3G是个基于FUSE的用户态驱动,NTFS3虽然是内核驱动,但是和Paragon的另一商业NTFS驱动完全不同源。
Namjae JeonHyunchul Lee常驻Linux内核开发,在此NTFS之前,Linux内核的exFAT驱动也是这二位贡献的,从Linux内核邮件列表也能看出,这二位既是高技术力又是Linux社区活跃开发者。所以从作者靠谱程度来看,还是比较放心的。

对于这个新驱动,Namjae Jeon提供了内核驱动用户空间工具两个仓库。

ntfsprogs-plus

用户空间工具可聊的不多,简单介绍一下。ntfsprogs-plus定位仍然是补强ntfs-3g提供的用户空间工具,建议配套新ntfs驱动使用,替代ntfs-3g。

工具包 提供的命令
共有 mkfs.ntfs mkntfs ntfsclone ntfscluster ntfsinfo ntfslabel ntfsresize
ntfs-3g独有 ntfscat ntfscmp ntfscp ntfsdecrypt ntfsfix ntfsls ntfsrecover ntfssecaudit ntfstruncate ntfsundelete ntfsusermap ntfswipe
ntfsprogs-plus独有 fsck.ntfs ntfsck

从对比表来看,ntfsprogs-plus精简掉了ntfs-3g时代大量依赖FUSE的用户态修补工具;
与此同时新增了fsck.ntfs/ntfsck,且这个应该是ntfsprogs-plus的重头戏:

ntfsck include basic filesystem checking features, like as below:

  • Boot sector check
  • Meta system files check
  • Inode and LCN Bitmap consistency check
  • Inode structure check
    • Essential attribute check
    • Runlist check
    • Attribute list check
  • Directory structure check
    • All checks for inode strcuture above
    • Directory index check
    • Directory index bitmap check
  • Cluster duplication check : If found cluster duplication. it copied to new clusters.

它能在Linux上修复NTFS文件系统问题,接近在Windows上执行chkdsk的结果,功能远强于ntfs-3g提供的ntfsfix

如何安装

从发布策略来看,仓库使用了ntfs-next分支作开发分支,主分支更新频率很低,因此直接把main分支当成发布分支都行。至于release tag上一个已经是2025年12月了,实在有点太老旧。
因此如果自行编译安装,咱觉得直接拉git主线来编译是个相当不错的选择。

  1. Arch直接安装AUR包ntfsprogs-plus-git
  2. Debian/Ubuntu用户可以移步咱的打包repo,为了避免C abi不兼容,能源码安装就源码安装;release里面作为实验性打包,咱打算长期标注为pre-release,且只用Ubuntu22.04作为打包基底系统————由于该项目是纯C的,debhelper自动检测的运行依赖列表里面只有libc6一项,由于glibc有单向向上兼容,因此理论上选择一个具有最旧glibc的系统,在上面编译的包可以适用于未来的所有新系统。目前deb系里面适配新ntfs内核驱动的最旧发行版就是Ubuntu22.04了,因此先用它;Debian12的版本作为Ubuntu22.04停止支持之后的打包实验。值得一提的是,Ubuntu22.04和Debian12输出的均为libc6 (>= 2.34),而从Ubuntu24.04开始的发行版,输出的均为libc6 (>= 2.38),这里刚刚好形成一条兼容性分界线了。后续如果有空做兼容性测试且确实新系统上有问题,咱再来研究每个系统分别打包。

由于工具冲突,因此咱只能设定Conflicts: ntfs-3g否则会撞同名文件;
与此同时考虑到有一些磁盘管理应用会硬依赖ntfs-3g,因此咱考虑再三之后设定了Provides: ntfs-3g,以免因为使用新工具破坏已有的依赖,甚至导致部分软件被apt拒绝安装。

ntfs新驱动尝鲜指北

新的NTFS驱动在linux-cachyos>=7.0,主线内核linux>=7.1上线,但是这个版本存在一个软链接不兼容的bug, 主要影响的是相对链接(绝对链接就算能认,存的路径也不一样,因此也不指望能用。
这个bug的修复要到linux>=7.2的主线才能看到(目前还是rc2),因此对于所有内核>=6.1, <=7.1的发行版,单独编译驱动本身作为外置模块是最优尝鲜方案。

首先讲一下这个驱动引入的两个新的挂载选项,都是在7.2的补丁才引入的:

  1. symlink=<native|wsl>:
    wsl(默认): 在创建符号链接时,这些链接无法被Windows系统或者Linux ntfs3驱动程序读取,只能被WSL读取。由于利用一些Linux特性,创建和解析速度都会快一些。
    native: 在创建符号链接时,这些链接可以被Windows系统或者Linux ntfs3驱动程序读取。因此,这些符号链接的行为应该与在Windows系统中创建的符号链接完全相同。
    无论激活哪个,都可以正常读取Windows原生创建的符号链接。
  2. native_symlink=<raw|rel>:
    raw(默认): 记录绝对路径的符号链接,路径直接按原样解析。
    rel: ntfs_translate_junction()函数会被激活,然后把符号链接记录的绝对路径重写成相对于挂载点的相对符号链接。

如何安装

对于官方repo介绍的make编译方法,只能为当前正在运行的内核编译,每次内核切换版本,都需要手动编译。
因此最方便的使用方法自然是打成dkms包,这样每次安装新内核的时候,dkms就能自动编译;卸载内核的时候模块也能自动一起移除。

  1. Arch直接安装AUR包ntfsplus-dkms-git,附带的udev rules包看起来作用不明,可选安装;
  2. Debian/Ubuntu: 适用系统版本:Debian12及以上,Ubuntu22.04及以上;其中Ubuntu22.04需要检查当前运行的内核版本:
    1
    uname -r
    如果是出厂的5.15内核则无法兼容,需要装hwe内核,内核版本是6.1以上即可;
    从咱的打包repo获取到dkms驱动包安装即可。由于dkms包本质是把源码安装到指定位置,然后在用户的本机上根据用户系统内安装的内核对应编译,因此不分系统兼容性,甚至不分指令集架构,ARM64都能用。
    由于打包使用到了一点新版本dh-dkms的特性,因此只能在Debian13/Ubuntu26.04上才能完成打包,低一点的系统版本都会导致dkms.conf被打包到错误的位置。包好的就能通用了。

Udisks2配置

查看/etc/udisks2/mount_options.conf.example可以看到ntfs区的示例配置:

1
2
3
4
5
6
7
8
9
10
11
# # 'ntfs' signature, definitions for the legacy ntfs kernel driver and the ntfs-3g fuse driver
# ntfs:ntfs_defaults=uid=$UID,gid=$GID,windows_names
# ntfs:ntfs_allow=uid=$UID,gid=$GID,umask,dmask,fmask,locale,norecover,ignore_case,windows_names,compression,nocompression,big_writes
#
# # 'ntfs' signature, the new 'ntfs3' kernel driver
# ntfs:ntfs3_defaults=uid=$UID,gid=$GID
# ntfs:ntfs3_allow=uid=$UID,gid=$GID,umask,dmask,fmask,iocharset,discard,nodiscard,sparse,nosparse,hidden,nohidden,sys_immutable,nosys_immutable,showmeta,noshowmeta,prealloc,noprealloc,hide_dot_files,nohide_dot_files,windows_names,nocase,case
#
# # define order of filesystem driver priorities for the actual mount call,
# # required definition for non-matching driver names
# ntfs_drivers=ntfs3,ntfs

所以自定义的/etc/udisks2/mount_options.conf可以作以下调整:

1
2
3
4
5
6
# 新驱动改为首选驱动
ntfs_drivers=ntfs,ntfs3

# 新驱动的挂载选项,主要是添加symlink的配置
ntfs:ntfs_defaults=uid=$UID,gid=$GID,windows_names,symlink=native
ntfs:ntfs_allow=uid=$UID,gid=$GID,umask,dmask,fmask,locale,norecover,ignore_case,windows_names,compression,nocompression,big_writes,symlink

如果添加其它defaults选项,确保它同时也在allow选项里面。

与ntfs-3g共存

新驱动本身是不与ntfs-3g冲突的,因此如果不使用ntfsprogs-plus,那三个驱动共存是没问题的。
但是ntfs-3g会注册一个可执行文件/usr/sbin/mount.ntfs,从而mount -t ntfs会被ntfs-3g抢占;使用mount -i -t ntfs就能让mount命令无视/sbin目录下的mount helper,使用新的ntfs驱动挂载。

但是Udisks2没法加-i参数,因此需要曲线救国,给新ntfs驱动准备一个新的名字,例如ntfsplus;然后在/usr/sbin目录下创建一个mount.ntfsplus文件:

1
2
#!/bin/sh
exec /usr/bin/mount -i -t ntfs "$@"

这样之后mount -t ntfsplus就会被新ntfs驱动接管。接下来配置Udisks2的/etc/udisks2/mount_options.conf驱动顺序就行了:

1
2
3
4
ntfs_drivers=ntfsplus,ntfs3,ntfs

ntfs:ntfsplus_defaults=uid=$UID,gid=$GID,windows_names,symlink=native
ntfs:ntfsplus_allow=uid=$UID,gid=$GID,umask,dmask,fmask,locale,norecover,ignore_case,windows_names,compression,nocompression,big_writes,symlink

实测这样配置的挂载选项可以完全正常生效,Udisks2在这一块留的接口还是挺灵活的。

结语

配完默认驱动之后就该收工了,之后该怎么用怎么用。没有存在感的驱动才是好驱动,如果驱动有存在感了,那八成是出问题了。
好好尝鲜就完事了~


Linux与NTFS的那些事
http://silvertuanzi.github.io/2026/07/02/linux-ntfs/
作者
silvertuanzi
发布于
2026年7月2日
许可协议