Linux에서 다음을 제공합니다.
- 장치, 예를 들면
/dev/sda
, - 예를 들어 주요 및 부 번호
8, 0
는
어떤 모듈 / 드라이버가 "구동"하는지 어떻게 알 수 있습니까?
내가 파고 수 /sys
또는 /proc
그것을 발견?
Linux에서 다음을 제공합니다.
/dev/sda
,8, 0
는어떤 모듈 / 드라이버가 "구동"하는지 어떻게 알 수 있습니까?
내가 파고 수 /sys
또는 /proc
그것을 발견?
답변:
sysfs
장치 파일에 대한 정보를 얻으려면 먼저 다음 ls -l
과 같은 출력을보고 주 / 부 번호를 결정하십시오.
$ ls -l /dev/sda
brw-rw---- 1 root disk 8, 0 Apr 17 12:26 /dev/sda
는 8, 0
주 번호는 것을 우리에게 알려줍니다 8
그리고 미성년자입니다 0
. b
목록의 시작은 또한 블록 디바이스 것을 우리에게 알려줍니다. 다른 장치는 c
시작할 때 문자 장치를 가질 수 있습니다 .
그런 다음 아래를 보면 /sys/dev
두 개의 디렉토리가 있음을 알 수 있습니다. 하나는 호출 block
하고 다른 하나는 호출했습니다 char
. 여기서 가장 중요한 것은 각각 블록 및 문자 장치를위한 것입니다. 그런 다음 각 장치의 주 / 부 번호로이 디렉토리에 액세스 할 수 있습니다. 장치에 사용 가능한 드라이버가있는 driver
경우이 device
디렉토리 또는 하위 디렉토리 에있는 링크 의 대상을 읽어 드라이버를 찾을 수 있습니다 . 예를 들어, /dev/sda
나는 간단하게 할 수 있습니다.
$ readlink /sys/dev/block/8\:0/device/driver
../../../../../../../bus/scsi/drivers/sd
sd
드라이버가 장치에 사용됨을 나타냅니다 . 장치가 블록 또는 문자 장치인지 확실하지 않은 경우 셸에서이 부분을 간단히로 바꿀 수 *
있습니다. 이것은 다음과 같이 작동합니다.
$ readlink /sys/dev/*/8\:0/device/driver
../../../../../../../bus/scsi/drivers/sd
블록 장치는 /sys/block
또는을 통해 이름을 통해 직접 액세스 할 수도 있습니다 /sys/class/block
. 예 :
$ readlink /sys/block/sda/device/driver
../../../../../../../bus/scsi/drivers/sd
/sys
커널 구성에 따라 다양한 디렉토리의 존재 가 변경 될 수 있습니다. 또한 모든 장치에 device
하위 폴더 가있는 것은 아닙니다 . 예를 들어, 같은 파티션 장치 파일의 경우입니다 /dev/sda1
. 여기서 전체 디스크의 장치에 액세스해야합니다 (불행히도 이에 대한 sys
링크 가 없습니다 ).
마지막으로 유용한 것은 사용 가능한 모든 장치의 드라이버를 나열하는 것입니다. 이를 위해 글롭을 사용하여 드라이버 링크가있는 모든 디렉토리를 선택할 수 있습니다. 예 :
$ 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
마지막으로 질문에서 조금 벗어나기 위해 다른 /sys
장치를 사용하여 어떤 장치에서 어떤 드라이버를 사용하고 있는지에 대한 더 넓은 관점을 얻을 것입니다 (장치 파일이있는 장치는 아니지만).
find /sys/bus/*/drivers/* -maxdepth 1 -lname '*devices*' -ls
의 결과를 자세히 살펴보면 udevadm
표준 /sys
디렉토리 를 찾은 다음 (위의 주요 / 부 디렉토리를 역 참조하면 얻을 수있는 것처럼) 디렉토리 트리를 올라가서 찾은 정보를 인쇄 하여 작동하는 것으로 보입니다 . 이렇게하면 상위 장치 및 이들이 사용하는 드라이버에 대한 정보를 얻을 수 있습니다.
이것을 실험하기 위해 아래의 스크립트를 작성하여 디렉토리 트리를 걷고 각 관련 수준에서 정보를 표시합니다. udev
각 레벨에서 읽을 수있는 파일을 찾고있는 것으로 보입니다 (이름과 내용이에 통합되어 있음) ATTRS
. 이 작업을 수행하는 대신 uevent
각 수준에서 파일 내용을 표시합니다 (이것의 존재는 하위 디렉토리가 아닌 고유 한 수준을 정의합니다). 또한 찾은 모든 하위 시스템 링크의 기본 이름과 장치가이 계층 구조에 어떻게 적합한 지 보여줍니다. udevadm
동일한 정보를 표시하지 않으므로 훌륭한 보완 도구입니다. 상위 장치 정보 (예 : PCI
정보)는 다른 lshw
장치 의 출력 을 상위 장치 와 일치시키려는 경우에도 유용 합니다.
#!/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
대답은 당신을 줄 것이다 sd
하고 ahci
. ahci
사용 중인지 확인하는 방법이 있습니까?
device/device/
있었으므로 내 readlink
명령은 다음과 같습니다 readlink /sys/dev/char/XX\:Y/device/device/driver
.
udevadm
도구를 사용하여 이를 발견 할 수 있습니다 .
명령은 udevadm info -a -n /dev/sda
이고 DRIVER==
매개 변수를보십시오.
# udevadm info -a -n /dev/sda | grep -oP 'DRIVERS?=="\K[^"]+'
sd
ahci
이이이 장치를 제공에 관련된 2 드라이버가 실제로 것을 보여줍니다 sd
및 ahci
. 첫 번째 sd
는 /dev/sda
장치를 직접 담당 하지만 ahci
드라이버를 사용합니다 .
udevadm
명령 출력은 다음과 같으며 작동 방식에 대한 설명이 포함되어 있습니다.
# 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
제거 된 (또는 권장되는) 위치는 어디입니까? 나는 그것에 힌트를주는 것도 찾을 수 없습니다.
hwinfo 명령 과 출력 모델 및 드라이버를 사용하십시오 . 드라이버가 없으면 표시되지 않습니다. 예를 들어 디스크의 경우 :
# hwinfo --block | grep -Ei "driver \ : | 모델 \ :" 모델 : "플로피 디스크" 모델 : "FUJITSU MHZ2080B" 드라이버 : "ahci", "sd" 모델 : "파티션" 모델 : "파티션" 모델 : "파티션" 모델 : "일반 멀티 카드" 드라이버 : "ums-realtek", "sd" 모델 : "Realtek USB2.0-CRW" 드라이버 : "ums-realtek"
네트워크 카드의 경우 :
# hwinfo --netcard | grep -Ei "driver \ : | 모델 \ :" 모델 : "Broadcom NetXtreme BCM5764M 기가비트 이더넷 PCIe" 드라이버 : "tg3" 모델 : "Intel Wireless WiFi Link 5100" 드라이버 : "iwlwifi"
USB 장치의 경우 :
# hwinfo --usb | grep -Ei "driver \ : | 모델 \ :" 모델 : "Linux 3.11.10-7-desktop uhci_hcd UHCI 호스트 컨트롤러" 드라이버 : "hub" 모델 : "Linux 3.11.10-7-desktop uhci_hcd UHCI 호스트 컨트롤러" 드라이버 : "hub" 모델 : "IDEACOM IDC 6680" 드라이버 : "usbhid" [...]
hwinfo --help를 사용하여 쿼리 할 수있는 다른 장치 유형을 찾으십시오. hwinfo는 기본적으로 예를 들어 SUSE Linux에 설치됩니다.
--only
옵션 을 추가하는 것입니다. 예 hwinfo --block --only /dev/sda | grep ...
.
lshw
컴퓨터에서 발견 된 하드웨어를 나열하는 멋진 도구입니다. 실행하기 전에 먼저 설치해야합니다.
$ yum install lshw
$ apt-get install lshw
사용 yum
또는 apt-get
사용중인 시스템에 따라 달라집니다. 그런 다음 스토리지 하드웨어를 구체적으로 나열하십시오.
# 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
모든 정보를 다시 가져 오도록 실행할 수 있습니다 .
그렇지 않으면 lspci
하드웨어에 대한 정보를 제공 할 수도 있습니다.
$ 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
장치의 주 및 부 번호를 찾으려면 장치를 실행 ls
하십시오.
$ ls -l /dev/sda
brw-rw----. 1 root disk 8, 0 13 avril 10:54 /dev/sda
이 출력에서 b
in brw-rw----.
은 이것이 블록 장치임을 의미합니다. 숫자 8
와 0
각각은 장치의 주 번호와 부 번호입니다.
lshw
과 출력 lspci
에서 장치가 사용하는 모듈을 볼 수 있습니다 : configuration : driver = ahci latency = 0 및 커널 드라이버 사용 : ahci .
lsmod
,/proc/modules
그리고modinfo
?