Wanneer ons ons rekenaar gebruik, ontkoppel ons baie keer 'n USB-toestel (veilig, soos dit moet wees), en onmiddellik daarna besef ons dat ons vergeet het om 'n lêer te kopieer of dat ons moes seker maak dat die data in ons eenheid. In hierdie gevalle is dit gewoonlik baie handig om die USB-skyfies feitlik te ontkoppel as ons op afstand werk.
Nadat ons die toestel uitgegooi het, sien ons dit nie meer in ons lys met toestelle nie, maar die hardeskyf of pendrive is nog steeds deur die USB-poort gekoppel. Ons kan nie berg vanaf ons terminale. Die vinnigste oplossing is om die kabel te ontkoppel en weer aan te sluit, in sommige gevalle, as gevolg van luiheid om op te staan, of omdat ons toegang het tot 'n rekenaar waarvoor ons nie is nie en daar niemand is nie, ons kan dit nie doen nie.
Index
- 1 Inligting oor USB-toestelle
- 2 Voorregte en toestelle
- 3 Metode 1. Behandel dit soos 'n CD / DVD
- 4 Metode 2. Ontkoppel en virtueel ingeprop
- 5 As ons nie 'n C-program wil hê nie ... het ek dit in die perl
- 6 Metode 3. Versteek en wys die toestel
- 7 Metode 4. Toestemming van toestelle
- 8 Metode 5. Herbegin die USB-substelsel
Inligting oor USB-toestelle
Kom ons kyk eers voordat ons begin om inligting te kry oor USB-toestelle wat aan die stelsel gekoppel is. Hiervoor kan ons gebruik lsusb, wat tans die gekoppelde toestelle sal lys. Ek sit voorbeelde van wat ek nou op my rekenaar kry, maar miskien is dit baie anders as wat u kry:
$ 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. Hubbus 001 Toestel 010: ID 125f: c93a A-DATA Technology Co., Ltd. 4GB Pen Drive Bus 001 Toestel 003: ID 04f2: b424 Chicony Electronics Co., Ltd Bus 001 Toestel 001: ID 1d6b : 0002 Linux Foundation 2.0-wortelhub
As ons meer inligting wil hê, kan ons die wysiger -t gebruik wat 'n boomvormige afvoer met inligting oor die modules sal wys:
$ lsusb -t /: Bus 02.Poort 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, indien 0, Class = Video, Driver = uvcvideo, 480M | __ Port 4: Dev 3, If 1, Class = Video, Driver = uvcvideo, 480M | __ Port 5: Dev 10, If 0, Class = Massa-berging, bestuurder = usb-opslag, 480M | __ Poort 6: Dev 5, indien 0, Class = Hub, Driver = hub / 4p, 12M | __ Poort 4: Dev 7, As 0, Class = Human Interface Device, 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 | __ Poort 9: Dev 6, indien 0, Class = Wireless, Driver = btusb, 12M | __ Port 9: Dev 6, As 1, Class = Wireless, Driver = btusb, 12M
As ons baie meer inligting wil hê, kan ons dit gebruik lsusb -v (as die uitset baie groot is), kan ons byvoorbeeld die maksimum krag wat aan die toestel gelewer word, op die volgende manier ken:
$ lsusb -v 2> / dev / null | egrep "^ Bus | MaxPower" Bus 002 Toestel 001: ID 1d6b: 0003 Linux Foundation 3.0 wortelhub MaxPower 0mA Bus 001 Toestel 006: ID 8087: 0a2a Intel Corp. MaxPower 100mA Bus 001 Toestel 007: ID 046d: c52b Logitech, Inc. Unifying Receiver MaxPower 98mA Bus 001 Toestel 005: ID 1a40: 0101 Terminus Technology Inc. Hub MaxPower 100mA Bus 001 Toestel 010: ID 125f: c93a A-DATA Technology Co., Ltd. 4GB Pen Drive MaxPower 480mA Bus 001 Toestel 003: ID 04f2: b424 Chicony Electronics Co., Ltd MaxPower 500mA Bus 001 Toestel 001: ID 1d6b: 0002 Linux Foundation 2.0 wortelhub MaxPower 0mA
Ander baie nuttige opdragte is usb-toestelle, hwinfo, of as ons byvoorbeeld die pad van 'n toestel (binne / dev /) het, kan ons die stelsel vra vir alle moontlike inligting daaroor en die substelsels waardeur dit moet gaan. As ons byvoorbeeld 'n USB-hardeskyf verbind, sodat ons kan sien hoe u die toestel kan gebruik, benodig ons 'n SCSI-bestuurder (om te wees / dev / sdX), ons het ook 'n USB-stoorbestuurder nodig wat werk deur die USB-poort, wat behoort 'n hub wat onder andere tussenstelsels in 'n PCI-poort ingeprop is. Alles waarmee ons kon sien
$ udevadm info --query = path --name = / dev / sdX - attribute-walk
o
$ udevadm info -a -n / dev / sdX
As ons dit wil waag, kan ons ook inskryf / sys / bus / usb en kyk na alles wat daar is, sal ons baie inligting sien, maar gelukkig klassifiseer die bogenoemde opdragte al hierdie inligting.
Voorregte en toestelle
Om hierdie taak uit te voer, sal ons moet weet na watter toestel ons gaan weer verbind. Om dit te doen, kan ons hardloop:
$ dmesg | stert [Do Nov 24 19:50:04 2016] sd 7: 0: 0: 0: Aangeheg scsi generiese sg3 tipe 0 [798339.431677] sd 7: 0: 0: 0: [sdc] 15806464 512-byte logiese blokke: ( 8.09 GB / 7.54 GiB) [798339.431840] sd 7: 0: 0: 0: [sdc] Skryfbeveiliging is uit [798339.431848] sd 7: 0: 0: 0: [sdc] Mode sin: 00 00 00 00 [798339.431988] sd 7: 0: 0: 0: [sdc] Vra vir cache-data het misluk [798339.431996] sd 7: 0: 0: 0: [sdc] Gestel skyfgeheue: skryf deur [798339.434157] sdc: sdc1 sdc2 [798339.446812] sd 7 : 0: 0: 0: [sdc] Aangehegte SCSI-verwyderbare skyf [798360.808588] ISO 9660 Uitbreidings: Microsoft Joliet Vlak 3 [798360.809353] ISO 9660 Uitbreidings: RRIP_1991A
In hierdie uitvoer sal ons sien dat die toestel waarmee ons werk, is STK (sdc1 en sdc2 sou partisies binne daardie skyf wees). Vir die voorbeelde sal ek hierdie toestel gebruik, in u geval moet u visualiseer watter rekening u het.
In die onderstaande voorbeelde sal ek gebruik sudo om die opdragte uit te voer met die voorregte van wortel. Alhoewel dit genoeg sou wees om 'n gebruiker met voldoende toestemming te hê. As ons die nodige voorregte wil sien, doen dit net ls na toestel:
$ ls -latr / dev / sdc brw-rw ---- 1 wortelskyf 8, 32 Nov 24 19:50 / dev / sdc
Daar sien ons dat die eienaar root en die groep is skyf. Dit sou voldoende wees om 'n gebruiker wat tot die groepskyf behoort, te hê.
Metode 1. Behandel dit soos 'n CD / DVD
Dit is die eenvoudigste van almal. As u al jare lank GNU / Linux gebruik, het u die uitwerpopdrag gebruik toe u met CD-ROM of DVD gewerk het. Wel, die uitwerp is gebruik om die CDROM oop te maak en die uitwerp -t is gebruik om die skinkbord toe te maak. Wel, as ons dit voor die USB-toestel doen:
$ sudo-uitwerp -t / dev / sdc
Die toestel moet lyk asof ons dit weer verbind.
Metode 2. Ontkoppel en virtueel ingeprop
Op sommige stelsels (solank die hardeware dit ondersteun), hou die toestel op met krag en stop dit nie meer as u die USB-toestel veilig verwyder. Dit is dieselfde as wanneer u dit doen:
udisksctl afskakel -b / dev / sdc
In hierdie geval, / Dev / STK dit is my toestel, en met hierdie opdrag het dit 'n virtuele kragonderbreking gesimuleer.
Die probleem is dat nou / dev / sdc nie bestaan nie. Wat meer is, as ons na dmesg kyk, sal ons so iets kry:
$ dmesg | stert [281954.693298] usb 1-5: USB-ontkoppeling, toestel nommer 3
Dus as ons probeer met die metode van uitwerp dit gaan nie werk nie. Let wel: Ek het uitgelig usb 1-5 en ons sal binnekort sien waarom.
As u op afstand werk, kan dit 'n goeie idee wees. Stel u voor dat u USB-skyfies aan die rugsteun gekoppel het. As u die kopieë maak, is dit goed dat die stelsel weet dat daar skywe gekoppel is, maar as ons dit nie gebruik nie, moet ons enersyds om energie te bespaar en vermy die verweer van die skywe, dus is dit beter om die stroom te sny, aan die ander kant, ons wil nie hê dat kwaadwillige programme moet sien dat dit bestaan nie hierdie skywe sodat hulle nie besmet raak nie. (Ja, in GNU / Linux is daar virusse).
Hoe verbind ons die stroom nou?
Ons moet 'n oproep doen na die USB-poort, want daar is 'n projek genaamd spilkrag (Ek skakel na 'n vurk van die oorspronklike projek, want hier is 'n fout reggestel wat die stroom van meer toestelle kan verwyder en nie net die een wat ons wil hê nie). Daar is meer projekte (soos uhubctl), maar dit het geen afhanklikheid nie, want as ons gaan saamstel, is dit ook net 'n hubpower.c-lêer.
Eerstens stel ons dit saam,
$ gcc -o hubpower hubpower.c
Onthou u die vetgedrukte getalle in die dmesg? Wel, ons gaan dit gebruik, ons sal die toestel moet ontkoppel en weer verbind, soos volg:
$ 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
As die toestel ons nie opspoor nie, kan ons dit doen:
$ sudo ./hubpower 1: 1 bind Bind-drywer-versoek gestuur na die kern
Op hierdie manier sien ons weer ons gekoppelde USB-toestel.
As ons nie 'n C-program wil hê nie ... het ek dit in die perl
'N C-program is moeilik om saam te stel en te toets of dit baie eenvoudig is, en daarom kan ons hierdie klein poort in tien reëls in perl probeer:
#! / bin / perl benodig "sys / ioctl.ph"; $ device = "05"; open (my $ usbdev,"> "," / dev / bus / usb/ 001/001 "); $ data = pak ("H *", "23010800". $ toestel. "000000FFFFFF8813"); ioctl ($ usbdev, 0xC0185500, $ data); $ data = pak ("H *", "23030800". $ toestel. "000000FFFFFF8813"); ioctl ($ usbdev, 0xC0185500, $ data); sluit ($ usbdev);
Ons moet respekteer $ toestel, die poortnommer (in my geval was dit 5), dit is 'n heksadesimale waarde, daarom is 10 A, 11 sal B wees, 15 sal F wees, 16 sal 10 wees ... Ons moet ook die toestel en die bus monitor, waartoe ons toegang verkry vanaf / dev / bus / usb /001/001, die getalle moet met vooraanstaande nulle wees, aangesien ons die lêer noem.
Soos ons kan sien, is die sleutel in ioctl (), dit is 'n funksie wat parameters van 'n toestel vanaf 'n spesiale lêer in die lêerstelsel manipuleer. Onder die heksadesimale waardes wat gebruik word, vind ons 0xC0185500, 'n konstante genaamd USBDEVFS_CONTROL waarmee ons 'n beheeropdrag na die USB-toestel sal stuur. Die ander kodes behoort tot die ontkoppelings- en verbindingsversoek (u kan meer inligting vind in die program wat in C gemaak is).
Metode 3. Versteek en wys die toestel
'N Ander manier om die toestel te ontkoppel, kan wees:
eggo '1-5' | sudo tee / sys / bus / usb / bestuurders / usb / ontbind
En ons kan dit herstel deur:
eggo '1-5' | sudo tee / sys / bus / usb / bestuurders / usb / bind
Hierdie metode veroorsaak nie 'n volledige ontkoppeling van die toestel nie. Dit laat die bedryfstelsel net nie daaroor praat nie en baie toestelle, as 'n rekenaar niks hiervan wil weet nie, gaan hulle in lae kragmodus, want ons gaan niks vra nie.
Metode 4. Toestemming van toestelle
Die nadeel van hierdie metode is dat daar in baie stelsels meer toestelle tydelik gedeaktiveer kan word, wat nie net nodig is nie, maar ook 'n hele USB-hub aanval. Byvoorbeeld:
$ eggo 0 | sudo tee / sys / bus / usb / toestelle / usb1 / gemagtigde $ echo 1 | sudo tee / sys / bus / usb / toestelle / usb1 / gemagtig
Wat ons natuurlik alles agter mekaar kan laat loop:
$ eggo 0 | sudo tee / sys / bus / usb / toestelle / usb1 / gemagtig; eggo 1 | sudo tee / sys / bus / usb / toestelle / usb1 / gemagtig
Ons moet versigtig wees as daar meer skyfies aan dieselfde USB-poort gekoppel is (en byna altyd op ons rekenaars, is verskeie USB-poorte as die wat ons sien intern gekoppel aan 'n hub, so daar is groepe poorte met dieselfde USB vader, stel dit op 'n manier.
Metode 5. Herbegin die USB-substelsel
As ons die USB-substelsel wil weer begin. Dit wil sê: verfris alle USB-toestelle, soos om almal uit te trek en aan te sluit, enersyds kan ons die USB-kernelmodule aflaai en herlaai:
$ sudo modprobe -r ehci_hcd; sudo modprobe ehci_hcd # Vir USB2 $ sudo modprobe -r xhci_hcd; sudo modprobe xhci_hcd # Vir USB3
Alhoewel sommige verspreidings, die nuutste weergawes van Ubuntu en afgeleides, die geïntegreerde USB-modules en hulle kan nie afgelaai word nie. Aan die ander kant, kan die stelsel nie toelaat dat ons dit aflaai nie, omdat dit gebruik word vanweë ander modules (drukkers, berging, koppelvlaktoestelle, ens.), En as ons modules begin aflaai en dinge breek, moet ons die rekenaar dalk weer begin. aan die einde. Op 'n ander manier kan ons dit doen:
$ eggo '0000: 00: 14.5'| sudo tee / sys / bus / pci / bestuurders / xhci_hcd / ontkoppel $ echo '0000: 00: 14.5'| sudo tee / sys / bus / pci / drywers / xhci_hcd / bind
Om ons toestel te vind, kan ons ls binne / sys / bus / pci / bestuurders / xhci_hcd doen, verskeie dinge sal verskyn, ons moet een soek wat so lyk aaaa: bb: cc: dd.e. U USB-poort kom miskien nie as xhci_hcd (USB3) nie, maar eerder ehci_hcd (USB2)
14 kommentaar, los joune
Uitstekende artikel!
Baie dankie Cristian! Ek hoop dat u dit nuttig gevind het.
In hierdie artikel word nie gesê dat wanneer u dit gaan gebruik, dit aan die ander kant van die regte een is nie, en u moet dit omdraai ... hehehe. Goeie artikel.
Dankie Antonio Juan! Wel, jy weet nie hoeveel keer dit met my gebeur het terwyl ek alles probeer het wat ek in die pos geplaas het nie! 🙂
Groot. 'N Superieure item. Dit moet die titel he: "Lees meer oor die Linux-stelsel deur eenvoudig u USB-stekker uit te koppel en in te steek." Baie geluk.
Groete uit Malaga.
Nou ja, ek weet nie of iemand vanaf hierdie pos in C sal begin programmeer en toegang tot toestelle sal kry nie! Ook van Malaga !! Ons is oral 🙂
Indrukwekkende artikel. Jy het oorboord gegaan met sulke materiaal.
Dankie HO2Gi !! Op my persoonlike blog ( http://totaki.com/poesiabinaria ) daar is ook baie tutoriale van die styl 🙂
baie dankie vriend. Ek begin in Linux, spesifiek in Linux mint, en ek het die volgende probleem: in die konsole kan ek sien dat my telefoon op die masjien gekoppel is, maar nie in die lêerbestuurder nie. En daarom kan ek dit nie as 'n modem gebruik om verbinding met die internet te maak nie. Wat ek kan doen?
Daar is telefone waarmee u nie as modem kan koppel nie, maar wel met tethering
Uitstekende dokumentasie!
Dankie dat u die tyd geneem het om die ervaring te deel.
Ek gebruik dit as verwysing vir 'n ander soort probleem wat ek het: Ontkoppeling van die USB-poorte in Ubuntu (# 42 ~ presies1-Ubuntu SMP Wo 14 Aug 15:31:16 UTC 2013)
Daar kom 'n tyd dat die stelsel 'n -110 in die dmesg gooi en die rekenaar weer begin, daar word aanvaar dat die mislukking te wyte is aan die gebrek aan krag in die USB waar die toestel gekoppel is (USB3.0).
Nou gebruik ek die lsusb -v om die kragvlak van die toestel te verifieer, maar dit gooi 2mA, wat heeltemal absurd is ... net die LED's verbruik meer as dit ...
Ek verbind 'n huawei E4 USB-8372G-modem, maar die maksimum krag dui 2mA aan, wat ongelooflik is, nou het die twyfel verander en ander het ontstaan:
Is MaxPower 'n kenmerk wat standaard op die toestel of in die bedryfstelsel is?
Is dit 'n parameter van die maksimum krag wat die usb-poort sal lewer?
As u 'n parameter is
Kan hierdie parameter gewysig word en ingestel word op die maksimum wat deur die USB-poort (900mAh- 3.0 / 500mAh- 2.0) gegee word?
As u nie 'n parameter is nie,
Is dit 'n real-time meetwaarde van die USB-verbruik (onwaarskynlik)?
As dit 'n ander opsie is, moet u dit aan my verduidelik, want ek twyfel oor die verwysingsinligting.
Ek twyfel oor hierdie MaxPower-waarde. As u addisionele inligting het, sal ek baie dankbaar wees.
lsusb -v 2> / dev / null | egrep "^ Bus | MaxPower | bDeviceClass | iProduct"
Bus 002-toestel 006: ID 1a86: 7523 QinHeng Electronics HL-340 USB-seriële adapter
bDeviceClass 255 Verskafferspesifieke klas
iProduct 2 USB2.0-reeks
MaxPower 96mA
Bus 002 Toestel 008: ID 12d1: 14db Huawei Technologies Co., Ltd.
bDeviceClass 2 kommunikasie
iProduct 2 HUAWEI_MOBILE
MaxPower 2mA
Kan dit op vensters toegepas word?
Baie dankie. Met udisksctl power-off -b / dev / sdc op my eksterne skyf was dit genoeg om die hoofpyn op te los. Sou dit nie beter wees as die ontkoppeling 'n opsie het om dit self te doen nie?
God wat de fok! Het iemand hierdie hele testament gelees? En bo na die plaat weet ons nog nie hoe om 'n DAC / USB-klankinterface, 'n drukker, 'n grafiese tablet uit te skakel nie ... wel, niks wat nie 'n piek of 'n eksterne skyf is nie. Wat 'n mors van tyd ...