全流程:從識(shí)別磁盤(pán)到fstab永久掛載避坑指南)
剛裝好的Ubuntu服務(wù)器插上一塊新硬盤(pán)以為開(kāi)機(jī)就能在系統(tǒng)里看到結(jié)果進(jìn)終端敲命令一看什么也沒(méi)有。第一次上手“ubuntu系統(tǒng) 掛載 硬盤(pán)”這個(gè)操作的人十有八九會(huì)被這一下卡住不是找不到盤(pán)就是掛載完重啟之后“丟盤(pán)”或者分區(qū)表選錯(cuò)導(dǎo)致整塊盤(pán)都讀不出來(lái)。這篇文章我就圍繞這個(gè)話題把從識(shí)別磁盤(pán)、分區(qū)、格式化到臨時(shí)掛載、永久開(kāi)機(jī)掛載的完整流程完整講透順便把那些文檔里不會(huì)寫(xiě)、不看一眼根本想不明白的坑也翻出來(lái)聊一聊。適合剛接觸Linux運(yùn)維的新手也適合那些系統(tǒng)已經(jīng)裝好、平時(shí)只碰圖形界面、對(duì)磁盤(pán)管理還有點(diǎn)發(fā)怵的朋友。我個(gè)人做Linux運(yùn)維這幾年經(jīng)手“加掛數(shù)據(jù)盤(pán)”這個(gè)操作不下幾十次包含普通臺(tái)式機(jī)、服務(wù)器陣列盤(pán)、NVMe固態(tài)盤(pán)、USB外接移動(dòng)硬盤(pán)各種情況。不同的硬件、不同的場(chǎng)景步驟上有些微差異但核心思路是一致的。下面按照我實(shí)際操作的順序把每一步為什么這么做、命令該怎么敲、參數(shù)怎么取舍都拆開(kāi)講。1. 掛載前的核心準(zhǔn)備先認(rèn)清硬件與磁盤(pán)狀態(tài)1.1 動(dòng)手之前先確認(rèn)系統(tǒng)認(rèn)出了幾塊盤(pán)掛載硬盤(pán)最基礎(chǔ)也最容易被忽略的一步是先確認(rèn)系統(tǒng)到底有沒(méi)有識(shí)別出這塊新加的盤(pán)。很多新手上來(lái)就直接敲mount /dev/sdb1 /data結(jié)果整個(gè)終端都在報(bào)錯(cuò)最后發(fā)現(xiàn)系統(tǒng)里根本沒(méi)有/dev/sdb1這個(gè)設(shè)備節(jié)點(diǎn)。Linux下查看磁盤(pán)信息的命令有好幾個(gè)我最常用的是lsblk因?yàn)樗妮敵鲆谎劬湍芸炊?。它是“l(fā)ist block devices”的縮寫(xiě)會(huì)以樹(shù)狀結(jié)構(gòu)列出系統(tǒng)中所有的塊設(shè)備lsblk新插上一塊盤(pán)之后執(zhí)行這條命令你會(huì)在輸出里看到類(lèi)似這樣的內(nèi)容NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 238.5G 0 disk ├─sda1 8:1 0 512M 0 part /boot/efi ├─sda2 8:2 0 218.2G 0 part / └─sda3 8:3 0 19.8G 0 part [SWAP] sdb 8:16 0 931.5G 0 disk如果新增了一塊盤(pán)通常會(huì)以sdb、sdc這樣的名字出現(xiàn)。TYPE 列值為disk表示物理磁盤(pán)值為part表示這是磁盤(pán)上的分區(qū)。最右側(cè) MOUNTPOINT 列如果為空說(shuō)明這塊盤(pán)目前還沒(méi)掛載需要手動(dòng)處理如果有值說(shuō)明系統(tǒng)已經(jīng)在使用這個(gè)分區(qū)。除了lsblk還可以用fdisk -l查看更詳細(xì)的磁盤(pán)信息包括磁盤(pán)大小、扇區(qū)數(shù)、分區(qū)表類(lèi)型。不過(guò)fdisk -l的輸出稍微有點(diǎn)長(zhǎng)一般用來(lái)確認(rèn)分區(qū)表類(lèi)型和扇區(qū)信息。還有l(wèi)shw -class disk這類(lèi)命令能顯示更底層的硬件信息但我平時(shí)用得少能通過(guò)lsblk解決問(wèn)題就不需要繞彎子。注意如果插上的是NVMe固態(tài)盤(pán)設(shè)備名不是sdx而是類(lèi)似/dev/nvme0n1這樣。其中nvme0表示第0個(gè)NVMe控制器n1表示這個(gè)控制器上的第1個(gè)命名空間。使用習(xí)慣不同但邏輯一樣。1.2 設(shè)備節(jié)點(diǎn)命名規(guī)律為什么新盤(pán)是 sdb 而不是 sda了解Linux的設(shè)備命名規(guī)律對(duì)掛載操作有很大幫助也能減少誤操作。sda、sdb、sdc這種命名方式是內(nèi)核按照設(shè)備被發(fā)現(xiàn)和注冊(cè)的順序自動(dòng)分配的。這里的sd表示 SCSI 磁盤(pán)設(shè)備現(xiàn)在幾乎所有通過(guò)SATA、USB、SAS接口連接的盤(pán)在內(nèi)核里都會(huì)被映射為SCSI子系統(tǒng)管理所以都以sd開(kāi)頭。這意味著一個(gè)很實(shí)際的問(wèn)題如果你下次重插了某塊盤(pán)或者BIOS里改了啟動(dòng)順序設(shè)備名可能會(huì)發(fā)生漂移——原來(lái)叫/dev/sdb1的分區(qū)重新開(kāi)機(jī)后可能變成/dev/sdc1。所以在永久掛載配置里直接用設(shè)備名引用磁盤(pán)是不穩(wěn)妥的這個(gè)后面講UUID的時(shí)候還會(huì)深入聊。1.3 驗(yàn)證磁盤(pán)狀態(tài)新盤(pán)還是舊盤(pán)有沒(méi)有分區(qū)表一塊新硬盤(pán)出廠時(shí)是一張白紙既沒(méi)有分區(qū)表也沒(méi)有文件系統(tǒng)。而一塊二手盤(pán)或者挪過(guò)來(lái)的舊盤(pán)可能已經(jīng)有分區(qū)、有數(shù)據(jù)了。掛載之前如果不先確認(rèn)盤(pán)的狀態(tài)很容易把重要數(shù)據(jù)覆蓋掉。判斷方法很簡(jiǎn)單用lsblk看TYPE列如果整塊盤(pán)下面沒(méi)有任何分區(qū)直接只有一個(gè)disk說(shuō)明是空盤(pán)需要先分區(qū)再格式化。如果下面已經(jīng)出現(xiàn)了part子項(xiàng)說(shuō)明這塊盤(pán)以前被分過(guò)區(qū)要小心處理不要貿(mào)然格式化。需要檢查這塊盤(pán)有沒(méi)有被系統(tǒng)識(shí)別到但處于“離線”或異常狀態(tài)可以看內(nèi)核日志journalctl -k | grep sd或者用dmesg | grep sd。如果系統(tǒng)識(shí)別到新硬件這里會(huì)出現(xiàn)類(lèi)似sd 0:0:0:0: [sdb] 1953525168 512-byte logical blocks的信息。如果什么日志都沒(méi)有可能是物理連接問(wèn)題或者驅(qū)動(dòng)沒(méi)有加載這種情況就不是掛載命令能解決的了。2. 分區(qū)與格式化實(shí)操新盤(pán)如何變成可用的文件系統(tǒng)2.1 分區(qū)表選 MBR 還是 GPT這個(gè)選擇影響整塊盤(pán)的可用容量確認(rèn)系統(tǒng)識(shí)別到新盤(pán)之后下一步是對(duì)整塊裸盤(pán)進(jìn)行分區(qū)。分區(qū)表類(lèi)型的選擇是最關(guān)鍵的決策點(diǎn)之一它直接決定了這塊盤(pán)能用多大容量。Linux下有兩種主流的分區(qū)表格式MBR傳統(tǒng)主引導(dǎo)記錄和GPT全局唯一標(biāo)識(shí)分區(qū)表。MBR是幾十年前的老格式分區(qū)表只能記錄4個(gè)主分區(qū)而且最大只支持約2TB的磁盤(pán)容量。GPT則沒(méi)有這些限制最多支持128個(gè)分區(qū)容量上限大得多已經(jīng)是現(xiàn)代計(jì)算機(jī)的事實(shí)標(biāo)準(zhǔn)。我的建議非常簡(jiǎn)單直接2024年之后新做的分區(qū)一律用GPT。無(wú)論你的盤(pán)是500GB還是8TB無(wú)論你裝的是Ubuntu還是DebianGPT都是最穩(wěn)妥的選擇。不用糾結(jié)“老機(jī)器不兼容GPT”這種說(shuō)法——只要是支持UEFI啟動(dòng)的主板都能正常識(shí)別GPT分區(qū)。而那些還在用傳統(tǒng)BIOS的機(jī)器GPT在數(shù)據(jù)盤(pán)上同樣沒(méi)有問(wèn)題因?yàn)檫@里的分區(qū)表是給操作系統(tǒng)用的不屬于系統(tǒng)引導(dǎo)盤(pán)的場(chǎng)景。使用parted工具來(lái)操作分區(qū)表比f(wàn)disk的交互式界面直觀得多。先設(shè)置分區(qū)表格式為gptparted /dev/sdb mklabel gpt這里的/dev/sdb要替換為你自己機(jī)器上識(shí)別到的設(shè)備節(jié)點(diǎn)。執(zhí)行完之后可以用parted /dev/sdb print查看分區(qū)表信息確認(rèn)已經(jīng)變更為GPT。注意mklabel會(huì)清空分區(qū)表。如果這塊盤(pán)上有舊數(shù)據(jù)執(zhí)行前一定要確認(rèn)數(shù)據(jù)已經(jīng)備份這一步不可逆。2.2 如何規(guī)劃分區(qū)是給整塊盤(pán)一個(gè)分區(qū)還是拆開(kāi)多個(gè)分區(qū)表建好之后下一步是創(chuàng)建實(shí)際的分區(qū)。這里有個(gè)很現(xiàn)實(shí)的問(wèn)題給一塊數(shù)據(jù)盤(pán)是直接分一個(gè)分區(qū)占滿整個(gè)空間還是按需拆成多個(gè)分區(qū)我個(gè)人的經(jīng)驗(yàn)是對(duì)于個(gè)人電腦和工作站的數(shù)據(jù)盤(pán)直接一個(gè)分區(qū)占滿整塊盤(pán)簡(jiǎn)單高效維護(hù)成本最低。對(duì)服務(wù)器場(chǎng)景如果這塊盤(pán)要承擔(dān)不同的業(yè)務(wù)比如一個(gè)分區(qū)放數(shù)據(jù)庫(kù)一個(gè)分區(qū)放日志拆分才有意義。用parted創(chuàng)建分區(qū)的交互式操作如下parted /dev/sdb (parted) mkpart primary ext4 0% 100% (parted) align-check optimal 1 (parted) print (parted) quit其中mkpart primary ext4 0% 100%的含義是創(chuàng)建一個(gè)從磁盤(pán)開(kāi)頭到末尾的完整分區(qū)。primary表示主分區(qū)在GPT分區(qū)表下這個(gè)參數(shù)實(shí)際上沒(méi)有傳統(tǒng)MBR那樣嚴(yán)格的“主/擴(kuò)展/邏輯”區(qū)分但保留這個(gè)寫(xiě)法沒(méi)有壞處。ext4只是給分區(qū)打個(gè)標(biāo)簽告訴分區(qū)表這個(gè)分區(qū)預(yù)期的文件系統(tǒng)類(lèi)型實(shí)際的文件系統(tǒng)要在格式化時(shí)才真正寫(xiě)入。創(chuàng)建完分區(qū)后一個(gè)重要的驗(yàn)證步驟是用align-check optimal 1檢查分區(qū)是否對(duì)齊?,F(xiàn)代固態(tài)硬盤(pán)和機(jī)械硬盤(pán)都采用4K物理扇區(qū)如果分區(qū)起始位置沒(méi)有對(duì)齊到物理扇區(qū)邊界讀寫(xiě)性能會(huì)明顯下降。如果提示1 aligned就說(shuō)明對(duì)齊沒(méi)問(wèn)題。這個(gè)問(wèn)題在純圖形界面的磁盤(pán)工具里不會(huì)暴露但用命令行操作時(shí)值得順手檢查一遍。2.3 格式化文件系統(tǒng)mkfs 命令怎么選參數(shù)分區(qū)創(chuàng)建好之后系統(tǒng)還不知道這個(gè)分區(qū)里是什么文件系統(tǒng)所以需要格式化。格式化的本質(zhì)是在分區(qū)上寫(xiě)入文件系統(tǒng)元數(shù)據(jù)建立一套“目錄文件”的組織結(jié)構(gòu)這樣才能在里面存放數(shù)據(jù)。Linux下最常用的文件系統(tǒng)是ext4它穩(wěn)定、成熟、支持度高適合絕大多數(shù)應(yīng)用場(chǎng)景。創(chuàng)建ext4文件系統(tǒng)的命令是mkfs.ext4 /dev/sdb1如果希望在格式化時(shí)順帶給分區(qū)設(shè)置一個(gè)卷標(biāo)Label方便以后用lsblk一眼認(rèn)出來(lái)可以加-L參數(shù)mkfs.ext4 -L data_disk /dev/sdb1這里-L后面跟的名字建議使用有意義的標(biāo)識(shí)比如data、backup這種以后在圖形界面或者其他工具里看到卷標(biāo)就不會(huì)茫然。還有其他文件系統(tǒng)可以選擇XFS適合大文件順序讀寫(xiě)和并行IO場(chǎng)景很多企業(yè)級(jí)存儲(chǔ)和大數(shù)據(jù)平臺(tái)都在用。創(chuàng)建命令是mkfs.xfs /dev/sdb1。Btrfs面向未來(lái)設(shè)計(jì)的文件系統(tǒng)支持寫(xiě)時(shí)復(fù)制、快照、子卷等高級(jí)功能適合對(duì)數(shù)據(jù)管理有高要求的用戶(hù)。exFAT當(dāng)你想在Linux和Windows/macOS之間方便地移動(dòng)U盤(pán)或移動(dòng)硬盤(pán)時(shí)exFAT是好選擇。需要先安裝exfatprogs工具包然后用mkfs.exfat /dev/sdb1創(chuàng)建。選擇哪個(gè)文件系統(tǒng)沒(méi)有絕對(duì)的對(duì)錯(cuò)。我個(gè)人的原則是沒(méi)有特殊需求就用ext4追求大數(shù)據(jù)吞吐考慮XFS跨平臺(tái)場(chǎng)景用exFAT。不要為了追求新特性而盲目使用Btrfs除非你清楚它的工作原理并且已經(jīng)做完數(shù)據(jù)備份策略。2.4 用 blkid 和 UUID 記住每塊分區(qū)的“身份證號(hào)”格式化完成之后可以用blkid查看分區(qū)的UUID和文件系統(tǒng)類(lèi)型blkid /dev/sdb1輸出類(lèi)似/dev/sdb1: UUID3a8f19e7-2b7e-4a54-b7d2-7373ef4b7b0e TYPEext4 PARTLABELprimary PARTUUIDc7d2a13e-1b46-47c9-b8a1-e6a25b1d3b2e這里的UUID是文件系統(tǒng)在被格式化時(shí)隨機(jī)生成的唯一標(biāo)識(shí)符。它跟設(shè)備名不同設(shè)備名是內(nèi)核按識(shí)別順序動(dòng)態(tài)分配的換個(gè)啟動(dòng)順序就可能變UUID在文件系統(tǒng)創(chuàng)建時(shí)生成除非重新格式化否則基本上終身不變。這就是為什么永久掛載配置/etc/fstab里建議用UUID來(lái)引用分區(qū)而不是用/dev/sdb1。后面配置的時(shí)候會(huì)再詳細(xì)說(shuō)。3. mount 掛載與測(cè)試從命令到文件的完整過(guò)程3.1 理解掛載的本質(zhì)把文件系統(tǒng)接入目錄樹(shù)的“接線”操作掛載這個(gè)詞很多人第一次聽(tīng)到覺(jué)得玄乎。用一句話解釋掛載就是把一塊格式化好的存儲(chǔ)空間接入到系統(tǒng)已經(jīng)存在的目錄樹(shù)的某個(gè)位置上。在你指定的目錄里你會(huì)看到這塊盤(pán)上的文件內(nèi)容把它們當(dāng)作普通目錄文件來(lái)讀寫(xiě)底層實(shí)際寫(xiě)入的是這塊物理盤(pán)。這個(gè)待接入的目錄叫“掛載點(diǎn)”mount point。Linux系統(tǒng)有一個(gè)根目錄/整個(gè)系統(tǒng)所有掛載點(diǎn)都在這個(gè)目錄樹(shù)之下。比如/data是根分區(qū)下一個(gè)普通目錄如果把/dev/sdb1掛載到/data那么所有寫(xiě)入/data的內(nèi)容都會(huì)落到/dev/sdb1這塊硬盤(pán)上。這樣設(shè)計(jì)的好處是操作系統(tǒng)無(wú)需關(guān)心文件在哪個(gè)物理設(shè)備上只要路徑對(duì)就可以直接訪問(wèn)。也是為什么Linux不像Windows那樣給每塊硬盤(pán)分配一個(gè)“盤(pán)符”的原因——統(tǒng)一目錄樹(shù)的思想貫穿始終。3.2 選擇合適的掛載點(diǎn)目錄不要隨手掛到 /mnt 下掛載點(diǎn)的選擇要注意幾點(diǎn)。系統(tǒng)已存在的目錄可以直接作為掛載點(diǎn)但更常見(jiàn)的做法是專(zhuān)門(mén)創(chuàng)建一個(gè)新目錄比如mkdir -p /data這個(gè)目錄創(chuàng)建在根分區(qū)上占用根分區(qū)的少量空間但它只是一個(gè)“門(mén)洞”真正的內(nèi)容都在掛載的分區(qū)上。掛載之后/data目錄原有的內(nèi)容會(huì)被隱藏掉直到卸載之后才會(huì)重新出現(xiàn)。所以不要在一個(gè)有數(shù)據(jù)的目錄上直接掛載新盤(pán)否則數(shù)據(jù)會(huì)被“遮住”讓人誤以為丟了。有些人習(xí)慣把數(shù)據(jù)盤(pán)掛在/mnt下。/mnt是系統(tǒng)默認(rèn)的臨時(shí)掛載點(diǎn)很多自動(dòng)腳本會(huì)在這里活動(dòng)把個(gè)人數(shù)據(jù)盤(pán)掛在/mnt下面既不規(guī)范也容易引起沖突。建議按用途創(chuàng)建有意義的頂層目錄比如/data、/home如果你想把home放到獨(dú)立盤(pán)的話、/srv等。規(guī)范一點(diǎn)的服務(wù)器環(huán)境還會(huì)采用/data0、/data1這種多數(shù)據(jù)盤(pán)的命名方式。3.3 臨時(shí)掛載與卸載操作mount 與 umount 的參數(shù)細(xì)節(jié)掛載命令的標(biāo)準(zhǔn)格式是mount [選項(xiàng)] 設(shè)備 掛載點(diǎn)執(zhí)行臨時(shí)掛載mount /dev/sdb1 /data這條命令不指定文件系統(tǒng)類(lèi)型時(shí)系統(tǒng)會(huì)自動(dòng)檢測(cè)分區(qū)的文件系統(tǒng)通過(guò)blkid和內(nèi)核識(shí)別絕大多數(shù)ext4場(chǎng)景下可以省略-t ext4參數(shù)。掛載后驗(yàn)證是否成功最直接的方式是用df -hTdf -hT | grep datadf是“disk free”的縮寫(xiě)-h表示人類(lèi)可讀的容量單位G、T-T表示顯示文件系統(tǒng)類(lèi)型??吹筋?lèi)似下面的輸出說(shuō)明掛載成功了/dev/sdb1 ext4 932G 5.0G 879G 1% /data此時(shí)向/data寫(xiě)入任意文件都會(huì)實(shí)際寫(xiě)入到/dev/sdb1這塊盤(pán)。卸載操作是umountumount /data這里有個(gè)新手經(jīng)常碰到的坑卸載時(shí)提示target is busy。原因一定是有進(jìn)程正在使用掛載點(diǎn)下的文件比如某個(gè)終端當(dāng)前工作目錄在這個(gè)掛載點(diǎn)里或者是某個(gè)服務(wù)正在寫(xiě)文件。排查方法是用lsof D /data或者fuser -vm /data找出占用進(jìn)程等進(jìn)程結(jié)束后再卸載。3.4 掛載參數(shù)怎么加noatime、discard、nosuid 這些到底要不要寫(xiě)mount命令支持多個(gè)掛載參數(shù)用-o指定多個(gè)參數(shù)用逗號(hào)分隔。下面這幾個(gè)是我在實(shí)際操作中經(jīng)常用到且值得關(guān)注的核心參數(shù)。noatimeLinux默認(rèn)會(huì)記錄文件被訪問(wèn)的時(shí)間atime。對(duì)絕大多數(shù)應(yīng)用來(lái)說(shuō)訪問(wèn)時(shí)間沒(méi)有實(shí)用價(jià)值每次讀文件都要更新這個(gè)時(shí)間戳?xí)?lái)無(wú)謂的磁盤(pán)寫(xiě)入。加上noatime可以明顯減少小文件讀寫(xiě)的磁盤(pán)IO。做數(shù)據(jù)庫(kù)、Web服務(wù)、文件存儲(chǔ)的機(jī)器這個(gè)參數(shù)幾乎必加。discard這個(gè)參數(shù)對(duì)SSD有意義。掛載時(shí)額外輸入discard再刪除大量文件時(shí)文件系統(tǒng)會(huì)通過(guò)TRIM指令通知SSD哪些塊可以清理幫助保持長(zhǎng)期寫(xiě)入性能。但需要注意TRIM是異步還是同步執(zhí)行跟硬件和文件系統(tǒng)有關(guān)同步TRIM可能在某些型號(hào)的SSD上造成延遲。現(xiàn)在很多SSD固件已經(jīng)支持排隊(duì)TRIM使用ext4也不用過(guò)度擔(dān)心。如果你拿不準(zhǔn)可以先不加用fstrim定期手動(dòng)TRIM也是一種常見(jiàn)做法。采用defaults掛載時(shí)不會(huì)自動(dòng)包含這個(gè)參數(shù)。nosuid掛載點(diǎn)為普通數(shù)據(jù)目錄時(shí)加上nosuid可以防止在掛載的分區(qū)上執(zhí)行setuid程序這是一種基本的安全加固。平時(shí)用discretion并不大但服務(wù)器環(huán)境建議加上。noexec與nosuid類(lèi)似禁止掛載點(diǎn)下的文件直接執(zhí)行。這兩個(gè)參數(shù)對(duì)防惡意上傳文件有一定的防護(hù)意義普通家用環(huán)境看需求加。舉個(gè)例子一段考慮了參數(shù)優(yōu)化的掛載命令mount -o rw,noatime,nosuid /dev/sdb1 /data4. 永久掛載配置讓系統(tǒng)重啟后自動(dòng)掛載的 fstab 詳解4.1 臨時(shí)掛載的問(wèn)題重啟之后一切歸零使用mount命令的掛載是臨時(shí)性的。系統(tǒng)重啟后內(nèi)核重新初始化塊設(shè)備mount命令注入的掛載關(guān)系會(huì)全部消失那塊盤(pán)會(huì)變回“未掛載”狀態(tài)。之前辛辛苦苦配置好的數(shù)據(jù)目錄重啟后里面就空了。要讓系統(tǒng)每次開(kāi)機(jī)都自動(dòng)掛載指定分區(qū)需要修改系統(tǒng)掛載配置文件/etc/fstab。fstab 是file systems table的縮寫(xiě)系統(tǒng)在啟動(dòng)過(guò)程中會(huì)讀取這個(gè)文件按照其中規(guī)則逐條掛載所有需要自動(dòng)掛載的分區(qū)。直接編輯 fstab 之前務(wù)必先備份cp /etc/fstab /etc/fstab.bak這個(gè)習(xí)慣在我處理系統(tǒng)配置文件時(shí)幾乎形成肌肉記憶了一次備份能讓你犯錯(cuò)時(shí)少一晚上失眠。4.2 fstab 六列含義逐個(gè)拆解/etc/fstab中每一行描述一個(gè)掛載項(xiàng)總共6列用空格或Tab分隔。以最常見(jiàn)的寫(xiě)法為例UUID3a8f19e7-2b7e-4a54-b7d2-7373ef4b7b0e /data ext4 defaults,noatime 0 2下面每一列的具體含義列號(hào)字段含義示例1設(shè)備標(biāo)識(shí)要掛載的分區(qū)引用方式UUIDxxx或/dev/sdb12掛載點(diǎn)分區(qū)接入目錄樹(shù)的位置/data3文件系統(tǒng)類(lèi)型ext4、xfs、exfat等ext44掛載參數(shù)多個(gè)參數(shù)逗號(hào)分隔defaults,noatime5是否dump備份0表示不備份1表示備份06fsck檢查順序根分區(qū)為1其他分區(qū)為20表示不檢查2第5列和第6列很多人會(huì)寫(xiě)成0 0對(duì)數(shù)據(jù)盤(pán)來(lái)說(shuō)通常沒(méi)問(wèn)題。但第6列如果填2系統(tǒng)開(kāi)機(jī)時(shí)會(huì)按順序?qū)Ψ謪^(qū)做文件系統(tǒng)檢查如果填0則開(kāi)機(jī)不會(huì)檢查。個(gè)人數(shù)據(jù)盤(pán)填2是比較穩(wěn)妥的做法萬(wàn)一文件系統(tǒng)有損壞開(kāi)機(jī)自檢能提前發(fā)現(xiàn)。掛載參數(shù)列defaults是系統(tǒng)默認(rèn)參數(shù)集合包括 rw、suid、dev、exec、auto、nouser、async。如果你沒(méi)有特別需要直接寫(xiě)defaults即可。在defaults的基礎(chǔ)上追加noatime的實(shí)際寫(xiě)法是defaults,noatime中間沒(méi)有空格。4.3 用UUID還是設(shè)備名為什么我堅(jiān)決推薦UUIDfstab第一列寫(xiě)成/dev/sdb1不是不能用但前面提過(guò)設(shè)備名有漂移風(fēng)險(xiǎn)。舉個(gè)例子某機(jī)器有兩塊盤(pán)sda和sdb某次開(kāi)機(jī)時(shí)BIOS識(shí)別順序變了原來(lái)在sdb上的數(shù)據(jù)盤(pán)變成了sda原來(lái)系統(tǒng)盤(pán)變成了sdb如果你的fstab寫(xiě)的是/dev/sdb1啟動(dòng)時(shí)系統(tǒng)可能就把系統(tǒng)盤(pán)掛到/data上了——輕則目錄內(nèi)容錯(cuò)亂重則系統(tǒng)起不來(lái)。而UUID是文件系統(tǒng)創(chuàng)建時(shí)生成的隨機(jī)標(biāo)識(shí)不依賴(lài)設(shè)備名不會(huì)因?yàn)楸P(pán)序變化而改變。所以fstab第一列優(yōu)先用UUID形式這是我給所有生產(chǎn)環(huán)境配置掛載時(shí)堅(jiān)持的原則。獲取UUID的方式前面已經(jīng)演示過(guò)blkid還有一種方式是lsblk -f輸出更直觀會(huì)直接把文件系統(tǒng)類(lèi)型和UUID列在分區(qū)旁邊。4.4 配置完成后的驗(yàn)證流程mount -a 與重啟前的自查fstab 寫(xiě)完之后千萬(wàn)不能直接重啟。這個(gè)文件如果有語(yǔ)法錯(cuò)誤或設(shè)備引用錯(cuò)誤系統(tǒng)開(kāi)機(jī)時(shí)可能卡在緊急模式emergency mode到時(shí)只能通過(guò)維護(hù)模式修復(fù)很麻煩。正確的驗(yàn)證流程分三步第一步執(zhí)行mount -a讓系統(tǒng)按照f(shuō)stab重新掛載所有條目。如果沒(méi)有任何輸出說(shuō)明語(yǔ)法和掛載本身沒(méi)有報(bào)錯(cuò)mount -a這里-a表示mount all讀/etc/fstab中的所有條目嘗試掛載。第二步用df -hT確認(rèn)新掛載的分區(qū)已經(jīng)在目錄樹(shù)中df -hT | grep data第三步如果條件允許直接重啟一次確認(rèn)開(kāi)機(jī)后分區(qū)自動(dòng)掛載成功。這一步雖然耗時(shí)但能徹底消除“開(kāi)機(jī)掛載失敗”的隱患。我在生產(chǎn)環(huán)境配置新盤(pán)之后都會(huì)執(zhí)行一次避免第二天客戶(hù)打電話說(shuō)數(shù)據(jù)目錄是空的。5. 常見(jiàn)問(wèn)題與排查技巧實(shí)錄掛載失敗的跨國(guó)流程一覽5.1 開(kāi)機(jī)卡在緊急模式誰(shuí)動(dòng)了我的 /etc/fstabfstab 配置若出錯(cuò)最典型的癥狀是開(kāi)機(jī)時(shí)系統(tǒng)提示無(wú)法掛載某個(gè)文件系統(tǒng)進(jìn)入 emergency mode。屏幕上會(huì)有類(lèi)似You are in emergency mode或者Press Enter for maintenance的提示。出現(xiàn)這種情況不要慌修復(fù)流程是這樣的進(jìn)入維護(hù)模式后系統(tǒng)文件系統(tǒng)通常還是只讀狀態(tài)。先執(zhí)行mount -o remount,rw /讓根分區(qū)以可寫(xiě)方式重新掛載然后查看fstab里哪一行寫(xiě)錯(cuò)了grep -v ^# /etc/fstab定位到問(wèn)題行后用blkid核對(duì)正確的UUID修改fstab最后用mount -a驗(yàn)證。確認(rèn)無(wú)誤后執(zhí)行reboot重新啟動(dòng)。這個(gè)問(wèn)題的根源絕大多數(shù)情況下是fstab里設(shè)備名或UUID寫(xiě)錯(cuò)或者標(biāo)點(diǎn)符號(hào)不對(duì)比如漏了分隔符。之前備份的/etc/fstab.bak此刻就能派上大用場(chǎng)不確定怎么改就直接恢復(fù)備份cp /etc/fstab.bak /etc/fstab5.2 掛載后目錄權(quán)限不對(duì)只能看不能寫(xiě)的問(wèn)題排查掛載成功后往目錄里寫(xiě)入文件有時(shí)候會(huì)收到Permission denied的報(bào)錯(cuò)。這個(gè)問(wèn)題在新手身上出現(xiàn)頻率非常高很多時(shí)候不是掛載命令的問(wèn)題而是文件系統(tǒng)的屬主和權(quán)限問(wèn)題。新格式化的ext4文件系統(tǒng)默認(rèn)root擁有且權(quán)限為rwxr-xr-x普通用戶(hù)只能讀和執(zhí)行不能創(chuàng)建文件。解決辦法就是給目標(biāo)用戶(hù)或用戶(hù)組授權(quán)chown -R 用戶(hù)名:用戶(hù)組 /data chmod -R 755 /data如果掛了多個(gè)用戶(hù)的共享盤(pán)不想用chown改變屬主可以改用掛載參數(shù)uid和gid直接指定掛載后的文件屬主這在掛載exFAT、NTFS這類(lèi)不帶原生Unix權(quán)限的Windows文件系統(tǒng)時(shí)尤其好用。比如mount -o uid1000,gid1000 /dev/sdb1 /data5.3 突然掛載不上分區(qū)被別人占用了怎么辦有時(shí)執(zhí)行mount會(huì)報(bào)錯(cuò)mount point is busy或者device is busy。原因無(wú)非是掛載點(diǎn)正被某個(gè)進(jìn)程占用或者設(shè)備已經(jīng)被其他掛載點(diǎn)使用。先用mount | grep sdb1看這個(gè)分區(qū)是否已經(jīng)被掛載到別處再用lsof D /data排查是誰(shuí)占用。如果是掛載點(diǎn)目錄被占用而不是設(shè)備被占用卸載時(shí)也會(huì)遇到同樣的提示解決方式是用umount -l強(qiáng)制卸載注意這個(gè)操作可能造成數(shù)據(jù)尚未落盤(pán)寫(xiě)入不推薦在有大量寫(xiě)操作的場(chǎng)景下使用。5.4 exFAT/NTFS 移動(dòng)硬盤(pán)掛載跨平臺(tái)文件系統(tǒng)亂碼或權(quán)限異常把U盤(pán)或移動(dòng)硬盤(pán)插到Ubuntu上有時(shí)能自動(dòng)掛載有時(shí)不行或者掛載后中文文件名變成亂碼。這通常是因?yàn)橄到y(tǒng)缺了對(duì)應(yīng)的文件系統(tǒng)驅(qū)動(dòng)。exFAT需要裝exfatprogsNTFS需要裝ntfs-3gsudo apt update sudo apt install exfatprogs ntfs-3g裝好之后手動(dòng)掛載即可。NTFS移動(dòng)硬盤(pán)在Linux下掛載默認(rèn)權(quán)限比較寬松適合讀取拷貝。但如果要向NTFS盤(pán)寫(xiě)入大量小文件建議使用big_writes參數(shù)提升寫(xiě)性能需要在掛載參數(shù)里加big_writes。mount -o big_writes /dev/sdb1 /mnt/usb這個(gè)參數(shù)是否有效也取決于ntfs-3g版本新版本默認(rèn)行為有所優(yōu)化但加上無(wú)妨。5.5 熱插拔 SATA 硬盤(pán)不識(shí)別硬件的鍋還是系統(tǒng)的鍋機(jī)箱支持熱插拔的SATA硬盤(pán)插入后系統(tǒng)有時(shí)不會(huì)自動(dòng)識(shí)別。先確認(rèn)主板BIOS里SATA模式是否設(shè)置為AHCI而不是IDE兼容模式。AHCI模式下才支持熱插拔。系統(tǒng)側(cè)可以執(zhí)行echo - - - /sys/class/scsi_host/host0/scan強(qiáng)制掃描或者用udevadm trigger觸發(fā)重新識(shí)別sudo udevadm trigger如果掃描之后還是看不到就換數(shù)據(jù)線、換板載接口排查硬件問(wèn)題。我遇到過(guò)客服咨詢(xún)說(shuō)“怎么掛載都不識(shí)別”的情況結(jié)果最后發(fā)現(xiàn)是新盤(pán)沒(méi)通電SATA供電線松了——這種操作層面的失誤排查優(yōu)先級(jí)應(yīng)該放在最開(kāi)始。6. 一套標(biāo)準(zhǔn)操作流程從新盤(pán)到開(kāi)機(jī)自動(dòng)掛載的全流程腳本前面把每一步的原理和細(xì)節(jié)都掰開(kāi)講過(guò)了這里我把整個(gè)流程串起來(lái)給出一份可以直接照著敲的完整流程方便大家作為一個(gè)模板來(lái)復(fù)制使用。# 1. 查看系統(tǒng)里的磁盤(pán) lsblk # 2. 確定設(shè)備節(jié)點(diǎn)比如 /dev/sdb建GPT分區(qū)表 sudo parted /dev/sdb mklabel gpt # 3. 創(chuàng)建占滿全盤(pán)的唯一分區(qū) sudo parted /dev/sdb mkpart primary ext4 0% 100% # 4. 分區(qū)對(duì)齊檢查 sudo parted /dev/sdb align-check optimal 1 # 5. 格式化文件系統(tǒng)ext4 sudo mkfs.ext4 -L data_disk /dev/sdb1 # 6. 獲取UUID sudo blkid /dev/sdb1 # 7. 創(chuàng)建掛載點(diǎn) sudo mkdir -p /data # 8. 臨時(shí)掛載 sudo mount /dev/sdb1 /data # 9. 驗(yàn)證掛載 df -hT # 10. 備份fstab sudo cp /etc/fstab /etc/fstab.bak # 11. 把掛載信息寫(xiě)入fstab注意UUID換成實(shí)際值 echo UUID你的UUID /data ext4 defaults,noatime 0 2 | sudo tee -a /etc/fstab # 12. 驗(yàn)證fstab sudo mount -a執(zhí)行到第12步?jīng)]有報(bào)錯(cuò)再結(jié)合df -hT和一次重啟驗(yàn)證整個(gè)掛載流程就收尾了。很多線上文檔講到第8步就結(jié)束忽悠人以為臨時(shí)掛載完就算完事不寫(xiě)fstab重啟之后盤(pán)又消失這就是很多人“掛載硬盤(pán)存數(shù)據(jù)存著存著盤(pán)沒(méi)了”的真相。我在實(shí)際工作里會(huì)把第6步的UUID先寫(xiě)在小本本上或者直接復(fù)制到fstab那一條里因?yàn)樵谡麄€(gè)流程里最容易出錯(cuò)的就是UUID復(fù)制不全或者格式寫(xiě)錯(cuò)。fstab里UUID格式是UUID一串字符中間不要有引號(hào)不要有多余空格這串字符全小寫(xiě)不帶符號(hào)。7. 掛載完成后我還會(huì)做的三件小事7.1 設(shè)置開(kāi)機(jī)TRIMSSD用戶(hù)必看如果掛載的是NVMe或者SATA SSD建議設(shè)置一個(gè)每周TRIM任務(wù)讓文件系統(tǒng)定期通知SSD清理已刪除的塊?,F(xiàn)在很多Linux發(fā)行版自帶的fstrim.timer已經(jīng)是默認(rèn)啟用狀態(tài)可以用下面的命令檢查systemctl status fstrim.timer如果沒(méi)有啟用執(zhí)行sudo systemctl enable --now fstrim.timerTRIM這件事直接掛載參數(shù)加discard是一種做法用定期fstrim是更可控的做法兩個(gè)選一個(gè)就行不要同時(shí)用免得有的SSD固件對(duì)頻繁TRIM反而處理不過(guò)來(lái)回導(dǎo)致IO卡頓。7.2 設(shè)置一個(gè)簡(jiǎn)單的訪問(wèn)權(quán)限收斂數(shù)據(jù)盤(pán)掛載之后我通常不會(huì)讓它對(duì)所有用戶(hù)開(kāi)放。如果個(gè)人機(jī)器直接chown給自己用就夠了。如果是多人共享的工作站可以把目錄組權(quán)限設(shè)成770把需要訪問(wèn)的用戶(hù)加進(jìn)同一個(gè)組chown -R root:data_group /data chmod -R 770 /data usermod -aG data_group 用戶(hù)名這樣普通用戶(hù)看不到盤(pán)里的目錄結(jié)構(gòu)能有效防止手滑誤刪別人的文件。權(quán)限設(shè)計(jì)不用一開(kāi)始就做得很復(fù)雜簡(jiǎn)單按“組”劃分已經(jīng)能覆蓋大多數(shù)場(chǎng)景。7.3 新建掛載點(diǎn)不要放在 /media 下自動(dòng)生成的目錄桌面版Ubuntu插入U(xiǎn)SB移動(dòng)硬盤(pán)時(shí)桌面環(huán)境和自動(dòng)掛載到/media/用戶(hù)名/卷標(biāo)目錄。這種臨時(shí)掛載機(jī)制很方便但如果你把一塊固定的內(nèi)盤(pán)也掛在這種動(dòng)態(tài)目錄下路徑會(huì)因?yàn)椴迦霑r(shí)間、卷標(biāo)變化而發(fā)生變化寫(xiě)腳本、配服務(wù)都會(huì)很痛苦。固定數(shù)據(jù)盤(pán)一定要規(guī)劃一個(gè)不動(dòng)搖的路徑比如/data、/srv/data這種不要依賴(lài)動(dòng)態(tài)創(chuàng)建的臨時(shí)掛載點(diǎn)。我個(gè)人在實(shí)際操作中最深刻的體會(huì)是掛載硬盤(pán)就像給新員工安排工位你得先告訴人事系統(tǒng)來(lái)了個(gè)新人設(shè)備分一個(gè)工位分區(qū)貼上名牌文件系統(tǒng)格式化卷標(biāo)然后把門(mén)牌號(hào)掛載點(diǎn)登記到通訊錄fstab以后每天開(kāi)門(mén)開(kāi)機(jī)才能自動(dòng)坐到位置上。只把人領(lǐng)進(jìn)門(mén)、不登記通訊錄第二天開(kāi)門(mén)的時(shí)候就全亂套了。希望這篇關(guān)于Ubuntu掛載硬盤(pán)的完整復(fù)盤(pán)能幫你少走點(diǎn)彎路路上踩過(guò)的每一個(gè)坑都是學(xué)費(fèi)換來(lái)的經(jīng)驗(yàn)別讓它白交。