Retire Kernel Lock del dispositivo USB de almacenamiento masivo desmontado de la línea de comandos en Linux

1

He buscado por todas partes, y no puedo entender esto. Tengo una cámara Olympus más antigua (2001 más o menos). Cuando conecto la conexión USB, obtengo la siguiente salida de registro:

$ dmesg | grep sd
[20047.625076] sd 21:0:0:0: Attached scsi generic sg7 type 0
[20047.627922] sd 21:0:0:0: [sdg] Attached SCSI removable disk

En segundo lugar, la unidad no está montada en el FS, pero cuando ejecuto gphoto2 aparece el siguiente error:

$ gphoto2 --list-config

*** Error ***              
An error occurred in the io-library ('Could not lock the device'): Camera is already in use.
*** Error (-60: 'Could not lock the device') ***       

Qué comando desmontará la unidad. Por ejemplo, en Nautilus, puedo hacer clic derecho y seleccionar "Quitar dispositivo con seguridad". Después de hacer eso, se eliminan los dispositivos / dev / sg7 y / dev / sdg.

La salida de gphoto2 es entonces:

# gphoto2 --list-config
/Camera Configuration/Picture Settings/resolution                              
/Camera Configuration/Picture Settings/shutter
/Camera Configuration/Picture Settings/aperture
/Camera Configuration/Picture Settings/color
/Camera Configuration/Picture Settings/flash
/Camera Configuration/Picture Settings/whitebalance
/Camera Configuration/Picture Settings/focus-mode
/Camera Configuration/Picture Settings/focus-pos
/Camera Configuration/Picture Settings/exp
/Camera Configuration/Picture Settings/exp-meter
/Camera Configuration/Picture Settings/zoom
/Camera Configuration/Picture Settings/dzoom
/Camera Configuration/Picture Settings/iso
/Camera Configuration/Camera Settings/date-time
/Camera Configuration/Camera Settings/lcd-mode
/Camera Configuration/Camera Settings/lcd-brightness
/Camera Configuration/Camera Settings/lcd-auto-shutoff
/Camera Configuration/Camera Settings/camera-power-save
/Camera Configuration/Camera Settings/host-power-save
/Camera Configuration/Camera Settings/timefmt

Algunas cosas que he probado ya son sdparmy sg3_utils, sin embargo, no estoy familiarizado con ellas, por lo que es posible que simplemente no haya encontrado el comando correcto.

Actualización 1:

# mount | grep sdg
# mount | grep sg7
# umount /dev/sg7
umount: /dev/sg7: not mounted
# umount /dev/sdg
umount: /dev/sdg: not mounted
# gphoto2 --list-config

*** Error ***              
An error occurred in the io-library ('Could not lock the device'): Camera is already in use.
*** Error (-60: 'Could not lock the device') ***       
cmcginty
fuente
Si recuerdo correctamente, gphoto2solo trata con dispositivos MTP / PTP, no con almacenamiento masivo ...
Grawity
lo siento, tal vez mi terminología está desactivada, pero funciona cuando
desmonto
ninguna solución hasta el momento, alguna idea?
cmcginty
¿gvfs-mount no funciona entonces? (ver mi respuesta)
Peter Jaric
La solución de Peter Janic funcionó muy bien para mí. Un dispositivo montado en ptp no aparece con el comando "mount", pero "gvfs-mount -l" y "gvfs-mount -u" funcionan en mi nikon d70 montado en ptp. Gracias Peter!
cdaaawg

Respuestas:

1

Método rápido y sucio

Para desactivar la fuerza bruta de todos los dispositivos de almacenamiento masivo activos:

rmmod usb_storage

Evite que cualquier dispositivo cargue el módulo usb_storage

Encontré el siguiente enlace, básicamente haciendo la misma pregunta que esta . Si desea evitar que el núcleo se monte automáticamente usando usb_storage:

echo "blacklist usb_storage" | sudo tee /etc/modprobe.d/blacklist-usb-storage.conf

Evitar que un solo dispositivo cargue el módulo usb_storage

En lugar de deshabilitar todos los dispositivos, puede apuntar a un dispositivo específico para ignorarlo usando las reglas de udev. Hay un ejemplo específico aquí .

Pasé mucho tiempo tratando de hacer que esto funcione en Ubuntu 10.04, pero parece que esta funcionalidad estaba deshabilitada en las versiones más recientes de udev .

"Quitar disco de forma segura" Desvincular / No reclamar código fuente

La última publicación en este hilo funcionó de maravilla.

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <linux/ioctl.h>
#include <linux/usbdevice_fs.h>

int main(int argc, char**argv)
{
   struct usbdevfs_ioctl command;
   int ret;
   int fd;
   int i;
   if (argc>1) {
      fd = open(argv[1],O_RDWR);
      if (fd<1){
         perror("unable to open file");
         return 1;
      }
      for (i=0;i<255;i++){ // hack: should fetch how many interface there is.
         command.ifno = i;
         command.ioctl_code = USBDEVFS_DISCONNECT;
         command.data = NULL;
         ret = ioctl(fd, USBDEVFS_IOCTL, &command);
         if(ret!=-1)
            printf("un claimed interface %d %d\n",i,ret);
      }
   }else {
      printf ("usage: %s /dev/bus/usb/BUS/DEVICE\n",argv[0]);
      printf("Release all interfaces of this usb device for usage in virtualisation\n");
   }
}

Script simple para dispositivo de enlace / desvinculación

El ejemplo anterior es un caso interesante, pero también encontré un método mucho más simplificado. Puede usar la interfaz del controlador de almacenamiento usb para vincular y desvincular dispositivos .

El siguiente comando funcionó, al igual que el código fuente de arriba:

echo -n "1-2.4:1.0" | sudo tee unbind    
cmcginty
fuente
0

Primero, ejecutar mountcomo root. Esto debería enumerar todos los sistemas de archivos montados. Si /dev/sdgy /dev/sg7no están en la lista, la cámara ya no está montada.

Si la cámara todavía está montada, puede desmontarla con el comando umount(observe la 'n' que falta). Un ejemplo sería umount /dev/sg7o umount /dev/sdg.

Si la cámara tiene sistemas de archivos montados, entonces probablemente solo pueda buscar las fotos en Nautilus. La salida de mountle dirá dónde están montados los dispositivos en el sistema de archivos: solo busque la carpeta y comience a buscar las fotos.

Darth Android
fuente
Agregué el resultado de los comandos en la pregunta ... Estoy seguro de que lo intenté hace unos días;)
cmcginty
Además, supones que estoy tratando de descargar fotos, ese no es el caso.
cmcginty
@casey: / dev / sg7 no se hubiera montado de todos modos, es un dispositivo de control scsi, no un disco. / dev / sdg podría ser un dispositivo montable y podría ser una unidad particionada (en cuyo caso tendría que montar / dev / sdg1 o / dev / sdg2 o similar).
quack quijote
No se muestran particiones en / dev / sdg
cmcginty
0

¿Estás usando Ubuntu? Se habla de un error en 8.10, y aunque no estoy seguro de si esto se solucionó en la última versión, hay una solución alternativa que podría permitirle hacer ... lo que sea que esté tratando de hacer (ya que no está solo estoy descargando fotos). :PAGS

Darth Android
fuente
Parece similar, pero puedo hacer que gphoto funcione si simplemente desmonto el dispositivo de Nautilus primero. Me aseguraré de leerlo todo y probar las soluciones alternativas.
cmcginty
0

Hago esto en un script:

# If camera is mounted we need to unmount it
export CAMERA_MOUNT_POINTS=`gvfs-mount -l | grep gphoto2 | sed 's/.*\(gphoto2.*\)$/\1/' | uniq 2> $LOG_FILE`
for CAMERA_MOUNT_POINT in $CAMERA_MOUNT_POINTS
do
    echo Unmounting mounted camera from $CAMERA_MOUNT_POINT.
    gvfs-mount -u $CAMERA_MOUNT_POINT &> $LOG_FILE
done

No estoy seguro de que esto sea lo que necesita, pero podría serlo, ya que he tenido problemas similares.

EDITAR: Para explicar un poco: gvfs-mount -llistas de cosas montadas El resto de esa línea limpia la salida para producir solo una lista de cámaras montadas (y canaliza errores en un archivo de registro). Luego, el bucle desmonta todas las cámaras.

Peter Jaric
fuente
Cambié algo, y ahora gvfs_mount no enumera el dispositivo. Lo intentaré nuevamente después de reiniciar.
cmcginty
Entonces no funcionó, supongo, ya que buscaste otra línea.
Peter Jaric