fstab
fstab(5)文件可用於定義如何掛載硬碟分區以及各種塊設備和遠程文件系統。
每個文件系統都分別在單獨一行中定義,這些定義將在系統引導或重新加載系統管理器配置時被動態轉換為 systemd 掛載單元。The default setup will automatically fsck and mount file systems before starting services that need them to be mounted. 例如,systemd 會自動確保類似 NFS 和 Samba 的遠程文件系統僅在網絡可用後才會進行掛載。因此,/etc/fstab 中指定的本地和遠程文件系統掛載應能開箱即用。具體信息請參考 systemd.mount(5)。
如果僅提供了單個目錄或是設備作為參數,那麼 mount 會調用 fstab 來填充其它參數。在這種情況下,將調用 fstab 中列出的掛載參數。
一個簡單的 /etc/fstab,使用了文件系統 UUID:
/etc/fstab
# <device> <dir> <type> <options> <dump> <fsck>
UUID=0a3407de-014b-458b-b5c1-848e92a327a3 / ext4 defaults 0 1
UUID=CBB6-24F2 /boot vfat defaults,nodev,nosuid,noexec,fmask=0177,dmask=0077 0 2
UUID=f9fe0b69-a280-415d-a03a-a32752370dee none swap defaults 0 0
UUID=b411dc99-f0a0-4c87-9e05-184977be8539 /home ext4 defaults 0 2
-
<device>描述了要掛載的特定塊設備或遠程文件系統,詳見 #文件系統標識。 -
<dir>指定了要將文件系統掛載到的目錄,即掛載點。必須提前創建該目錄。 -
<type>是文件系統類型。 -
<options>是文件系統掛載選項,詳見 mount(8) § FILESYSTEM-INDEPENDENT MOUNT OPTIONS 和 ext4(5) § Mount options for ext4。 -
<dump>會被 dump(8) 工具檢查。該欄位通常設置為0,以禁用檢查。 -
<fsck>設置了引導時檢查文件系統的順序,具體信息請參考 fsck(8)。對於根設備,該欄位需設置為1。對於其它分區該欄位應該設置為2,或設置為0以禁用檢查。
-
auto類型會讓 mount 命令猜測設備使用的文件系統。這對於光學介質(CD/DVD/Blu-ray)非常有用。 - 如果根文件系統是 btrfs 或 XFS,那麼 fsck 順序應該設置為
0而不是1。具體信息請參考 fsck.btrfs(8) 和 fsck.xfs(8)。
除非指定 noauto 選項,否則在啟動以及使用帶有 -a 標識的 mount(8) 命令時,所有在 /etc/fstab 裡指定的設備都會自動被掛載。除非使用 nofail 選項,否則在列表中出現但實際不存在的設備會導致錯誤。
更多信息請參考 fstab(5) § DESCRIPTION。
在 /etc/fstab 配置文件中,有多種方法可用於標識文件系統:內核名稱、文件系統標籤或者 UUID,對於 GPT 硬碟還可以使用 GPT 分區標籤和 UUID。不應使用內核名稱,而 UUID 或分區 UUID(PARTUUID)應該優於標籤。更多信息請參考塊設備持久化命名。建議在繼續閱讀本文前先閱讀那篇文章。
在本節中,我們將通過示例描述如何使用所有可用的掛載方法來掛載文件系統。以下示例中使用的命令 lsblk -f 和 blkid 的輸出可在塊設備持久化命名一文中找到。
運行 lsblk -f 以列出分區,並在 NAME 列中的值的前面加上 /dev/。
/etc/fstab
# <device <dir> <type> <options> <dump> <fsck>
/dev/sda2 / ext4 defaults 0 1
/dev/sda1 /boot vfat defaults,nodev,nosuid,noexec,fmask=0177,dmask=0077 0 2
/dev/sda3 /home ext4 defaults 0 2
/dev/sda4 none swap defaults 0 0
運行 lsblk -f 以列出分區,並在 LABEL 列中的值的前面加上 LABEL=;或者運行 blkid 並使用不帶引號的 LABEL 的值:
/etc/fstab
# <device> <dir> <type> <options> <dump> <fsck>
LABEL=System / ext4 defaults 0 1
LABEL=ESP /boot vfat defaults,nodev,nosuid,noexec,fmask=0177,dmask=0077 0 2
LABEL=Data /home ext4 defaults 0 2
LABEL=Swap none swap defaults 0 0
運行 lsblk -f 以列出分區,並在 UUID 列中的值的前面加上 UUID=;或者運行 blkid 並使用不帶引號的 UUID 的值:
/etc/fstab
# <device> <dir> <type> <options> <dump> <fsck>
UUID=0a3407de-014b-458b-b5c1-848e92a327a3 / ext4 defaults 0 1
UUID=CBB6-24F2 /boot vfat defaults,nodev,nosuid,noexec,fmask=0177,dmask=0077 0 2
UUID=b411dc99-f0a0-4c87-9e05-184977be8539 /home ext4 defaults 0 2
UUID=f9fe0b69-a280-415d-a03a-a32752370dee none swap defaults 0 0
運行 blkid 來列出分區,並使用不帶引號的 PARTLABEL 的值:
/etc/fstab
# <device> <dir> <type> <options> <dump> <fsck>
PARTLABEL=GNU/Linux / ext4 defaults 0 1
PARTLABEL=EFI\040system\040partition /boot vfat defaults,nodev,nosuid,noexec,fmask=0177,dmask=0077 0 2
PARTLABEL=Home /home ext4 defaults 0 2
PARTLABEL=Swap none swap defaults 0 0
運行 blkid 來列出分區,並使用不帶引號的 PARTUUID 的值:
/etc/fstab
# <device> <dir> <type> <options> <dump> <fsck>
PARTUUID=98a81274-10f7-40db-872a-03df048df366 / ext4 defaults 0 1
PARTUUID=d0d0d110-0a71-4ed6-936a-304969ea36af /boot vfat defaults,nodev,nosuid,noexec,fmask=0177,dmask=0077 0 2
PARTUUID=7280201c-fc5d-40f2-a9b2-466611d3d49e /home ext4 defaults 0 2
PARTUUID=039b6c1c-7553-4455-9537-1befbc9fbc5b none swap defaults 0 0
請參考 systemd.mount(5) 獲取所有 systemd 掛載選項。
在使用大分區時,可以在 fsck 進行檢查時啟動不依賴該分區的服務以提高效率。這可以通過向 /etc/fstab 的分區條目中添加以下選項來完成:
x-systemd.automount
這會使分區被首次訪問時才運行 fsck 和 mount,並且內核會在它可用前緩衝所有對它的文件訪問。
該方法適用於如 /home 分區非常大的情況。
autofs,並默認被 locate 忽略。對於遠程文件系統的掛載也是一樣的。如果你想讓它們只在訪問時被掛載,就需要使用 x-systemd.automount 參數。另外,你還可以使用 x-systemd.mount-timeout= 選項來指定 systemd 應該在命令完成前等待多久。另外,_netdev 選項可確保 systemd 明白該掛載需要網絡,並且在網絡就緒後再執行掛載:
x-systemd.automount,x-systemd.mount-timeout=30,_netdev
如果你有一個使用密鑰文件的加密附屬文件系統,可以將 nofail 參數添加到 /etc/crypttab 和 /etc/fstab 中的對應項中。systemd 將不會在啟動時等待 cryptsetup 完成解密並掛載,而是等到甚至是抵達 default.target 後再完成掛載。通過忽略無需啟動後立即可用的加密附屬文件系統,該操作可避免由此帶來的啟動延遲。cryptsetup 的具體配置請參考 dm-crypt/系統配置#非阻塞掛載。
由於掛載服務默認僅會為文件系統可用等待 90 秒,因此任何對密鑰文件可用性的延遲都可能導致掛載失敗。為避免該情況出現,可以在 fstab 中添加 x-systemd.mount-timeout=0 選項,以使掛載服務一直等待到分區解鎖完成。
/etc/fstab
UUID=0a3407de-014b-458b-b5c1-848e92a327a3 /data ext4 defaults,nofail,x-systemd.device-timeout=0 0 2
可以通過 x-systemd.idle-timeout 參數來為掛載設置一個空閒超時時間。舉個例子:
x-systemd.automount,x-systemd.idle-timeout=1min
這會使 systemd 在設備空閒 1 分鐘後卸載它。
對於僅在可用時掛載,未找到時忽略的外部設備,需要使用 nofail 選項。該選項可在啟動時防止出現報錯。例如:
/etc/fstab
LABEL=MyExternalDrive /media/backup jfs nofail,x-systemd.device-timeout=5 0 2
建議將 nofail 選項搭配 x-systemd.device-timeout 選項使用,原因是默認設備超時時間是 90 秒,因此除非按如上進行配置,否則僅包含 nofail 選項且未連接的外部設備將使啟動時間延長 90 秒。務必確保超時時間沒有設為 0 秒,這會將超時時間設為無限。
因為空格在 fstab 中用於劃分列,如果任意一列(PARTLABEL,LABEL 或掛載點)中含有空格,這些空格必須被替換為轉義符 \ 後面跟著三位數八進制代碼 040:
/etc/fstab
UUID=47FA-4071 /home/username/Camera\040Pictures vfat defaults 0 0 LABEL=Storage\040drive /media/100\040GB\040(Storage) ext4 defaults,user 0 2
下列 atime 選項可能影響驅動器性能。
-
strictatime選項會在文件每次被訪問時更新它們的訪問時間。這更多用於 Linux 伺服器,而對於桌面用戶並沒有多少價值。strictatime選項的缺點是即使從頁面緩存中讀取文件(從內存而不是從驅動器讀取)也會導致一次寫入。 -
noatime選項將在讀取文件時不將文件訪問時間寫入驅動器。開啟這個選項對多數應用不會產生影響,除了那些需要知道文件自上次修改後是否被訪問的應用。在啟用此選項的情況下,只要寫入文件,文件的寫入時間信息就會更新。 -
nodiratime選項僅對目錄禁用文件訪問時間的寫入,而其他文件仍會寫入訪問時間。 -
relatime僅當先前訪問時間早於當前修改時間時才會更新訪問時間。此外,從 Linux 2.6.30 開始,如果與之前的訪問時間間隔超過 24 小時,則始終會更新訪問時間。在使用defaults選項,atime選項(即使用內核默認值relatime;具體信息請參考 mount(8) 和 Once upon atime)或沒指定任何選項時,將啟用該選項。
在使用 Mutt 或其它需要知道一個文件自上次修改後是否被讀取的應用時,不應該使用 noatime 選項;可以使用 relatime,同時還能獲得性能提升。
自從內核 4.0 版本起還有另一個相關的選項:
-
lazytime通過僅在內存中維護對 inode 時間戳的更改(包括訪問、修改和創建時間)來減少對磁碟的寫入。硬碟上的時間戳僅在以下情況下更新:(1) 文件 inode 需要針對與文件時間戳無關的某些更改進行更新,(2) 發生與硬碟的同步,(3) 從內存中逐出未刪除的 inode 或 (4) 自上次將內存中的副本寫入硬碟已超過 24 小時。
- 警告:如果系統崩潰,硬碟上的訪問和修改時間可能會距當前時間過時最多 24 小時。
注意, lazytime 並不用於替代上述 *atime 選項,而是與它們搭配使用。默認會與 relatime 搭配,但在搭配 strictatime 時的硬碟寫入損耗也較純 relatime 選項相同設置更低。
如果出於某些原因根分區被錯誤掛載為只讀,通過以下命令可以將根分區以讀寫訪問重新掛載:
# mount -o remount,rw /
在根據可發現分區規範進行了分區的情況下,使用 UEFI/GPT 時可以在 /etc/fstab 中省略部分分區,並讓 systemd-gpt-auto-generator(8) 自動進行掛載。具體信息請參考 systemd#GPT分區自動掛載。
可以將 /dev/gpt-auto-root 作為設備名稱來為根分區指定掛載選項:
/etc/fstab
/dev/gpt-auto-root / ext4 defaults,noatime 0 1
你可以使用 bind 選項鍊接目錄:
/etc/fstab
# <device> <dir> <type> <options> <dump> <fsck> UUID=94649E22649E06E0 /media/user/OS/ ntfs defaults,rw,errors=remount-ro 0 0 /media/user/OS/Users/user/Music/ /home/user/Music/ none defaults,bind 0 0 /media/user/OS/Users/user/Pictures/ /home/user/Pictures/ none defaults,bind 0 0 /media/user/OS/Users/user/Videos/ /home/user/Videos/ none defaults,bind 0 0 /media/user/OS/Users/user/Downloads/ /home/user/Downloads/ none defaults,bind 0 0 /media/user/OS/Users/user/Documents/ /home/user/Documents/ none defaults,bind 0 0 /media/user/OS/Users/user/projects/ /home/user/projects/windows/ none defaults,bind 0 0
詳情請見 mount(8) § Bind mount operation。
可以使用 genfstab 來創建 fstab 文件,具體信息請參考 genfstab.
以下為一系列可用於修改掛載點的工具,它們的 fstab 編輯功能可能不完整,但常用的功能都有,可以簡化你的工作流:
- GNOME Disks — 用於處理存儲設備的 GNOME 工具,是 gnome包組 的一部分。
- KDE Partition Manager — 可用於管理電腦上的硬碟、分區和文件系統的工具,是 kde-system包組 的一部分。
如果你希望所有用戶都能掛載某個硬碟,可以考慮在 fstab 的對應項中添加以下掛載選項:
-
users- 允許任意用戶掛載和卸載(即使由其他用戶掛載)對應的文件系統。該選項隱式包含了 noexec,nosuid 和 nodev 選項(除非被類似 users,exec,dev 和 suid 的選項覆蓋)。 -
user- 允許一個普通用戶掛載對應的文件系統,且僅允許同一個用戶進行卸載。該選項隱式包含了 noexec,nosuid 和 nodev 選項(除非被類似 users,exec,dev 和 suid 的選項覆蓋)。
對於沒有文件權限功能的文件系統(例如 FAT 和 exFAT),可以顯式指定整個硬碟和其中的文件的用戶和用戶組。可以通過 /etc/passwd 查找特定用戶的 ID,其中第三列是用戶 ID(UID),第四列是組 ID(GID)。
-
uid- 設置硬碟的所有者 ID -
gid- 設置硬碟的組 ID
對於 ext4,btrfs 和其他有權限功能的文件系統,其他用戶可能沒有查看硬碟的權限。請檢查硬碟下的文件權限,並根據需要進行修改。
可以通過 findmnt --verify --verbose 檢查 fstab 中的語法錯誤和無效選項。