
最近兩周我至少收到四個類似消息新買的SSD插上去了系統(tǒng)里看不到盤或者掛載時報個沒見過英文錯直接卡在wrong fs type那里不知道怎么辦還有人在/etc/fstab里寫了一行結果重啟后愣是卡在emergency mode。這類問題我在工作里遇到過太多次其實Linux掛載硬盤這件事本身并不難難點在于大部分人上來就跳過“認盤”和“選文件系統(tǒng)”這兩步直接執(zhí)行mount一旦環(huán)境跟教程不一致就容易翻車。這篇內(nèi)容我就按自己平時處理服務器的習慣來寫從認盤開始到臨時掛載、開機自動掛載再到排查各種常見報錯最后補一個開發(fā)板和NFS場景。不管你是剛把第二塊硬盤塞進臺式機還是在機房給新機器接存儲照著這套路子走基本不會再瞎折騰。1. 掛載之前先認清硬盤1.1 lsblk和blkid兩個最常用的“透視鏡”拿到一塊沒有系統(tǒng)的新硬盤多數(shù)人第一反應是fdisk -l這個命令確實能看到設備但輸出信息非常啰嗦尤其當機器上插了好幾塊盤一堆扇區(qū)、磁頭、柱面參數(shù)看得人眼花。我更推薦先執(zhí)行l(wèi)sblk它的輸出是按樹形結構列出來的一眼就能看出誰是誰的分區(qū)誰還沒被分區(qū)。lsblk輸出大概長這樣NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 223.6G 0 disk ├─sda1 8:1 0 500M 0 part /boot/efi ├─sda2 8:2 0 222.7G 0 part / └─sda3 8:3 0 512M 0 part [SWAP] sdb 8:16 0 1.8T 0 disk注意看sdb下面沒有任何─子項MOUNTPOINT列也是空的這表示整塊盤還沒分區(qū)、沒格式化系統(tǒng)根本不知道該拿它怎么辦。這時候直接mount /dev/sdb1 /mnt肯定報錯因為/dev/sdb1還不存在。如果想看更詳細的文件系統(tǒng)信息用blkid。它會把每塊分區(qū)當前已經(jīng)寫好的文件系統(tǒng)類型、UUID都列出來blkid輸出類似/dev/sda2: UUIDa1b2c3d4... TYPEext4 PARTUUID... /dev/sdb: PTUUID... PTYPEgpt注意sdb那一行只有PTUUID、PTYPE沒有TYPE這同樣說明它還沒有文件系統(tǒng)。一旦你看到某塊盤帶了TYPEext4這類信息那就說明它曾經(jīng)被格式化過可以直接掛載。實操心得拿到自己不熟悉的機器先lsblk再blkid兩個命令一結合設備的“體檢報告”就出來了。別急著敲mount先花十秒鐘看清盤后面少踩一半的坑。1.2 分區(qū)表GPT還是MBR別再憑感覺分區(qū)表決定硬盤怎么組織分區(qū)。老的MBR最多支持4個主分區(qū)而且單分區(qū)容量超過2TB時會有各種別扭GPT沒有主分區(qū)數(shù)量限制也支持更大容量?,F(xiàn)在的新硬盤除非你有非常特殊的兼容性要求比如老主板純Legacy引導、某些老設備固件否則閉著眼睛選GPT就行。我見過有人在2TB以上的新盤上非要手動建MBR分區(qū)表結果建完只有不到2TB可用的尷尬場面。所以這里給個明確建議新盤、大容量盤2TB一律GPT老設備、老系統(tǒng)裝機引導保留MBR拿不準GPT優(yōu)先分區(qū)工具推薦gdisk或者parted操作風格不同但底層都是改分區(qū)表。以最常見的場景為例一塊全新的盤打算整塊盤分成一個區(qū)來用用parted可以這樣parted /dev/sdb mklabel gpt parted /dev/sdb mkpart primary ext4 0% 100%0% 100%意思是從頭到尾占滿整塊盤。如果你只想分一半做數(shù)據(jù)盤可以把后面改成0% 50%再補一條命令建第二個分區(qū)。這個百分比寫法比直接填扇區(qū)號友好太多我處理新盤時基本都用它。1.3 新盤收到之后的基本檢查流程收到一塊新盤別急著往機箱里塞我一般按下面的順序走一遍插上盤啟動系統(tǒng)后執(zhí)行l(wèi)sblk確認系統(tǒng)有沒有認到設備如果完全沒有優(yōu)先檢查供電和線纜。執(zhí)行dmesg | tail看看有沒有異常報錯。新盤通常會看到類似sdb: sdb1的信息如果看到I/O error基本可以斷定是盤本身或線材的問題。確認設備名后再確認分區(qū)表類型和分區(qū)情況。格式化、掛載一步步來。這個流程聽起來很基礎但真能省下不少排查時間。我遇到過好幾次“硬盤插上沒反應”的求助最后查下來是SATA線沒插緊或者供電線分叉沒插到位?!跋到y(tǒng)認不到盤”九成是硬件問題不是軟件問題別一開始就在軟件里折騰。2. 臨時掛載先跑通再談永久2.1 決定文件系統(tǒng)ext4、XFS、NTFS/exFAT怎么選掛載之前你得先讓盤上有文件系統(tǒng)也就是“格式化”。這塊盤將來要拿來做什么決定了你選什么格式場景推薦文件系統(tǒng)理由Linux系統(tǒng)盤、普通數(shù)據(jù)盤ext4兼容性最好老牌穩(wěn)定新手首選大文件存儲、數(shù)據(jù)庫備份XFS大文件讀寫性能好適合單文件大容量場景跨Windows/Linux雙系統(tǒng)讀寫NTFS或exFATWindows原生支持Linux要裝ntfs-3g移動硬盤、U盤exFAT跨平臺兼容好避免單文件4GB限制ext4我還是最推薦給第一次接觸Linux的用戶原因無他生態(tài)最成熟網(wǎng)上能查到的資料最多出了問題也好修。格式化命令mkfs.ext4 /dev/sdb1如果打算整塊盤不分區(qū)直接格式化也可以mkfs.ext4 /dev/sdb但不建議因為后續(xù)做分區(qū)調(diào)整會非常被動還是老老實實分一個區(qū)再格式化。2.2 mount的基本用法和常用參數(shù)格式化完成之后臨時掛載就簡單了mkdir -p /data mount /dev/sdb1 /data掛載的本質(zhì)是把一塊已經(jīng)格式化好的分區(qū)跟系統(tǒng)目錄樹里的某個目錄“連接”起來。這里有個必須理解的邏輯掛載點目錄必須是已經(jīng)存在的空目錄。如果目錄里原本有文件掛載之后這些文件會被“遮住”你看不到了但數(shù)據(jù)還在卸載之后又會重新出現(xiàn)。mount還有一些常用參數(shù)挑幾個最實用的說一下mount -o ro /dev/sdb1 /data # 只讀掛載適合排查盤的數(shù)據(jù)安全場景 mount -o noexec /dev/sdb1 /data # 禁止執(zhí)行二進制文件適合防病毒的場景 mount -o loop ubuntu.iso /mnt/iso # 掛載鏡像文件 mount --bind /data /srv/data # 目錄綁定不新建分區(qū)也能把目錄掛到別處--bind這個用法很多人不知道但它在服務遷移時極好用。比如某個服務寫死路徑/srv/data而你的真實數(shù)據(jù)在/data不用挪數(shù)據(jù)一條bind命令就搞定。2.3 umount卸不掉這說明有人在占用對應mount的是umountumount /data如果提示target is busy說明還有進程在訪問這個目錄。先執(zhí)行l(wèi)sof f -- /data或fuser -mv /data看清楚是誰占著再決定是停掉進程還是用強制卸載兜底。umount -l /data-l參數(shù)是lazy umount意思是立刻把這個掛載點從目錄樹里摘掉但等占用它的進程全部退出后才真正卸載底層設備。這個參數(shù)很適合生產(chǎn)環(huán)境你不能停掉正在寫數(shù)據(jù)的業(yè)務進程但你又確實需要卸載這塊盤去處理問題。用了-l之后目錄里的數(shù)據(jù)不會丟進程寫到一半的數(shù)據(jù)也會繼續(xù)完成寫入。踩過的坑很多人習慣cd到掛載目錄里再執(zhí)行umount結果永遠提示target is busy。因為當前shell的工作目錄還停留在掛載點里shell本身就是那個占用進程。先cd /再umount問題直接消失。3. 開機自動掛載fstab的正確打開方式3.1 fstab的六個字段逐行講清楚臨時掛載只能解決當下重啟之后系統(tǒng)不會自動恢復掛載關系所以要把掛載信息寫進/etc/fstab。這個文件每行有固定的六個字段我用一個例子來拆解UUIDxxxx-xxxx-xxxx /data ext4 defaults 0 2依次是設備標識推薦寫UUID不推薦寫/dev/sdb1掛載點一個不存在的目錄系統(tǒng)會先創(chuàng)建再掛載文件系統(tǒng)類型這里寫ext4掛載選項defaults代表rw, suid, dev, exec, auto, nouser, async的組合dump備份標記基本寫0現(xiàn)在很少人用dumpfsck檢查順序根分區(qū)寫1其他想開機自檢的分區(qū)寫2不想自檢寫0一個典型的數(shù)據(jù)盤示例UUIDabcdef00-1234-5678-9abc-def012345678 /data ext4 defaults,nofail 0 23.2 為什么推薦用UUID而不是/dev/sdX新手最喜歡照抄教程里的/dev/sdb1但這是最不該學的一種寫法。設備名不是固定的系統(tǒng)每次啟動時發(fā)現(xiàn)硬盤的順序不一樣很可能這次是/dev/sdb下次就變成/dev/sdc了。一旦設備名錯位fstab就會掛錯盤。UUID是格式化時隨機生成的一串唯一標識部分文件系統(tǒng)也可以手動指定它跟盤走的跟系統(tǒng)啟動順序無關。你把這盤插到另一臺機器上UUID還是同一個。獲取UUIDblkid /dev/sdb1復制那一長串UUID...里的內(nèi)容填到fstab里就行。如果有人問“我就一塊盤寫/dev/sdb1應該沒事吧”從概率上確實沒事但這習慣不好。哪天你把一塊新盤插上去原來的sdb變成了sdc系統(tǒng)起不來了那才是最疼的。UUID雖然長但一勞永逸。3.3 調(diào)優(yōu)選項noatime、nofail、uid/giddefaults能應付大部分場景但幾個實用選項值得記一下noatime不記錄文件的訪問時間。能減少大量寫I/O對SSD和機械盤的隨機讀都有明顯幫助。普通數(shù)據(jù)盤不是特殊審計需求建議加上。nofail如果掛載失敗比如外接硬盤沒插系統(tǒng)不會卡在emergency mode而是跳過并繼續(xù)啟動。外接盤、虛擬機共享盤強烈建議加。uid和gid只對FAT/NTFS這類沒有Unix權限概念的文件系統(tǒng)有效可以指定掛載后文件歸屬的用戶和用戶組。后面講NTFS時會再細說。舉個例子一個追求性能的本地數(shù)據(jù)盤可以這么寫UUIDxxxx /data ext4 noatime,nofail 0 2實操心得我維護的服務器里只要遇到外置USB硬盤或云盤冷備目錄nofail是必須加的。不加這個哪天設備沒插好整個機器開機直接進維護模式值班的人半夜就得爬起來處理。生產(chǎn)環(huán)境不要挑戰(zhàn)這種風險。3.4 驗證fstab別把系統(tǒng)整得開不了機改完fstab想驗證對不對不要重啟。先執(zhí)行mount -a-a會把fstab里所有還沒掛載的條目按配置掛一遍如果配置有問題這里當場就會報錯你還來得及改。如果沒報錯再執(zhí)行l(wèi)sblk確認掛載點生效。另一個穩(wěn)妥的驗證方式是findmnt /data它顯示的是當前系統(tǒng)對這個掛載點的真實解析結果。如果fstab寫得不對但手動掛載成功了findmnt會提示target is not mounted或是fstab與實測不一致。我還建議改文件之前先備份一下cp /etc/fstab /etc/fstab.bak一旦后面改壞了從單用戶模式或live CD里一條cp就能救回來。4. 典型故障報錯信息就是最好的線索4.1 “wrong fs type, bad option, bad superblock”到底在說什么掛載時報這串英文錯的人特別多mount: /data: wrong fs type, bad option, bad superblock on /dev/sdb1, missing codepage or helper program, or other error.這一長串其實是在說我在掛載點里找不到一個我能識別的文件系統(tǒng)。常見原因有幾種盤上根本沒有文件系統(tǒng)沒格式化或者文件系統(tǒng)已經(jīng)損壞。指定的掛載類型不對比如明明是ext4盤你寫成了-t xfs。缺少對應的文件系統(tǒng)驅(qū)動比如掛NTFS盤但沒裝ntfs-3g。排查辦法很簡單先blkid /dev/sdb1看它到底識別出的TYPE是什么再跟掛載命令里的-t對比。如果blkid顯示TYPEntfs那你需要先裝apt install ntfs-3g如果blkid沒有任何輸出大概率盤沒有有效的文件系統(tǒng)只能重新格式化。注意重新格式化會清空所有數(shù)據(jù)執(zhí)行之前務必確認盤上沒你想要的舊數(shù)據(jù)。4.2 明明是root為什么還是permission denied掛載成功了但cd /data進去讀取文件時提示permission denied。這要分兩種情況看如果掛載的是ext4/xfs這類原生Linux文件系統(tǒng)問題出在文件和目錄權限上。用ls -l /data看看屬主和權限位chown -R 你的用戶名:組名 /data改一下即可。如果掛載的是NTFS或exFAT問題不在常規(guī)權限而是這兩個文件系統(tǒng)沒有Unix的owner/group概念內(nèi)核默認把它們掛載成root擁有普通用戶自然進不去。解法是掛載時指定uid/gid。先id 你的用戶名查到uid和gid然后mount -t ntfs-3g -o uid1000,gid1000,umask022 /dev/sdb1 /dataumask022含義是創(chuàng)建出來的文件權限是644、目錄權限是755普通用戶既可以讀也擁有自己的文件。想徹底可寫可刪就把umask設成000——不推薦這樣所有用戶都能改任何文件雙系統(tǒng)共享盤上容易互相誤刪。4.3 開機進emergency mode大概率是fstab寫錯了系統(tǒng)重啟后沒有正常進桌面而是黑屏里出現(xiàn)一句類似You are in emergency mode. After logging in, type journalctl -xb ...第一反應不要慌九成是fstab有問題。先輸入root密碼進維護模式執(zhí)行mount -a它會明確告訴你哪一行出錯。常見錯誤包括UUID寫錯、掛載點不存在、文件系統(tǒng)類型不一致、盤沒插好。臨時把那行注釋掉行首加#再reboot就能先進系統(tǒng)然后再仔細修正配置。還有一種情況需要特別注意掛載點目錄本身不在根目錄里。如果我寫的是/mnt/data但忘記創(chuàng)建/mnt/data目錄fstab在實際掛載時會自動創(chuàng)建這個倒不用擔心。真正坑的是掛載點的父目錄被另一張盤掛載了導致啟動順序?qū)Σ簧线@種只能手動先掛父目錄再掛子目錄。4.4 外接NTFS盤只讀掛載和中文亂碼雙系統(tǒng)用戶最常遇到外接NTFS盤只能讀、不能寫。這往往是ntfs-3g沒裝或者是Windows開啟了快速啟動導致NTFS卷標處于“休眠”狀態(tài)Linux為了安全會以只讀方式掛載。先裝ntfs-3gapt update apt install -y ntfs-3g如果還是只讀進Windows關閉快速啟動或者在Linux上強制以讀寫方式掛載mount -t ntfs-3g -o remove_hiberfile /dev/sdb1 /dataremove_hiberfile會刪掉Windows的休眠鏡像文件相當于放棄之前休眠狀態(tài)之后盤就正??蓪懥?。已經(jīng)有舊內(nèi)核版本的ntfs驅(qū)動也可能造成亂碼問題但現(xiàn)代發(fā)行版默認UTF-8基本都能正常顯示中文文件名。5. 延伸把本地經(jīng)驗遷移到服務器和開發(fā)板5.1 掛載NFS網(wǎng)絡存儲掛了本地盤很多人下一個需求就是掛NAS。NFS是最常見的網(wǎng)絡文件共享協(xié)議Linux對NFS的支持幾乎是原生級別的。假設NAS的IP是192.168.1.10共享目錄是/volume1/media你想掛到本機/mnt/nasapt install nfs-common mkdir -p /mnt/nas mount -t nfs 192.168.1.10:/volume1/media /mnt/nas這時用df -h能看到一條網(wǎng)絡存儲的記錄。想要開機自動掛載寫進fstab192.168.1.10:/volume1/media /mnt/nas nfs defaults,noatime,nofail 0 0NFS掛載相比本地盤多了網(wǎng)絡延遲的變量如果NAS沒響應mount命令會卡很久。所以建議在mount參數(shù)里加soft和timeomount -t nfs -o soft,timeo50,retrans2 192.168.1.10:/volume1/media /mnt/nassoft表示網(wǎng)絡超時后放棄請求并報錯hard則會讓進程卡住重試。生產(chǎn)環(huán)境要數(shù)據(jù)不丟用hard自己家里玩玩用soft更不容易卡機。5.2 開發(fā)板掛載ubuntu主機的目錄這塊可能偏嵌入式但我覺得值得寫。開發(fā)板上磁盤空間緊張常常需要直接訪問Ubuntu主機上的交叉編譯工具鏈或代碼目錄。做法也不復雜在Ubuntu主機上裝NFS服務把需要共享的目錄export出去apt install nfs-kernel-server vim /etc/exports加一行/home/你用戶名/shared 192.168.1.0/24(rw,sync,no_subtree_check,no_root_squash)然后執(zhí)行exportfs -ra systemctl restart nfs-server開發(fā)板上再執(zhí)行mount命令掛過來效果等同于開發(fā)板直接操作主機上的目錄。編譯產(chǎn)物直接寫到主機磁盤開發(fā)板的eMMC或TF卡空間壓力會小很多。no_root_squash如果不需要建議去掉。root_squash會讓遠程root在本機自動降權為nobody這對安全性是保護。我自己在調(diào)試時圖方便加過no_root_squash后來發(fā)現(xiàn)一旦開發(fā)板被入侵攻擊者直接用root寫我主機文件想想都后怕。平時調(diào)代碼完全用不上這個選項默認配置就好。說到最后我還想提一條關于“掛載習慣”的建議不要因為掛載命令看起來簡單就跳過前面認盤的環(huán)節(jié)直接執(zhí)行。我見過太多翻車案例最后定位都是“掛載點寫錯”“忘了確認盤上有沒有文件系統(tǒng)”“fstab里用了不穩(wěn)定的設備名”。按我開頭說的流程走一遍認盤、分區(qū)、格式化、臨時掛載、寫fstab、mount -a驗證每一步都確認好了再往下走Linux掛硬盤這件事就能從“玄學”變成“肌肉記憶”。如果你手邊正好有塊閑置硬盤挑個不忙的晚上拿我這套流程練一遍之后遇到服務器加盤、開發(fā)板擴容、NAS掛載你會發(fā)現(xiàn)自己真的不再慌。