多くの場合、コンピューターを使用しているときにUSBデバイスを切断し(必要に応じて安全に)、その直後に、ファイルのコピーを忘れたか、データが正しいことを確認する必要があることに気付きます。私たちのユニットで。 このような場合、通常、リモートで作業するときにUSBドライブを仮想的に切断すると非常に便利です。
デバイスを取り出した後、デバイスのリストに表示されなくなりましたが、ハードドライブまたはペンドライブは引き続きUSBポートで接続されており、今日の多くのディストリビューションでは、ドライブを安全に取り出したため、デバイスとできません mount 私たちのターミナルから。 最も簡単な解決策は、ケーブルを切断して再接続することです。場合によっては、起き上がるのが面倒であるか、目の前にいないコンピューターにアクセスしていて、周りに誰もいないために、ケーブルを再接続できません。
USBデバイスに関する情報
始める前に、システムに接続されているUSBデバイスに関する情報を取得する方法を見てみましょう。 このために、私たちは使用することができます lsusb、現在接続されているデバイスが一覧表示されます。 私は今私のコンピューターで得たものの例を挙げましたが、多分それはあなたが得たものとは非常に異なっています:
$ lsusbバス002デバイス001:ID 1d6b:0003 Linux Foundation 3.0ルートハブバス001デバイス006:ID 8087:0a2a Intel Corp.バス001デバイス007:ID 046d:c52b Logitech、Inc。レシーバーバス001デバイス005の統合:ID 1a40 :0101 Terminus Technology Inc.ハブバス001デバイス010:ID 125f:c93a A-DATA Technology Co.、Ltd。4GBペンドライブバス001デバイス003:ID 04f2:b424 Chicony Electronics Co.、Ltdバス001デバイス001:ID 1d6b :0002 Linux Foundation2.0ルートハブ
さらに情報が必要な場合は、-t修飾子を使用して、モジュールに関する情報を含むツリー形式の出力を表示できます。
$ lsusb -t /:バス02.ポート1:開発1、クラス= root_hub、ドライバー= xhci_hcd / 8p、5000M /:バス01.ポート1:開発1、クラス= root_hub、ドライバー= xhci_hcd / 16p、480M | __ポート4:Dev 3、0の場合、クラス=ビデオ、ドライバー= uvcvideo、480M | __ポート4:Dev 3、1の場合、クラス=ビデオ、ドライバー= uvcvideo、480M | __ポート5:Dev 10、0の場合、クラス=大容量ストレージ、ドライバー= usb-storage、480M | __ポート6:開発5、0の場合、クラス=ハブ、ドライバー=ハブ/ 4p、12M | __ポート4:開発7、0の場合、クラス=ヒューマンインターフェイスデバイス、ドライバー= usbhid、12M | __ポート4:Dev 7、If 1、クラス=ヒューマンインターフェイスデバイス、ドライバー= usbhid、12M | __ポート4:Dev 7、If 2、クラス=ヒューマンインターフェイスデバイス、ドライバー= usbhid、12M | __ポート9:開発6、0の場合、クラス=ワイヤレス、ドライバー= btusb、12M | __ポート9:開発6、1の場合、クラス=ワイヤレス、ドライバー= btusb、12M
より多くの情報が必要な場合は、 lsusb -v (出力が非常に大きい)さらに、たとえば、次のように、デバイスに供給される最大電力を知ることができます。
$ lsusb -v 2> / dev / null | egrep "^ Bus | MaxPower"バス002デバイス001:ID 1d6b:0003 Linux Foundation3.0ルートハブMaxPower0mAバス001デバイス006:ID 8087:0a2a Intel Corp. MaxPower100mAバス001デバイス007:ID 046d:c52b Logitech、Inc。ユニファイングレシーバーMaxPower 98mAバス001デバイス005:ID 1a40:0101 Terminus TechnologyInc。ハブMaxPower100mAバス001デバイス010:ID 125f:c93a A-DATA Technology Co.、Ltd。4GBペンドライブMaxPower480mAバス001デバイス003:ID 04f2:b424 Chicony Electronics Co.、Ltd MaxPower 500mAバス001デバイス001:ID 1d6b:0002 Linux Foundation2.0ルートハブMaxPower0mA
他の非常に便利なコマンドは usb-デバイス, hwinfo、または、たとえば、デバイスのパス(inside / dev /)がある場合、デバイスとそれが通過する必要のあるサブシステムに関するすべての可能な情報をシステムに要求できます。 たとえば、USBハードディスクを接続する場合、デバイスの使用方法を確認するには、SCSIドライバー(/ dev / sdX用)が必要です。また、に属するUSBポートを介して動作するUSBストレージドライバーも必要です。他の中間システムの中でも、PCIポートに接続されているハブ。 私たちが見ることができるすべて
$ udevadm info --query = path --name = / dev / sdX --attribute-walk
o
$ udevadm info -a -n / dev / sdX
冒険したいなら、入ることもできます / sys /バス/ usb そこにあるすべてのものを見ると、多くの情報が表示されますが、幸い、上記のコマンドはこのすべての情報を分類します。
特権とデバイス
このタスクを実行するには、どのデバイスにアクセスするかを知る必要があります 再接続。 これを行うには、次を実行できます。
$ dmesg | tail [Thu Nov 24 19:50:04 2016] sd 7:0:0:0:アタッチされたscsi汎用sg3タイプ0 [798339.431677] sd 7:0:0:0:[sdc] 15806464 512バイトの論理ブロック:( 8.09 GB / 7.54 GiB)[798339.431840] sd 7:0:0:0:[sdc]書き込み保護がオフ[798339.431848] sd 7:0:0:0:[sdc]モードセンス:00 00 00 00 [798339.431988] sd 7:0:0:0:[sdc]キャッシュデータの要求に失敗しました[798339.431996] sd 7:0:0:0:[sdc]ドライブキャッシュを想定:ライトスルー[798339.434157] sdc:sdc1 sdc2 [798339.446812] sd 7 :0:0:0:[sdc]接続されたSCSIリムーバブルディスク[798360.808588] ISO 9660拡張機能:MicrosoftJolietレベル3 [798360.809353] ISO 9660拡張機能:RRIP_1991A
この出力では、使用しているデバイスが次のようになっていることがわかります。 sdc (sdc1とsdc2は、そのディスク内のパーティションになります)。 このデバイスを使用する例では、あなたの場合、あなたが持っているアカウントを視覚化する必要があります。
以下の例では、 sudo の特権でコマンドを実行するには ルート。 ただし、十分な権限を持つユーザーがあれば十分です。 必要な特権を確認したい場合は、 ls デバイスへ:
$ ls -latr / dev / sdc brw-rw ---- 1ルートディスク8、32 Nov 24 19:50 / dev / sdc
所有者がルートであり、グループであることがわかります ディスク。 グループディスクに所属するユーザーがあれば十分です。
方法1.CD / DVDのように扱います
それはすべての中で最も単純です。 確かに、GNU / Linuxを何年も使用している場合は、CD-ROMまたはDVDを使用するときに、ejectコマンドを使用しました。 さて、CDROMを開くためにイジェクトが使用され、トレイを閉じるためにイジェクト-tが使用されました。 さて、USBデバイスの前にこれを行うと:
$ sudoイジェクト-t / dev / sdc
デバイスは、再度接続したように表示されます。
方法2.プラグを抜いて仮想プラグイン
一部のシステムでは(ハードウェアがサポートしている限り)、USBデバイスを安全に取り外すと、デバイスの電源が停止し、デバイスが表示されなくなります。 それはあなたがするときと同じです:
udisksctl power-off -b / dev / sdc
この場合、 / dev / sdc これは私のデバイスであり、このコマンドを使用して、仮想電源切断をシミュレートしました。
問題は、/ dev / sdcが存在しないことです。さらに、dmesgを見ると、次のようになります。
$ dmesg | テール[281954.693298] USB 1-5:USB切断、デバイス番号3
だから私たちがの方法で試してみると イジェクト 効果がないでしょう。 注:強調表示しました USB 1-5 その理由はまもなくわかります。
リモートで作業する場合、これは良い考えかもしれません。 USBドライブがバックアップに接続されていると想像してください。 コピーを作成するときは、ディスクが接続されていることをシステムが認識しているのは良いことですが、ディスクを使用していないときは、一方では 省エネ ディスクの摩耗を避けるため、電流をカットすることをお勧めします。 悪意のあるアプリにそれらが存在することを見せたくない これらのディスクは感染しないようにします。 (はい、GNU / Linuxにはウイルスがあります)。
現在の電流をどのように接続しますか?
USBポートに電話をかける必要があります。これには、というプロジェクトがあります。 ハブパワー (元のプロジェクトのフォークにリンクします。これは、必要なデバイスだけでなく、より多くのデバイスから電流を削除できるバグが修正されているためです)。 より多くのプロジェクトがあります( うーハブctl)ですが、これはコンパイルするときの依存関係はなく、hubpower.cファイルでもあります。
まず、コンパイルします。
$ gcc -o ハブパワー ハブパワー.c
さて、あなたは太字の数字を覚えていますか dmesg?まあ、私たちはそれらを使用するつもりです、私たちは次のようにデバイスを切断して再接続する必要があります:
$ sudo ./hubpower 1:1電源5オフポート5ステータス:0000電源オフ$ sudo ./hubpower 1:1電源5オンポート5ステータス:0100電源オン
デバイスが私たちを検出しない場合は、次のことを試みることができます。
$ sudo ./hubpower 1:1バインドバインド-ドライバー要求がカーネルに送信されました
このようにして、接続されたUSBデバイスが再び表示されます。
Cプログラムが必要ない場合...私はperlにあります
Cプログラムは、コンパイルしてテストするのが非常に単純であるかどうかをテストするのが難しいため、perlで作成された10行でこの小さなポートを試すことができます。
#!/ bin / perl require "sys / ioctl.ph"; $デバイス= "05"; open(my $ usbdev、"> "、" / dev / bus / usb/ 001/001 "); $ data = pack( "H *"、 "23010800"。$ device。 "000000FFFFFF8813"); ioctl($ usbdev、0xC0185500、$データ); $ data = pack( "H *"、 "23030800"。$ device。 "000000FFFFFF8813"); ioctl($ usbdev、0xC0185500、$データ); 閉じる($ usbdev);
私たちは尊重しなければなりません $デバイス、ポート番号(私の場合は5)、10進数の値であるため、11はA、15はB、16はF、10はXNUMXになります...デバイスとバスも監視する必要があります。 / dev / bus / usb /からアクセスします001/001、そのファイルを呼び出しているので、数字は先行ゼロで行く必要があります。
ご覧のとおり、キーはioctl()にあり、ファイルシステム内の特別なファイルからデバイスのパラメーターを操作する関数です。 使用されているXNUMX進値の中に、 0xC0185500、USBデバイスに制御コマンドを送信するUSBDEVFS_CONTROLと呼ばれる定数。他のコードは、切断および接続要求に属します(詳細については、Cで作成されたプログラムを参照してください)。
方法3.デバイスの非表示と表示
デバイスを切断する別の方法は次のとおりです。
echo '1-5' | sudo tee / sys / bus / usb / drivers / usb / unbind
そして、次のようにして回復できます。
echo '1-5' | sudo tee / sys / bus / usb / drivers / usb / bind
この方法では、デバイスが完全に切断されるわけではありません。 それはオペレーティングシステムがそれと通信しないようにするだけであり、コンピュータがそれらについて何も知りたくないとき、私たちが何も要求しないので、多くのデバイスは低電力モードになります。
方法4.デバイスの認証
この方法の欠点は、多くのシステムで、より多くのデバイスを一時的に非アクティブ化できることです。これは、必要なものであるだけでなく、USBハブ全体を攻撃します。 例えば:
$エコー0 | sudo tee / sys / bus / usb / devices / usb1 / authorized $ echo 1 | sudo tee / sys / bus / usb / devices / usb1 /承認済み
もちろん、これはすべてを連続して実行できます。
$エコー0 | sudo tee / sys / bus / usb / devices / usb1 /承認済み; エコー1 | sudo tee / sys / bus / usb / devices / usb1 /承認済み
同じUSBポートに接続されているディスクの数が多い場合は注意が必要です(ほとんどの場合、コンピューターでは、表示されているものよりもいくつかのUSBポートが内部でハブに接続されているため、同じUSBを持つポートのグループがあります 父、なんらかの方法でそれを置きます。
方法5.USBサブシステムを再起動します
USBサブシステムを再起動する場合。 つまり、すべてのUSBデバイスのプラグを抜き差しするなど、すべてのUSBデバイスを更新します。一方で、USBカーネルモジュールをダウンロードして再ロードできます。
$ sudo modprobe -r ehci_hcd; sudo modprobe ehci_hcd#USB2の場合$ sudo modprobe -r xhci_hcd; sudo modprobe xhci_hcd#USB3の場合
一部のディストリビューションには、Ubuntuの最新バージョンとその派生物が含まれていますが、 統合されたUSBモジュール そしてそれらはダウンロードできません。 一方、他のモジュール(プリンター、ストレージ、インターフェースデバイスなど)が原因で使用されているため、システムがダウンロードできない場合があります。モジュールのダウンロードを開始して問題が発生した場合は、コンピューターを再起動する必要があります。最後に。 したがって、別の方法で次のことができます。
$エコー '0000:00:14.5'| sudo tee / sys / bus / pci / drivers / xhci_hcd / unbind $ echo '0000:00:14.5'| sudo tee / sys / bus / pci / drivers / xhci_hcd / bind
デバイスを見つけるには、/ sys / bus / pci / drivers / xhci_hcd内でlsを実行できます。いくつか表示されますが、次のようなものを探す必要があります。 aaaa:bb:cc:dd.e。 USBポートはxhci_hcd(USB3)ではなく、ehci_hcd(USB2)として提供される場合があります