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
配置crypttab
windows_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.