从 Nautilus 卸载后如何在不断开连接的情况下重新安装 USB 记忆棒?

tsh*_*ang 28 linux usb mount usb-drive

我发现为了重新安装 U 盘,我必须物理断开它,然后重新连接它。如果没有如此累人的身体动作,我怎么能做到这一点?

sda*_*aau 19

这是我在 Ubuntu Lucid 系统上的行为:

当我插入有两个分区的 USB 闪存/拇指驱动器时,系统报告:

$ ls /dev/sdb*
/dev/sdb  /dev/sdb1  /dev/sdb2

$ udisks --show-info /dev/sdb | grep -A2 'partition table\|by-id'
    by-id:                     /dev/disk/by-id/usb-takeMS_USB_Mini_AA07013000010057-0:0
    by-path:                   /dev/disk/by-path/pci-0000:00:1d.7-usb-0:2:1.0-scsi-0:0:0:0
  detected at:                 Mon 29 Apr 2013 02:16:50 PM CEST
--
  partition table:
    scheme:                    mbr
    count:                     2

$ udisks --show-info /dev/sdb1 | grep -A2 'partition table\|by-id'
    by-id:                     /dev/disk/by-id/usb-takeMS_USB_Mini_AA07013000010057-0:0-part1
    by-id:                     /dev/disk/by-uuid/581E-EE0B
    by-path:                   /dev/disk/by-path/pci-0000:00:1d.7-usb-0:2:1.0-scsi-0:0:0:0-part1
  detected at:                 Mon 29 Apr 2013 04:24:25 PM CEST

$ udisks --show-info /dev/sdb2 | grep -A2 'partition table\|by-id'
    by-id:                     /dev/disk/by-id/usb-takeMS_USB_Mini_AA07013000010057-0:0-part2
    by-id:                     /dev/disk/by-uuid/4A0E-A166
    by-path:                   /dev/disk/by-path/pci-0000:00:1d.7-usb-0:2:1.0-scsi-0:0:0:0-part2
  detected at:                 Mon 29 Apr 2013 04:24:25 PM CEST

$ udevadm info --query=all --name=/dev/sdb | grep DEVPATH
E: DEVPATH=/devices/pci0000:00/0000:00:1d.7/usb1/1-2/1-2:1.0/host13/target13:0:0/13:0:0:0/block/sdb    
$ udevadm info --query=all --name=/dev/sdb1 | grep DEVPATH
E: DEVPATH=/devices/pci0000:00/0000:00:1d.7/usb1/1-2/1-2:1.0/host13/target13:0:0/13:0:0:0/block/sdb/sdb1
$ udevadm info --query=all --name=/dev/sdb2 | grep DEVPATH
E: DEVPATH=/devices/pci0000:00/0000:00:1d.7/usb1/1-2/1-2:1.0/host13/target13:0:0/13:0:0:0/block/sdb/sdb2
$ sudo partprobe /dev/sdb
$
Run Code Online (Sandbox Code Playgroud)

所以,只有分区有/dev/disk/by-uuid;而磁盘和分区都有(不同的)/dev/disk/by-id.

现在,如果我左键单击 Lucid 中 Gnome2 桌面中磁盘安装程序小程序中的任一分区条目,我只会得到两个条目:“打开”或“弹出”(如[已解决] 如何重新安装lynx 中带有 nautilus 的 USB 驱动器?,来自@Thomas的回答,指的是16_hide_unmount.patch)。此外,palimpsest这里显示了磁盘的两个分区。

当我单击任一分区上的“弹出”时 - 它们都消失了;此时,palimpsest显示磁盘,但没有分区,而是显示“未找到介质”消息;还:

$ ls /dev/sdb*
/dev/sdb

$ udisks --show-info /dev/sdb | grep -A2 'partition table\|by-id'
    by-id:                     /dev/disk/by-id/usb-takeMS_USB_Mini_AA07013000010057-0:0
    by-path:                   /dev/disk/by-path/pci-0000:00:1d.7-usb-0:2:1.0-scsi-0:0:0:0
  detected at:                 Mon 29 Apr 2013 02:16:50 PM CEST

$ udisks --show-info /dev/sdb1 | grep -A2 'partition table\|by-id'
$

$ udevadm info --query=all --name=/dev/sdb | grep DEVPATH
E: DEVPATH=/devices/pci0000:00/0000:00:1d.7/usb1/1-2/1-2:1.0/host13/target13:0:0/13:0:0:0/block/sdb
$ udevadm info --query=all --name=/dev/sdb1 | grep DEVPATH
device node not found

$ sudo partprobe /dev/sdb
Error: Error opening /dev/sdb: No medium found
Run Code Online (Sandbox Code Playgroud)

所以,正如@ultrasawblade在评论中提到的,确实是磁盘在那里,但不是分区-尽管,我认为我需要将分区作为设备,以便mount.

此外,与桌面 GUI 中的左键单击 +“弹出”相同的行为,我可以使用sudo eject /dev/sdb. 请注意,也可以打开palimpsest,从那里单击两个分区中的每一个,然后单击“卸载卷”-此时,分区的图标仍将显示在 Disk Mounter 小程序中,但会被标记为已卸载;然后可以这样做sudo udisks --detach /dev/sdb:这会使图标从磁盘安装程序小程序中消失-而且该/dev/sdb设备将不再出现在系统上(但是,lsusb仍会显示该设备)!

在搜索了相当多的答案之后(udevadm monitor --environment在插入和拔出期间尝试了一些东西,通过复制所有操作udevadm trigger,查看BLKRRPARTioctl 的作用),没有任何成功 - 我终于偶然发现了如何在不移除和重新插入的情况下重新安装 USB 记忆棒- Ubuntu/Debian,它有答案:

sudo eject -t /dev/sdb
Run Code Online (Sandbox Code Playgroud)

运行此命令后 - 两个分区再次出现在 Disk Mounter 小程序中 - 无需拔下/重新插入 USB 密钥!!这都是陌生人,因为如果你读到man eject

   -t   With  this  option the drive is given a CD-ROM tray close command.
        Not all devices support this command.
Run Code Online (Sandbox Code Playgroud)

... 你绝对想不到它适用于 USB 闪存/拇指驱动器!(我什至尝试查看sys-utils/eject.c,但我看不到任何明显的东西:)

当然,如果sudo udisks --detach /dev/sdb之前已经运行过,那么/dev/sdb将不存在,所以eject -t /dev/sdb会失败eject: unable to find or open device for: '/dev/sdb'。在这种情况下,如#7457 如何重新连接逻辑断开的 USB 设备中所述的 USB 电源循环帮助我恢复:

$ sudo sh -c 'echo suspend > /sys/bus/usb/devices/1-2/power/level'
$ sudo sh -c 'echo auto > /sys/bus/usb/devices/1-2/power/level'
Run Code Online (Sandbox Code Playgroud)

这使得分区的图标再次显示在 Disk Mounter 小程序中,直接显示为已安装;要找到正确的地址,请在安装磁盘时尝试:

$ udevadm info --attribute-walk --name=/dev/sdb | grep "looking\|busnum\|devnum" | grep -B1 'busnum\|devnum'
  looking at parent device '/devices/pci0000:00/0000:00:1d.7/usb1/1-2':
    ATTRS{busnum}=="1"
    ATTRS{devnum}=="13"
  looking at parent device '/devices/pci0000:00/0000:00:1d.7/usb1':
    ATTRS{busnum}=="1"
    ATTRS{devnum}=="1"

# the first (.../usb1/1-2) should be the right one, check bus/devnum:
$ lsusb -s 1:13
Bus 001 Device 013: ID 090c:1000 Feiya Technology Corp. Flash Drive

# looks good; check for symlinks in `sys/bus/usb/devices` as per "parent device" .../usb1/1-2
$ ls -la /sys/bus/usb/devices/ | grep "usb1/1-2"
lrwxrwxrwx 1 root root 0 2013-04-29 17:17 1-2 -> ../../../devices/pci0000:00/0000:00:1d.7/usb1/1-2
lrwxrwxrwx 1 root root 0 2013-04-29 17:21 1-2:1.0 -> ../../../devices/pci0000:00/0000:00:1d.7/usb1/1-2/1-2:1.0

# so it should be /sys/bus/usb/devices/1-2; check if it has power/level:
$ ls /sys/bus/usb/devices/1-2/power/level 
/sys/bus/usb/devices/1-2/power/level
Run Code Online (Sandbox Code Playgroud)

  • tl; dr:再次“插入”弹出的USB驱动器的命令是`eject -t /dev/<DEVICE>`。 (3认同)

小智 9

根据我在 Ubuntu 中的经验,当您从 Nautilus 中“弹出”一个 USB 记忆棒时,该设备实际上从系统中消失了。我不确定这是为什么,但 Nautilus 和命令行都无法恢复。我想逻辑是,一旦你弹出一个 USB 记忆棒,你就不想要它回来,而是要断开它。

我解决这个问题的方法(在需要时)是使用umount而不是 Nautilus。您也可以调用sync将文件系统缓冲区刷新到磁盘。

刚刚找到一个包含更多信息的线程:http : //ubuntuforums.org/showthread.php?t=1477247

所以基本上要么a)在没有那个补丁的情况下从源代码重建nautilus(并在更新系统时保持最新......)或b)使用另一个文件管理器(至少在卸载^^时)。

  • 检查`/dev/disk/by-id`,看看设备是否真的消失了。我敢打赌它不是,并且可以使用 `mount` 命令从那里重新安装。 (2认同)
  • @ultrasawblade `/dev/disk/by-id` 包含指向 `/dev` 中设备文件的*符号链接*,例如 `/dev/disk/by-id/usb-Kingston_DT_100_G2_001CC0C60DBDFC90D32923CE-0:0 -> ../。 ./sdb`。当设备在`udisks --eject`(我假设发生在这里)之后消失时,符号链接是陈旧的,不能用于重新安装。 (2认同)

小智 9

至少在基于 Debian 的系统上,您应该能够执行以下操作:

  1. 弄清楚驱动器号应该是什么...我要在这里说 /dev/sdb 作为示例。
  2. 双击“将是”的驱动器盘符,以有效地重新打开设备电源。
  3. 利润!

这之所以有效,是因为……魔法。

# determine 'would be drive letter'
lsblk
# do magic
eject /dev/sdb; sleep 1; eject -t /dev/sdb
Run Code Online (Sandbox Code Playgroud)