Sering kali, ketika kita menggunakan komputer kita memutuskan sambungan peranti USB (dengan selamat, seperti mestinya) dan, segera setelah itu, kita menyedari bahawa kita lupa untuk menyalin fail atau kita harus memastikan bahawa data di unit kami. Untuk kes-kes seperti ini, adalah sangat berguna untuk memutuskan sambungan pemacu USB semasa kita bekerja dari jauh.
Setelah mengeluarkan peranti, kami tidak lagi melihatnya dalam senarai peranti kami, tetapi cakera keras atau pendrive masih disambungkan melalui port USB, dan dalam banyak pengedaran hari ini, setelah mengeluarkan pemacu dengan selamat, kami juga tidak melihat peranti tersebut dan Kita tidak boleh buat mount dari terminal kami. Penyelesaian terpantas adalah melepaskan kabel dan menyambungkannya semula, dalam beberapa kes, baik kerana kemalasan untuk bangun atau kerana kita mengakses komputer yang tidak kita hadapi dan tidak ada orang di sekitar, kita tidak dapat melakukannya.
Maklumat mengenai peranti USB
Sebelum memulakan, mari kita lihat bagaimana mendapatkan maklumat mengenai peranti USB yang disambungkan ke sistem. Untuk ini, kita boleh menggunakan lsusb, yang akan menyenaraikan peranti yang disambungkan sekarang. Saya meletakkan contoh dari apa yang saya dapatkan di komputer saya sekarang, tetapi mungkin sangat berbeza dengan apa yang anda dapat:
$ lsusb Bus 002 Peranti 001: ID 1d6b: 0003 Linux root 3.0 root hub Bus 001 Device 006: ID 8087: 0a2a Intel Corp. Bus 001 Device 007: ID 046d: c52b Logitech, Inc. Unifying Receiver Bus 001 Device 005: ID 1a40 : 0101 Terminus Technology Inc. Bus Hub 001 Peranti 010: ID 125f: c93a A-DATA Technology Co., Ltd. Bus Pen Pen 4GB 001 Peranti 003: ID 04f2: b424 Chicony Electronics Co., Ltd Bas 001 Peranti 001: ID 1d6b : 0002 hub root Linux Foundation 2.0
Sekiranya kita mahukan lebih banyak maklumat, kita dapat menggunakan pengubah -t yang akan menunjukkan kepada kita output dalam bentuk pohon dengan maklumat mengenai modul:
$ lsusb -t /: Bas 02. Port 1: Dev 1, Class = root_hub, Driver = xhci_hcd / 8p, 5000M /: Bus 01. Port 1: Dev 1, Class = root_hub, Driver = xhci_hcd / 16p, 480M | __ Port 4: Dev 3, If 0, Class = Video, Driver = uvcvideo, 480M | __ Port 4: Dev 3, If 1, Class = Video, Driver = uvcvideo, 480M | __ Port 5: Dev 10, If 0, Class = Penyimpanan Massa, Pemacu = penyimpanan usb, 480M | __ Port 6: Dev 5, If 0, Class = Hub, Driver = hub / 4p, 12M | __ Port 4: Dev 7, If 0, Class = Peranti Antaramuka Manusia, Pemandu = usbhid, 12M | __ Port 4: Dev 7, If 1, Class = Human Interface Device, Driver = usbhid, 12M | __ Port 4: Dev 7, If 2, Class = Human Interface Device, Driver = usbhid, 12M | __ Port 9: Dev 6, If 0, Class = Wireless, Driver = btusb, 12M | __ Port 9: Dev 6, If 1, Class = Wireless, Driver = btusb, 12M
Sekiranya kita mahukan lebih banyak maklumat, kita boleh menggunakan lsusb -v (outputnya sangat besar), selain itu kita dapat, misalnya, mengetahui kekuatan maksimum yang dikirimkan ke perangkat, seperti berikut:
$ lsusb -v 2> / dev / null | egrep "^ Bus | MaxPower" Bus 002 Device 001: ID 1d6b: 0003 Linux Foundation 3.0 hub root MaxPower 0mA Bus 001 Device 006: ID 8087: 0a2a Intel Corp. MaxPower 100mA Bus 001 Peranti 007: ID 046d: c52b Logitech, Inc. Unifying Receiver MaxPower 98mA Bus 001 Device 005: ID 1a40: 0101 Terminus Technology Inc. Hub MaxPower 100mA Bus 001 Device 010: ID 125f: c93a A-DATA Technology Co., Ltd. 4GB Pen Drive MaxPower 480mA Bus 001 Device 003: ID 04f2: b424 Chicony Electronics Co., Ltd MaxPower 500mA Bus 001 Device 001: ID 1d6b: 0002 Linux Foundation 2.0 hub root MaxPower 0mA
Perintah lain yang sangat berguna adalah peranti usb, HWiNFO, atau, misalnya, jika kita memiliki jalur perangkat (di dalam / dev /), kita dapat meminta sistem untuk semua kemungkinan informasi mengenainya dan subsistem yang harus dilaluinya. Sebagai contoh, jika kita menyambungkan cakera keras USB, agar kita dapat melihat bagaimana peranti digunakan, kita memerlukan pemacu SCSI (untuk menjadi / dev / sdX), kita juga memerlukan pemacu storan USB, yang berfungsi melalui port USB, yang termasuk dalam hub, yang dipasang ke port PCI, antara sistem perantaraan lain. Semua yang dapat kita lihat
$ udevadm info --query = path --name = / dev / sdX - atribut-berjalan
o
$ udevadm info -a -n / dev / sdX
Sekiranya kita ingin menceburkan diri, kita juga boleh masuk / sys / bas / usb dan melihat semua yang ada, kita akan melihat banyak maklumat, tetapi untungnya perintah di atas mengklasifikasikan semua maklumat ini.
Keistimewaan dan peranti
Untuk melaksanakan tugas ini, kita perlu mengetahui peranti yang akan kita tuju sambung semula. Untuk melakukan ini, kita boleh menjalankan:
$ dmesg | tail [Thu 24 Nov 19:50:04 2016] sd 7: 0: 0: 0: Attached scsi generic sg3 type 0 [798339.431677] sd 7: 0: 0: 0: [sdc] 15806464 blok logik 512-bait: 8.09 GB / 7.54 GiB) [798339.431840] sd 7: 0: 0: 0: [sdc] Write Protect dimatikan [798339.431848] sd 7: 0: 0: 0: [sdc] Mod Sense: 00 00 00 00 [798339.431988] sd 7: 0: 0: 0: [sdc] Meminta data cache gagal [798339.431996] sd 7: 0: 0: 0: [sdc] Dengan andaian cache pemacu: tulis hingga [798339.434157] sdc: sdc1 sdc2 [798339.446812] sd 7 : 0: 0: 0: [sdc] Dilampirkan cakera boleh tanggal SCSI [798360.808588] Sambungan ISO 9660: Microsoft Joliet Level 3 [798360.809353] Sambungan ISO 9660: RRIP_1991A
Dalam output ini, kita akan melihat bahawa peranti yang kita bekerjasama adalah sdc (sdc1 dan sdc2 akan menjadi partisi dalam disk itu). Sebagai contoh, saya akan menggunakan peranti ini, sekiranya anda perlu membayangkan akaun mana yang anda ada.
Dalam contoh di bawah ini saya akan gunakan sudo untuk melaksanakan perintah dengan hak istimewa akar. Walaupun cukup untuk mempunyai pengguna dengan izin yang mencukupi. Sekiranya kita ingin melihat hak istimewa yang diperlukan, lakukan saja ls ke peranti:
$ ls -latr / dev / sdc brw-rw ---- 1 root disk 8, 32 Nov 24 19:50 / dev / sdc
Di sana kita melihat bahawa pemiliknya adalah root dan kumpulan cakera. Cukup untuk mempunyai pengguna yang tergolong dalam cakera kumpulan.
Kaedah 1. Perlakukannya seperti CD / DVD
Ia adalah yang paling mudah. Sudah tentu jika anda telah menggunakan GNU / Linux selama bertahun-tahun, semasa anda bekerja dengan CD-ROM atau DVD, anda menggunakan perintah eject. Nah, eject digunakan untuk membuka CDROM dan eject -t digunakan untuk menutup dulang. Sekiranya kita melakukan ini sebelum peranti USB:
$ sudo eject -t / dev / sdc
Peranti akan kelihatan seolah-olah kita telah menyambungkannya semula.
Kaedah 2. Plugged dan Virtual Plugged In
Pada beberapa sistem (selagi perkakasan menyokongnya), apabila anda mengeluarkan peranti USB dengan selamat, peranti berhenti dihidupkan dan peranti tidak lagi muncul. Sama seperti ketika anda melakukan:
udisksctl power-off -b / dev / sdc
Dalam kes ini, / dev / sdc ini adalah peranti saya, dan dengan perintah ini, simulasi putus kuasa maya.
Masalahnya ialah sekarang / dev / sdc tidak ada, lebih-lebih lagi jika kita melihat dmesg, kita akan mendapat sesuatu seperti ini:
$ dmesg | ekor [281954.693298] usb 1-5: Putuskan sambungan USB, nombor peranti 3
Jadi jika kita mencuba dengan kaedah mengeluarkan ia tidak akan berjaya. Nota: Saya telah menyerlahkan usb 1-5 dan kita akan melihat mengapa tidak lama lagi.
Sekiranya anda bekerja dari jauh, ini mungkin idea yang baik. Bayangkan bahawa anda mempunyai pemacu USB yang disambungkan ke sandaran. Semasa anda membuat salinan, ada baiknya sistem mengetahui bahawa ada disk yang disambungkan tetapi, apabila kita tidak menggunakannya, kita mesti menjimatkan tenaga dan elakkan pemakaian cakera, oleh itu lebih baik memotong arus, sebaliknya kami tidak mahu aplikasi berniat jahat melihatnya ada cakera ini supaya mereka tidak dijangkiti. (Ya, di GNU / Linux ada virus).
Bagaimana kita menghubungkan arus sekarang?
Kita mesti membuat panggilan ke port USB, kerana ini ada projek yang dipanggil tenaga kerja (Saya menghubungkan ke garpu projek asal kerana di sini bug diperbaiki yang dapat mengeluarkan arus dari lebih banyak peranti dan bukan hanya yang kita mahukan). Terdapat lebih banyak projek (seperti uhubctl), tetapi ini tidak mempunyai kebergantungan ketika kita menyusunnya, itu juga hanya file hubpower.c.
Pertama, kami menyusunnya,
$ gcc -o hubpower hubpower.c
Sekarang, adakah anda ingat nombor dalam huruf tebal dari dmesgBaiklah, kita akan menggunakannya, kita mesti memutuskan sambungan peranti dan menyambungkannya semula, seperti ini:
$ sudo ./hubpower 1: 1 power 5 off Port 5 status: 0000 Power-Off $ sudo ./hubpower 1: 1 power 5 on Port 5 status: 0100 Power-On
Sekiranya peranti tidak mengesan kami, kami boleh mencuba:
$ sudo ./hubpower 1: 1 mengikat permintaan pengikat pengikat yang dihantar ke kernel
Dengan cara ini, kita akan melihat peranti USB yang disambungkan lagi.
Sekiranya kita tidak mahu program C ... saya memilikinya di perl
Program C sukar disusun dan diuji jika apa yang akan kita lakukan sangat mudah, jadi kita boleh mencuba port kecil ini dalam 10 baris yang dibuat dalam perl:
#! / bin / perl memerlukan "sys / ioctl.ph"; $ peranti = "05"; buka ($ usbdev saya,"> "," / dev / bus / usb/ 001/001 "); $ data = pack ("H *", "23010800". $ device. "000000FFFFFF8813"); ioctl ($ usbdev, 0xC0185500, $ data); $ data = pek ("H *", "23030800". $ peranti. "000000FFFFFF8813"); ioctl ($ usbdev, 0xC0185500, $ data); tutup ($ usbdev);
Kita mesti menghormati $ peranti, nombor port (dalam kes saya adalah 5), ia adalah nilai heksadesimal, oleh itu 10 akan menjadi A, 11 akan menjadi B, 15 akan menjadi F, 16 akan menjadi 10 ... Kita juga harus memantau peranti dan bas, yang kami akses dari / dev / bus / usb /001/001, nombor mesti ada dengan angka nol terkemuka kerana kita memanggil fail itu.
Seperti yang dapat kita lihat, kuncinya adalah dalam ioctl (), ini adalah fungsi yang memanipulasi parameter peranti dari fail khas dalam sistem fail. Di antara nilai heksadesimal yang digunakan, kita dapati 0xC0185500, pemalar yang dipanggil USBDEVFS_CONTROL yang dengannya kami akan menghantar arahan kawalan ke peranti USB, Kod lain termasuk dalam permintaan pemutusan dan sambungan (anda boleh mendapatkan lebih banyak maklumat dalam program yang dibuat dalam C).
Kaedah 3. Menyembunyikan dan menunjukkan peranti
Kaedah lain untuk memutuskan peranti adalah:
echo '1-5' | sudo tee / sys / bus / usb / driver / usb / unbind
Dan kita dapat memulihkannya dengan melakukan:
echo '1-5' | sudo tee / sys / bus / usb / driver / usb / bind
Kaedah ini tidak menyebabkan pemutusan sepenuhnya peranti. Ini hanya menjadikan sistem operasi tidak bercakap dengannya dan banyak peranti, ketika komputer tidak ingin mengetahui apa-apa tentangnya, dimasukkan ke dalam mod kuasa rendah, kerana kita tidak akan meminta apa-apa.
Kaedah 4. Kebenaran peranti
Kelemahan kaedah ini adalah bahawa dalam banyak sistem, lebih banyak peranti dapat dilumpuhkan buat sementara waktu, yang bukan hanya satu yang kita perlukan, tetapi kita juga menyerang seluruh hab USB. Sebagai contoh:
$ gema 0 | sudo tee / sys / bus / usb / devices / usb1 / $ echo yang dibenarkan 1 | sudo tee / sys / bus / usb / devices / usb1 / sah
Yang tentu saja, kita dapat menjalankan semuanya berturut-turut:
$ gema 0 | sudo tee / sys / bus / usb / devices / usb1 / dibenarkan; gema 1 | sudo tee / sys / bus / usb / devices / usb1 / sah
Kita harus berhati-hati, jika terdapat lebih banyak cakera yang disambungkan ke port USB yang sama (dan hampir selalu di komputer kita, beberapa port USB daripada yang kita lihat disambungkan secara dalaman ke hub, jadi terdapat sekumpulan port dengan USB yang sama bapa, masukkan ke dalam beberapa cara.
Kaedah 5. Nyalakan semula subsistem USB
Sekiranya kita mahu memulakan semula subsistem USB. Maksudnya, muat semula semua peranti USB, seperti mencabut dan memasang semuanya, di satu pihak kita boleh memuat turun dan memuatkan semula modul kernel USB:
$ sudo modprobe -r ehci_hcd; sudo modprobe ehci_hcd #Untuk USB2 $ sudo modprobe -r xhci_hcd; sudo modprobe xhci_hcd #Untuk USB3
Walaupun sebilangan pengedaran, versi terbaru Ubuntu dan turunannya termasuk, mempunyai modul USB bersepadu dan mereka tidak boleh dimuat turun. Sebaliknya, sistem mungkin tidak membenarkan kami memuat turunnya kerana digunakan kerana modul lain (pencetak, penyimpanan, peranti antara muka, dll.), Dan jika kita mula memuat turun modul dan memecahkan sesuatu, kita mungkin perlu menghidupkan semula komputer pada akhir. Oleh itu, dengan cara lain kita boleh melakukan:
$ gema '0000:00:14.5'| sudo tee / sys / bus / pci / driver / xhci_hcd / lepaskan $ echo '0000:00:14.5'| sudo tee / sys / bus / pci / driver / xhci_hcd / bind
Untuk mencari peranti kami, kami boleh melakukan ls inside / sys / bus / pci / drivers / xhci_hcd, beberapa perkara akan muncul, kita harus mencari yang seperti ini aaaa: bb: cc: dd.e. Port USB anda mungkin tidak datang sebagai xhci_hcd (USB3), melainkan ehci_hcd (USB2)