Hapus Kernel Lock dari Unmounted Mass Storage USB Device dari Command Line di Linux

1

Saya telah mencari tinggi dan rendah, dan tidak dapat menemukan yang ini. Saya memiliki Kamera Olympus yang lebih tua (2001 atau lebih). Ketika saya mencolokkan koneksi USB, saya mendapatkan output log berikut:

$ 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

Kedua, drive tidak dipasang di FS, tetapi ketika saya menjalankan gphoto2 saya mendapatkan kesalahan berikut:

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

Perintah apa yang akan melepas drive. Misalnya di Nautilus, saya bisa klik kanan dan pilih "Safely Remove Device". Setelah melakukan itu, perangkat / dev / sg7 dan / dev / sdg dihapus.

Output dari gphoto2 adalah:

# 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

Beberapa hal yang sudah saya coba adalah sdparm dan sg3_utilsNamun saya tidak terbiasa dengan mereka, jadi mungkin saja saya tidak menemukan perintah yang tepat

Pembaruan 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
sumber
Jika saya ingat dengan benar, gphoto2 hanya berurusan dengan perangkat MTP / PTP, bukan penyimpanan massal ...
grawity
maaf, mungkin terminologi saya tidak aktif, tetapi berfungsi ketika saya melepas dari Nautilus
cmcginty
tidak ada solusi sejauh ini, ada ide?
cmcginty
gvfs-mount tidak berfungsi? (lihat jawaban saya)
Peter Jaric
Solusi Peter Janic berhasil untuk saya. Perangkat yang dipasang ptp tidak muncul dengan perintah "mount", tetapi "gvfs-mount -l" dan "gvfs-mount -u" berfungsi pada ptp saya yang terpasang nikon d70. Terima kasih Peter!
cdaaawg

Jawaban:

1

Metode Cepat dan Kotor

Untuk menonaktifkan brute force dari semua perangkat penyimpanan massal yang aktif:

rmmod usb_storage

Cegah Perangkat Apa Saja dari Memuat Modul usb_storage

Saya menemukan tautan berikut, pada dasarnya bertanya pertanyaan yang sama seperti ini . Jika Anda ingin mencegah kernel dari pemasangan otomatis menggunakan usb_storage:

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

Cegah Perangkat Tunggal dari Memuat Modul usb_storage

Alih-alih menonaktifkan semua perangkat, Anda dapat menargetkan perangkat tertentu untuk diabaikan menggunakan aturan udev. Ada contoh spesifik sini .

Saya menghabiskan banyak waktu untuk mencoba ini berfungsi di Ubuntu 10,04, tetapi sepertinya fungsi ini dinonaktifkan di versi udev yang lebih baru .

"Safely Remove Disk" Unbind / Unclaim Source Code

Itu posting terakhir di utas ini bekerja seperti pesona.

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

Skrip Sederhana untuk Perangkat Binding / Tidak mengikat

Contoh sebelumnya adalah kasus yang menarik, tetapi saya juga menemukan metode yang lebih sederhana. Anda dapat menggunakan antarmuka driver penyimpanan usb untuk perangkat yang mengikat dan tidak mengikat .

Perintah berikut ini berfungsi, sama seperti kode sumber dari atas:

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

Lari pertama mount sebagai root. Ini harus mendaftar semua sistem file yang terpasang. Jika /dev/sdg dan /dev/sg7 tidak ada dalam daftar, maka kamera tidak lagi terpasang.

Jika kamera masih terpasang, Anda dapat melepasnya dengan perintah umount (catat 'n' yang hilang). Contohnya adalah umount /dev/sg7 atau umount /dev/sdg.

Jika kamera telah menginstal sistem file, maka Anda mungkin dapat menelusuri foto-foto di Nautilus. Output dari mount akan memberi tahu Anda di mana perangkat dipasang ke dalam sistem file - cukup telusuri folder dan mulai mencari-cari foto.

Darth Android
sumber
Saya menambahkan output dari perintah dalam pertanyaan .. Saya yakin saya sudah mencobanya beberapa hari yang lalu;)
cmcginty
Juga, Anda menganggap saya sedang mencoba mengunduh foto, itu tidak terjadi.
cmcginty
@casey: / dev / sg7 toh tidak akan dipasang - itu adalah perangkat kontrol scsi, bukan drive. / dev / sdg mungkin perangkat yang dapat dipasang, dan mungkin merupakan drive yang dipartisi (dalam hal ini Anda harus memasang / dev / sdg1 atau / dev / sdg2 atau serupa).
quack quixote
Tidak ada partisi yang ditampilkan di / dev / sdg
cmcginty
0

Apakah Anda menggunakan Ubuntu? Ada berbicara dari a bug di 8.10, dan sementara saya tidak yakin apakah ini diperbaiki pada versi terbaru, ada a solusi yang mungkin membiarkan Anda melakukan ... apa pun yang Anda coba lakukan (karena Anda tidak hanya mengunduh gambar). : P

Darth Android
sumber
Kelihatannya mirip, tetapi saya bisa mengaktifkan gphoto jika saya melepas perangkat dari Nautilus terlebih dahulu. Saya akan pastikan untuk membaca semuanya dan mencoba dan menyelesaikannya.
cmcginty
0

Saya melakukan ini dalam sebuah skrip:

# 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

Saya tidak yakin ini yang Anda butuhkan, tapi mungkin saja, karena saya punya masalah serupa.

EDIT: Untuk menjelaskan sedikit: gvfs-mount -l daftar barang yang dipasang Sisa dari baris itu membersihkan output untuk menghasilkan hanya daftar kamera yang terpasang (dan pipa kesalahan ke file log) Kemudian loop melepas semua kamera.

Peter Jaric
sumber
Saya mengubah sesuatu, dan sekarang gvfs_mount tidak mencantumkan perangkat. Saya akan coba lagi setelah reboot.
cmcginty
Kurasa itu tidak berhasil, karena kamu mengejar jalur lain?
Peter Jaric