【问题标题】:How to enumerate connected USB storage devices Ubuntu Java如何枚举连接的 USB 存储设备 Ubuntu Java
【发布时间】:2015-08-13 23:15:54
【问题描述】:

我有一个应用程序,主要是在 Java 中,它通过网页 GUI(由 Ubuntu 机器提供服务)控制机载红外摄像头,当计算机通电并接近启动结束时,它会自动开始运行。应用程序以用户身份运行,而不是 root,即使用户没有登录。

在收集了大量图像后,需要使用 rsync 将数据存档到操作员 U 盘上的文件夹中。我需要安装 USB 驱动器并知道它的名称标签。计算机是无头的,无论如何不能指望飞机上的操作员了解 Linux。

在 Ubuntu 上,我看到已登录并运行 xfce4 GUI,然后驱动器才会在 /media/user-name/drive-tag 中列出(我注意到 /media/username 归 root 所有,但为驱动器命名的文件夹归用户所有。)并显示在 /etc/mtab 中:

/dev/sdd1 /media/programmer/DATA-02-2TB vfat rw,nosuid,nodev,uid=1001,gid=1001,shortname=mixed,dmask=0077,utf8=1,showexec,flush,uhelper=udisks2 0 0

如何通过 Java 或通过 Java 和 bash 的组合来检测和挂载 USB 存储设备?

如果这不可行,我是否需要通过 GUI 要求用户输入设备标签或名称,例如“DATA-02-2TB”,然后创建挂载点并通过脚本挂载 USB 驱动器使用上述信息?

【问题讨论】:

  • 我不知道,现在如何在纯 java 中做到这一点。我需要阅读更多相关信息。不过在 Ubuntu 上,您可以在终端中简单地调用 lsusb 命令。它将显示有关 USB 端口和连接到它们的设备的信息。您可以使用-t 参数查看树形层次结构中的端口或使用-v 参数查看有关端口和连接设备的详细信息。它不能回答你的全部问题,但它可能是解决问题的起点。
  • 谢谢,假设 Bus 004 始终与两个端口绑定,那么我得到的是“LaCie, Ltd”(在这种情况下)制造的东西。

标签: java ubuntu-14.04 usb-drive


【解决方案1】:

首先安装usbmount,一个Ubuntu工具。

sudo apt-get update
sudo apt-get install usbmount

然后编辑 /etc/usbmount/usbmount.conf 文件:

sudo sed -i 's/MOUNTOPTIONS="/MOUNTOPTIONS="user,umask=000,/' /etc/usbmount/usbmount.conf

Serverfault 描述了这些步骤。请注意,仅支持一部分驱动器格式,包括普遍存在的 VFAT。

设置完成后,USB 外部驱动器和拇指驱动器将作为 /media/usb0 到 /media/usb7 安装在 /media 中,并将在 /etc/mtab 中列出。

/dev/sdc1 /media/usb0 vfat rw,noexec,nosuid,nodev,sync,noatime,nodiratime,umask=000 0 0

我已经在我的 14.04 机器上对此进行了测试。现在,如果我能得到驱动器标签。

编辑:sync 选项不适用于闪存驱动器。阅读 /etc/usbmount/usbmount.conf 文件以了解详细信息,并从该文件的相应行中删除“sync”。在我取消之前,使用 sync 选项进行的完整备份运行了一个多小时,但删除了 sync 只需要大约 5 分钟。请注意有关使用 pumount 卸载非同步驱动器的注释。

public static ArrayList<String> usbDriveList() throws FileNotFoundException {

    final String MTB_ADDRESS = "/etc/mtab";
    final String TARGET = "^/media/usb[0-7]$"; // REGEX

    final File file = new File(MTB_ADDRESS);
    final ArrayList<String> driveList = new ArrayList<String>();

    try (Scanner in = new Scanner(file)) {
        while (in.hasNext()) {
            final String[] splitLine = in.nextLine().split(" ");
            if (splitLine[1].matches(TARGET)) {
                driveList.add(splitLine[1]); // got it!
            }
        }
    } catch (final FileNotFoundException e) {
        throw new FileNotFoundException();
    }

    return driveList;
}

【讨论】:

    猜你喜欢
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多