跳至內容

fstab

出自 Arch Linux 中文维基

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

每個文件系統都分別在單獨一行中定義,這些定義將在系統引導或重新加載系統管理器配置時被動態轉換為 systemd 掛載單元。The default setup will automatically fsck and mount file systems before starting services that need them to be mounted. 例如,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 中的語法錯誤和無效選項。

參見

[編輯 | 編輯原始碼]