Raspberry Pi 3 (Raspbian) 以编程方式访问 USB 驱动器:执行此操作的最佳方法?

Raspberry Pi 3 (Raspbian) programatically accessing a USB drive: best way to do this?

我 运行 Raspbian 1.0,v9/15 在 RP3 上。我正在开发一个应用程序,该应用程序将访问专用 USB 闪存驱动器来存储收集的数据。写入数据的静态路径是“/media/user/kingston”。这很好用,除非我有系统崩溃,此时“/media/user/kingston”的所有者和组更改为 root,闪存驱动器的安装点现在更改为“/media/user/kingston1”这(显然)不适用于我的应用程序中定义的静态路径。是否有可用于此设备和 OS 的标准动态路径选项?提前致谢...

更新: 根据 BJ Black 的建议,这是我在文件系统的根目录下创建名为 /usb 的目录后添加到 fstab 的内容,

/dev/sda1  /usb  vfat noatime,nofail,user,rw,exec,umask=000   0  3

优点是, 1) 即使没有插入 USB 驱动器也允许启动, 2) 允许在此处使用任何USB 存储设备。

缺点是在移除闪存驱动器之前必须关闭系统(或卸载驱动器)否则会发生不好的事情,(我试过这个)。问题:如果有人在 USB 仍处于安装状态时将其拔出,我可以做些什么来减少 "bad things"?提前致谢。

一般来说,我更喜欢使用硬挂载点来做这种事情。 /sys 中可能有一些巧妙的技巧(或者通过对 mount(1) 或 /proc/mounts 的输出使用 grep),但是一旦您将金士顿棒换成其他供应商,它们就会失败(呸)。

查看 this link 以更好地了解什么在自动挂载您的 U 盘以及如何关闭该机制。

至于固定安装,我会尝试:

  1. 创建一个挂载点(例如 /data)并在 fstab(5) 中添加一个条目,以便它在启动时自动挂载。
  2. 与 1 相同,但使用 noauto 和 user 并从您的应用程序中显式调用 mount(1),或者...
  3. 安装 autofs 并在 auto.misc 中添加一个条目以在使用时自动挂载设备(可能 /dev/sda1)。然后符号链接 /data -> /misc/data.

其中,我最喜欢选项3,因为棒会在闲置时自动卸载。那么您的应用程序只需事先仔细检查该路径是否可写。

写入时也要格外小心,因为便宜的 USB 记忆棒往往会大块擦除,而且它们的磨损均衡充其量也很弱(因此小的随机写入和大的写入往往会快速磨损闪存)。使用 f2fs 或仔细的写缓冲会有所帮助(挂载上的 noatime 选项也有帮助)。并且不要在您的应用中一直调用 fsync()!