Przy wielu okazjach, kiedy korzystamy z naszego komputera, odłączamy urządzenie USB (bo tak jest bezpiecznie) i zaraz potem zdajemy sobie sprawę, że zapomnieliśmy skopiować plik lub że musieliśmy się upewnić, że dane zostały w naszej jednostce. W takich przypadkach zwykle bardzo przydatne jest wirtualne odłączanie dysków USB, gdy pracujemy zdalnie.
Po wysunięciu urządzenia nie widzimy go już na naszej liście urządzeń, ale dysk twardy lub pendrive jest nadal podłączony przez port USB, aw wielu dystrybucjach dziś, po bezpiecznym wysunięciu dysku, również nie widzimy urządzenia i Nie możemy tego zrobić uchwyt z naszego terminala. Najszybszym rozwiązaniem jest odłączenie kabla i ponowne podłączenie, w niektórych przypadkach albo z powodu lenistwa konieczności wstawania, albo z powodu dostępu do komputera, przed którym nie stoimy i nikogo nie ma w pobliżu, nie możemy tego zrobić.
Informacje o urządzeniach USB
Zanim zaczniemy, zobaczmy, jak uzyskać informacje o urządzeniach USB podłączonych do systemu. Do tego możemy użyć lsusb, który wyświetli teraz listę podłączonych urządzeń. Podaję przykłady tego, co mam teraz na moim komputerze, ale może jest to bardzo różne od tego, co otrzymujesz:
$ lsusb Magistrala 002 Urządzenie 001: ID 1d6b: 0003 Główny koncentrator Linux Foundation 3.0 Magistrala 001 Urządzenie 006: ID 8087: 0a2a Intel Corp. Bus 001 Urządzenie 007: ID 046d: c52b Logitech, Inc. Unifying Receiver Bus 001 Urządzenie 005: ID 1a40 : 0101 Terminus Technology Inc. Hub Bus 001 Urządzenie 010: ID 125f: c93a A-DATA Technology Co., Ltd. 4GB Pen Drive Bus 001 Urządzenie 003: ID 04f2: b424 Chicony Electronics Co., Ltd Bus 001 Urządzenie 001: ID 1d6b : 0002 Główny koncentrator Linux Foundation 2.0
Jeśli chcemy uzyskać więcej informacji, możemy użyć modyfikatora -t, który pokaże nam wynik w postaci drzewa z informacjami o modułach:
$ lsusb -t /: Bus 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, Jeśli 0, Class = Video, Driver = uvcvideo, 480M | __ Port 4: Dev 3, If 1, Class = Video, Driver = uvcvideo, 480M | __ Port 5: Dev 10, If 0, Class = Pamięć masowa, sterownik = pamięć usb, 480 M | __ Port 6: wersja deweloperska 5, jeśli 0, klasa = koncentrator, sterownik = koncentrator / 4 p, 12 M | __ Port 4: wersja 7, jeśli 0, klasa = urządzenie interfejsu ludzkiego, Driver = 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, Jeśli 0, Class = Wireless, Driver = btusb, 12M | __ Port 9: Dev 6, If 1, Class = Wireless, Driver = btusb, 12M
Jeśli chcemy znacznie więcej informacji, możemy użyć lsusb -v (moc jest bardzo duża) moglibyśmy też np. poznać maksymalną moc jaka jest dostarczana do urządzenia w następujący sposób:
$ lsusb -v 2> / dev / null | egrep "^ Bus | MaxPower" Bus 002 Urządzenie 001: ID 1d6b: 0003 Główny koncentrator Linux Foundation 3.0 MaxPower 0mA Bus 001 Urządzenie 006: ID 8087: 0a2a Intel Corp. MaxPower 100mA Magistrala 001 Urządzenie 007: ID 046d: c52b Logitech, Inc. Odbiornik Unifying MaxPower 98mA Bus 001 Urządzenie 005: ID 1a40: 0101 Terminus Technology Inc. Hub MaxPower 100mA Bus 001 Urządzenie 010: ID 125f: c93a A-DATA Technology Co., Ltd. 4 GB Pen Drive MaxPower 480mA Bus 001 Urządzenie 003: ID 04f2: b424 Chicony Electronics Co., Ltd MaxPower 500mA Bus 001 Urządzenie 001: ID 1d6b: 0002 Główny koncentrator Linux Foundation 2.0 MaxPower 0mA
Inne bardzo przydatne polecenia to urządzenia USB, hwinfolub np. jeśli mamy ścieżkę do urządzenia (wewnątrz / dev /), możemy poprosić system o wszelkie możliwe informacje na jego temat i podsystemy, przez które musi przejść. Na przykład, jeśli podłączymy dysk twardy USB, abyśmy mogli zobaczyć, jak urządzenie jest używane, potrzebujemy sterownika SCSI (do bycia / dev / sdX), potrzebujemy również sterownika pamięci USB, który działa przez port USB, który należy do koncentrator, który jest podłączony do portu PCI, wśród innych systemów pośrednich. Wszystko, co mogliśmy zobaczyć
$ udevadm info --query = path --name = / dev / sdX --attribute-walk
o
$ udevadm info -a -n / dev / sdX
Jeśli chcemy zaryzykować, możemy też wejść / sys / bus / usb i spójrz na wszystko, co jest, zobaczymy wiele informacji, ale na szczęście powyższe polecenia klasyfikują wszystkie te informacje.
Uprawnienia i urządzenia
Aby wykonać to zadanie, będziemy musieli wiedzieć, do którego urządzenia się wybieramy na nowo połączyć. Aby to zrobić, możemy uruchomić:
$ dmesg | tail [Thu Nov 24 19:50:04 2016] sd 7: 0: 0: 0: Attached scsi generic sg3 type 0 [798339.431677] sd 7: 0: 0: 0: [sdc] 15806464 512-bajtowe bloki logiczne: ( 8.09 GB / 7.54 GiB) [798339.431840] sd 7: 0: 0: 0: [sdc] Ochrona przed zapisem jest wyłączona [798339.431848] sd 7: 0: 0: 0: [sdc] Poczucie trybu: 00 00 00 00 [798339.431988] sd 7: 0: 0: 0: [sdc] Pytanie o dane w pamięci podręcznej nie powiodło się [798339.431996] sd 7: 0: 0: 0: [sdc] Przy założeniu pamięci podręcznej dysku: zapis przez [798339.434157] sdc: sdc1 sdc2 [798339.446812] sd 7 : 0: 0: 0: [sdc] Dołączony dysk wymienny SCSI [798360.808588] Rozszerzenia ISO 9660: Microsoft Joliet Level 3 [798360.809353] Rozszerzenia ISO 9660: RRIP_1991A
Na tym wyjściu zobaczymy, że urządzenie, z którym pracujemy, to Sdc (sdc1 i sdc2 byłyby partycjami na tym dysku). W przykładach użyję tego urządzenia, w twoim przypadku będziesz musiał wizualizować, jakie masz konto.
W poniższych przykładach użyję sudo do wykonywania poleceń z uprawnieniami korzeń. Chociaż wystarczyłoby mieć użytkownika z wystarczającymi uprawnieniami. Jeśli chcemy zobaczyć niezbędne przywileje, po prostu zrób to ls do urządzenia:
$ ls -latr / dev / sdc brw-rw ---- 1 dysk główny 8, 32 24 listopada 19:50 / dev / sdc
Tam widzimy, że właścicielem jest root i grupa dysk. Wystarczyłoby mieć użytkownika należącego do dysku grupowego.
Metoda 1. Traktuj to jak dysk CD / DVD
To jest najprostsze ze wszystkich. Z pewnością, jeśli używasz GNU / Linuksa od lat, kiedy pracujesz z CD-ROM lub DVD, użyłeś polecenia eject. Cóż, wysunięcie zostało użyte do otwarcia CDROM, a wysunięcie -t zostało użyte do zamknięcia tacy. Cóż, jeśli zrobimy to przed urządzeniem USB:
$ sudo eject -t / dev / sdc
Urządzenie powinno wyglądać tak, jakbyśmy je ponownie podłączyli.
Metoda 2. Odłączony i podłączony wirtualnie
W niektórych systemach (o ile obsługuje je sprzęt), po bezpiecznym odłączeniu urządzenia USB urządzenie przestaje się włączać i nie pojawia się. Działa tak samo, jak wtedy:
udisksctl power-off -b / dev / sdc
W tym przypadku / dev / sdc to moje urządzenie i za pomocą tego polecenia symuluje wirtualne odłączenie zasilania.
Problem w tym, że teraz / dev / sdc nie istnieje, co więcej, jeśli spojrzymy na dmesg, otrzymamy coś takiego:
$ dmesg | ogon [281954.693298] USB 1-5: Odłączenie USB, numer urządzenia 3
Więc jeśli spróbujemy z metodą wyrzucać to nie zadziała. Uwaga: zaznaczyłem USB 1-5 a wkrótce zobaczymy, dlaczego.
Jeśli pracujesz zdalnie, może to być dobry pomysł. Wyobraź sobie, że masz podłączone dyski USB do tworzenia kopii zapasowych. Podczas wykonywania kopii dobrze, że system wie, że są podłączone dyski, ale gdy ich nie używamy, z jednej strony musimy oszczędzać energię i unikaj zużycia tarcz, dlatego z drugiej strony lepiej odciąć prąd, nie chcemy, aby złośliwe aplikacje widziały, że istnieją te dyski, aby nie zostały zainfekowane. (Tak, w systemie GNU / Linux są wirusy).
Jak teraz łączymy prąd?
Musimy nawiązać połączenie z portem USB, w tym celu istnieje projekt o nazwie moc piasty (Podaję link do rozwidlenia oryginalnego projektu, ponieważ tutaj naprawiono błąd, który może usunąć prąd z większej liczby urządzeń, a nie tylko tego, którego chcemy). Jest więcej projektów (np uhubctl), ale nie ma żadnych zależności, kiedy przechodzimy do kompilacji, jest to również plik hubpower.c.
Najpierw go kompilujemy,
$ gcc -o hubpower hubpower.c
Czy pamiętasz teraz pogrubione liczby z dmesgCóż, będziemy ich używać, będziemy musieli odłączyć urządzenie i podłączyć je ponownie, na przykład:
$ sudo ./hubpower 1: 1 zasilanie 5 wyłączone Status portu 5: 0000 Wyłączony $ sudo ./hubpower 1: 1 zasilanie 5 włączone Status portu 5: 0100 Włączony
Jeśli urządzenie nas nie wykryje, możemy spróbować:
$ sudo ./hubpower 1: 1 bind Żądanie powiązania sterownika wysłane do jądra
W ten sposób ponownie zobaczymy nasze podłączone urządzenie USB.
Jeśli nie chcemy programu w C ... mam go w perlu
Program w C jest trudny do skompilowania i przetestowania, czy to, co zamierzamy zrobić, jest bardzo proste, więc możemy wypróbować ten mały port w 10 wierszach wykonany w perlu:
#! / bin / perl wymagają "sys / ioctl.ph"; $ device = "05"; open (my $ usbdev,"> "," / dev / bus / usb/ 001/001 "); $ dane = opakowanie ("H *", "23010800". $ urządzenie. "000000FFFFFF8813"); ioctl ($ usbdev, 0xC0185500, $ dane); $ dane = opakowanie ("H *", "23030800". $ urządzenie. "000000FFFFFF8813"); ioctl ($ usbdev, 0xC0185500, $ dane); zamknij ($ usbdev);
Musimy szanować $ device, numer portu (w moim przypadku było to 5), jest to wartość szesnastkowa, więc 10 będzie A, 11 będzie B, 15 będzie F, 16 będzie 10 ... Musimy też monitorować urządzenie i magistralę, do którego mamy dostęp z / dev / bus / usb /001/001, liczby muszą mieć początkowe zera, ponieważ wywołujemy ten plik.
Jak widać, klucz znajduje się w ioctl (), jest to funkcja, która manipuluje parametrami urządzenia ze specjalnego pliku w systemie plików. Wśród użytych wartości szesnastkowych znajdujemy 0xC0185500, stała o nazwie USBDEVFS_CONTROL, za pomocą której wyślemy polecenie sterujące do urządzenia USB, Pozostałe kody należą do żądania odłączenia i połączenia (więcej informacji można znaleźć w programie wykonanym w C).
Metoda 3. Ukrywanie i pokazywanie urządzenia
Innym sposobem odłączenia urządzenia może być:
echo '1-5' | sudo tee / sys / bus / usb / drivers / usb / unbind
I możemy to odzyskać, wykonując:
echo '1-5' | sudo tee / sys / bus / usb / drivers / usb / bind
Ta metoda nie powoduje całkowitego odłączenia urządzenia. To tylko sprawia, że system operacyjny z nim nie rozmawia, a wiele urządzeń, gdy komputer nie chce nic o nich wiedzieć, przechodzą w tryb niskiego poboru mocy, ponieważ nie będziemy o nic prosić.
Metoda 4. Autoryzacja urządzenia
Wadą tej metody jest to, że w wielu systemach można tymczasowo dezaktywować więcej urządzeń, które są nie tylko tym, czego potrzebujemy, ale także atakujemy cały koncentrator USB. Na przykład:
$ echo 0 | sudo tee / sys / bus / usb / devices / usb1 / autoryzowane $ echo 1 | sudo tee / sys / bus / usb / devices / usb1 / authorised
Co oczywiście możemy uruchomić wszystko z rzędu:
$ echo 0 | sudo tee / sys / bus / usb / devices / usb1 / autoryzowane; echo 1 | sudo tee / sys / bus / usb / devices / usb1 / authorised
Musimy uważać, jeśli jest więcej dysków podłączonych do tego samego portu USB (i prawie zawsze w naszych komputerach kilka portów USB, niż widzimy, jest wewnętrznie podłączonych do koncentratora, więc są grupy portów z tym samym USB ojciec, ująć to w jakiś sposób.
Metoda 5. Uruchom ponownie podsystem USB
Jeśli chcemy ponownie uruchomić podsystem USB. Czyli odświeżyć wszystkie urządzenia USB, np. Odłączając i podłączając je wszystkie, z jednej strony możemy pobrać i przeładować moduł jądra USB:
$ sudo modprobe -r ehci_hcd; sudo modprobe ehci_hcd # For USB2 $ sudo modprobe -r xhci_hcd; sudo modprobe xhci_hcd #Dla USB3
Chociaż niektóre dystrybucje, w tym najnowsze wersje Ubuntu i pochodnych, mają rozszerzenie zintegrowane moduły USB i nie można ich pobrać. Z drugiej strony system może nie pozwolić nam ich pobrać, ponieważ są w użyciu ze względu na inne moduły (drukarki, pamięci masowe, urządzenia interfejsowe itp.), A jeśli zaczniemy pobierać moduły i zepsuć rzeczy, być może będziemy musieli ponownie uruchomić komputer. na końcu. Więc w inny sposób możemy zrobić:
$ echo '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
Aby znaleźć nasze urządzenie, możemy zrobić ls wewnątrz / sys / bus / pci / drivers / xhci_hcd, pojawi się kilka rzeczy, musimy poszukać takiego, który wygląda tak aaaa: bb: cc: dd.e. Twój port USB może nie być dostępny jako xhci_hcd (USB3), ale raczej jako ehci_hcd (USB2)
Świetny artykuł!
Bardzo dziękuję Cristian! Mam nadzieję, że okazał się przydatny.
W tym artykule nie jest powiedziane, że za każdym razem, gdy zamierzasz go umieścić, znajduje się on po przeciwnej stronie do właściwej i musisz go obrócić ... Świetny artykuł.
Dzięki Antonio Juan! Cóż, nie wiesz, ile razy to mi się przydarzyło, kiedy próbowałem wszystkiego, co umieściłem w poście! 🙂
Świetny. Doskonały przedmiot. Powinien nosić tytuł: „Dowiedz się o systemie Linux, po prostu odłączając i podłączając pamięć USB”. Gratulacje.
Pozdrowienia z Malagi.
No tak, nie wiem czy ktoś zacznie programować w C i uzyskiwać dostęp do urządzeń z tego postu! Również z Malagi !! Jesteśmy wszędzie 🙂
Imponujący artykuł. Z takim materiałem przesadziłeś.
Dzięki HO2Gi !! Na moim osobistym blogu ( http://totaki.com/poesiabinaria ) istnieje również wiele tutoriali dotyczących stylu 🙂
dziękuje Ci bardzo przyjacielu. Uruchamiam w Linuksie, a konkretnie w Linuksie Mint i mam następujący problem: w konsoli widzę, że mój telefon jest podłączony do maszyny ale nie w menedżerze plików. Dlatego nie mogę używać go jako modemu do łączenia się z Internetem. Co mogę zrobić?
Istnieją telefony, które nie pozwalają na połączenie jako modem, ale możesz korzystać z tetheringu
Doskonała dokumentacja!
Dziękujemy za poświęcenie czasu na podzielenie się doświadczeniem.
Używam go jako odniesienia do innego rodzaju problemu, który mam: Odłączenie portów USB w Ubuntu (# 42 ~ precyzyjne1-Ubuntu SMP środa 14 sierpnia 15:31:16 UTC 2013)
Przychodzi taki moment, gdy System wrzuca -110 do dmesg i restartuje komputer, zakłada się, że awaria jest spowodowana brakiem zasilania w USB, do którego jest podłączone urządzenie (USB3.0).
Teraz używam lsusb -v do sprawdzenia poziomu mocy urządzenia, ale rzuca 2mA, co jest totalnie absurdalne ... tylko diody zużywają więcej ...
Podłączam modem USB-4G Huawei E8372, jednak maxpower wskazuje 2mA, co jest niebywałe, teraz wątpliwości się zmieniły i pojawiły się inne:
Czy MaxPower to atrybut, który jest domyślnie dostępny na urządzeniu lub w systemie operacyjnym?
Czy jest to parametr maksymalnej mocy, jaką dostarczy port USB?
W przypadku, gdy jest parametrem
Czy ten parametr można zmodyfikować i ustawić na maksimum podane przez port USB (900 mAh - 3.0 / 500 mAh - 2.0)?
W przypadku, gdy nie jest parametrem,
Czy jest to wartość pomiaru zużycia USB w czasie rzeczywistym (mało prawdopodobne)?
Jeśli jest to inna opcja, proszę o wyjaśnienie, ponieważ mam wątpliwości co do informacji referencyjnych.
Mam kilka wątpliwości co do tej wartości MaxPower, gdybyś miał jakieś dodatkowe informacje, byłbym bardzo wdzięczny.
lsusb -v 2> / dev / null | egrep "^ Bus | MaxPower | bDeviceClass | iProduct"
Bus 002 Urządzenie 006: ID 1a86: 7523 QinHeng Electronics HL-340 Adapter szeregowy USB
bDeviceClass 255 Vendor Specific Class
iProduct 2 USB2.0-szeregowy
MaxPower 96mA
Urządzenie Bus 002 008: ID 12d1: 14db Huawei Technologies Co., Ltd.
bDeviceClass 2 Communications
iProduct 2 HUAWEI_MOBILE
MaxPower 2mA
Czy można go zastosować do okien?
Wielkie dzięki. Z udisksctl power-off -b / dev / sdc na moim zewnętrznym dysku wystarczyło, aby rozwiązać ból głowy. Czy nie byłoby lepiej, gdyby odmontowanie miało opcję zrobienia tego samodzielnie?
Boże co do cholery! Czy ktoś przeczytał cały ten testament? A wyżej po płytce nadal nie wiemy, jak wyłączyć interfejs dźwiękowy DAC/USB, drukarkę, tablet graficzny… krótko mówiąc, nic, co nie jest kolcem ani dyskiem zewnętrznym. Co za strata czasu ...