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 /sys
ya /proc
keşfetmek için?
Linux'ta verilenler:
/dev/sda
,8, 0
,Hangi modülün / sürücünün "sürdüğünü" nasıl bilebilirim?
Ben içine kazmak Can /sys
ya /proc
keşfetmek için?
Yanıtlar:
Bu bilgiyi sysfs
bir 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, 0
Büyük numara olduğunu söyler 8
ve minör olduğunu 0
. b
Listenin başında da bir blok aygıtı olduğunu söyler. Diğer cihazların c
başında bir for karakter cihazı bulunabilir.
Daha sonra altına bakarsanız /sys/dev
, iki dizin olduğunu göreceksiniz. Biri, block
diğ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 device
alt dizindeki bağlantının hedefini okuyarak bulunabilir . Örneğin, benim için /dev/sda
basitçe yapabilirim:
$ readlink /sys/dev/block/8\:0/device/driver
../../../../../../../bus/scsi/drivers/sd
Bu, sd
sü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/block
da 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 device
alt 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 sys
bağ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, /sys
hangi 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
Çıktısına daha yakından bakıldığında udevadm
, kanonik /sys
dizini 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. udev
Her seviyede okunabilir dosyaları arayın, adları ve içerikleri dahil edildi ATTRS
. Bunu yapmak yerine, uevent
dosyaları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. udevadm
aynı bilgiyi göstermediğinden, bu güzel bir tamamlayıcı araçtır. Ana cihaz bilgisi (örneğin PCI
bilgi), diğer araçların çıktısını lshw
daha ü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
udevadm
cevap size verecek sd
ve ahci
. ahci
Kullanıldığını belirlemenin bir yolu var mı ?
device/device/
, bu yüzden readlink
emrim benziyordu readlink /sys/dev/char/XX\:Y/device/device/driver
.
Bunu udevadm
keşfetmek için aracı kullanabilirsiniz .
Komut olur udevadm info -a -n /dev/sda
ve 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 sd
ve ahci
. Birincisi sd
, /dev/sda
cihazdan doğrudan sorumludur , ancak ahci
sürücüyü altında kullanır .
udevadm
Komutun çı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==""
udevadm
kaldırılmasını (veya hatta tavsiye edilmesini) nerede görüyorsunuz ? Bu konuda ipucu veren bir şey bile bulamıyorum.
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.
--only
seçenek eklemenin bir yolu vardır . Örn hwinfo --block --only /dev/sda | grep ...
.
lshw
makinenizde 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 yum
veya 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
root
Tüm bilgileri geri almak için çalıştırmak isteyebilirsiniz .
Aksi takdirde, lspci
donanı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, b
içerisinde brw-rw----.
, bu blok, cihaz araçlarına olduğu. Rakamlar 8
ve 0
sırasıyla cihazın büyük ve küçük sayılarıdır.
lshw
ve lspci
yapı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 .
lsmod
,/proc/modules
vemodinfo
?