我想在登录后安装分区,就像文件管理器在单击“设备”下未安装的设备时所做的那样。理想情况下,我想使用文件管理器使用的相同底层守护程序。
它不应该通过 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>