Linux'ta bir aygıtla ilişkili sürücüyü (modülü) nasıl bulabilirim?


48

Linux'ta verilenler:

  • Bir cihaz, örneğin /dev/sda,
  • ve örneğin büyük ve küçük sayıları 8, 0,

Hangi modülün / sürücünün "sürdüğünü" nasıl bilebilirim?

Ben içine kazmak Can /sysya /prockeşfetmek için?


Bazı kombinasyonu lsmod, /proc/modulesve modinfo?

4
stackoverflow.com/questions/2911050 bu soru ile aynı görünüyor.
Michael Tomkins


Totor, ödül eklediğim için başka bir kullanıcı aynı soruyu gönderdiği için bunun yeterli ilgi görmediğini düşündüğü için ekledim. Sorusunu silmesini istedim ve daha fazla cevap almak için bu konuda bir ödül teklif ettim. Lütfen sorunuzu yanıtlarsa aşağıdaki cevaplardan birini kabul etmeyi unutmayın.
terdon

@ terdon ödül için teşekkürler, güzel cevaplar üretti. Ben dikkatle henüz her şeyi test etmedim ama kabul eder Graeme arada cevabını.
Totor

Yanıtlar:


56

Bu bilgiyi sysfsbir cihaz dosyasından almak için, önce ls -lörneğin / çıktısına bakarak büyük / küçük sayıları belirleyin.

 $ ls -l /dev/sda
 brw-rw---- 1 root disk 8, 0 Apr 17 12:26 /dev/sda

8, 0Büyük numara olduğunu söyler 8ve minör olduğunu 0. bListenin başında da bir blok aygıtı olduğunu söyler. Diğer cihazların cbaşında bir for karakter cihazı bulunabilir.

Daha sonra altına bakarsanız /sys/dev, iki dizin olduğunu göreceksiniz. Biri, blockdiğeri aradı char. Buradaki dikkatsiz olan, bunların sırasıyla blok ve karakter aygıtları için olmasıdır. Daha sonra her cihaza erişilebilir ana / küçük sayıları bu dizindir. Aygıt için uygun bir sürücü varsa driver, bu ya da devicealt dizindeki bağlantının hedefini okuyarak bulunabilir . Örneğin, benim için /dev/sdabasitçe yapabilirim:

$ readlink /sys/dev/block/8\:0/device/driver
../../../../../../../bus/scsi/drivers/sd

Bu, sdsürücünün aygıt için kullanıldığını gösterir . Cihazın bir blok veya karakter bir cihaz olup olmadığından emin değilseniz, kabuğun içinde bu parçayı a ile değiştirebilirsiniz *. Bu da aynı şekilde çalışır:

$ readlink /sys/dev/*/8\:0/device/driver
../../../../../../../bus/scsi/drivers/sd

Blok cihazlarına ya /sys/blockda aracılığıyla isimleri yoluyla doğrudan erişilebilir /sys/class/block. Örneğin:

$ readlink /sys/block/sda/device/driver
../../../../../../../bus/scsi/drivers/sd

İçindeki çeşitli dizinlerin varlığının /sys, çekirdek yapılandırmasına bağlı olarak değişebileceğini unutmayın. Ayrıca tüm cihazların bir devicealt klasörü yoktur. Örneğin, bu gibi bölüm aygıt dosyaları için durum böyledir /dev/sda1. Burada tüm diskin cihaza erişmek zorundasınız (maalesef bunun için bir sysbağlantı yok ).

Yapılması yararlı olabilecek son şey, mevcut oldukları tüm aygıtların sürücülerini listelemektir. Bunun için sürücü bağlantılarının bulunduğu tüm dizinleri seçmek için globları kullanabilirsiniz. Örneğin:

$ ls -l /sys/dev/*/*/device/driver ls -l /sys/dev/*/*/driver 
ls: cannot access ls: No such file or directory
lrwxrwxrwx 1 root root 0 Apr 17 12:27 /sys/dev/block/11:0/device/driver -> ../../../../../../../bus/scsi/drivers/sr
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/block/8:0/device/driver -> ../../../../../../../bus/scsi/drivers/sd
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/block/8:16/device/driver -> ../../../../../../../bus/scsi/drivers/sd
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/block/8:32/device/driver -> ../../../../../../../../../bus/scsi/drivers/sd
lrwxrwxrwx 1 root root 0 Apr 17 20:38 /sys/dev/char/189:0/driver -> ../../../../bus/usb/drivers/usb
lrwxrwxrwx 1 root root 0 Apr 17 20:38 /sys/dev/char/189:1024/driver -> ../../../../bus/usb/drivers/usb
lrwxrwxrwx 1 root root 0 Apr 17 20:38 /sys/dev/char/189:128/driver -> ../../../../bus/usb/drivers/usb
lrwxrwxrwx 1 root root 0 Apr 17 20:38 /sys/dev/char/189:256/driver -> ../../../../bus/usb/drivers/usb
lrwxrwxrwx 1 root root 0 Apr 17 20:38 /sys/dev/char/189:384/driver -> ../../../../bus/usb/drivers/usb
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/char/189:512/driver -> ../../../../bus/usb/drivers/usb
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/char/189:513/driver -> ../../../../../bus/usb/drivers/usb
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/char/189:514/driver -> ../../../../../bus/usb/drivers/usb
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/char/189:640/driver -> ../../../../bus/usb/drivers/usb
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/char/189:643/driver -> ../../../../../bus/usb/drivers/usb
lrwxrwxrwx 1 root root 0 Apr 17 20:38 /sys/dev/char/189:768/driver -> ../../../../bus/usb/drivers/usb
lrwxrwxrwx 1 root root 0 Apr 17 20:38 /sys/dev/char/189:896/driver -> ../../../../bus/usb/drivers/usb
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/char/21:0/device/driver -> ../../../../../../../bus/scsi/drivers/sd
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/char/21:1/device/driver -> ../../../../../../../bus/scsi/drivers/sd
lrwxrwxrwx 1 root root 0 Apr 17 12:27 /sys/dev/char/21:2/device/driver -> ../../../../../../../bus/scsi/drivers/sr
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/char/21:3/device/driver -> ../../../../../../../../../bus/scsi/drivers/sd
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/char/250:0/device/driver -> ../../../../../../../bus/hid/drivers/hid-generic
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/char/250:1/device/driver -> ../../../../../../../bus/hid/drivers/hid-generic
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/char/250:2/device/driver -> ../../../../../../../bus/hid/drivers/hid-generic
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/char/252:0/device/driver -> ../../../../../../../bus/scsi/drivers/sd
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/char/252:1/device/driver -> ../../../../../../../bus/scsi/drivers/sd
lrwxrwxrwx 1 root root 0 Apr 17 12:27 /sys/dev/char/252:2/device/driver -> ../../../../../../../bus/scsi/drivers/sr
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/char/252:3/device/driver -> ../../../../../../../../../bus/scsi/drivers/sd
lrwxrwxrwx 1 root root 0 Apr 17 19:53 /sys/dev/char/254:0/device/driver -> ../../../bus/pnp/drivers/rtc_cmos
lrwxrwxrwx 1 root root 0 Apr 17 19:53 /sys/dev/char/29:0/device/driver -> ../../../bus/platform/drivers/simple-framebuffer
lrwxrwxrwx 1 root root 0 Apr 17 19:53 /sys/dev/char/4:64/device/driver -> ../../../bus/pnp/drivers/serial
lrwxrwxrwx 1 root root 0 Apr 17 19:53 /sys/dev/char/4:65/device/driver -> ../../../bus/platform/drivers/serial8250
lrwxrwxrwx 1 root root 0 Apr 17 19:53 /sys/dev/char/4:66/device/driver -> ../../../bus/platform/drivers/serial8250
lrwxrwxrwx 1 root root 0 Apr 17 19:53 /sys/dev/char/4:67/device/driver -> ../../../bus/platform/drivers/serial8250
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/char/6:0/device/driver -> ../../../bus/pnp/drivers/parport_pc
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/char/99:0/device/driver -> ../../../bus/pnp/drivers/parport_pc

Son olarak, sorudan biraz sapmak için, /syshangi sürücülerin hangi cihazlar tarafından kullanıldığı konusunda daha geniş bir perspektif elde etmek için başka bir glob numarası ekleyeceğim (zorunlu olarak bir cihaz dosyasına sahip olanlar olmasa da):

find /sys/bus/*/drivers/* -maxdepth 1 -lname '*devices*' -ls

Güncelleme

Çıktısına daha yakından bakıldığında udevadm, kanonik /sysdizini bularak (yukarıdaki ana / küçük dizinleri kaldırırsanız elde edeceğiniz gibi), daha sonra bulduğu herhangi bir bilgiyi yazdırarak dizin ağacını bularak çalışıyor gibi görünüyor . Bu şekilde, ana aygıtlar ve kullandıkları sürücüler hakkında bilgi edinebilirsiniz.

Bunu denemek için, dizin ağacında dolaşmak ve ilgili her bir seviyedeki bilgiyi görüntülemek için aşağıdaki betiği yazdım. udevHer seviyede okunabilir dosyaları arayın, adları ve içerikleri dahil edildi ATTRS. Bunu yapmak yerine, ueventdosyaların içeriğini her seviyede görüntülerim (görünüşe göre bunun varlığı sadece bir alt dizinden ziyade farklı bir seviye tanımlar). Ayrıca, bulduğum alt sistem bağlantılarının temel adını ve cihazın bu hiyerarşide nasıl uyduğunu gösteren bir ad gösteririm. udevadmaynı bilgiyi göstermediğinden, bu güzel bir tamamlayıcı araçtır. Ana cihaz bilgisi (örneğin PCIbilgi), diğer araçların çıktısını lshwdaha üst seviye cihazlarla eşleştirmek isterseniz de kullanışlıdır .

#!/bin/bash

dev=$(readlink -m $1)

# test for block/character device
if [ -b "$dev" ]; then
  mode=block
elif [ -c "$dev" ]; then
  mode=char
else
  echo "$dev is not a device file" >&2
  exit 1
fi

# stat outputs major/minor in hex, convert to decimal
data=( $(stat -c '%t %T' $dev) ) || exit 2
major=$(( 0x${data[0]} ))
minor=$(( 0x${data[1]} ))

echo -e "Given device:     $1"
echo -e "Canonical device: $dev"
echo -e "Major: $major"
echo -e "Minor: $minor\n"

# sometimes nodes have been created for devices that are not present
dir=$(readlink -f /sys/dev/$mode/$major\:$minor)
if ! [ -e "$dir" ]; then
  echo "No /sys entry for $dev" >&2
  exit 3
fi

# walk up the /sys hierarchy one directory at a time
# stop when there are three levels left 
while [[ $dir == /*/*/* ]]; do

  # it seems the directory is only of interest if there is a 'uevent' file
  if [ -e "$dir/uevent" ]; then
    echo "$dir:"
    echo "  Uevent:"
    sed 's/^/    /' "$dir/uevent"

    # check for subsystem link
    if [ -d "$dir/subsystem" ]; then
        subsystem=$(readlink -f "$dir/subsystem")
        echo -e "\n  Subsystem:\n    ${subsystem##*/}"
    fi

    echo
  fi

  # strip a subdirectory
  dir=${dir%/*}
done

Kullanılan tüm sürücüleri belirlemenin bir yolu var mı? Mesela udevadmcevap size verecek sdve ahci. ahciKullanıldığını belirlemenin bir yolu var mı ?
Patrick,

@Patrick, evet, güncellendi.
Graeme

Harika cevap, teşekkürler! Sadece not etmek gerekirse, benim durumumda link vardı device/device/, bu yüzden readlinkemrim benziyordu readlink /sys/dev/char/XX\:Y/device/device/driver.
Harry

19

Bunu udevadmkeşfetmek için aracı kullanabilirsiniz .
Komut olur udevadm info -a -n /dev/sdave ardından DRIVER==parametrelere bakar .

# udevadm info -a -n /dev/sda | grep -oP 'DRIVERS?=="\K[^"]+'  
sd
ahci

Bu gösteriler orada aslında bu cihazı sunan katılan 2 sürücü vardır o sdve ahci. Birincisi sd, /dev/sdacihazdan doğrudan sorumludur , ancak ahcisürücüyü altında kullanır .

 

udevadmKomutun çıktısı şöyle görünür ve nasıl çalıştığını açıklar.

# udevadm info -a -n /dev/sda      

Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

  looking at device '/devices/pci0000:00/0000:00:1f.2/ata1/host0/target0:0:0/0:0:0:0/block/sda':
    KERNEL=="sda"
    SUBSYSTEM=="block"
    DRIVER==""
    ATTR{ro}=="0"
    ATTR{size}=="500118192"
    ATTR{stat}=="   84786     1420  3091333    40215   966488    12528 14804028  2357668        0  1146934  2396653"
    ATTR{range}=="16"
    ATTR{discard_alignment}=="0"
    ATTR{events}==""
    ATTR{ext_range}=="256"
    ATTR{events_poll_msecs}=="-1"
    ATTR{alignment_offset}=="0"
    ATTR{inflight}=="       0        0"
    ATTR{removable}=="0"
    ATTR{capability}=="50"
    ATTR{events_async}==""

  looking at parent device '/devices/pci0000:00/0000:00:1f.2/ata1/host0/target0:0:0/0:0:0:0':
    KERNELS=="0:0:0:0"
    SUBSYSTEMS=="scsi"
    DRIVERS=="sd"
    ATTRS{rev}=="VZJ4"
    ATTRS{type}=="0"
    ATTRS{scsi_level}=="6"
    ATTRS{model}=="LITEONIT LMT-256"
    ATTRS{state}=="running"
    ATTRS{queue_type}=="simple"
    ATTRS{iodone_cnt}=="0x10daad"
    ATTRS{iorequest_cnt}=="0x10ead1"
    ATTRS{queue_ramp_up_period}=="120000"
    ATTRS{device_busy}=="0"
    ATTRS{evt_capacity_change_reported}=="0"
    ATTRS{timeout}=="30"
    ATTRS{evt_media_change}=="0"
    ATTRS{ioerr_cnt}=="0x2"
    ATTRS{queue_depth}=="31"
    ATTRS{vendor}=="ATA     "
    ATTRS{evt_soft_threshold_reached}=="0"
    ATTRS{device_blocked}=="0"
    ATTRS{evt_mode_parameter_change_reported}=="0"
    ATTRS{evt_lun_change_reported}=="0"
    ATTRS{evt_inquiry_change_reported}=="0"
    ATTRS{iocounterbits}=="32"
    ATTRS{eh_timeout}=="10"

  looking at parent device '/devices/pci0000:00/0000:00:1f.2/ata1/host0/target0:0:0':
    KERNELS=="target0:0:0"
    SUBSYSTEMS=="scsi"
    DRIVERS==""

  looking at parent device '/devices/pci0000:00/0000:00:1f.2/ata1/host0':
    KERNELS=="host0"
    SUBSYSTEMS=="scsi"
    DRIVERS==""

  looking at parent device '/devices/pci0000:00/0000:00:1f.2/ata1':
    KERNELS=="ata1"
    SUBSYSTEMS==""
    DRIVERS==""

  looking at parent device '/devices/pci0000:00/0000:00:1f.2':
    KERNELS=="0000:00:1f.2"
    SUBSYSTEMS=="pci"
    DRIVERS=="ahci"
    ATTRS{irq}=="41"
    ATTRS{subsystem_vendor}=="0x144d"
    ATTRS{broken_parity_status}=="0"
    ATTRS{class}=="0x010601"
    ATTRS{enabled}=="1"
    ATTRS{consistent_dma_mask_bits}=="64"
    ATTRS{dma_mask_bits}=="64"
    ATTRS{local_cpus}=="0f"
    ATTRS{device}=="0x1e03"
    ATTRS{msi_bus}==""
    ATTRS{local_cpulist}=="0-3"
    ATTRS{vendor}=="0x8086"
    ATTRS{subsystem_device}=="0xc0d3"
    ATTRS{numa_node}=="-1"
    ATTRS{d3cold_allowed}=="1"

  looking at parent device '/devices/pci0000:00':
    KERNELS=="pci0000:00"
    SUBSYSTEMS==""
    DRIVERS==""

1
@ECarterYoung Bunun udevadmkaldırılmasını (veya hatta tavsiye edilmesini) nerede görüyorsunuz ? Bu konuda ipucu veren bir şey bile bulamıyorum.
Patrick,

1
@ECarterYoung Yaptım, hiçbir şey göremiyorum.
Patrick

Çekirdekte UEVENT_HELPER'ın olmaması konusunda yanılmışım. Systemd çalıştıran sistemlerde bu giriş boştur, ancak helpr hala sistemde bulunmaktadır.
eyoung100

4

Hwinfo ve output model ile driver komutunu kullanın . Sürücü yoksa, gösterilmez. Örneğin diskler için:

# hwinfo --blok | grep -Ei "sürücü \: | model \:"
  Model: "Disket"
  Model: "FUJITSU MHZ2080B"
  Sürücü: "ahcı", "sd"
  Model: "Bölüm"
  Model: "Bölüm"
  Model: "Bölüm"
  Model: "Genel Çoklu Kart"
  Sürücü: "ums-realtek", "sd"
  Model: "Realtek USB2.0-CRW"
  Sürücü: "ums-realtek"

Ağ kartları için:

# hwinfo - ağ kartı | grep -Ei "sürücü \: | model \:"
  Model: "Broadcom NetXtreme BCM5764M Gigabit Ethernet PCIe"
  Sürücü: "tg3"
  Model: "Intel Kablosuz WiFi Bağlantısı 5100"
  Sürücü: "iwlwifi"

USB cihazları için:

# hwinfo - usb | grep -Ei "sürücü \: | model \:"
  Model: "Linux 3.11.10-7-desktop uhci_hcd UHCI Ana Bilgisayar Denetleyicisi"
  Sürücü: "hub"
  Model: "Linux 3.11.10-7-desktop uhci_hcd UHCI Ana Bilgisayar Denetleyicisi"
  Sürücü: "hub"
  Model: "IDEACOM IDC 6680"
  Sürücü: "usbhid"
  [...]

Başka hangi cihaz tiplerini sorgulayabileceğinizi öğrenmek için hwinfo --help komutunu kullanın. hwinfo, varsayılan olarak örneğin SUSE Linux'ta kuruludur.


Bunu belirli bir cihaz dosyasıyla ilişkilendirmek için --onlyseçenek eklemenin bir yolu vardır . Örn hwinfo --block --only /dev/sda | grep ....
Graeme

3

lshwmakinenizde bulunan donanımı listelemek için harika bir araçtır. Çalıştırmadan önce onu yüklemeniz gerekecektir.

$ yum install lshw
$ apt-get install lshw

Kullanmakta olduğunuz sistemi bağlı olarak kullanın yumveya kullanın apt-get. Ardından, depolama donanımını özellikle listelemek için:

# lshw -class storage 
*-storage               
   description: SATA controller
   product: 5 Series/3400 Series Chipset 4 port SATA AHCI Controller
   vendor: Intel Corporation
   physical id: 1f.2
   bus info: pci@0000:00:1f.2
   version: 06
   width: 32 bits
   clock: 66MHz
   capabilities: storage msi pm ahci_1.0 bus_master cap_list
   configuration: driver=ahci latency=0
   resources: irq:41 ioport:1830(size=8) ioport:1824(size=4) ioport:1828(size=8) ioport:1820(size=4) ioport:1800(size=32) memory:f0305000-f03057ff

rootTüm bilgileri geri almak için çalıştırmak isteyebilirsiniz .

Aksi takdirde, lspcidonanımınız hakkında da bilgi verebilir:

$ lspci -vv
00:1f.2 SATA controller: Intel Corporation 5 Series/3400 Series Chipset 4 port SATA AHCI Controller (rev 06) (prog-if 01 [AHCI 1.0])
    Subsystem: Dell Device 0434
    Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+
    Status: Cap+ 66MHz+ UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
    Latency: 0
    Interrupt: pin B routed to IRQ 41
    Region 0: I/O ports at 1830 [size=8]
    Region 1: I/O ports at 1824 [size=4]
    Region 2: I/O ports at 1828 [size=8]
    Region 3: I/O ports at 1820 [size=4]
    Region 4: I/O ports at 1800 [size=32]
    Region 5: Memory at f0305000 (32-bit, non-prefetchable) [size=2K]
    Capabilities: <access denied>
    Kernel driver in use: ahci

Bir cihazın büyük ve küçük sayılarını bulmak için, sadece lsüzerinde çalıştırın .

$ ls -l /dev/sda
brw-rw----. 1 root disk 8, 0 13 avril 10:54 /dev/sda

Bu çıkış olarak, biçerisinde brw-rw----., bu blok, cihaz araçlarına olduğu. Rakamlar 8ve 0sırasıyla cihazın büyük ve küçük sayılarıdır.


1
Sorum şu: bir aygıtla onun modülü / sürücüsü arasındaki bağlantıyı bulmak. Buna nerede cevap veriyorsun?
Totor

1
Her iki çıktısında @Totor lshwve lspciyapılandırma: Bir aygıt tarafından kullanılan modülü görebilir sürücü = ahci gecikme = 0 ve kullanımda Çekirdek sürücü: AHCI .
Spack
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.