In veel gevallen, wanneer we onze computer gebruiken, ontkoppelen we een USB-apparaat (veilig, zoals het moet) en, onmiddellijk daarna, realiseren we ons dat we zijn vergeten een bestand te kopiëren of dat we ervoor moesten zorgen dat er gegevens in onze eenheid. Voor deze gevallen is het meestal erg handig om USB-drives virtueel los te koppelen wanneer u op afstand werkt.
Nadat we het apparaat hebben uitgeworpen, zien we het niet meer in onze lijst met apparaten, maar de harde schijf of pendrive is nog steeds verbonden via de USB-poort, en in veel distributies vandaag, nadat we de schijf veilig hebben uitgeworpen, zien we het apparaat ook niet en We kunnen niet doen monteren vanaf onze terminal. De snelste oplossing is om de kabel los te koppelen en opnieuw aan te sluiten, in sommige gevallen, hetzij vanwege luiheid omdat we moeten opstaan of omdat we toegang hebben tot een computer waar we niet voor staan en er is niemand in de buurt, we kunnen het niet doen .
Informatie over USB-apparaten
Laten we, voordat we beginnen, kijken hoe we informatie kunnen krijgen over USB-apparaten die op het systeem zijn aangesloten. Hiervoor kunnen we gebruik maken van lsusb, waarin de aangesloten apparaten nu worden weergegeven. Ik heb voorbeelden van wat ik nu op mijn computer krijg, maar misschien is het heel anders dan wat jij krijgt:
$ lsusb Bus 002 Device 001: ID 1d6b: 0003 Linux Foundation 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. Hub Bus 001 Apparaat 010: ID 125f: c93a A-DATA Technology Co., Ltd. 4GB Pen Drive Bus 001 Apparaat 003: ID 04f2: b424 Chicony Electronics Co., Ltd Bus 001 Apparaat 001: ID 1d6b : 0002 Linux Foundation 2.0 root-hub
Als we meer informatie willen, kunnen we de -t modifier gebruiken die ons een output laat zien in de vorm van een boom met informatie over de modules:
$ 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 | __ Poort 4: Dev 3, If 0, Class = Video, Driver = uvcvideo, 480M | __ Port 4: Dev 3, If 1, Class = Video, Driver = uvcvideo, 480M | __ Poort 5: Dev 10, If 0, Class = Mass Storage, Driver = usb-storage, 480M | __ Port 6: Dev 5, If 0, Class = Hub, Driver = hub / 4p, 12M | __ Port 4: Dev 7, If 0, Class = Human Interface Device, Driver = usbhid, 12M | __ Poort 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 | __ Poort 9: Dev 6, If 0, Class = Wireless, Driver = btusb, 12M | __ Port 9: Dev 6, If 1, Class = Wireless, Driver = btusb, 12M
Als we veel meer informatie willen, kunnen we dat gebruiken lsusb-v (de output is erg groot), we zouden bijvoorbeeld ook het maximale vermogen kunnen weten dat aan het apparaat wordt geleverd, op de volgende manier:
$ lsusb -v 2> / dev / null | egrep "^ Bus | MaxPower" Bus 002 Apparaat 001: ID 1d6b: 0003 Linux Foundation 3.0 root hub MaxPower 0mA Bus 001 Apparaat 006: ID 8087: 0a2a Intel Corp. MaxPower 100mA Bus 001 Apparaat 007: ID 046d: c52b Logitech, Inc. Unifying-ontvanger MaxPower 98mA Bus 001 Apparaat 005: ID 1a40: 0101 Terminus Technology Inc. Hub MaxPower 100mA Bus 001 Apparaat 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 root hub MaxPower 0mA
Andere zeer nuttige opdrachten zijn usb-apparaten, hwinfo, of, bijvoorbeeld, als we het pad van een apparaat hebben (binnen / dev /), kunnen we het systeem vragen om alle mogelijke informatie erover en de subsystemen die het moet doorlopen. Als we bijvoorbeeld een USB-harde schijf aansluiten om te kunnen zien hoe we het apparaat moeten gebruiken, hebben we een SCSI-stuurprogramma nodig (omdat het / dev / sdX is), we hebben ook een USB-opslagstuurprogramma nodig, dat werkt via de USB-poort, die hoort bij een hub, die is aangesloten op een PCI-poort, naast andere tussenliggende systemen. Alles waarmee we konden zien
$ udevadm info --query = pad --naam = / dev / sdX --attribute-walk
o
$ udevadm info -a -n / dev / sdX
Als we ons willen wagen, kunnen we ook binnenkomen / sys / bus / usb en kijk naar alles wat er is, we zullen veel informatie zien, maar gelukkig classificeren de bovenstaande commando's al deze informatie.
Privileges en apparaten
Om deze taak uit te voeren, moeten we weten naar welk apparaat we gaan maak opnieuw verbinding. Om dit te doen, kunnen we uitvoeren:
$ dmesg | tail [Thu Nov 24 19:50:04 2016] sd 7: 0: 0: 0: Bijgevoegd scsi algemeen sg3 type 0 [798339.431677] sd 7: 0: 0: 0: [sdc] 15806464 Logische blokken van 512 bytes: ( 8.09 GB / 7.54 GiB) [798339.431840] sd 7: 0: 0: 0: [sdc] Schrijfbeveiliging is uitgeschakeld [798339.431848] sd 7: 0: 0: 0: [sdc] Mode Sense: 00 00 00 00 [798339.431988] sd 7: 0: 0: 0: [sdc] Vragen om cachegegevens mislukt [798339.431996] sd 7: 0: 0: 0: [sdc] Ervan uitgaande dat schijfcache: schrijven door [798339.434157] sdc: sdc1 sdc2 [798339.446812] sd 7 : 0: 0: 0: [sdc] Bijgevoegde SCSI-verwijderbare schijf [798360.808588] ISO 9660-extensies: Microsoft Joliet Level 3 [798360.809353] ISO 9660-extensies: RRIP_1991A
In deze uitvoer zullen we zien dat het apparaat waarmee we werken is sdc (sdc1 en sdc2 zouden partities op die schijf zijn). Voor de voorbeelden zal ik dit apparaat gebruiken, in jouw geval zul je moeten visualiseren welk account je hebt.
In de onderstaande voorbeelden zal ik gebruiken sudo om de opdrachten uit te voeren met de rechten van wortel. Hoewel het voldoende zou zijn om een gebruiker met voldoende toestemming te hebben. Als we de nodige privileges willen zien, doe dat dan gewoon ls naar apparaat:
$ ls -latr / dev / sdc brw-rw ---- 1 rootdisk 8, 32 november 24 19:50 / dev / sdc
Daar zien we dat de eigenaar root is en de groep schijf. Het zou voldoende zijn om een gebruiker te hebben die tot de groepsschijf behoort.
Methode 1. Behandel het als een cd / dvd
Het is de eenvoudigste van allemaal. Als je GNU / Linux al jaren gebruikt, heb je bij het werken met cd-rom of dvd het uitwerpcommando gebruikt. Nou, uitwerpen werd gebruikt om de cd-rom te openen en uitwerpen -t werd gebruikt om de lade te sluiten. Als we dit doen vóór het USB-apparaat:
$ sudo uitwerpen -t / dev / sdc
Het apparaat zou eruit moeten zien alsof we het opnieuw hebben aangesloten.
Methode 2. Niet aangesloten en virtueel aangesloten
Op sommige systemen (zolang de hardware dit ondersteunt), stopt het apparaat met stroomvoorziening wanneer u het USB-apparaat veilig verwijdert en verschijnt het apparaat niet meer. Het is hetzelfde als wanneer u:
udisksctl power-off -b / dev / sdc
In dit geval / Dev / sdc het is mijn apparaat, en met deze opdracht simuleerde het een virtuele stroomonderbreking.
Het probleem is dat / dev / sdc nu niet bestaat, wat meer is, als we naar dmesg kijken, krijgen we zoiets als dit:
$ dmesg | staart [281954.693298] usb1-5: USB-verbinding verbreken, apparaatnummer 3
Dus als we het proberen met de methode van uitwerpen het zal niet werken. Opmerking: ik heb gemarkeerd usb1-5 en we zullen binnenkort zien waarom.
Als u op afstand werkt, kan dit een goed idee zijn. Stel je voor dat je USB-drives hebt aangesloten op de back-up. Wanneer u de kopieën maakt, is het goed voor het systeem om te weten dat er schijven zijn aangesloten, maar als we ze enerzijds niet gebruiken, moeten we energie te besparen en vermijd slijtage van de schijven, dus het is beter om de stroom af te snijden, aan de andere kant, we willen niet dat kwaadwillende apps zien dat ze bestaan deze schijven zodat ze niet geïnfecteerd raken. (Ja, er zijn virussen in GNU / Linux).
Hoe verbinden we de stroom nu?
We moeten de USB-poort bellen, hiervoor is er een project genaamd naafkracht (Ik link naar een vork van het originele project omdat hier een bug is opgelost die de stroom van meer apparaten kan verwijderen en niet alleen degene die we willen). Er zijn meer projecten (zoals uhubctl), maar dit heeft geen afhankelijkheden voor wanneer we gaan compileren, het is ook gewoon een hubpower.c-bestand.
Eerst compileren we het,
$ gcc -o hubpower hubpower.c
Herinner je je nu de vetgedrukte cijfers van de dmesgNou, we gaan ze gebruiken, we zullen het apparaat moeten loskoppelen en opnieuw verbinden, zoals dit:
$ sudo ./hubpower 1: 1 power 5 off Poort 5 status: 0000 Power-Off $ sudo ./hubpower 1: 1 power 5 on Poort 5 status: 0100 Power-On
Als het apparaat ons niet detecteert, kunnen we proberen:
$ sudo ./hubpower 1: 1 bind Bind-driver-verzoek verzonden naar de kernel
Op deze manier zullen we ons aangesloten USB-apparaat weer zien.
Als we geen C-programma willen ... Ik heb het in perl
Een C-programma is moeilijk te compileren en te testen of wat we gaan doen heel eenvoudig is, dus we kunnen deze kleine port proberen in 10 regels gemaakt in perl:
#! / bin / perl vereist "sys / ioctl.ph"; $ device = "05"; open (my $ usbdev,"> "," / dev / bus / usb/ 001/001 "); $ data = pack ("H *", "23010800". $ device. "000000FFFFFF8813"); ioctl ($ usbdev, 0xC0185500, $ data); $ data = pack ("H *", "23030800". $ device. "000000FFFFFF8813"); ioctl ($ usbdev, 0xC0185500, $ data); sluiten ($ usbdev);
We moeten respecteren $ apparaat, het poortnummer (in mijn geval was het 5), het is een waarde in hexadecimaal, daarom wordt 10 A, 11 B, 15 F, 16 is 10 ... We moeten ook het apparaat monitoren en de bus, waartoe we toegang hebben vanaf / dev / bus / usb /001/001moeten de nummers met voorloopnullen zijn, aangezien we dat bestand aanroepen.
Zoals we kunnen zien, bevindt de sleutel zich in ioctl (), het is een functie die parameters van een apparaat manipuleert vanuit een speciaal bestand in het bestandssysteem. Onder de gebruikte hexadecimale waarden vinden we 0xC0185500, een constante genaamd USBDEVFS_CONTROL waarmee we een controlecommando naar het USB-apparaat sturen. De andere codes horen bij het verbroken en verbindingsverzoek (u kunt meer informatie vinden in het programma gemaakt in C).
Methode 3. Het apparaat verbergen en weergeven
Een andere manier om het apparaat los te koppelen kan zijn:
echo '1-5' | sudo tee / sys / bus / usb / drivers / usb / unbind
En we kunnen het herstellen door te doen:
echo '1-5' | sudo tee / sys / bus / usb / drivers / usb / bind
Deze methode leidt niet tot een volledige ontkoppeling van het apparaat. Het zorgt er alleen voor dat het besturingssysteem er niet mee praat en dat veel apparaten, wanneer een computer er niets van wil weten, in de energiebesparende modus gaan, omdat we nergens om zullen vragen.
Methode 4. Apparaatautorisatie
Het nadeel van deze methode is dat in veel systemen meer apparaten tijdelijk kunnen worden uitgeschakeld, wat niet alleen degene is die we nodig hebben, maar we vallen ook een hele USB-hub aan. Bijvoorbeeld:
$ echo 0 | sudo tee / sys / bus / usb / devices / usb1 / geautoriseerde $ echo 1 | sudo tee / sys / bus / usb / devices / usb1 / geautoriseerd
Waarmee we natuurlijk alles op een rij kunnen uitvoeren:
$ echo 0 | sudo tee / sys / bus / usb / devices / usb1 / geautoriseerd; echo 1 | sudo tee / sys / bus / usb / devices / usb1 / geautoriseerd
We moeten voorzichtig zijn, als er meer schijven zijn aangesloten op dezelfde USB-poort (en bijna altijd op onze computers, zijn meerdere USB-poorten dan die we zien intern verbonden met een hub, dus er zijn groepen poorten met dezelfde USB-poort). vader, zeg het op een of andere manier.
Methode 5. Start het USB-subsysteem opnieuw op
Als we het USB-subsysteem willen herstarten. Dat wil zeggen, vernieuw alle USB-apparaten, zoals ze allemaal loskoppelen en aansluiten, enerzijds kunnen we de USB-kernelmodule downloaden en opnieuw laden:
$ sudo modprobe -r ehci_hcd; sudo modprobe ehci_hcd #Voor USB2 $ sudo modprobe -r xhci_hcd; sudo modprobe xhci_hcd #Voor USB3
Hoewel sommige distributies, de nieuwste versies van Ubuntu en afgeleide producten, de geïntegreerde USB-modules en ze kunnen niet worden gedownload. Aan de andere kant laat het systeem ons ze misschien niet downloaden omdat ze in gebruik zijn vanwege andere modules (printers, opslag, interfaceapparaten, enz.), En als we modules gaan downloaden en dingen kapot maken, moeten we mogelijk opnieuw opstarten de computer uiteindelijk. Dus op een andere manier kunnen we doen:
$ 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
Om ons apparaat te vinden, kunnen we ls doen in / sys / bus / pci / drivers / xhci_hcd, er zullen verschillende dingen verschijnen, we moeten er een zoeken die er zo uitziet aaaa: bb: cc: dd.e. Uw USB-poort komt misschien niet als xhci_hcd (USB3), maar eerder als ehci_hcd (USB2)
Uitstekend artikel!
Heel erg bedankt Cristian! Ik hoop dat je het nuttig hebt gevonden.
In dit artikel wordt niet gezegd dat wanneer je het gaat plaatsen, het zich aan de andere kant van de juiste bevindt en je het moet omdraaien ... hehehe. Geweldig artikel.
Bedankt Antonio Juan! Nou kijk, je weet niet hoe vaak dat mij is overkomen terwijl ik alles probeerde wat ik in de post heb gestopt! 🙂
Briljant. Een superieur item. Het zou de titel moeten hebben: "Leer meer over het Linux-systeem door simpelweg je USB-stick los te koppelen en in te pluggen." Gefeliciteerd.
Groeten uit Malaga.
Nou ja, ik weet niet of iemand zal beginnen met programmeren in C en toegang krijgt tot apparaten vanuit dit bericht! Ook uit Malaga !! We zijn overal 🙂
Indrukwekkend artikel. Je bent met dergelijk materiaal overboord gegaan.
Bedankt HO2Gi !! Op mijn persoonlijke blog ( http://totaki.com/poesiabinaria ) zijn er ook veel tutorials over de stijl 🙂
heel erg bedankt vriend. Ik begin in linux, specifiek in linux mint, en ik heb het volgende probleem: in de console kan ik zien dat mijn telefoon is verbonden met de machine, maar niet in de bestandsbeheerder. En daarom kan ik het niet als modem gebruiken om verbinding te maken met internet. Wat ik kan doen?
Er zijn telefoons waarmee u geen verbinding kunt maken als modem, maar u kunt tethering gebruiken
Uitstekende documentatie!
Bedankt dat je de tijd hebt genomen om deze ervaring te delen.
Ik gebruik het als referentie voor een ander type probleem dat ik heb: Ontkoppeling van de USB-poorten in Ubuntu (# 42 ~ precieze1-Ubuntu SMP wo 14 aug. 15:31:16 UTC 2013)
Er komt een tijd dat het systeem een -110 in de dmesg gooit en de pc opnieuw opstart. Aangenomen wordt dat de storing te wijten is aan een gebrek aan stroom op de USB waarop het apparaat is aangesloten (USB3.0).
Nu gebruik ik de lsusb -v om het vermogensniveau van het apparaat te controleren, maar het gooit 2mA, wat volkomen absurd is ... alleen de LED's verbruiken meer dan dat ...
Ik sluit een huawei E4 USB-8372G-modem aan, maar de maxpower geeft 2mA aan, wat ongelooflijk is, nu is de twijfel veranderd en zijn er andere ontstaan:
Is MaxPower een kenmerk dat standaard op het apparaat of in het besturingssysteem wordt geleverd?
Is het een parameter van het maximale vermogen dat de usb-poort zal leveren?
In het geval dat het een parameter is
Kan deze parameter worden gewijzigd en ingesteld op het maximum dat wordt gegeven door de USB-poort (900 mAh-3.0 / 500 mAh-2.0)?
In het geval dat het geen parameter is,
Is het een realtime meetwaarde van het USB-verbruik (onwaarschijnlijk)?
Als het een andere optie is, leg het me dan uit, want ik heb twijfels over de verwijzende informatie.
Ik heb verschillende twijfels over deze MaxPower-waarde, als je aanvullende informatie hebt, zou ik je zeer dankbaar zijn.
lsusb -v 2> / dev / null | egrep "^ Bus | MaxPower | bDeviceClass | iProduct"
Bus 002 Apparaat 006: ID 1a86: 7523 QinHeng Electronics HL-340 USB-seriële adapter
bDeviceClass 255 Leveranciersspecifieke klasse
iProduct 2 USB2.0-serieel
MaxPower 96mA
Bus 002 Apparaat 008: ID 12d1: 14db Huawei Technologies Co., Ltd.
bDeviceClass 2-communicatie
iProduct 2 HUAWEI_MOBILE
MaxPower 2mA
Kan het op ramen worden toegepast?
Hartelijk dank. Met udisksctl power-off -b / dev / sdc op mijn externe schijf was het genoeg om de hoofdpijn op te lossen. Zou het niet beter zijn als de unmount een optie heeft om dit zelf te doen?
Godverdomme! Heeft iemand dit hele testament gelezen? En boven na de plaat weten we nog steeds niet hoe we een DAC / USB-geluidsinterface, een printer, een grafisch tablet ... nou ja, niets dat geen spike of een externe schijf is, moeten uitschakelen. Wat een tijdverspilling ...