fstab

出自 Arch Linux 中文维基

fstab(5)文件可用於定義磁碟分區,各種其他塊設備或遠程文件系統應如何裝入文件系統。

每個文件系統在一個單獨的行中描述。這些定義將在引導時動態地轉換為系統掛載單元,並在系統管理器的配置重新加載時轉換。在啟動需要掛載的服務之前,默認設置會自動 fsck 和掛載文件系統。例如,Systemd 會自動確保遠程文件系統掛載(如 NFSSamba )僅在網絡設置完成後啟動。因此,在 /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   noatime   0      1
UUID=f9fe0b69-a280-415d-a03a-a32752370dee none  swap   defaults  0      0
UUID=b411dc99-f0a0-4c87-9e05-184977be8539 /home ext4   noatime   0      2
提示:
  • auto 類型會讓 mount 命令猜測設備使用的文件系統。這對於 光學介質 (CD/DVD/Blu-ray) 是很有用的。
  • 如果 root 文件系統是 BtrfsXFS,fsck 順序應該設置為 0 而不是 1。請見 fsck.btrfs(8)fsck.xfs(8)

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

文件系統標識[編輯 | 編輯原始碼]

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

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

/etc/fstab 配置文件中你可以用不同的方法表示文件系統:內核名稱、標籤 或者 UUID,對於 GPT 磁碟還可以使用 GPT 標籤 和 分區 UUID。內核名稱不應該被使用,而 UUID 或 分區 UUID 應該優於標籤。更多解釋請見持久化塊設備名稱。建議在繼續閱讀本文前先閱讀那篇文章。

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

要使用 內核名稱,在第一列中使用 /dev/sdxy

內核名稱[編輯 | 編輯原始碼]

運行 lsblk -f 以列出分區,並在 NAME 列中的值的前面加上 /dev/

/etc/fstab
# <device>        <dir>        <type>        <options>        <dump> <fsck>
/dev/sda1         /boot        vfat          defaults         0      2
/dev/sda2         /            ext4          defaults         0      1
/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=ESP         /boot        vfat          defaults         0      2
LABEL=System      /            ext4          defaults         0      1
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=CBB6-24F2                            /boot vfat   defaults  0      2
UUID=0a3407de-014b-458b-b5c1-848e92a327a3 /     ext4   defaults  0      1
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=EFI\040system\040partition /boot vfat   defaults  0      2
PARTLABEL=GNU/Linux                  /     ext4   defaults  0      1
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=d0d0d110-0a71-4ed6-936a-304969ea36af /boot vfat   defaults  0      2
PARTUUID=98a81274-10f7-40db-872a-03df048df366 /     ext4   defaults  0      1
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 掛載選項。

自動掛載[編輯 | 編輯原始碼]

  • 如果 /home 分區較大,可以讓不依賴 /home 分區的服務先啟動。把下面的參數添加到 /etc/fstab 文件中 /home 項目的參數部分即可:
noauto,x-systemd.automount

這樣 /home 分區只有需要訪問時才會被掛載。內核會緩存所有的文件操作,直到 /home 分區準備完成。

注意: 這樣做會使 /home 的文件系統類型被識別為 autofs,造成 mlocate 查詢時忽略該目錄。實際加速效果因配置而異,所以請自己權衡是否需要。
  • 掛載遠程文件系統也是同理。如果你僅想在需要的時候才掛載,也可以添加 noauto,x-systemd.automount 參數。另外,可以設置 x-systemd.device-timeout=# 參數,設置超時時間,以防止網絡資源不能訪問的時候浪費時間。
  • 如果你的加密文件系統需要密鑰,則需要添加 noauto 參數到 /etc/crypttab 文件中的對應位置。systemd 開機的時候就不會打開這個加密設備,會一直等待到設備被訪問時再使用密鑰文件掛載。比如在使用加密RAID設備的時候可以節省一定的時間,因為 systemd 不必等到設備可用後才能訪問。例如:
/etc/crypttab
data /dev/md0 /root/key noauto

本機分區[編輯 | 編輯原始碼]

假如有一個大分區,當它通過 fsck 被檢查時,允許不依賴它可能會更快啟動。這可以通過向 /etc/fstab 的分區條目中添加下列選項來完成:

noauto,x-systemd.automount

這會使分區第一次被訪問時才運行 fsck 和 mount,並且在它準備好前內核會緩衝所有對它的文件訪問。 例如,有人有非常大的 /home 分區時,這個方法可能會起作用。

注意: 這會使文件系統類型 autofs 默認被 mlocate 忽略。

遠程文件系統[編輯 | 編輯原始碼]

對於遠程文件系統的掛載也是一樣的。如果你想讓它們只在訪問時被掛載,你需要使用 noauto,x-systemd.automount 參數。另外,你還可以使用 x-systemd.mount-timeout= 選項來指定 systemd 應該在命令完成前等待多久。還有,_netdev 選項確保 systemd 明白掛載需要網絡並且在網絡就緒後再執行掛載。

加密文件系統[編輯 | 編輯原始碼]

如果你有帶有密鑰文件的加密文件系統,你可以在 /etc/crypttab 向對應條目添加 noauto 參數。systemd 將不會在啟動時打開加密設備,而是會等到它實際被訪問時再在掛載前自動通過指定的密鑰文件打開它。假如你使用一個加密的 RAID 設備,這可能會為你在啟動時省下幾秒鐘,因為 systemd 不會等待變為可用。舉個例子:

/etc/crypttab
data /dev/md0 /root/key noauto

自動卸載[編輯 | 編輯原始碼]

你也許可以通過 x-systemd.idle-timeout 參數來為掛載設置一個空閒超時。舉個例子:

noauto,x-systemd.automount,x-systemd.idle-timeout=1min

這會使 systemd 在設備空閒 1 分鐘後卸載它。

外部設備[編輯 | 編輯原始碼]

外部設備在插入時掛載,在未插入時忽略。這需要 nofail 選項,可以在啟動時若設備不存在直接忽略它而不報錯。舉個例子:

/etc/fstab
/dev/sdg1        /media/backup    jfs    nofail,x-systemd.device-timeout=1ms    0  2

路徑名有空格[編輯 | 編輯原始碼]

因為空格在 fstab 中用於劃分列,如果任意一列(PARTLABEL, LABEL 或 掛載點)中含有空格,這些空格必須被替換為轉義符 \ 後面跟著三位數八進位代碼 040:

/etc/fstab
UUID=47FA-4071     /home/username/Camera\040Pictures   vfat  noatime       0  0
/dev/sda7          /media/100\040GB\040(Storage)       ext4  noatime,user  0  2

atime 參數[編輯 | 編輯原始碼]

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

  • strictatime 選項會在文件每次被訪問時更新它們的訪問時間。這更多用於將 Linux 用作伺服器時;它對於桌面用戶並沒有多少價值。strictatime 選項的缺點是即使從頁面緩存中讀取文件(從內存而不是從驅動器讀取)也會導致一次寫入。
  • noatime 選項完全禁用每次讀取文件時將文件訪問時間寫入驅動器。開啟這個選項後大部分應用程式都能很好工作。除了那些需要知道文件自上次修改後是否被訪問的應用程式。在啟用此選項的情況下,只要寫入文件,文件的寫入時間信息就會繼續更新。
  • nodiratime 選項僅對目錄禁用文件訪問時間的寫入,而其他文件仍會寫入訪問時間。
    注意: noatime 包含了 nodiratime你不需要同時啟用兩個選項
  • relatime 僅當先前訪問時間早於當前修改或改變時間時才會更新訪問時間。此外,從 Linux 2.6.30 開始,如果之前的訪問時間超過 24 小時,則始終會更新訪問時間。在使用 defaults 選項,atime 選項(表示使用內核默認值,即 relatime;請見 mount(8)wikipedia:Stat (system call)#Criticism of atime) 或 根本沒指定任何選項 時,該選項也會被使用。

在使用 Mutt 或其它需要知道一個文件自上次修改後是否已被讀取的應用程式時,不應該使用 noatime 選項;可以使用 relatime 以獲取性能提升。

自從內核 4.0 版本起還有另一個相關的選項:

  • lazytime 通過僅在內存中維護對 inode 時間戳的更改來減少對磁碟的寫入(訪問,修改 和 創建時間)。磁碟時間戳僅在以下情況下更新:(1) 文件 inode 需要針對與文件時間戳無關的某些更改進行更新, (2) 發生與磁碟的同步, (3) 從內存中逐出未刪除的 inode 或 (4) 如果自上次將內存中的副本寫入磁碟已超過 24 小時。
警告: 如果系統崩潰, 磁碟上的訪問和修改時間可能會距離當前時間最多 24 小時。

重新掛載 root 分區[編輯 | 編輯原始碼]

如果處於某些原因 root 分區被不正確地掛載為只讀,通過以下命令將 root 分區以讀寫訪問重新掛載:

# mount -o remount,rw /

GPT 分區自動掛載[編輯 | 編輯原始碼]

在使用 UEFI/GPT 時,根據可發現分區規範進行分區,可以在 /etc/fstab 中省略某些分區,並具有 systemd-gpt-auto-generator(8) 掛載分區。請見 Systemd#GPT 分區自動掛載.

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

參見[編輯 | 編輯原始碼]