Remover o bloqueio de kernel do dispositivo USB de armazenamento em massa não montado da linha de comando no Linux

1

Eu pesquisei alto e baixo, e não consigo descobrir isso. Eu tenho uma câmera Olympus mais velha (2001 ou mais). Quando eu conecto a conexão USB, recebo a seguinte saída de log:

$ 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

Em segundo lugar, a unidade não está montada no FS, mas quando eu executo o gphoto2, recebo o seguinte erro:

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

Qual comando desmontará a unidade. Por exemplo, no Nautilus, eu posso clicar com o botão direito e selecionar "Remover dispositivo com segurança". Depois disso, os dispositivos / dev / sg7 e / dev / sdg são removidos.

A saída de gphoto2 é então:

# 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

Algumas coisas que eu já tentei são sdparm e sg3_utils , mas eu não estou familiarizado com elas, então é possível que eu não tenha encontrado o comando correto.

Atualização 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') ***       
    
por cmcginty 03.06.2010 / 13:07

4 respostas

1

Método Rápido e Sujo

Para uma desativação de força bruta de todos os dispositivos de armazenamento em massa ativos:

rmmod usb_storage

Impedir que qualquer dispositivo carregue o módulo usb_storage

Encontrei o seguinte link, basicamente perguntando o mesmo pergunta como esta . Se você quiser evitar que o kernel seja montado automaticamente usando usb_storage :

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

Impedir que um único dispositivo carregue o módulo usb_storage

Em vez de desativar todos os dispositivos, você pode segmentar um dispositivo específico para ignorar usando as regras do udev. Existe um exemplo específico aqui .

Eu passei muito tempo tentando fazer isso funcionar no Ubuntu 10.04, mas parece que essa funcionalidade era desativado em versões mais recentes do udev .

"Remover Disco com Segurança" Unbind / Unclaim Source Code

A última publicação deste tópico funcionou como um encanto.

#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 simples para dispositivo de ligação / desobstrução

O exemplo anterior é um caso interessante, mas também encontrei um método muito simplificado. Você pode usar a interface do driver usb-storage para ligar e desligar dispositivos .

O seguinte comando funcionou, assim como o código-fonte acima:

echo -n "1-2.4:1.0" | sudo tee unbind    
    
por 04.06.2010 / 13:28
0

Primeiro, execute mount como root. Isso deve listar todos os sistemas de arquivos montados. Se /dev/sdg e /dev/sg7 não estiverem na lista, a câmera não estará mais montada.

Se a câmera ainda estiver montada, você pode desmontá-la com o comando umount (observe a falta de 'n'). Um exemplo seria umount /dev/sg7 ou umount /dev/sdg .

Se a câmera montou sistemas de arquivos, provavelmente você pode simplesmente navegar até as fotos no Nautilus. A saída de mount dirá onde os dispositivos são montados no sistema de arquivos - basta procurar a pasta e começar a procurar as fotos.

    
por 03.06.2010 / 13:18
0

Você está usando o Ubuntu? Há conversa de um bug em 8.10, e embora eu não tenha certeza se isso foi corrigido na última versão, há um solução alternativa que pode permitir que você faça ... o que quer que você esteja tentando fazer (já que você não está apenas baixando imagens). : P

    
por 03.06.2010 / 15:17
0

Eu faço isso em um script:

# If camera is mounted we need to unmount it
export CAMERA_MOUNT_POINTS='gvfs-mount -l | grep gphoto2 | sed 's/.*\(gphoto2.*\)$//' | 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

Não sei se é isso que você precisa, mas pode ser, já que tive problemas semelhantes.

EDITAR: Para explicar um pouco: gvfs-mount -l lista material montado O restante dessa linha limpa a saída para produzir apenas uma lista de câmeras montadas (e canaliza erros para um arquivo de log). Então o loop desmonta todas as câmeras.

    
por 04.06.2010 / 11:48