大家平时在 Linux 上实现开机挂载其它硬盘、一般都是对 /etc/fstab
文件进行修改,将我们需要开机挂载的硬盘条目添加到改文件最下面,但是这种方法有一个非常严重的弊端:
一旦你写在 fstab
文件里面的硬盘出现故障、或者连接不稳定,那么整个系统将会无法启动,直接 kernel panic
!
所以如果是直接连接到主板上的硬盘可以直接写在 fstab 文件里面(因为连接稳定)、而一些 USB 外置备份硬盘可以使用 systemd
进行硬盘挂载(硬盘的挂载操作将由 systemd 接管,不影响系统的启动过程,提高系统容错率)。
如果你的设备像可移动设备和网络位置一样在启动时不可用,则应仅使用自动挂载单元。
1. 重要规则
-
对于内部设备,启用并启动
mount
单元。 -
对于可移动设备—永远不要启用挂载(
mount
)单元,只启用自动挂载(automount
)单元。 -
如果挂载点不存在,挂载单元将创建挂载点。
-
如果挂载单元处于活动状态,则自动挂载单元将失败
-
自动挂载单元将在挂载点被访问时启动挂载单元,无论这是终端访问还是应用程序访问。
2. 单元文件名(Unit file names)
本地系统单元文件存放在 /etc/systemd/system
目录下。
2.1. 挂载单元(Mount unit)
挂载单元必须以扩展名为 .mount
的挂载点命名,因此如果您使用名为 /data/backup
的挂载点,则单元文件必须命名为 data-backup.mount
2.2. 自动挂载单元(Automount unit)
自动挂载单元使用挂载单元的名称,扩展名为 .automount
,因此示例 data-backup.mount
的自动挂载单元必须命名为 data-backup.automount
。
不要在路径中使用破折号,因为破折号指的是文件夹树上的一个新分支,这将破坏挂载/自动挂载文件的命名
- 在文件夹命名中使用破折号时获取挂载文件名的正确名称:
systemd-escape -p --suffix=mount "/data/home-backup"
data/home\x2dbackup.mount
- 对于自动挂载:
systemd-escape -p --suffix=automount "/data/home-backup"
data/home\x2dbackup.automount
所以可以像这样使用输出来创建文件:
touch $(systemd-escape -p --suffix=mount "/data/home-backup")
touch $(systemd-escape -p --suffix=automount "/data/home-backup")
3. 挂载单元的内容
根据 What
(挂载类型)、Type
(文件系统类型)的不同,所以选项也不同。
-
What
标识你想挂载什么(磁盘、服务器、共享)? -
Where
标识你希望它挂载在哪里(系统上的路径)? -
Type
标识你的挂载是哪种类型(文件系统,cifs, nfs)? -
Options
标识挂载时应该使用哪些选项(rw, auto, netdev)?
3.1. 示例
如果您想挂载由名为 server
的本地NAS提供的名为 video
的 Samba 共享
-
What
你服务器与共享文件的名字 e.g.//server/video
-
Where
你想挂载的挂载点路径 e.g./data/smb/video
-
Type
将是cifs
,因为这就是这种类型的连接的名称 -
Options
给系统指出它是一个网络设备_netdev
, 能够进行读写操作rw
, 并且使用特定的用户组、用户名和密码进行连接(workgroup
,username
andpassword
.)
4. 挂载单元示例
4.1. SMB网络共享
包 smbclient 就足够了,凭据可以存储在只有 root 可读的位置,将 $VARIABLES
替换为您系统的值。
💡注意:根据 archlinux wiki,uid 和 gid 会导致 I/O 错误。
4.1.1. SMB 凭据
创建文件 /etc/smb.cred
或在用户的家目录中包含以下内容:
user=$SMBUSER
password=$SMBPASS
workgroup=$WORKGROUP
使文件对用户只读:
sudo chmod 600 /etc/smb.cred
4.1.2. SMB版本
如果需要,您可以将版本添加到选项字符串中,例如 vers=NT1
4.1.3. 挂载单元
根据 $YOUR_MOUNT_PATH.mount
命名文件:
[Unit]
Description=NAS SMB video share
[Mount]
What=//$YOUR_SERVER/$YOUR_SHARE
Where=$YOUR_MOUNT_PATH
Type=cifs
Options=_netdev,iocharset=utf8,rw,file_mode=0777,dir_mode=0777,credentials=/etc/smb.cred,vers=$SMBVERSION
TimeoutSec=30
[Install]
WantedBy=multi-user.target
4.1.4. 自动挂载单元
根据 $YOUR_MOUNT_PATH.automount
命名文件:
[Unit]
Description=Automount video share using SMB
[Automount]
Where=$YOUR_MOUNT_PATH
TimeoutIdleSec=10
[Install]
WantedBy=multi-user.target
4.2. 磁盘分区
[Type]
和 [Options]
对于磁盘设备是可选的。为减少对 SSD 设备的不必要写入,建议使用 noatime
选项。
4.2.1. 挂载单元
根据 $YOUR_MOUNT_PATH.mount
命名文件:
[Unit]
Description=Mount build partition
[Mount]
What=/dev/disk/by-uuid/$UUID
Where=$YOUR_MOUNT_PATH
Type=ext4
Options=rw,noatime
[Install]
WantedBy=multi-user.target
4.3. USB 设备分区
[Type]
和 [Options]
对于磁盘设备是可选的。为减少对 SSD 设备的不必要写入,建议使用 noatime
选项。
4.3.1. 挂载单元
根据 $YOUR_MOUNT_PATH.mount
命名文件:
[Unit]
Description=Mount USB backup device partition
[Mount]
What=/dev/disk/by-uuid/$UUID
Where=$YOUR_MOUNT_PATH
Type=ext4
Options=rw,noatime
[Install]
WantedBy=multi-user.target
4.3.2. USB分区自动挂载单元
根据 $YOUR_MOUNT_PATH.mount
命名文件:
[Unit]
Description=Automount USB backup partition
[Automount]
Where=$YOUR_MOUNT_PATH
TimeoutIdleSec=10
[Install]
WantedBy=multi-user.target
4.4. NFS 网络共享
4.4.1. 挂载单元
根据 $YOUR_MOUNT_PATH.mount
命名文件:
[Unit]
Description=Mount NAS Video share using NFS
[Mount]
What=$YOUR_SERVER:/$YOUR_SHARE
Where=$YOUR_MOUNT_PATH
Type=nfs
Options=_netdev,auto
[Install]
WantedBy=multi-user.target
4.4.2. 自动挂载单元
根据 $YOUR_MOUNT_PATH.automount
命名文件:
[Unit]
Description=Automount video share usuing NFS
[Automount]
Where=$YOUR_MOUNT_PATH
TimeoutIdleSec=10
[Install]
WantedBy=multi-user.target
4.5. 用于 FTP 服务器的 MOUNT 单元
使用 curlftpfs 也可以将用户名和密码存储在只有 root 可读的安全位置。
- 您可以将用户和密码放在执行 CurlFtpFS 的用户的主目录中的 .netrc 文件中。它可以有 600 个权限。它仍然是明文,但至少不是所有人都可以访问:
machine ftp.host.com
login myuser
password mypass
4.5.1. 挂载单元
根据 $YOUR_MOUNT_PATH.mount
命名文件:
[Unit]
Description=Mount FTP server (ftp.server.tld) using curlftpfs
Wants=network-online.service
[Mount]
What=curlftpfs#ftp.server.tld
Where=$YOUR_MOUNT_PATH
Type=fuse
Options=rw,nosuid,uid=$UID,gid=$GID,allow_other,user=$FTPUSER:$FTPPASS
[Install]
WantedBy=remote-fs.target
WantedBy=multi-user.target
4.5.2. 自动挂载单元
根据 $YOUR_MOUNT_PATH.automount
命名文件:
[Unit]
Description=Automount ftp server ftp.server.tld
[Automount]
Where=$YOUR_MOUNT_PATH
TimeoutIdleSec=300
[Install]
WantedBy=multi-user.target
4.6 WEBDAV
-
Install
davfs2
from the AUR -
编辑文件
/etc/davfs2/secrets
并附加您的 webdav 服务和凭据:
http(s)://地址:<端口>/路径 davusername "davpassword"
- 或在
~/.davfs2/secrets
为用户特定的挂载创建一个用户文件。
4.6.1. 挂载单元
根据 $YOUR_MOUNT_PATH.mount
命名文件:
[Unit]
Description=Mount WebDAV Service on server https://host:port/path
Wants=network-online.service
[Mount]
What=http(s)://address:<port>/path
Where=$YOUR_MOUNT_PATH
Options=rw,_netdev
Type=davfs
TimeoutSec=15
[Install]
WantedBy=remote-fs.target
WantedBy=multi-user.target
4.6.2. 自动挂载单元
根据 $YOUR_MOUNT_PATH.automount
命名文件:
[Unit]
Description=Mount WebDAV Service
[Automount]
Where=$YOUR_MOUNT_PATH
TimeoutIdleSec=300
[Install]
WantedBy=multi-user.target
5. 配置生效
想让修改后的 systemd 配置文件生效、首先需要重载以下 systemd 的守护进程,才能正常启用配置好的挂载点。
后续进入挂载路径就会自动完成相关文件的挂载了。
sudo systemctl daemon-reload
sudo systemctl enable data-1tb.automount --now
cd $YOUR_MOUNT_POINT