我希望能够自动挂载即时格式化的USB记忆棒fat32和ntfs,例如热插拔而不重启我的Raspberry Pi 2。

不能在fstab中放入UUID,因为我必须找到每个设备的UUID。我希望能够插入具有不同文件格式的不同USB设备并自动安装它们。这可能吗?

我也曾经一次将它与usbmount程序配合使用。在出现错误transport endpoint is not connected之前,我可以访问驱动器一秒钟。我重新安装了该程序,但是即使出现错误,我也再也没有达到那个程度。

#1 楼

经过大量研究,我可以使用usbmount解决问题:

将ntfs添加到usbmount


sudo apt-get install usbmount安装usbmount。
安装NTFS驱动程序软件包ntfs带有sudo apt-get install ntfs-3g的-3g。
通过使用sudo nano /etc/usbmount/usbmount.conf打开usbmount文件,将usbmount配置为挂载指定的文件系统。

这儿有一行叫做FILESYSTEMS=""。仅通过usbmount挂载了该行中指定的文件系统,因此我们将其更改为: ntfs-3g软件包有时会将NTFS设备列为fusblk,因此这两个是相同的。我真的不知道为什么。

此外,如果您未在配置中添加fuseblk,则拔出的NTFS设备不会自动卸载。它们将保持挂载状态,并保留安装到的文件夹,直到使用FILESYSTEMS="vfat ntfs fuseblk ext2 ext3 ext4 hfsplus"->手动卸载设备为止,其中sda1可能是另一个变量。在这里,您可以指定应挂载的文件系统以及应如何挂载它们。 )和
fuseblk(再次为NTFS)已安装。我认为大多数参数可以保持不变。再次在这里只需添加ntfs-3g(添加ntfs-3g而不是ntfs)和fuseblk即可挂载所有NTFS文件。要获取更多文件系统,请添加更多以unmount /dev/sda1开头的行。几秒钟。此修复程序来自Christian Weinberger。


使用FS_MOUNTOPTIONS=""在/etc/udev/rules.d/中创建文件usbmount.rules。

这是内容:

KERNEL=="sd*", DRIVERS=="sbp2",         ACTION=="add",  PROGRAM="/bin/systemd-escape -p --template=usbmount@.service $env{DEVNAME}", ENV{SYSTEMD_WANTS}+="%c"
KERNEL=="sd*", SUBSYSTEMS=="usb",       ACTION=="add",  PROGRAM="/bin/systemd-escape -p --template=usbmount@.service $env{DEVNAME}", ENV{SYSTEMD_WANTS}+="%c"
KERNEL=="ub*", SUBSYSTEMS=="usb",       ACTION=="add",  PROGRAM="/bin/systemd-escape -p --template=usbmount@.service $env{DEVNAME}", ENV{SYSTEMD_WANTS}+="%c"
KERNEL=="sd*",                          ACTION=="remove",       RUN+="/usr/share/usbmount/usbmount remove"
KERNEL=="ub*",                          ACTION=="remove",       RUN+="/usr/share/usbmount/usbmount remove"



FS_MOUNTOPTIONS="-fstype=ntfs-3g,nls=utf8,umask=007,gid=46 -fstype=fuseblk,nls=utf8,umask=007,gid=46 -fstype=vfat,gid=1000,uid=1000,umask=007"在/ etc / systemd / system /中创建文件usbmount @ .service。

这是内容:

[Unit]
BindTo=%i.device
After=%i.device

[Service]
Type=oneshot
TimeoutStartSec=0
Environment=DEVNAME=%I
ExecStart=/usr/share/usbmount/usbmount add
RemainAfterExit=yes


现在重新启动,并使用-fstype=检查USB设备安装到的文件夹。默认情况下,它们被安装到/ media / usbstick0。

来源:

评论


此解决方案还需要几个步骤,请参阅我的答案。

– AbiusX
17年11月1日在19:08

@ f-untermoser:您能在这里看看我有关usbmount的问题吗:superuser.com/questions/1603086/…?

– wewa
20-11-18在13:58

#2 楼

Untermoser的答案是正确的,但是它将破坏一些usbmount功能。

因为他使用Systemd单元生成要挂载的进程(以启用NTFS),所以不再将环境变量$DEVPATH发送到usbmount add命令,导致符号链接创建失败。

要解决此问题,请运行以下命令:

sed -i '/# Determine vendor/,/if/ s/\(.*vendor=\)/if [ -z "$DEVPATH" ]; then DEVPATH="$(udevadm info --query=path --name=\/$DEVNAME)"; fi\n/g' /usr/share/usbmount/usbmount


上面的命令会重新创建$DEVPATH不可用。

关于usbmount remove,usbmount中还有另一个错误。它遍历挂载点,并且在usmount config中定义的挂载被卸载。但是,如果找到匹配项但不在该列表中,请删除中断并不执行任何操作。如果您为一个USB创建多个安装点,这尤其重要,因为usbmount会看到第一个并且不执行任何操作。

要修复,需要进行以下更改:

sed -i '/umount.d ||/,/break/ s/break.*//; /umount.d ||/,/done/ s/:/:\n\t\tbreak 2/' /usr/share/usbmount/usbmount


这会将中断移动到内部循环内(保证成功,并中断2步)。

#3 楼

对于那些试图在更新的Stretch(Lite)上使用相同功能并发现Untermoser和AlbiusX的答案没有卸载vfat驱动器的用户,除了提供的答案外,您还需要按照以下额外步骤进行操作:

在终端中运行以下命令:

sudo mkdir -p /etc/systemd/system/systemd-udevd.service.d/

这将创建所需的所需文件夹。接下来,在此处创建一个conf文件,例如:

sudo nano /etc/systemd/system/systemd-udevd.service.d/shared-mount-ns.conf

在此文件中添加以下行:

[Service] MountFlags=shared

这将更改systemd-udevd的专用文件系统名称空间的默认行为,以使用共享的名称空间,这等效于jessie中udev的行为。 / questions / 330094 / udev-rule-to-mount-disk-does-not-work / 330156#330156)

评论


所以这一直都是问题-我一直在寻找过时的文档。我在Pi上运行Linux raspberrypi 4.14.79-v7 +,以供参考

– ctietze
19年5月31日在7:47