大家好,我是冯哥的缓存。今天这篇我们来聊一下双系统用户最常见的一个需求:在Linux下读写Windows的硬盘。
💡提示:本文适用于双系统或多系统用户、希望在Linux上访问外接硬盘/U盘的用户,以及需要在Linux和Windows之间传数据的用户。
Windows默认用的是NTFS文件系统(C盘、D盘一般都是),U盘和SD卡常用exFAT。Linux本身的文件系统是ext4。
三个系统,三种格式,互相访问就需要"驱动支持":
文件系统 | Linux读 | Linux写 | Windows读 | Windows写 |
NTFS | ✅ 支持(ntfs-3g/内核驱动) | ✅ 支持(需ntfs-3g或内核5.15+) | ✅ 原生支持 | ✅ 原生支持 |
exFAT | ✅ 支持(内核5.4+内置) | ✅ 支持 | ✅ 原生支持 | ✅ 原生支持 |
ext4 | ✅ 原生支持 | ✅ 原生支持 | ❌ 需安装第三方软件 | ⚠️ 不稳定 |
💡提示: Ubuntu 22.04(内核5.15)开始,NTFS已有更稳定的内核驱动,读写速度比ntfs-3g更快。本文覆盖两种方式。
先确认磁盘情况
插上硬盘或U盘后,先看系统识别到了什么:
#查看所有磁盘和分区
lsblk -f
输出示例:
NAME | FSTYPE | LABEL | UUID | MOUNTPOINT |
sda | | | | |
sda1 | ntfs | Windows | XXXX-XXXX | |
sda2 | ntfs | Data | XXXX-XXXX | |
sdb | | | | |
sdb1 | exfat | USB | XXXX-XXXX | |
·NAME:设备名(sda1、sdb1等)
·FSTYPE:文件系统类型(ntfs / exfat / ext4)
·MOUNTPOINT:当前挂载点(空=未挂载,需要手动挂载)
#另一个常用命令,显示更多分区信息
sudo fdisk -l
#只看NTFS分区
lsblk -f | grep ntfs
一、NTFS 硬盘的读写
安装 NTFS 支持
Ubuntu 22.04 内核(5.15)已内置 ntfs3驱动,但建议同时安装 ntfs-3g(用户空间驱动,兼容性更好):
sudo apt install ntfs-3g
两种驱动对比:
对比项 | ntfs3(内核驱动) | ntfs-3g(用户空间驱动) |
读写速度 | ⭐⭐⭐⭐⭐更快(内核级) | ⭐⭐⭐较慢(FUSE层) |
稳定性 | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐更成熟 |
支持系统 | Ubuntu 22.04+ / 内核5.15+ | 所有较新Linux |
适用场景 | 日常高频读写 | 兼容性优先,老旧系统 |
故障恢复 | 一般 | ntfsfix工具支持更好 |
💡提示:如果你的 Ubuntu 是22.04 或更新版本,可以优先用内核 ntfs3 驱动。如果是 Ubuntu 20.04,用 ntfs-3g 更稳妥。另外部分发行版(如RHEL/Fedora)因许可证原因未开启ntfs3,需使用ntfs-3g。
方式一:临时挂载(命令行,立即生效)
#创建挂载点目录
sudomkdir -p /mnt/windows_d
#挂载(使用 ntfs-3g 驱动,推荐)
sudo mount -t ntfs-3g /dev/sda2 /mnt/windows_d
#或者使用内核 ntfs3 驱动(Ubuntu 22.04+,更快)
sudo mount -t ntfs3 /dev/sda2 /mnt/windows_d
#验证挂载成功
ls /mnt/windows_d
临时挂载在重启后会失效,需要重新执行。适合偶尔需要访问的场景。
方式二:开机自动挂载(写入 /etc/fstab)
步骤一:获取分区 UUID(比设备名更稳定,不受插槽顺序影响)
sudo blkid /dev/sda2
输出示例:
/dev/sda2: UUID="ABCD1234ABCD1234" TYPE="ntfs" PARTLABEL="Basic data partition"
步骤二:创建挂载点
sudo mkdir -p /mnt/windows_d
步骤三:编辑 fstab
sudo nano /etc/fstab
在文件末尾追加一行(使用 ntfs-3g 驱动):
UUID=ABCD1234ABCD1234/mnt/windows_dntfs-3gdefaults,uid=1000,gid=1000,dmask=022,fmask=13300
或使用内核 ntfs3 驱动(速度更快):
UUID=ABCD1234ABCD1234/mnt/windows_dntfs3defaults,uid=1000,gid=1000,dmask=022,fmask=13300
#也可以用’umask=022‘ 代替‘dmask=022,fmask=133‘
步骤四:验证 fstab 配置是否正确
#测试挂载(不重启)
sudo mount -a#如果报错,说明fstab配置有误,修正后再重启。
#查看挂载结果
df -h | grep windows_d
⚠️注意:/etc/fstab写错会导致系统无法启动!务必先用 sudo mount -a测试,确认没有报错再重启。如果 mount -a报错,立刻用 sudo nano /etc/fstab回去改正。
Windows 快速启动(Fast Startup)导致 NTFS 只读
这是双系统用户最常遇到的问题!
症状: NTFS 分区挂载后只能读,写入时报错 Read-only file system。
原因: Windows 的"快速启动"功能(Hibernate to disk)让系统处于类似于休眠,但只关闭用户会话而非彻底关机。NTFS 分区在"脏"状态下,Linux 只能以只读模式挂载,防止数据损坏。
现象 | 原因 |
mount报 Windows is hibernated | 快速启动开启,Windows 未完全关机 |
NTFS 以只读模式挂载 | Linux 保护机制,防止损坏睡眠状态的NTFS |
ntfsfix提示 volume dirty | 同上 |
解决方法(二选一):
方法A(推荐):在Windows里彻底关闭快速启动
在 Windows 中:控制面板 → 电源选项 → 选择电源按钮的功能 → 关闭"启用快速启动"
方法B(临时解除,不推荐长期用):
#强制挂载(有风险,仅偶尔使用)
sudo ntfsfix /dev/sda2
sudo mount -t ntfs-3g /dev/sda2 /mnt/windows_d
⚠️注意:如果 Windows 处于休眠状态,ntfsfix强制挂载可能导致Windows 下次启动后文件系统错误。强烈建议从根本上关闭快速启动。
NTFS 挂载参数说明
参数 | 含义 |
uid=1000 | 挂载后文件所属用户(用 id命令确认你的uid) |
gid=1000 | 挂载后文件所属用户组 |
dmask=022 | 目录权限掩码(目录权限=755) |
fmask=133 | 文件权限掩码(文件权限=644,不设可执行位) |
defaults | 读写权限、自动挂载等默认选项 |
nofail | 设备不存在时不报错(U盘、移动硬盘推荐加上) |
noatime | 不记录访问时间(提升性能) |
0 0 | 最后两个数字:不自动dump、不自动fsck |
💡提示:uid=1000是第一个普通用户的默认 uid。如果不确定,运行 id命令查看 uid=后面的数字。
二、exFAT 硬盘(U盘/SD卡)的读写
安装 exFAT 支持
Ubuntu 22.04 内核5.4+ 已内置 exFAT 驱动,一般直接就能用。但建议安装工具包:
sudo apt install exfat-fuse exfatprogs
💡提示:旧版 Ubuntu(20.04以前)需要安装 exfat-fuse + exfat-utils。Ubuntu 22.04 只需 exfatprogs。
临时挂载
#挂载exFAT 设备
sudomkdir -p /mnt/usb
sudo mount -t exfat /dev/sdb1 /mnt/usb
#或者让系统自动识别类型
sudo mount /dev/sdb1 /mnt/usb
开机自动挂载(可移除设备不推荐强制开机挂载)
对于U盘/移动硬盘,建议加nofail参数(设备不在时不阻止开机):
UUID=XXXX-XXXX/mnt/usbexfatdefaults,uid=1000,gid=1000,nofail00
三、图形界面自动挂载
如果不想手动挂载,Nautilus(GNOME文件管理器)会在插入设备时自动挂载,左侧出现设备图标,点击即可访问:
·挂载点路径:/media/用户名/卷标名/(如 /media/feng/Windows_D/)
·弹出(卸载):右键 → 弹出,或点击侧边栏图标旁的弹出按钮
对于双系统内置硬盘,Nautilus 也能识别,但需要注意 Windows 快速启动的问题(同上)。
四、格式化和文件系统建议
如果你有一块新硬盘或想重新格式化,该选哪种文件系统?
使用场景 | 推荐格式 | 理由 |
只在Linux内部使用 | ext4 | Linux原生,性能最好,支持日志 |
Linux + Windows 共享数据 | NTFS | Windows和Linux都能读写,支持大文件 |
U盘/SD卡(跨系统传文件) | exFAT | 最通用,Windows/Linux/macOS/电视/相机均支持 |
树莓派/嵌入式设备 | ext4 / FAT32 | FAT32兼容性最广,但单文件≤4GB |
格式化命令:
#格式化为NTFS
sudo mkfs.ntfs -f /dev/sdb1
#格式化为exFAT
sudo mkfs.exfat /dev/sdb1
#格式化为ext4
sudo mkfs.ext4 /dev/sdb1
⚠️注意:格式化会清空所有数据!务必确认设备名(lsblk)再执行,不要搞错 sda(系统盘)和 sdb(外接盘)!
五、Wine 游戏放在 NTFS 分区上能跑吗?
💡提示:这是之前评论区读者提到的问题,顺便在这里补充说明。
可以,但有一个权限问题:
NTFS 分区挂载后,所有文件都显示为 -rwxrwxrwx(全权限),但这是 NTFS 驱动"虚报"的——实际上 Linux 无法对 NTFS 文件单独设置执行权限。
对 Wine 的影响:
启动方式 | 是否受影响 |
wine /mnt/windows_d/game/game.exe(命令行) | ✅ 正常,Wine绕过Linux执行权限检查,直接读取NTFS文件 |
双击 .exe文件 | ⚠️可能失败,取决于文件管理器和桌面关联 |
通过 Lutris / Bottles 启动 | ✅ 正常,管理器绕过权限检查 |
建议:游戏放 NTFS 分区完全可行,使用命令行或 Lutris/Bottles 来管理和启动。如果游戏需要频繁写文件(存档、缓存),建议先测试写入是否正常(touch /mnt/windows_d/test.txt)。
常见报错速查
报错现象 | 原因 | 解决方法 |
mount: /mnt/xxx: can't read superblock | 文件系统损坏 | ntfsfix /dev/sdXX(NTFS)或 fsck.exfat /dev/sdXX(exFAT)。ntfsfix 只能修复部分简单问题,如果无效,需进入Windows运行 'chkdsk /f'。 |
Windows is hibernated, refused to mount | Windows未完全关机(快速启动) | 关闭Windows快速启动;临时用 ntfsfix |
Read-only file system | NTFS处于只读模式(快速启动或驱动问题) | 同上 |
mount: unknown filesystem type 'ntfs' | ntfs-3g未安装 | sudo apt install ntfs-3g |
mount: unknown filesystem type 'exfat' | exFAT驱动未安装 | sudo apt install exfat-fuse exfatprogs |
挂载后文件无法写入,权限被拒 | uid参数未设置 | fstab加 uid=1000,gid=1000 |
系统启动变慢/卡在启动画面 | fstab配置错误(设备不存在时卡死) | 加 nofail参数;或启动时按 e进grub临时修改 |
NTFS分区挂载为只读,ntfsfix无效 | 磁盘有坏块或分区表问题 | 进Windows运行 chkdsk /f修复后再挂载 |
快速挂载命令速查表
操作 | 命令 |
查看所有磁盘分区 | lsblk -f |
查看磁盘详情 | sudo fdisk -l |
获取分区UUID | sudo blkid /dev/sdXX |
创建挂载点 | sudo mkdir -p /mnt/目录名 |
挂载NTFS(ntfs-3g) | sudo mount -t ntfs-3g /dev/sdXX /mnt/目录名 |
挂载NTFS(内核驱动,22.04+) | sudo mount -t ntfs3 /dev/sdXX /mnt/目录名 |
挂载exFAT | sudo mount -t exfat /dev/sdXX /mnt/目录名 |
卸载分区 | sudo umount /mnt/目录名 |
测试fstab是否正确 | sudo mount -a |
NTFS修复工具 | sudo ntfsfix /dev/sdXX |
exFAT检查 | sudo fsck.exfat /dev/sdXX |
写入测试 | touch /mnt/目录名/test.txt |
实战练习
按顺序操作,完整走一遍NTFS挂载流程:
# 1. 插入U盘或外接硬盘,查看设备名
lsblk -f
# 2. 确认文件系统类型(NTFS/exFAT/ext4)
# 根据 lsblk -f 输出找到FSTYPE 列
# 3. 创建挂载点
sudomkdir -p /mnt/mydata
# 4. 临时挂载(把 sdb1 替换成你实际的设备名)
sudo mount -t ntfs-3g /dev/sdb1 /mnt/mydata
# 5. 验证挂载成功、可以读取
ls /mnt/mydata
df -h | grep mydata
# 6. 写入测试
ls -la#查看一下目录文件,确认读写权限,避免因快速启动导致测试失败困惑。
touch/mnt/mydata/test_linux.txt
ls/mnt/mydata/test_linux.txt
# 7. 获取UUID(准备写入fstab)
sudo blkid /dev/sdb1
# 8. (可选)卸载
sudo umount /mnt/mydata
小结
要点 | 说明 |
NTFS驱动 | Ubuntu 22.04+ 用内核ntfs3(快)或ntfs-3g(稳),二者均可 |
exFAT驱动 | Ubuntu 22.04内核内置,安装exfatprogs即可 |
临时挂载 | mount -t ntfs-3g /dev/sdXX /mnt/目录即可 |
永久挂载 | 写入 /etc/fstab,用UUID而不是设备名 |
最大坑 | Windows快速启动!关掉它,NTFS只读问题80%消失 |
移动设备fstab | 加 nofail参数,防止设备不在时卡死启动 |
下篇预告:我们讲Linux下高分屏的缩放问题——字太小看不清,该怎么设置。