NTFS

From Gentoo Wiki
Jump to:navigation Jump to:search
This page is a translated version of the page NTFS and the translation is 100% complete.
Other languages:
不要混淆 NFS.


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驱动程序,必须启用这些内核选项:

内核 启用新的NTFSv3驱动及其可选的压缩分区读取功能 (lxz/xpress) (CONFIG_NTFS3_FS, CONFIG_NTFS3_LZX_XPRESS)
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实现,以下内核选项必须被启用:

内核 启用基于FUSE的NTFS-3G (CONFIG_FUSE_FS)
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文件系统:

原生支持

为了使用包含在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或者叫PARTUUID00112233-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系统上获得管理员权限以防止休眠,可以尝试以下解决方法:
  1. 启动到Windows登陆屏幕
  2. 点击右下角的电源按钮,按住shift键并且点击重启
  3. 选择高级选项,然后重启进入UEFI固件设置。
  4. 当你进入UEFI固件后,选择Linux的启动入口点。
这应该强制Windows进行一次干净的关机,也就是为NTFS-3G启用干净的文件系统挂载。

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.

参见

外部资源

引用