NTFS
NTFS(新技术文件系统)是一个专有的,由微软公司开发的磁盘文件系统,用于Windows和基于Windows的操作系统。
在Linux中有两种常用的方法获取NTFS支持。Linux内核5.15通过新的NTFSv3驱动程序为NTFS文件系统提供了包括压缩在内的完全支持。还有一个更慢但是更稳定且经过时间检验的,名为NTFS-3G的驱动可以通过用户空间文件系统(FUSE)来使用。
安装
内核
在Linux内核5.15之前,主线内核中的旧NTFS驱动对NTFS的功能支持非常有限。内核配置信息将对其的支持描述为“部分支持,但是安全”。老驱动程序可以覆写已经存在的文件,但是不支持文件或文件夹新建、删除或者重命名。在Linux内核5.15发布时,有关旧NTFS的代码完全被Pargon公司的新内核内NTFS驱动程序,“NTFSv3”所取代。这个驱动程序具有完整的功能并且完全支持读写和文件系统压缩。
大多数NTFS用户将会对运行着早于5.15版内核的系统启用基于FUSE的NTFS-3G实现。
原生支持
对于Linux 5.15之后的内核,为了启用新的NTFSv3驱动程序,必须启用这些内核选项:
File systems ---> DOS/FAT/NT Filesystems ---> <*> NTFS Read-Write file system support Search for <code>CONFIG_NTFS3_FS</code> to find this item. <*> activate support of external compressions lzx/xpress Search for <code>CONFIG_NTFS3_LZX_XPRESS</code> to find this item.
NTFS-3G (FUSE实现)
为了使用基于FUSE的,具有读写能力的NTFS实现,以下内核选项必须被启用:
File systems --->
<*> FUSE (Filesystem in Userspace) support Search for <code>CONFIG_FUSE_FS</code> to find this item.
还必须安装sys-fs/ntfs3g包(参见下面的emerge章节)。
Emerge
NTFS-3G
下面的软件包仅在使用NTFS-3G时才是必须的。对于原生支持,它是不必要的!
因为NTFS-3G是一个基于FUSE的文件系统,用户空间工具是必须的。FUSE是用户空间文件系统的缩写,这意味着相对于内核空间的文件系统来说它有一些缺点,比如性能更差。
如果你遇到了“只读文件系统(read only filesystem)”的错误,你可能需要启用suid
USE标志。
USE flags for sys-fs/ntfs3g Open source read-write NTFS driver that runs under FUSE
+fuse
|
Enable ntfs-3g FUSE driver |
+mount-ntfs
|
Install mount.ntfs symlink |
+ntfsprogs
|
Enable ntfsprogs |
acl
|
Add support for Access Control Lists |
debug
|
Enable extra debug codepaths, like asserts and extra output. If you want to get meaningful backtraces see https://wiki.gentoo.org/wiki/Project:Quality_Assurance/Backtraces |
ntfsdecrypt
|
Build and install the ntfsdecrypt application. |
static-libs
|
Build static versions of dynamic libraries as well |
suid
|
Enable setuid root program(s) |
xattr
|
Add support for extended attributes (filesystem-stored metadata) |
在检查并按需调整USE标志之后,安装FUSE用户空间工具。这将会允许对NTFS文件系统进行操作:
root #
emerge --ask sys-fs/ntfs3g
使用
创建
mkfs.ntfs命令将会不可逆的损坏目标分区中的所有内容。在运行之前,请确认选择的是正确的分区!
为了在/dev/sda1分区中创建NTFS文件系统(需要ntfsprogs
USE标志):
root #
mkfs.ntfs /dev/sdyX
请将/dev/sdyX替换为你想要格式化的分区。
挂载
有多种方式挂载NTFS文件系统:
- mount - 手动挂载。
- /etc/fstab - 在启动时自动挂载。
- removable media - 按需自动挂载。
- AutoFS - 在访问时自动挂载。
原生支持
为了使用包含在Linux内核5.15或更高中的原生NTFS3驱动:
root #
mount -t ntfs3 /dev/设备 /到/挂载点的/路径
即使在
ntfs3
驱动已被加载时,mount /dev/设备 /到/挂载点的/路径也可能失败。一个可能的原因是ntfs3
并非预设于/etc/filesystems,而你可能想要这个预设。如果是这个情况,确保执行命令时带上了-t ntfs3
即可解决。FUSE (NTFS-3G)
使用ntfs3g包提供的,具有读写能力的驱动:
root #
mount -t ntfs-3g /dev/设备 /到/挂载点的/路径
BitLocker
参见:带有Windows 7/8的UEFI双启动项,BitLocker章节。
Linux dm-crypt已经对BitLocker和BitLocker to Go提供了原生支持,除了一些非常老的版本(比如Windows Vista所用的)。而且cryptsetup可以阅读BitLocker头bitlk
最重要的要求是Linux内核必须支持BitLocker所使用的加密算法。
对于有关dm-crypt的更多细节,请参阅这些手册:
cryptsetup (8)
,crypttab (5)
为了在Linux上使用被BitLocker加密的Windows文件系统,第一步是要获取这个卷的BitLocker恢复密钥。这是一个恢复密钥的例子:
00112233-4455-6677-8899-AABBCCDDEEFF.key
特定于卷UUID的BitLocker恢复密钥001122-334455-667788-990011-223344-556677-890123-456789
为了获取唯一的BitLocker恢复密钥,您可能需要联系微软的支持人员。在原文撰写时,这个支持页面描述了Windows 10和11的操作过程:找到您的BitLocker恢复密钥(英文)。
在Linux上,cryptsetup可以自动解密配置在/etc/crypttab中的卷。当使用systemd预设时,请参见sys-fs/cryptsetup设置来获取一个持久的设置(比如在开机时自动解密BitLocker)。
首先,将恢复密钥存储到一个文件上。一个方便的存储密钥的地方是/etc/cryptsetup-keys.d。如果Windows的BitLocker卷ID是上文中提到的00112233-4455-6677-8899-AABBCCDDEEFF
,你也许想要创建/etc/cryptsetup-keys.d/00112233-4455-6677-8899-AABBCCDDEEFF.key。
root #
mkdir /etc/cryptsetup-keys.d
root #
echo 001122-334455-667788-990011-223344-556677-890123-456789 > /etc/cryptsetup-keys.d/00112233-4455-6677-8899-AABBCCDDEEFF.key
与所有密钥一样,在更改这些密钥的访问权限时请极为小心。由于BitLocker密钥以明文存储,对密钥文件的访问应该被严格限制:
root #
chmod 444 /etc/cryptsetup-keys.d/*.*
然后,找到BitLocker分区标识符。可以使用Linux支持的任何方法,比如UUID
或者卷名(LABEL)
。下面的例子使用分区UUID,可以通过gdisk(也可以使用parted来替代)和lsblk:
root #
gdisk -l /dev/nvme0n1
GPT fdisk (gdisk) version 1.0.9 Partition table scan: MBR: protective BSD: not present APM: not present GPT: present Found valid GPT with protective MBR; using GPT. Disk /dev/nvme0n1: 3907029168 sectors, 1.8 TiB Model: SSD0000SSD2G Sector size (logical/physical): 512/512 bytes Disk identifier (GUID): FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF Partition table holds up to 128 entries Main partition table begins at sector 2 and ends at sector 33 First usable sector is 34, last usable sector is 3907029134 Partitions will be aligned on 2048-sector boundaries Total free space is 4205 sectors (2.1 MiB) Number Start (sector) End (sector) Size Code Name 1 2048 534527 260.0 MiB EF00 EFI system partition 2 534528 567295 16.0 MiB 0C01 Microsoft reserved 3 567296 3902930943 1.8 TiB 0700 Windows boot partition 4 3902932992 3907028991 2.0 GiB 2700 Windows RE
root #
lsblk -o +PARTUUID
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS PARTUUID nvme0n1 259:0 0 1,8T 0 disk ├─nvme0n1p1 259:1 0 260M 0 part 00000000-0000-0000-0000-000000000000 ├─nvme0n1p2 259:2 0 16M 0 part 00000000-1111-0000-0000-000000000000 ├─nvme0n1p3 259:3 0 1,8T 0 part 00112233-aabb-4455-ccdd-66778899eeff └─nvme0n1p4 259:4 0 2G 0 part 00000000-2222-0000-0000-000000000000
在上面的例子中,我们可以看见Windows使用第3分区(/dev/nvme0n1p3),并且该分区的UUID或者叫PARTUUID
是00112233-aabb-4455-ccdd-66778899eeff
。请注意这里的分区UUID和Windows BitLocker所给出的卷UUID并不相同。
然后,在/etc/crypttab中引用存储为纯文本格式的恢复密钥文件:
/etc/crypttab
配置crypttabwindows_bitlk PARTUUID=00112233-aabb-4455-ccdd-66778899eeff /etc/cryptsetup-keys.d/00112233-4455-6677-8899-AABBCCDDEEFF.key bitlk,discard,nofail
如果直接使用设备路径,比如
/dev/nvme0n1p3
而非使用分区UUID,比如PARTUUID=00112233-aabb-4455-ccdd-66778899eeff
,它也可以工作,但这样会有一些缺点,比如系统发生某些更改(比如更换了驱动器接口或者添加了驱动器)导致设备编号变更时(像是nvme0n1
变为了nvme1n1
),各种配置文件都需要被更新。并且,你可以为映射设备选择一个不同的名称,比如示例里的windows_bitlk
,以及包含BitLocker恢复密钥的文件的名称,例如,使用特定于其用途的名称(比如Windows-BitLocker-volume.key或者Additional-Data-Volume-BitLocker.key),而不是Windows分配的BitLocker UUID。确保将示例中的东西更改为你实际要在系统上使用的名称。对于/etc/crypttab,你可以添加/删除与连接相关的选项,比如nofail
选项将会阻止因为BitLocker卷因某些原因无法访问时导致的systemd启动错误。如果在没有设置该选项的情况下因为某些原因导致了BitLocker解密失败,系统启动将被终止,只会有对于systemd救援shell的访问。
为了自动挂载由BitLocker加密的NTFS分区,必须正确配置/etc/fstab。NTFS分区名必须与解密设置中的名称相同,比如/dev/mapper/windows_bitlk。这里是一个例子:
/etc/fstab
在fstab上使用NTFS BitLocker的例子/dev/mapper/windows_bitlk /mnt/windows ntfs3 noatime,discard,sys_immutable,showmeta,acl,hidden,hide_dot_files,nofail 0 0
在/etc/crypttab中,/etc/fstab里的nofail
选项也会防止在因为某些原因(也可能是NTFS分区变脏了时)导致BitLocker解密失败时为了不破坏NTFS分区而不去挂载它,同时使系统启动不会失败。
当你重启后Windows NTFS分区应该可以被解密和挂载。不过BitLocker分区也可以在一个正在运行的系统上解密而无需重启:
root #
cryptsetup open --type bitlk --allow-discards --key-file /etc/cryptsetup-keys.d/00112233-4455-6677-8899-AABBCCDDEEFF.key /dev/nvme0n1p3 windows_bitlk
root #
mount /mnt/windows
此后,对NTFS分区的所有操作都跟常规(未加密)的卷一样:
root #
umount /mnt/windows
root #
ntfsfix -n /dev/mapper/windows_bitlk
Mounting volume... OK Processing of $MFT and $MFTMirr completed successfully. Checking the alternate boot sector... OK NTFS volume version is 3.1. NTFS partition /dev/mapper/windows_bitlk was processed successfully.
故障排除
NTFS-3G
在Windows休眠后强制挂载NTFS分区
由Windows控制的NTFS文件系统可能为了加速系统启动而被休眠而不是真正的关闭。如果遇到了这种情况,除非删除hiberfil.sys文件,否则NTFS分区将不可能被挂载。以下命令可以用于强制挂载一个休眠状态中的分区,这将删除休眠文件;文件中的所有数据将会丢失。Windows必须通过一次干净的启动来恢复操作:
root #
mount -t ntfs-3g -o remove_hiberfile /到/设备的/路径 到/挂载点的/路径
在Windows系统下,为了防止不干净的关闭,可以在具有管理员权限的命令提示符(cmd)中运行powercfg /h off命令。这将禁用休眠,这很可能使Windows的启动时间变长,但好处是可以干净的卸载驱动器。
如果无法在Windows 10系统上获得管理员权限以防止休眠,可以尝试以下解决方法:
- 启动到Windows登陆屏幕
- 点击右下角的电源按钮,按住shift键并且点击重启
- 选择高级选项,然后重启进入UEFI固件设置。
- 当你进入UEFI固件后,选择Linux的启动入口点。
ntfsfix
有时,需要从Linux系统修复一个格式化为NTFS的分区。可以使用ntfsfix:
root #
ntfsfix /dev/nvme0n1p3
Mounting volume... $MFTMirr does not match $MFT (record 3). FAILED Attempting to correct errors... Processing $MFT and $MFTMirr... Reading $MFT... OK Reading $MFTMirr... OK Comparing $MFTMirr to $MFT... FAILED Correcting differences in $MFTMirr record 3...OK Processing of $MFT and $MFTMirr completed successfully. Setting required flags on partition... OK Going to empty the journal ($LogFile)... OK Checking the alternate boot sector... OK NTFS volume version is 3.1. NTFS partition /dev/nvme0n1p3 was processed successfully.
参见
- FAT — 文件系统 最初用于MS-DOS(和之后的,NT内核之前的Windows)。
- Dislocker — FUSE-based filesystem driver capable of reading NTFS BitLocker encrypted partitions.
- UEFI Dual boot with Windows 7/8 — describes how to dual boot Microsoft Windows on a UEFI computer.