Remove Kernel Lock from Unmounted Mass Storage USB Device from the Command Line in Linux

5,981

Quick and Dirty Method

For a brute force disable of all active mass storage devices:

rmmod usb_storage

Prevent Any Device from Loading usb_storage Module

I found the following link, basically asking the same question as this. If you want to prevent the kernel from auto-mounting using usb_storage:

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

Prevent Single Device from Loading usb_storage Module

Instead of disabling all devices, you can target a specific device to ignore using udev rules. There is a specific example here.

I spent a lot of time trying to get this to work in Ubuntu 10.04, but it looks like this functionality was disabled in newer versions of udev.

"Safely Remove Disk" Unbind/Unclaim Source Code

The last post on this thread worked like a charm.

#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");
   }
}

Simple Script for Binding / Unbinding Device

The previous example is an interesting case, but I also found a much simplified method. You can use the usb-storage driver interface for binding and unbinding devices.

The following command worked, just like the source code from above:

echo -n "1-2.4:1.0" | sudo tee unbind    
Share:
5,981

Related videos on Youtube

cmcginty
Author by

cmcginty

Former Sr. Software Engineer at Box. Interests include Python, Gradle, C, Java, Git, Linux, Embedded. Find me on github https://github.com/cmcginty.

Updated on September 17, 2022

Comments

  • cmcginty
    cmcginty over 1 year

    I've searched high and low, and can't figure this one out. I have a older Olympus Camera (2001 or so). When I plug in the USB connection, I get the following log output:

    $ 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
    

    Secondly, the drive is not mounted in the FS, but when I run gphoto2 I get the following 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') ***       
    

    What command will unmount the drive. For example in Nautilus, I can right click and select "Safely Remove Device". After doing that, the /dev/sg7 and /dev/sdg devices are removed.

    The output of gphoto2 is then:

    # 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
    

    Some things I've tried already are sdparm and sg3_utils, however I am unfamiliar with them, so it's possible I just didn't find the right command.

    Update 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') ***       
    
    • user1686
      user1686 almost 14 years
      If I recall correctly, gphoto2 only deals with MTP/PTP devices, not mass storage...
    • cmcginty
      cmcginty almost 14 years
      sorry, maybe my terminology is off, but it work when I unmount from Nautilus
    • cmcginty
      cmcginty almost 14 years
      no solution so far, any ideas?
    • Peter Jaric
      Peter Jaric almost 14 years
      gvfs-mount doesn't work then? (see my answer)
    • cdaaawg
      cdaaawg about 12 years
      Peter Janic's solution worked great for me. A ptp mounted device does not show up with the "mount" command, but "gvfs-mount -l" and "gvfs-mount -u" do work on my ptp mounted nikon d70. Thanks Peter!
  • cmcginty
    cmcginty almost 14 years
    I added the output of the commands in the question .. I'm sure I tried that a few days ago ;)
  • cmcginty
    cmcginty almost 14 years
    Also, you assume I am trying to download photos, that is not the case.
  • quack quixote
    quack quixote almost 14 years
    @casey: /dev/sg7 wouldn't have been mounted anyway -- that's a scsi control device, not a drive. /dev/sdg might be a mountable device, and might be a partitioned drive (in which case you'd have to mount /dev/sdg1 or /dev/sdg2 or similar).
  • cmcginty
    cmcginty almost 14 years
    There are no partitions shown on /dev/sdg
  • cmcginty
    cmcginty almost 14 years
    It looks similar, but I can get gphoto to work if I simply unmount the device from Nautilus first. I'll make sure to read it all and try and of the workarounds.
  • cmcginty
    cmcginty almost 14 years
    I changed something, and now gvfs_mount does not list the device. I'll try again after a reboot.
  • Peter Jaric
    Peter Jaric almost 14 years
    It didn't work then, I guess, since you pursued another line?