前言
虽然可以使用fstab
来在开机启动时自动挂载和计算机连接的硬盘设备,但是在系统运行阶段,对于新接入的设备,往往没有他的设备信息,此时如何让linux
像 windows
一样自动挂载接入设备的分区呢。
这里我使用的工具是systemd
和udisks
,以下是我的linux
发行版简要信息:
OS: Arch Linux x86_64
Kernel: 6.11.5-zen1-1-zen
Shell: zsh 5.9
DE: Plasma 6.2.2
Memory: 8807MiB / 31570MiB
除开各个发行版安装软件包的差异,以下内容为通用解决方案
正文
udisk是作为一个服务进程运行的,并提供了 udisksctl(1) 命令行工具来与其交互,从而实现对系统存储设备的管理。
安装udisk2
首先安装udisk2
pacman -S udisk2
添加polkit权限
安装完毕后,在使用这个工具之前,我们要先为他添加polkit
权限,使得用户执行此命令时可以免密执行。
sudo touch /etc/polkit-1/rules.d/50-udiskie.rules
sudo chmod 644 /etc/polkit-1/rules.d/50-udiskie.rules
sudo gpasswd -a <username> storage # <username>替换成自己的用户名
并为/etc/polkit-1/rules.d/50-udiskie.rules添加以下内容
polkit.addRule(function(action, subject) {
var YES = polkit.Result.YES;
var permission = {
// required for udisks1:
"org.freedesktop.udisks.filesystem-mount": YES,
"org.freedesktop.udisks.luks-unlock": YES,
"org.freedesktop.udisks.drive-eject": YES,
"org.freedesktop.udisks.drive-detach": YES,
// required for udisks2:
"org.freedesktop.udisks2.filesystem-mount": YES,
"org.freedesktop.udisks2.encrypted-unlock": YES,
"org.freedesktop.udisks2.eject-media": YES,
"org.freedesktop.udisks2.power-off-drive": YES,
// required for udisks2 if using udiskie from another seat (e.g. systemd):
"org.freedesktop.udisks2.filesystem-mount-other-seat": YES,
"org.freedesktop.udisks2.filesystem-unmount-others": YES,
"org.freedesktop.udisks2.encrypted-unlock-other-seat": YES,
"org.freedesktop.udisks2.encrypted-unlock-system": YES,
"org.freedesktop.udisks2.eject-media-other-seat": YES,
"org.freedesktop.udisks2.power-off-drive-other-seat": YES
};
if (subject.isInGroup("storage")) {
return permission[action.id];
}
});
此时只要是在storage
用户组内的用户在执行udisksctl
时,都将可以使用--no-user-interaction
参数来跳过输入密码的过程。
添加监听服务进程
udevadm monitor
You may use
udevadm monitor
to monitor block events and mount drives when a new block device is created. Stale mount points are automatically removed by udisksd, such that no special action is required on deletion.
udevadm monitor
指令实现了对block events的监听,我们可以利用这个指令来获取新接入设备的blkid等信息,然后调用udisksctl挂载分区,从而实现新接入设备的自动挂载。好在archlinux wiki
已经提供了一个示范脚本来实现此功能
#!/bin/sh
pathtoname() {
udevadm info -p /sys/"$1" | awk -v FS== '/DEVNAME/ {print $2}'
}
stdbuf -oL -- udevadm monitor --udev -s block | while read -r -- _ _ event devpath _; do
if [ "$event" = add ]; then
devname=$(pathtoname "$devpath")
udisksctl mount --block-device "$devname" --no-user-interaction
fi
done
将他保存到~/.local/bin/start-udevadm-monitor
中(其他路径也可以,别忘了赋予可执行权限),我的家目录为/home/styunlen
,请根据自己的用户名做更改
然后再创建一个systemd
服务来在开机启动时自动运行这个脚本,这样我们就能持续监听硬盘接入事件,并自动挂载他啦~
首先使用下列命令创建service
文件,并将他的文件权限改为644
sudo touch /etc/systemd/system/udevadm-monitor.service
sudo chmod 644 /etc/systemd/system/udevadm-monitor.service
然后输入以下内容
[Unit]
Description=udevadm-monitor
[Service]
WorkingDirectory=/home/styunlen/.local/bin
ExecStart=/home/styunlen/.local/bin/start-udevadm-monitor
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target
最后输入以下命令启用他,就可以实现自动监听硬盘接入事件,并且自动挂载啦~
sudo systemctl enable --now udevadm-monitor.service