fstab
fstab(5)文件可用於定義磁盤分區,各種其他塊設備或遠程文件系統應如何裝入文件系統。
每個文件系統在一個單獨的行中描述。這些定義將在引導時動態地轉換為系統掛載單元,並在系統管理器的配置重新加載時轉換。在啟動需要掛載的服務之前,默認設置會自動 fsck 和掛載文件系統。例如,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 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
<device>
描述要掛載的特定塊設備或遠程文件系統; 請見 #文件系統標識。<dir>
描述掛載目錄。<type>
文件系統類型。<options>
相關的掛載選項; 請見 mount(8) § FILESYSTEM-INDEPENDENT_MOUNT_OPTIONS 和 ext4(5) § MOUNT_OPTIONS。<dump>
會被 dump(8) 工具檢查。該字段通常設置為0
, 以禁用檢查。<fsck>
設置引導時文件系統檢查的順序; 請見 fsck(8)。對於 root 設備該字段應該設置為1
。對於其它分區該字段應該設置為2
,或設置為0
以禁用檢查。
auto
類型會讓 mount 命令猜測設備使用的文件系統。這對於 光學介質 (CD/DVD/Blu-ray) 是很有用的。- 如果 root 文件系統是 Btrfs 或 XFS,fsck 順序應該設置為
0
而不是1
。請見 fsck.btrfs(8) 和 fsck.xfs(8)。
除非指定 noauto
選項,否則在啟動以及使用帶有 -a
標識的 mount(8) 命令時,所有在 /etc/fstab
裡指定的設備會自動被掛載。除非使用 nofail
選項,否則在列表中出現但實際不存在的設備會導致錯誤。
文件系統標識[編輯 | 編輯原始碼]
在 /etc/fstab
配置文件中你可以用不同的方法表示文件系統:內核名稱、標籤 或者 UUID,對於 GPT 磁盤還可以使用 GPT 標籤 和 分區 UUID。內核名稱不應該被使用,而 UUID 或 分區 UUID 應該優於標籤。更多解釋請見持久化塊設備名稱。建議在繼續閱讀本文前先閱讀那篇文章。
在本節中,我們將通過示例描述如何使用所有可用的掛載方法來掛載文件系統。以下示例中使用的命令 lsblk -f
和 blkid
的輸出可在文章持久化塊設備名稱中找到。
要使用內核名稱,在第一列中使用 /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
分區準備完成。
- 掛載遠程文件系統也是同理。如果你僅想在需要的時候才掛載,也可以添加
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
選項僅對目錄禁用文件訪問時間的寫入,而其他文件仍會寫入訪問時間。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。