天天看點

systemd時代的/etc/fstabsystemd時代的/etc/fstab

回到Linux基礎系列文章大綱

回到Systemd系列文章大綱

回到Shell系列文章大綱

systemd時代的/etc/fstab

/etc/fstab檔案用于指定在開機時自動挂載的分區、檔案系統、遠端檔案系統或塊裝置,以及它們的挂載方式。此外,執行

mount -a

操作也可以重新挂載/etc/fstab中的所有挂載項。

通用格式大緻如下:

Code

1
2
3
4
5
      
# <device>        <dir>        <type>        <options>        <dump> <fsck>
/dev/sda1         /boot        vfat          defaults         0      0
/dev/sda2         /            ext4          defaults         0      0
/dev/sda3         /home        ext4          defaults         0      0
/dev/sda4         none         swap          defaults         0      0
      

使用systemd系統時,systemd接管了挂載/etc/fstab的任務。在系統啟動的時候,systemd會讀取/etc/fstab檔案并通過

systemd-fstab-generator

工具将該檔案轉換為systemd unit來執行,進而完成挂載任務。

systemd擴充了fstab檔案的定義方式,在/etc/fstab中可使用由systemd.mount提供的挂載選項,這些選項大多以

x-systemd

為字首(并非所有選項都如此),合理使用這些systemd提供的選項,可以完美地解決以前使用/etc/fstab時一些痛點。

比如,systemd.mount可以讓那些要求在網絡可用時的檔案系統在網絡已經可用的情況下才去挂載,還可以定義等待網絡可用的逾時時間,進而避免在開機過程中長時間卡住。

再比如,systemd可以讓某個挂載項自動開始挂載和自動解除安裝,而不是在開機時挂載後永久挂載在背景。

/etc/fstab檔案格式回顧

以如下内容為例:

Code

1
2
3
4
5
      
# <device>        <dir>        <type>        <options>        <dump> <fsck>
/dev/sda1         /boot        vfat          defaults         0      0
/dev/sda2         /            ext4          defaults         0      0
/dev/sda3         /home        ext4          defaults         0      0
/dev/sda4         none         swap          defaults         0      0
      

其中

systemd時代的/etc/fstabsystemd時代的/etc/fstab

需要注意,如果第一列或第二列的值包含了空格,則空格使用

\040

代替。例如:

Code

1
      
PARTLABEL=EFI\040SYSTEM\040PARTITION /boot vfat defaults  0  0
      

第一列:挂載項辨別符

/etc/fstab的第一列是挂載項的辨別符,用于辨別哪個裝置需要被挂載。

/etc/fstab支援多種辨別符類型:

  • 核心識别的名稱,即/dev/xxx
    • 如/dev/sda1、/dev/mapper/centos-root
    • 需注意,強烈建議不要在/etc/fstab中使用這種辨別符,因為如果有多個(SATA/SCSI/IDE)裝置時,每次系統啟動都能可能導緻裝置名稱改變。但如果是lvm裝置,它的裝置名是持久不變的,是以安全
  • 檔案系統LABEL:使用時需加字首

    LABEL=

    ,可

    lsblk -f

    或blkid檢視裝置對應的LABEL。如:

    Code

    1
          
    LABEL=EFI  /boot  vfat defaults 0 0
          
  • 檔案系統UUID:使用時需加字首

    UUID=

    ,可

    lsblk -f

    或blkid檢視對應裝置的UUID,如:

    Code

    1
          
    UUID=0a3407de-xxxx-848e92a327a3 /  ext4 defaults  0  0
          
  • GPT分區LABEL:使用時需加字首

    PARTLABEL=

    ,可使用blkid檢視PARTLABEL,如:

    Code

    1
    2
    3
          
    PARTLABEL=EFI\040SYSTEM\040PARTITION /boot vfat defaults  0  0
    PARTLABEL=GNU/LINUX /     ext4   defaults  0  0
    PARTLABEL=HOME      /home ext4   defaults  0  0
          
  • GPT UUID:使用時需加字首

    PARTUUID=

    ,可使用blkid檢視PARTUUID,如:

    Code

    1
          
    PARTUUID=98a81274-xxxx-03df048df366 / ext4 defaults 0 0
          

除了第一種辨別方式外,其餘四種辨別方式以及LVM的辨別符都是持久不變的,是以都可以安全地在/etc/fstab中使用。

第四列:systemd提供的一些有用的挂載技巧

systemd提供了一些以

x-systemd

為字首的挂載選項,還提供了

auto noauto nofail _netdev

這四個選項。

  • auto、noauto

    :auto表示開機自動挂載,noauto表示開機不自動挂載(且

    mount -a

    也不自動挂載該挂載項),但如果本挂載項被其它Unit一來,則noauto時仍然會被挂載
  • nofail

    :開機時,不在乎也不等待本挂載項,即使本挂載項在開機時挂載失敗也無所謂
  • _netdev

    :通常mount可以根據指定的檔案系統類型來推測是否是網絡裝置,如果是網絡裝置,則自動安排在網絡可用之後執行挂載操作,但某些時候無法推測,比如ISCSI這類依賴于網絡的塊裝置,使用該選項可以直接告知mount這是一個網絡裝置

更多挂載選項參考

man systemd.mount

延遲到第一次通路時自動挂載

例如,對于一些本地檔案系統,可以将挂載選項設定為:

Code

1
      
noauto,x-systemd.automount
      

noauto

表示開機時不要自動挂載,

x-systemd.automount

表示在第一次對該檔案系統進行通路時自動挂載。

核心會将從觸發自動挂載到挂載成功期間所有對該裝置的通路緩沖下來,當挂載成功後再去通路該裝置。

自動解除安裝裝置

Code

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

這表示systemd如果發現該裝置在1分鐘内都處于idle狀态,将自動解除安裝它。預設機關為秒,支援的機關有

s, min, h, ms

,設定為0表示永不逾時。

設定遠端網絡裝置挂載逾時時長

挂載網絡裝置時可能會因為各種原因而長時間等待,可設定

x-systemd.mount-timeout

選項。如:

Code

1
      
noauto,x-systemd.automount,x-systemd.mount-timeout=30,_netdev
      

x-systemd.mount-timeout=30

表示systemd最多等待該裝置在30秒内挂載成功。預設機關為秒,支援的機關有

s, min, h, ms

,設定為0表示永不逾時。

存在則挂載,不存在則忽略

使用

nofaile

挂載選項,在挂載失敗時(比如裝置不存在)直接跳過。

Code

1
      
nofail,x-systemd.device-timeout=1ms
      

nofail

通常會結合

x-systemd.device-timeout

一起使用,表示等待該裝置多長時間才認為可用于挂載(即判斷該裝置可執行挂載操作),預設等待90s,這意味着如果結合

nofail

時,如果挂載的裝置不存在,将會卡頓90s。預設機關為秒,支援的機關有

s, min, h, ms

,設定為0表示永不逾時。

注意區分

x-systemd.device-timeout

x-systemd.mount-timeout

systemd時代的/etc/fstabsystemd時代的/etc/fstab

關于atime的挂載選項

讀、寫檔案都會更改atime資訊,但很多時候atime這項資訊是無關緊要的,它僅表示檔案最近一次是何時通路的,隻有那些需要實時了解atime資訊的程式才在意atime是否更新。

因為atime資訊儲存在檔案系統的inode中,是以每次更新atime都會去通路磁盤,而通路磁盤的效率是非常低的。比如對于機械硬碟來說,頻繁更新atime将導緻大量磁盤尋道。

如果可以放棄維護atime的讀更新,将減少額外的磁盤通路,可大幅提升性能。

挂載檔案系統時,可以通過atime相關的挂載選項控制如何更新atime,進而在檔案系統層次保證不會因為頻繁更新atime而降低檔案系統性能。

atime相關挂載選項有:

  • strictatime

    :每次通路檔案時都更新檔案的atime,顯然這會嚴重降低檔案系統性能
  • noatime

    :在讀檔案時,禁止更新atime。寫檔案時,會自動将atime資訊更新到inode中
  • nodiratime

    :讀檔案時不更新所在目錄的atime
    • 使用

      noatime

      時将隐含

      nodiratime

      ,是以無需同時指定這兩項
  • relatime

    :讀檔案時,如果該檔案目前的atime資訊早于mtime/ctime(這意味着修改過内容但沒有更新atime),則更新atime,且如果本次讀檔案時發現目前的atime距離現在已經超過24小時,則也立即更新atime
    • 當使用

      defaults

      挂載選項時,預設将使用relatime選項。defaults挂載選項表示使用核心的預設值,而核心中對atime的更新行為預設是relatime
  • lazytime

    :這是Kernel 4.0才支援的atime更新政策,該選項表示隻在記憶體中維護inode中的atime/mtime和ctime資訊,當遇到如下情況時才将inode中的時間戳更新到磁盤上:
    • (1).當inode中和時間戳無關的資訊需要更新時(比如檔案大小、檔案權限),會順便把時間戳資訊也更新到磁盤(因為會更新整個inode)
    • (2).發生sync類操作時
    • (3).從記憶體中驅逐未被删除的inode時
    • (4).記憶體中的atime距離現在已經超出24小時

lazytime

不是獨立使用的選項,它可以結合前面的幾種atime更新選項,預設它結合的是

relatime

。但即使它結合的是

strictatime

,所能達到的性能也至少是單個

relatime

選項所能達到的性能。

繼續閱讀