我发现为了重新安装 USB 记忆棒,我必须将其物理断开,然后重新连接。如果没有如此劳累的体力活动,我怎样才能做到这一点呢?
答案1
这是我在 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
$
所以,只有分区有/dev/disk/by-uuid
;而磁盘和分区都有(不同的)/dev/disk/by-id
.
现在,如果我在 Lucid 中的 Gnome2 桌面的 Disk Mounter 小程序中左键单击任一分区条目,我只会得到两个条目:“打开”或“弹出”(如[已解决] 如何在 lynx 中使用 nautilus 重新安装 USB 驱动器?, 从@托马斯' 答案,指的是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
所以,正如评论中提到的@ultrasawblade,确实磁盘在那里,但没有分区 - 不过,我想我需要分区作为设备, 为了mount
。
另外,与桌面 GUI 中左键单击+“弹出”的行为相同,我可以使用sudo eject /dev/sdb
.请注意,也可以打开palimpsest
,从那里单击两个分区中的每一个,然后单击“卸载卷” - 此时,分区的图标将出现仍然显示在磁盘安装程序小程序中,但会被标记为未安装;然后我们可以做sudo udisks --detach /dev/sdb
:这使得图标从 Disk Mounter 小程序中消失 - 而且该/dev/sdb
设备也将不再出现在系统上(但是,lsusb
仍然会显示该设备)!
在搜索了相当多的答案之后(尝试了udevadm monitor --environment
插入和拔出期间的内容,通过复制所有操作udevadm trigger
,研究BLKRRPART
ioctl 的作用),但没有任何成功 - 我终于偶然发现如何在不移除并重新插入的情况下重新安装 USB 记忆棒 - Ubuntu/Debian,其中有答案:
sudo eject -t /dev/sdb
运行此命令后 - 两个分区再次出现在 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.
...您绝对想不到它也适用于 USB 闪存/拇指驱动器! (我什至尝试调查系统实用程序/eject.c,我看不到任何明显的东西:)
)
当然,如果sudo udisks --detach /dev/sdb
之前已经运行过,则/dev/sdb
不会存在,因此eject -t /dev/sdb
会失败并显示eject: unable to find or open device for: '/dev/sdb'
.在这种情况下,USB 电源循环如中所述#7457 如何重新连接逻辑上断开的 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'
这使得分区的图标再次显示在 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
答案2
根据我在 Ubuntu 中的经验,当您从 Nautilus 中“弹出”USB 记忆棒时,该设备实际上会从系统中消失。我不知道为什么会这样,但 Nautilus 和命令行都无法将其恢复。我猜逻辑是,一旦您弹出 USB 记忆棒,您就不会再想要它了,而是会断开它的连接。
我解决这个问题的方法(当需要时)是使用umount
而不是 Nautilus。您也可以调用sync
将文件系统缓冲区刷新到磁盘。
刚刚找到一个包含更多信息的线程:http://ubuntuforums.org/showthread.php?t=1477247
所以基本上要么a)在没有补丁的情况下从源代码重建nautilus(并在更新系统时保持最新......)或b)使用另一个文件管理器(至少在卸载时^^)。
答案3
至少在基于 Debian 的系统上,您应该能够执行以下操作:
- 弄清楚驱动器号应该是什么...我要在这里说 /dev/sdb 作为示例。
- 双击“将是”的驱动器盘符,以有效地重新打开设备电源。
- 利润!
这之所以有效,是因为……魔法。
# determine 'would be drive letter'
lsblk
# do magic
eject /dev/sdb; sleep 1; eject -t /dev/sdb