Mac 外接硬碟不顯示?exFAT 髒標記(dirty volume)與 fsck 修復

Mac 外接硬碟不顯示?exFAT 髒標記(dirty volume)與 fsck 修復

事情是這樣開始的

這顆 Transcend 2TB 外接硬碟平常在 Mac、Windows、Ubuntu 之間輪流使用,用了一段時間都沒問題。

某天在 Mac 上用完,可能因為趕時間,忘記按退出就直接拔掉了。當下其實有一點心虛,知道這樣不太對,但看起來也沒什麼異狀,就沒多想。

沒想到下次插回 MacBook,等了一下,桌面沒有出現硬碟圖示。打開 Finder,側欄也看不到。重新插拔幾次,還是沒反應。

那種感覺有點熟悉,就是上次沒有正確退出留下的後遺症。

診斷過程

Step 1:Mac 上的症狀

在 Mac 終端機跑 diskutil list,指令直接卡住不動,沒有任何輸出。

改用 fs_usage 觀察系統行為:

sudo fs_usage | grep -i disk

看到系統瘋狂對 /dev/rdisk4s1 發出大量 RdData 請求:

10:11:03    RdData[S]       /dev/rdisk4s1     0.001712 W com.apple.fs
10:11:03    RdData[S]       /dev/rdisk4s1     0.001698 W com.apple.fs
10:11:03    RdData[S]       /dev/rdisk4s1     0.005336 W com.apple.fs
...(每秒幾十筆,持續不斷)

這代表硬碟有被系統偵測到,但 macOS 嘗試掃描檔案系統時一直讀不到想要的資料,所以卡住。這是壞軌或檔案系統損壞的典型症狀。

之後 diskutil list 連外接硬碟都消失了,系統讀取失敗太多次後自動放棄。改用不會嘗試掛載的指令確認:

ls /dev/disk*

輸出:

...
/dev/disk4
/dev/disk4s1

確認硬碟還在,裝置為 disk4

Step 2:接到 Ubuntu 確認問題

把硬碟接到 Ubuntu,用 lsblk 確認:

lsblk | grep sdc
sdc           8:32   0   1.8T  0 disk
└─sdc1        8:33   0   1.8T  0 part /media/user/Transcend

Linux 成功掛載了,格式是 exFAT。接著看 kernel 訊息:

sudo dmesg | grep sdc | tail -20

最後一行出現關鍵訊息:

exFAT-fs (sdc1): Volume was not properly unmounted. Some data may be corrupt. Please run fsck.

原因找到了。上次沒有正常退出就拔掉硬碟,exFAT 檔案系統被標記為「髒」(dirty),Mac 看到這個標記就拒絕掛載。Linux 對這個標記比較寬鬆,所以還能掛載成功。


exfatprogs 是什麼?

exfatprogs 是 Linux 上用來管理 exFAT 檔案系統的工具包,由三星開發並開源,是目前 Linux 官方推薦的 exFAT 工具(取代舊版的 exfat-utils)。

Ubuntu 22.04 以上直接用 apt 安裝:

sudo apt install exfatprogs

安裝後包含兩個主要指令:

fsck.exfat:檢查與修復 exFAT 檔案系統

fsck.exfat /dev/sdX1          # 只檢查,不修復
fsck.exfat -r /dev/sdX1       # 自動修復
fsck.exfat -v /dev/sdX1       # 詳細輸出

mkfs.exfat:將磁碟格式化為 exFAT

sudo mkfs.exfat -L "MyDisk" /dev/sdX1    # -L 指定磁碟名稱

注意:使用前必須先 umount 卸載磁碟,否則會報錯。

為什麼要用 exFAT?

exFAT 是目前跨平台相容性最好的格式:

格式Mac 讀Mac 寫WindowsLinux
NTFS❌(需第三方)
HFS+❌(需第三方)
exFAT
FAT32✅(單檔限 4GB)

外接硬碟要在 Mac 和 Windows 之間共用,exFAT 是最省事的選擇。


修復步驟

第一次嘗試:fsck 但忘記 eject(失敗)

先安裝工具,卸載硬碟後跑 fsck:

sudo apt install exfatprogs
sudo umount /dev/sdc1
sudo fsck.exfat -v /dev/sdc1

第一次跑 -v(詳細輸出模式),指令卡住很久,等了一段時間後中斷。重新跑確認狀態:

sudo fsck.exfat -v /dev/sdc1
# exfatprogs version : 1.2.2
# label: Transcend
# (卡住)

中斷後直接把硬碟插回 Mac,結果還是看不到

問題出在兩個地方:第一次沒有用 -r 讓工具自動修復,第二是跑完之後沒有執行 eject 正確退出,導致硬碟帶著髒狀態被拔走。

第二次嘗試:加上 -r 並正確 eject(成功)

重新卸載,這次改用 -r(自動修復模式):

sudo umount /dev/sdc1
sudo fsck.exfat -r /dev/sdc1

輸出:

exfatprogs version : 1.2.2
/dev/sdc1: clean. directories 41649, files 329208

clean 確認修復成功,41649 個資料夾、329208 個檔案全部完整。

這次跑完後先正確退出再拔:

sudo eject /dev/sdc

插回 Mac,硬碟立刻出現在桌面。


結論

exFAT 硬碟沒有正常退出就拔掉,Mac 會因為髒標記拒絕掛載。用 Linux 的 fsck.exfat -r 修復並搭配 eject 正確退出,就能解決。

這次踩坑的關鍵教訓有兩點:fsck 要加 -r 才會真正修復,跑完之後也要記得 eject 讓系統正確寫入乾淨標記再拔,缺少任何一步都不會成功。

預防方式:拔硬碟前記得先退出。