资源地图

使用udisk来让Linux自动挂载USB硬盘和U盘

本文发布于630天前,最后更新于 630 天前,其中的信息可能已经有所发展或是发生改变。

前言

虽然可以使用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 storage # 替换成自己的用户名

并为/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.

—— udisks - ArchWiki

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

引用

udisks - ArchWiki [https://wiki.archlinux.org/title/Udisks]

Permissions · coldfix/udiskie Wiki · GitHub [https://github.com/coldfix/udiskie/wiki/Permissions]