Comment remonter une clé USB après démontage de Nautilus sans la déconnecter?

25

Je trouve que pour remonter une clé USB, je dois la déconnecter physiquement, puis la reconnecter. Comment puis-je faire cela sans une telle action physique fatigante?

tshepang
la source
3
Le périphérique USB est logiquement déconnecté (il devrait y avoir un message à cet effet vos journaux de noyau). Il n'aura plus d' /deventrée, et l'IIRC n'apparaîtra pas non lsusbplus. Je ne sais pas s'il y a un moyen de le reconnecter.
Gilles 'SO- arrête d'être méchant'
Cette question est très similaire à: superuser.com/questions/1163375/…
Dennis Benzinger

Réponses:

8

D'après mon expérience dans Ubuntu, lorsque vous "éjectez" une clé USB depuis Nautilus, l'appareil disparaît réellement du système. Je ne sais pas pourquoi c'est, mais ni Nautilus ni la ligne de commande ne peuvent le récupérer. Je suppose que la logique est qu'une fois que vous éjectez une clé USB, vous ne la voulez plus, mais vous allez la déconnecter.

La façon dont je travaille autour de cela (si nécessaire), consiste à utiliser umountau lieu de Nautilus. Vous pouvez également simplement appeler syncpour vider les tampons du système de fichiers sur le disque.

Je viens de trouver un fil qui contient plus d'informations: http://ubuntuforums.org/showthread.php?t=1477247

Donc, fondamentalement, soit a) Reconstruisez nautilus à partir de la source sans ce correctif (et gardez-le à jour lorsque vous mettez à jour votre système ...) ou b) utilisez un autre gestionnaire de fichiers (au moins lors du démontage ^^).

Thomas
la source
2
Vérifiez /dev/disk/by-idet voyez si l'appareil est vraiment parti. Je parie que ce n'est pas le cas, et peut être remonté à partir de là avec une mountcommande.
LawrenceC
1
@ultrasawblade /dev/disk/by-idcontient des liens symboliques vers des fichiers de périphérique dans /dev, par exemple /dev/disk/by-id/usb-Kingston_DT_100_G2_001CC0C60DBDFC90D32923CE-0:0 -> ../../sdb. Lorsque l'appareil est parti après udisks --eject(ce qui, je suppose, se produit ici), le lien symbolique est périmé et ne peut pas être utilisé pour le remontage.
PointedEars
16

Voici le comportement que j'ai sur mon système Ubuntu Lucid:

Lorsque je branche ma clé USB / clé USB à deux partitions, le système signale:

$ 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
$

Ainsi, seules les partitions ont /dev/disk/by-uuid; tandis que le disque et les partitions ont (différents) /dev/disk/by-id.

Maintenant, si je clique avec le bouton gauche sur l'une des entrées de partition dans l'applet Disk Mounter du bureau Gnome2 dans Lucid, je n'obtiens que deux entrées: "Open" ou "Eject" (comme mentionné dans [RESOLU] Comment remontez-vous une clé USB avec nautilus en lynx?, de la réponse de @Thomas , faisant référence à un 16_hide_unmount.patch ). En outre, palimpsestici montre deux partitions pour le disque.

Lorsque je clique sur Éjecter sur l'une des partitions, elles disparaissent toutes les deux; à ce stade, palimpsestaffiche le disque, mais pas de partitions, et un message "Aucun support trouvé" à la place; également:

$ 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

Ainsi, comme mentionné dans le commentaire de @ultrasawblade , en effet, le disque est là, mais pas les partitions - bien que, je pense que j'aurais besoin des partitions en tant que périphériques , pour le faire mount.

En outre, le même comportement que le clic gauche + "Éjecter" dans l'interface graphique du bureau, je peux obtenir dans le terminal avec sudo eject /dev/sdb. Notez que l'on peut également ouvrir palimpsest, à partir de là, cliquez sur chacune des deux partitions, puis cliquez sur "Démonter le volume" - à ce stade, les icônes des partitions seront toujours affichées dans l'applet Disk Mounter, mais seront notées comme non montées; et puis on peut faire sudo udisks --detach /dev/sdb: cela fait disparaître les icônes de l'applet Disk Mounter - mais aussi le /dev/sdbpériphérique ne sera plus présent sur le système (cependant, il lsusbmontrera toujours le périphérique)!

Après avoir cherché un peu la réponse (des trucs essayés udevadm monitor --environmentpendant le branchement et le débranchement, avec la réplication de toutes les actions via udevadm trigger, pour regarder ce que fait l' BLKRRPARTioctl), sans succès - j'ai finalement trouvé comment remonter une clé USB sans retirer ni réinsérer - Ubuntu / Debian , qui a la réponse:

sudo eject -t /dev/sdb

Après l'exécution de cette commande - les deux partitions apparaissent à nouveau dans l'applet Disk Mounter - sans débrancher / rebrancher la clé USB !! C'est tout étranger, car si vous lisez man eject:

   -t   With  this  option the drive is given a CD-ROM tray close command.
        Not all devices support this command.

... vous ne vous attendez jamais à ce que cela s'applique à la clé USB / clé USB! (Et j'ai même essayé de regarder dans sys-utils / eject.c , et je ne vois rien d'évident :))

Bien sûr, s'il sudo udisks --detach /dev/sdba été exécuté précédemment, il /dev/sdbn'existera pas, il eject -t /dev/sdbéchouera donc avec eject: unable to find or open device for: '/dev/sdb'. Dans ce cas, le cycle d'alimentation USB comme indiqué dans # 7457 Comment reconnecter un périphérique USB déconnecté logiquement? m'a aidé à récupérer:

$ 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'

Cela a fait réafficher les icônes des partitions dans l'applet Disk Mounter, directement comme monté; pour trouver la bonne adresse, essayez pendant que le disque est monté:

$ 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
sdaau
la source
1
tl; dr: La commande pour "insérer" à nouveau une clé USB éjectée est eject -t /dev/<DEVICE>.
Dennis Benzinger
4

Sur les systèmes basés sur Debian, au moins, vous devriez pouvoir faire ceci:

  1. comprendre ce que la lettre de lecteur devrait être ... Je vais dire / dev / sdb ici pour l'exemple.
  2. Double éjectez la lettre de lecteur «serait» pour rallumer efficacement l'appareil.
  3. Profit!

Cela fonctionne parce que ... magique.

# determine 'would be drive letter'
lsblk
# do magic
eject /dev/sdb; sleep 1; eject -t /dev/sdb
Karl N. Redman
la source