GNU/Linux >> Tutoriels Linux >  >> Linux

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

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

Lorsque je branche ma clé USB/clé USB qui a 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érent) /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 le [RESOLU] Comment remonter une clé USB avec nautilus dans lynx ?, de la réponse de @Thomas, faisant référence à un 16_hide_unmount.patch). Aussi, palimpsest montre ici deux partitions pour le disque.

Lorsque je clique sur Ejecter sur l'une ou l'autre des partitions, elles disparaissent toutes les deux ; à ce stade, palimpsest affiche le disque, mais pas de partitions, et un message "Aucun support trouvé" à la place ; aussi :

$ 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

Donc, 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 , afin de mount .

De plus, le même comportement que le clic gauche + "Ejecter" dans l'interface graphique du bureau, je peux entrer dans le terminal avec sudo eject /dev/sdb . Notez qu'on peut aussi 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 sera affiché dans l'applet Disk Mounter, mais sera noté comme non monté ; 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/sdb périphérique ne sera plus présent sur le système (cependant, lsusb affichera toujours l'appareil) !

Après avoir cherché un peu la réponse (j'ai essayé des trucs de udevadm monitor --environment pendant le branchement et le débranchement, avec réplication de toutes les actions via udevadm trigger , pour examiner ce que le BLKRRPART ioctl le fait), sans aucun succès - je suis finalement tombé sur 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 réapparaissent dans l'applet Disk Mounter - sans débrancher/rebrancher la clé USB !! C'est d'autant plus étrange, 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 attendriez jamais à ce qu'il 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, si sudo udisks --detach /dev/sdb a été exécuté précédemment, alors /dev/sdb n'existera pas, donc eject -t /dev/sdb échouera 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 logiquement déconnecté ? 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 apparaître à nouveau les icônes des partitions dans l'applet Disk Mounter, directement comme montées; 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

D'après mon expérience dans Ubuntu, lorsque vous "éjectez" une clé USB depuis Nautilus, le périphérique disparaît en fait du système. Je ne sais pas pourquoi, 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 voulez pas la récupérer, mais vous allez la déconnecter.

La façon dont je contourne cela (si nécessaire) consiste à utiliser umount au lieu de Nautilus. Vous pouvez également simplement appeler le sync pour 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, en gros, soit a) Reconstruisez Nautilus à partir des sources sans ce patch (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 ^^).


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

  1. découvrez quelle devrait être la lettre du lecteur... Je vais dire /dev/sdb ici pour l'exemple.
  2. Éjectez deux fois la lettre de lecteur « serait » pour rallumer efficacement l'appareil.
  3. Profitez !

Cela fonctionne parce que... la magie.

# determine 'would be drive letter'
lsblk
# do magic
eject /dev/sdb; sleep 1; eject -t /dev/sdb

Linux
  1. Comment démarrer à partir d'une clé USB dans VirtualBox sous Linux

  2. Comment créer une clé USB amorçable Linux à partir de la ligne de commande Linux

  3. Comment copier du texte depuis mon xterm sans souris ?

  4. Comment supprimer l'iso 9660 de l'USB ?

  5. Base de données MySql à partir d'une clé USB

Comment installer RHEL 8 depuis USB

Comment installer Ubuntu à partir d'une clé USB

Comment créer un ISO à partir d'une clé USB amorçable sous Linux

Comment démarrer à partir d'une clé USB dans Virtualbox sous Linux

Comment écrire une image ISO sur une clé USB à partir de la ligne de commande Linux ?

Comment puis-je rappeler une commande spécifique de l'historique des commandes, sans l'exécuter