type
Post
status
Published
slug
2022/12/23/use-systemd-mount-any-device
summary
tags
思考
工具
Linux
category
Linux
icon
password
new update day
Property
Oct 22, 2023 01:31 PM
created days
Last edited time
Oct 22, 2023 01:31 PM
大家平时在 Linux 上实现开机挂载其它硬盘、一般都是对 /etc/fstab 文件进行修改,将我们需要开机挂载的硬盘条目添加到改文件最下面,但是这种方法有一个非常严重的弊端
💡
一旦你写在 fstab 文件里面的硬盘出现故障、或者连接不稳定,那么整个系统将会无法启动,直接 kernel panic
所以如果是直接连接到主板上的硬盘可以直接写在 fstab 文件里面(因为连接稳定)、而一些 USB 外置备份硬盘可以使用 systemd 进行硬盘挂载(硬盘的挂载操作将由 systemd 接管,不影响系统的启动过程,提高系统容错率)。

1 systemd 的示例挂载单元

这里的示例是对 systemd 挂载单元指南的补充
💡
请记住删除单元中的注释 - 它们不是为复制粘贴而写的,只是作为示例。 (注释是以#开头的文本)
如果你的设备像可移动设备和网络位置一样在启动时不可用,则应仅使用自动挂载单元。

2 重要规则

  • 对于内部设备,启用并启动 mount 单元。
  • 对于可移动设备—永远不要启用挂载(mount)单元,只启用自动挂载(automount)单元。
  • 如果挂载点不存在,挂载单元将创建挂载点。
  • 如果挂载单元处于活动状态,则自动挂载单元将失败
  • 自动挂载单元将在挂载点被访问时启动挂载单元,无论这是终端访问还是应用程序访问。

3 单元文件名(Unit file names)

本地系统单元文件存放在 /etc/systemd/system 目录下。

3.1 挂载单元(Mount unit)

挂载单元必须以扩展名为 .mount 的挂载点命名,因此如果您使用名为 /data/backup 的挂载点,则单元文件必须命名为 data-backup.mount

3.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")

4 挂载单元的内容

根据 What(挂载类型)、Type (文件系统类型)的不同,所以选项也不同。
  • What 标识你想挂载什么(磁盘、服务器、共享)?
  • Where 标识你希望它挂载在哪里(系统上的路径)?
  • Type 标识你的挂载是哪种类型(文件系统,cifs, nfs)?
  • Options 标识挂载时应该使用哪些选项(rw, auto, netdev)?

4.1 示例

如果您想挂载由名为 server 的本地NAS提供的名为 video 的 Samba 共享
  • What 你服务器与共享文件的名字 e.g. //server/video
  • Where 你想挂载的挂载点路径 e.g. /data/smb/video
  • Type 将是 cifs ,因为这就是这种类型的连接的名称
  • Options 给系统指出它是一个网络设备 _netdev, 能够进行读写操作 rw, 并且使用特定的用户组、用户名和密码进行连接(workgroup, username and password.)

5 挂载单元示例

5.1 SMB网络共享

包 smbclient 就足够了。凭据可以存储在只有 root 可读的位置。将 $VARIABLES 替换为您系统的值
💡
注意:根据 archlinux wiki,uid 和 gid 会导致 I/O 错误。

5.1.1 SMB 凭据

创建文件 /etc/smb.cred 或在用户的家目录中包含以下内容
user=$SMBUSER password=$SMBPASS workgroup=$WORKGROUP
使文件对用户只读
sudo chmod 600 /etc/smb.cred

5.1.2 SMB版本

如果需要,您可以将版本添加到选项字符串中,例如 vers=NT1

5.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

5.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

5.2 磁盘分区

[Type][Options] 对于磁盘设备是可选的。为减少对 SSD 设备的不必要写入,建议使用 noatime 选项。

5.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

5.3 USB 设备分区

[Type][Options] 对于磁盘设备是可选的。为减少对 SSD 设备的不必要写入,建议使用 noatime 选项。

5.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

5.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

5.4 NFS 网络共享

5.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

5.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

5.5 用于 FTP 服务器的 MOUNT 单元

使用 curlftpfs 也可以将用户名和密码存储在只有 root 可读的安全位置。
您可以将用户和密码放在执行 CurlFtpFS 的用户的主目录中的 .netrc 文件中。它可以有 600 个权限。它仍然是明文,但至少不是所有人都可以访问。
machine ftp.host.com login myuser password mypass

5.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

5.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

5.6 WEBDAV

Install davfs2 from the AUR
编辑文件 /etc/davfs2/secrets 并附加您的 webdav 服务和凭据
http(s)://地址:<端口>/路径 davusername "davpassword"
或者在 ~/.davfs2/secrets 为用户特定的挂载创建一个用户文件

5.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

5.6.2 自动挂载单元

根据 $YOUR_MOUNT_PATH.automount 命名文件
[Unit] Description=Mount WebDAV Service [Automount] Where=$YOUR_MOUNT_PATH TimeoutIdleSec=300 [Install] WantedBy=multi-user.target

6 配置生效

想让修改后的 systemd 配置文件生效、首先需要重载以下 systemd 的守护进程,才能正常启用配置好的挂载点。
后续进入挂载路径就会自动完成相关文件的挂载了。
sudo systemctl daemon-reload sudo systemctl enable data-1tb.automount --now cd $YOUR_MOUNT_POINT

7 参考资料

 
欢迎加入喵星计算机技术研究院,原创技术文章第一时间推送。
notion image
 
使用 CoreDNS 对抗 DNS 污染BPF 映射类型