如何枚举连接的 USB 存储设备 Ubuntu Java
How to enumerate connected USB storage devices Ubuntu Java
我有一个应用程序,主要在 Java' 中,它通过网页 GUI(由 Ubuntu 机器提供服务)控制机载红外摄像机,当计算机启动时自动启动 运行通电并接近引导结束。该应用程序以用户身份运行,而不是 root,即使用户未登录也是如此。
采集大量图像后,需要使用rsync 将数据存档到操作员USB 驱动器上的文件夹中。我需要安装 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 驱动器使用以上信息?
首先安装 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;
}
我有一个应用程序,主要在 Java' 中,它通过网页 GUI(由 Ubuntu 机器提供服务)控制机载红外摄像机,当计算机启动时自动启动 运行通电并接近引导结束。该应用程序以用户身份运行,而不是 root,即使用户未登录也是如此。
采集大量图像后,需要使用rsync 将数据存档到操作员USB 驱动器上的文件夹中。我需要安装 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 驱动器使用以上信息?
首先安装 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;
}