使用udisk来让Linux自动挂载USB硬盘和U盘
本文发布于22天前,最后更新于 22 天前,其中的信息可能已经有所发展或是发生改变。

前言

虽然可以使用fstab 来在开机启动时自动挂载和计算机连接的硬盘设备,但是在系统运行阶段,对于新接入的设备,往往没有他的设备信息,此时如何让linux windows 一样自动挂载接入设备的分区呢。

这里我使用的工具是systemdudisks,以下是我的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.

—— 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

引用

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
Source: https://github.com/zhaoolee/ChineseBQB
Source: https://github.com/zhaoolee/ChineseBQB
Source: https://github.com/zhaoolee/ChineseBQB
颜文字
Emoji
小恐龙
花!
滑稽大佬
演奏
程序员专属
上一篇