启动时以与文件管理器相同的方式挂载分区 - 而不是使用 /etc/fstab

启动时以与文件管理器相同的方式挂载分区 - 而不是使用 /etc/fstab

我想在登录后安装分区,就像文件管理器在单击“设备”下未安装的设备时所做的那样。理想情况下,我想使用文件管理器使用的相同底层守护程序。

它不应该通过 fstab 挂载。基本上,结果应该就像我登录后打开文件管理器并单击设备一样,无需提升权限,用户无法卸载,访问权限相同,文件层次结构中的位置相同(/media/user/partitionlabel-or-UUID)。

登录后 - 例如,可以为不同的用户安装不同的设备。

这怎么能做到呢?通过搜索,相关信息淹没在无数答案中/etc/fstab。建议的答案是登录时安装 samba fs,但这没有帮助。

答案1

如果您知道要查找什么,答案其实很简单。登录时自动挂载磁盘的一种 DE 不可知方法是使用udisksctl。它通常用于挂载循环设备,但也可以挂载驱动器。由于在后台用于文件管理器的自动挂载机制,因此必要的polkit规则已经存在udisks2。因此,它可以在不提升访问权限的情况下运行。

udisksctl mount -b /dev/sdn1或者udisksctl mount -b /dev/disk/by-label/<disklabel>从 下的命令行安装磁盘/media/<username>/<diskname or UUID>

udisksctl mount -b /dev/sdn1 2>/dev/null每次图形、非图形或远程登录后运行的添加到用户的行~/.profile,尝试安装磁盘,如果已安装,则会静默失败,因此用户不会因错误行而烦恼。

为了完整起见,如果需要的话~/.bash_logout,可以udisksctl unmount -b /dev/sdn1在注销时卸载该磁盘。

对于更广泛的解决方案,请将其放入~/.profile

# mount disk with specified label if unmounted and present
userdisks=( "disklabel 1" "disklabel 2" "disklabel 3" )
for disk in "${userdisks[@]}"
do
    if ! lsblk -l | grep -q $disk ; then
        udisksctl mount -b /dev/disk/by-label/$disk
    fi
done

并将其添加到~/.bash_logout

# unmounts disks at last logout of user
count=$(who | grep -c $(whoami))
if [ $count -eq 1 ] ; then
    userdisks=( "disklabel 1" "disklabel 2" "disklabel 3" )
    for disk in "${userdisks[@]}"
    do
        if lsblk -l | grep -q $disk ; then
           udisksctl unmount -b /dev/disk/by-label/$disk
        fi
    done
fi

您必须将所有要挂载的设备的标签放在以空格分隔的userdisks数组中。确保带空格的标签用引号括起来。

这会让用户知道磁盘已在命令行上安装,当磁盘已安装时会默默跳过安装,当磁盘丢失时会给出错误。

仅当最后一个用户会话注销时,磁盘才会被卸载。

ssh例如,当通过带有可移动设备的笔记本电脑登录时,此设置可以方便地节省时间。

答案2

总体来说,上面的答案是正确的,不过这是我的提示。对于我来说,解决方案lsblk -l | grep -q $disk没有奏效,因为出于某些原因,我的磁盘仍然在输出中。

我通过将该行更改为解决了该问题

lsblk -l -o MOUNTPOINT | grep <expected_mount_path>

相关内容