跳至內容

fstab

出自 Arch Linux 中文维基

fstab(5)文件可用於定義如何掛載硬碟分區以及各種塊設備和遠程文件系統。

每個文件系統都分別在單獨一行中定義,這些定義將在系統引導或重新加載系統管理器配置時被動態轉換為 systemd 掛載單元。默認設置將在需要掛載文件系統的服務啟動之前自動進行 fsck 並掛載文件系統。例如,systemd 會自動確保類似 NFSSamba 的遠程文件系統僅在網絡可用後才會進行掛載。因此,/etc/fstab 中指定的本地和遠程文件系統掛載應能開箱即用。具體信息請參考 systemd.mount(5)

如果僅提供了單個目錄或是設備作為參數,那麼 mount 會調用 fstab 來填充其它參數。在這種情況下,將調用 fstab 中列出的掛載參數。

這篇文章的某些內容需要擴充。

原因:需解釋 systemd-remount-fs.service(8) 的作用,並建議通過 rootflags 調用無法通過重掛載應用的選項。 (在 Talk: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
提示:
  • auto 類型會讓 mount 命令猜測設備使用的文件系統。這對於光學介質(CD/DVD/Blu-ray)非常有用。
  • 如果根文件系統是 btrfsXFS,那麼 fsck 順序應該設置為 0 而不是 1。具體信息請參考 fsck.btrfs(8)fsck.xfs(8)

除非指定 noauto 選項,否則在啟動以及使用帶有 -a 標識的 mount(8) 命令時,所有在 /etc/fstab 裡指定的設備都會自動被掛載。除非使用 nofail 選項,否則在列表中出現但實際不存在的設備會導致錯誤。

更多信息請參考 fstab(5) § DESCRIPTION

文件系統標識

[編輯 | 編輯原始碼]

這篇文章的某些內容需要擴充。

原因:除了內核名稱外,還有其他類型的設備路徑。/dev/disk/by-*/*/dev/mapper/*/dev/md/* 有著不同程度的持久性,而且使用它們應該是沒有問題的。 (在 Talk:Fstab 中討論)

/etc/fstab 配置文件中,有多種方法可用於標識文件系統:內核名稱、文件系統標籤或者 UUID,對於 GPT 硬碟還可以使用 GPT 分區標籤和 UUID。不應使用內核名稱,而 UUID 或分區 UUID(PARTUUID)應該優於標籤。更多信息請參考塊設備持久化命名。建議在繼續閱讀本文前先閱讀那篇文章。

在本節中,我們將通過示例描述如何使用所有可用的掛載方法來掛載文件系統。以下示例中使用的命令 lsblk -fblkid 的輸出可在塊設備持久化命名一文中找到。

內核名稱

[編輯 | 編輯原始碼]

運行 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
警告:塊設備的內核名稱不是持久化的,可能在每次啟動系統時都不同,因此不能被用在配置文件中(包括 /etc/fstab)。

文件系統標籤

[編輯 | 編輯原始碼]

運行 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
注意:如果你的標籤中包含空格,請參考 #路徑名有空格

文件系統 UUID

[編輯 | 編輯原始碼]

運行 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

GPT 分區標籤

[編輯 | 編輯原始碼]

運行 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
注意:如果你的分區標籤中包含空格,請參考 #路徑名有空格

GPT 分區 UUID

[編輯 | 編輯原始碼]

運行 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 自動掛載

[編輯 | 編輯原始碼]

請參考 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 選項無法按以下描述工作。(在 Talk:Fstab#3.2 External Device options 中討論)


對於僅在可用時掛載,未找到時忽略的外部設備,需要使用 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 中用於劃分列,如果任意一列(PARTLABELLABEL 或掛載點)中含有空格,這些空格必須被替換為轉義符 \ 後面跟著三位數八進制代碼 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 參數

[編輯 | 編輯原始碼]

下列 atime 選項可能影響驅動器性能。

  • strictatime 選項會在文件每次被訪問時更新它們的訪問時間。這更多用於 Linux 伺服器,而對於桌面用戶並沒有多少價值。strictatime 選項的缺點是即使從頁面緩存中讀取文件(從內存而不是從驅動器讀取)也會導致一次寫入。
  • noatime 選項將在讀取文件時不將文件訪問時間寫入驅動器。開啟這個選項對多數應用不會產生影響,除了那些需要知道文件自上次修改後是否被訪問的應用。在啟用此選項的情況下,只要寫入文件,文件的寫入時間信息就會更新。
  • nodiratime 選項僅對目錄禁用文件訪問時間的寫入,而其他文件仍會寫入訪問時間。
    注意: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 /

GPT 分區自動掛載

[編輯 | 編輯原始碼]

在根據可發現分區規範進行了分區的情況下,使用 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 掛載

[編輯 | 編輯原始碼]

你可以使用 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 文件,具體信息請參考 genfstab.

GUI 工具

[編輯 | 編輯原始碼]

以下為一系列可用於修改掛載點的工具,它們的 fstab 編輯功能可能不完整,但常用的功能都有,可以簡化你的工作流:

  • GNOME Disks — 用於處理存儲設備的 GNOME 工具,是 gnome包組 的一部分。
https://apps.gnome.org/DiskUtility/ || gnome-disk-utility
  • KDE Partition Manager — 可用於管理電腦上的硬碟、分區和文件系統的工具,是 kde-system包組 的一部分。
https://apps.kde.org/partitionmanager/ || partitionmanager

修改用戶權限和所有權

[編輯 | 編輯原始碼]

如果你希望所有用戶都能掛載某個硬碟,可以考慮在 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 中的語法錯誤和無效選項。

參見

[編輯 | 編輯原始碼]