Linux에서는 다음이 제공됩니다.
/dev/sda
예를 들어 , 장치- 기본 및 보조 번호(예
8, 0
: ,
어떤 모듈/드라이버가 "구동"하는지 어떻게 알 수 있나요?
/sys
더 깊이 파고 들거나 /proc
이를 발견 할 수 있나요 ?
답변1
장치 파일에서 이 정보를 얻으 려면 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
마지막 유용한 기능 중 하나는 모든 장치에 사용 가능한 드라이버를 나열하는 것입니다. 이렇게 하려면 glob을 사용하여 드라이버 링크가 있는 모든 디렉터리를 선택할 수 있습니다. 예를 들어:
$ ls -l /sys/dev/*/*/device/driver && ls -l /sys/dev/*/*/driver
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
어떤 장치가 어떤 드라이버를 사용하고 있는지 더 폭넓게 이해하기 위해 또 다른 glob 트릭을 추가하겠습니다(장치 파일이 있는 드라이버는 반드시 그럴 필요는 없음).
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
답변2
이 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==""
답변3
사용명령hwininfo출력 모델과 드라이버도 마찬가지입니다. 드라이버가 없으면 표시되지 않습니다. 디스크를 예로 들어보겠습니다.
# hwinfo --block | grep -Ei "드라이버\:|모델\:" 모델: "플로피 디스크" 모델: "후지쯔 MHZ2080B" 드라이버: "ahci", "sd" 모델: "파티션" 모델: "파티션" 모델: "파티션" 모델: "범용 멀티 카드" 드라이버: "ums-realtek", "sd" 모델: "Realtek USB2.0-CRW" 드라이버: "ums-realtek"
네트워크 카드의 경우:
# hwinfo --네트워크 카드 | grep -Ei "드라이버\:|모델\:" 모델: "Broadcom NetXtreme BCM5764M 기가비트 이더넷 PCIe" 드라이버: "tg3" 모델: "인텔 무선 WiFi 링크 5100" 드라이버: "iwlwifi"
USB 장치의 경우:
# hwinfo --usb | grep -Ei "드라이버\:|모델\:" 모델: "Linux 3.11.10-7-desktop uhci_hcd UHCI 호스트 컨트롤러" 드라이버: "허브" 모델: "Linux 3.11.10-7-desktop uhci_hcd UHCI 호스트 컨트롤러" 드라이버: "허브" 모델: "IDEACOM IDC 6680" 드라이버: "usbhid" [...]
쿼리할 수 있는 다른 장치 유형을 찾으려면 hwinfo --help를 사용하십시오. hwinfo는 SUSE Linux에 기본적으로 설치됩니다.
답변4
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
는 각각 장치의 주 번호와 부 번호입니다.