本文轉自 Steins;Lab,非常詳細地介紹了樹莓派上 fstab 的配置項。
近期自己的Raspberry Pi出了點問題,總結總結便有了這篇文章。
本文首先記錄“移動硬盤掛載”實際發生的問題,然后淺析了fstab這一重要配置文件和使用,最后總結了Raspberry Pi上自動掛載移動硬盤的方法。本文主要基於Raspberry Pi和Raspbian描述問題,當然它也廣泛適用於各Linux發行版環境中 ; )。
1 問題描述和解決
之前,我的一塊Raspberry Pi作為一個簡單的NAS,通過fstab
文件實現了開機自動掛載移動硬盤。
根據網上別人嚼過的東西,沒有深究。fstab如下:
1
2
3
4
5
6
7
|
proc /proc proc defaults 0 0
/dev/mmcblk0p1 /boot vfat defaults 0 2
/dev/mmcblk0p2 / ext4 defaults,noatime 0 1
UUID=FD720D1BCFDB2930 /media/pi/usbhdd ntfs defaults,noatime 0 0
# a swapfile is not a swap partition, no line here
# use dphys-swapfile swap[on|off] for that
|
使用UUID作為標識掛載了一塊NTFS的移動硬盤,參數為defaults,noatime
,一直以來相安無事。
直至,我把移動硬盤拔掉后開機,無法正常引導進入系統。
我一度以為是我經常暴力關機導致tf卡文件系統損壞。連上顯示器和鍵盤救援一下,boot過程在
1
|
[** ]A start job is running for dev-disk-by\x2duuid-XXXXXXXX.device (xx s / 1min 30s)
|
隨即進入emergency mode。大致知道原因了:未找到fstab中指定的硬盤
根據Archlinux wiki,若要將其設置為可忽略,可添加nofail
選項[1]:
外部設備在插入時掛載,在未插入時忽略。這需要
nofail
選項,可以在啟動時若設備不存在直接忽略它而不報錯.
1/etc/fstab
1/dev/sdg1 /media/backup jfs defaults,nofail 0 2
External devices that are to be mounted when present but ignored if absent may require the
nofail
option. This prevents errors being reported at boot. For example:
1/etc/fstab
1/dev/sdg1 /media/backup jfs nofail,x-systemd.device-timeout=1 0 2
The
nofail
option is best combined with thex-systemd.device-timeout
option. This is because the default device timeout is 90 seconds, so a disconnected external device with onlynofail
will make your boot take 90 seconds longer, unless you reconfigure the timeout as shown. Make sure not to set the timeout to 0, as this translates to infinite timeout.If your external device requires another systemd unit to be loaded (for example the network for a network share) you can use
x-systemd.requires=x
combined withx-systemd.automount
to postpone automounting until after the unit is available. For example:
1/etc/fstab
1//host/share /net/share cifs noauto,nofail,x-systemd.automount,x-systemd.requires=network-online.target,x-systemd.device-timeout=10,workgroup=workgroup,credentials=/foo/credentials 0 0
綜合參考[2],我最終的fstab文件如下:
1
2
3
4
5
6
7
|
proc /proc proc defaults 0 0
/dev/mmcblk0p1 /boot vfat defaults 0 2
/dev/mmcblk0p2 / ext4 defaults,noatime 0 1
UUID=FD720D1BCFDB2930 /media/pi/usbhdd ntfs defaults,nofail,x-systemd.device-timeout=1,noatime 0 0
# a swapfile is not a swap partition, no line here
# use dphys-swapfile swap[on|off] for that
|
即使boot階段沒有接入移動硬盤,也能正常啟動。
2 fstab
fstab文件可以被用來定義磁盤分區,各種其他塊設備,或遠程文件系統應如何安裝到文件系統。
每個文件系統都在一個單獨的行中描述。這些定義將在引導時動態轉換為systemd安裝單元,並在重新加載系統管理器的配置時。
在第一節中可以看到典型的fstab結構。
2.1 手冊和wiki
關於fstab,wiki上已經寫得非常清晰了,參考鏈接如下:
https://help.ubuntu.com/community/Fstab
http://manpages.ubuntu.com/manpages/bionic/en/man5/fstab.5.html
https://wiki.archlinux.org/index.php/Fstab
其中,ArchLinux Wiki中給出了一些針對各類場景的fstab使用技巧,如果你正遇到某些問題,不妨一讀:
2.2 理解
各類參數解釋在上wiki中已經詳細給出,能搜到的博文有許許多多。這里是我的一些理解和總結:
fstab
的作用是定義磁盤分區,也可定義其他block設備和遠程文件系統。它所做出的指定,會在系統引導時掛載。
mount
命令和fstab
也是有關系的。當mount
參數給出一個時,剩余的參數會在fstab
中查找[3]。
這也就意味着,除非指定某些選項,否則/etc/fstab
在啟動時和使用mount -a
時,將自動掛載所有指定的設備。這時,若其中設備不存在將導致錯誤。這時需要用到的選項有noauto
,nofail
。
2.3 參數歸納
一個典型的fstab結構如下:
1
2
3
4
|
# <device> <dir> <type><options> <dump> <fsck>
/dev/sda1 / ext4 noatime 0 1
/dev/sda2 none swap defaults 0 0
/dev/sda3 /home ext4 noatime 0 2
|
每一行由以下參數組成 <device> <dir> <type> <options> <dump> <fsck>
<device>
描述了要安裝的塊特殊設備或遠程文件系統; 請參閱#Identifying filesystems。<dir>
介紹了安裝目錄,<type>
該文件系統類型,以及<options>
相關的安裝選項; 見mount(8)和ext4(5)。<dump>
由dump(8)實用程序檢查。此字段通常設置為0
,禁用檢查。<fsck>
設置啟動時文件系統檢查的順序; 見fsck(8)。對於根設備應該是1
。對於其他分區應該是2
,或0
禁用檢查。
options常用參數類型:
auto
– 在啟動時或鍵入了mount -a
命令時自動掛載。noauto
– 只在你的命令下被掛載。exec
– 允許執行此分區的二進制文件。noexec
– 不允許執行此文件系統上的二進制文件。ro
– 以只讀模式掛載文件系統。rw
– 以讀寫模式掛載文件系統。user
– 允許任意用戶掛載此文件系統,若無顯示定義,隱含啟用noexec
,nosuid
,nodev
參數。users
– 允許所有 users 組中的用戶掛載文件系統.nouser
– 只能被 root 掛載。owner
– 允許設備所有者掛載.sync
– I/O 同步進行。async
– I/O 異步進行。dev
– 解析文件系統上的塊特殊設備。nodev
– 不解析文件系統上的塊特殊設備。suid
– 允許 suid 操作和設定 sgid 位。這一參數通常用於一些特殊任務,使一般用戶運行程序時臨時提升權限。nosuid
– 禁止 suid 操作和設定 sgid 位。noatime
– 不更新文件系統上 inode 訪問記錄,可以提升性能(參見 atime 參數)。nodiratime
– 不更新文件系統上的目錄 inode 訪問記錄,可以提升性能(參見 atime 參數)。relatime
– 實時更新 inode access 記錄。只有在記錄中的訪問時間早於當前訪問才會被更新。(與 noatime 相似,但不會打斷如 mutt 或其它程序探測文件在上次訪問后是否被修改的進程。),可以提升性能(參見 atime 參數)。flush
–vfat
的選項,更頻繁的刷新數據,復制對話框或進度條在全部數據都寫入后才消失。defaults
– 使用文件系統的默認掛載參數,例如ext4
的默認參數為:rw
,suid
,dev
,exec
,auto
,nouser
,async
.
3 Desktop Environment的自動掛載
實際使用Raspbian桌面版的同學們可能發現了,在PIXEL(LXDE)桌面環境中,即使我們沒有設置fstab
,插入usb存儲設備后,它將自動被掛載到 /media/<user>/<label>
下。
這個功能我們在Linux各個發行版的桌面版本都用到過。自動掛載對於桌面用戶,非常友好。通常由GUI/DE協同處理[4]。對於Raspbian來說,在PIXEL自帶的PCManFM文件管理器中,對自動掛載usb存儲設備的設置選項如下:
有趣的是,我曾經分別以root和pi的賬戶開啟了2個PIXEL桌面。此時插入USB存儲介質時,某一個桌面就會顯示掛載沖突。這也使我開始意識到自動掛載是由GUI/DE操作的。
若你的Raspberry Pi作為遠端服務器設備,也在運行桌面版,不妨使用Desktop Environment作為你的工具幫你實現自動掛載。
參考資料
[1] Archlinux Wiki – Fstab https://wiki.archlinux.org/index.php/Fstab
[2] How to setup mount / auto-mount USB Hard Drive on Raspberry Pi https://gist.github.com/etes/aa76a6e9c80579872e5f
[3] mount(8) – debian wiki https://manpages.debian.org/jessie/mount/mount.8.en.html
[4] Stock Pi3 – what process is auto-mounting removable media? https://raspberrypi.stackexchange.com/questions/65739/stock-pi3-what-process-is-auto-mounting-removable-media
出處:http://shumeipai.nxez.com/2019/01/17/fstab-and-mobile-hard-disk-mounting-method.html