Linux 하드웨어 장치 탐색

CompTIABeginner
지금 연습하기

소개

이 실습에서는 Linux 환경에서 하드웨어 장치를 탐색, 식별 및 검사하는 필수 기술을 배웁니다. 강력한 명령줄 유틸리티를 직접 사용해 보며 운영 체제가 물리적 구성 요소와 어떻게 상호 작용하는지 이해하게 됩니다. 이 실습의 목표는 시스템 관리, 성능 튜닝 및 문제 해결에 필수적인 Linux 하드웨어 관리에 대한 기초 지식을 쌓는 것입니다.

먼저 lsblklshw를 사용하여 블록 장치를 나열하고 스토리지에 대한 개요를 파악합니다. 그 후 udevadm을 사용하여 장치의 세부 속성과 규칙을 검사합니다. 이어서 PCI 및 SCSI 버스 계층 구조를 확인하여 장치가 어떻게 연결되어 있는지 살펴봅니다. 마지막으로 /proc/sys 가상 파일 시스템을 조사하여 커널 관점에서 시스템 하드웨어에 대한 포괄적인 정보를 확인합니다.

lsblk와 lshw를 사용한 블록 장치 나열

이 단계에서는 시스템에 연결된 블록 장치를 식별하고 나열하는 방법을 배웁니다. 블록 장치는 하드 드라이브, SSD, USB 플래시 드라이브와 같이 고정 크기 블록으로 데이터를 전송하는 저장 장치입니다. 이를 위해 lsblklshw라는 두 가지 일반적인 명령어를 사용합니다.

먼저 lsblk 명령어를 사용하여 사용 가능한 모든 블록 장치를 트리 형태로 확인합니다. 이 명령어는 sysfs 파일 시스템과 udev 데이터베이스를 읽어 정보를 수집합니다.

터미널에서 lsblk 명령어를 실행하세요:

lsblk

장치와 해당 장치에 포함된 파티션을 나열하는 다음과 유사한 출력을 볼 수 있습니다.

NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
loop0    7:0    0  89.4M  1 loop /snap/lxd/31333
loop1    7:1    0     4K  1 loop /snap/bare/5
loop2    7:2    0  63.9M  1 loop /snap/core20/2318
loop3    7:3    0 242.9M  1 loop /snap/firefox/2710
loop4    7:4    0 244.5M  1 loop /snap/firefox/2800
loop5    7:5    0 349.7M  1 loop /snap/gnome-3-38-2004/140
loop6    7:6    0 349.7M  1 loop /snap/gnome-3-38-2004/143
loop7    7:7    0  91.7M  1 loop /snap/gtk-common-themes/1535
loop9    7:9    0    87M  1 loop /snap/lxd/28373
loop10   7:10   0  73.9M  1 loop /snap/core22/2010
loop11   7:11   0  38.8M  1 loop /snap/snapd/21759
loop12   7:12   0  50.9M  1 loop /snap/snapd/24718
loop13   7:13   0  63.8M  1 loop /snap/core20/2599
vda    252:0    0    40G  0 disk
├─vda1 252:1    0     1M  0 part
├─vda2 252:2    0   200M  0 part /boot/efi
└─vda3 252:3    0  39.8G  0 part /var/snap/firefox/common/host-hunspell
                                 /

VM 이미지에 따라 기본 디스크 이름은 vda, sda 또는 nvme0n1일 수 있습니다. 다음 단계에서는 lsblk/에 마운트된 장치로 표시하는 디스크 이름을 항상 사용하세요.

각 열에 대한 간단한 설명은 다음과 같습니다:

  • NAME: 장치 이름.
  • MAJ:MIN: 커널이 장치를 식별하는 데 사용하는 주(major) 및 부(minor) 장치 번호.
  • RM: 이동식 장치 여부 (1이면 예, 0이면 아니오).
  • SIZE: 장치 크기.
  • RO: 읽기 전용 장치 여부 (1이면 예, 0이면 아니오).
  • TYPE: 장치 유형 (예: disk, part, loop).
  • MOUNTPOINTS: 파일 시스템에서 장치가 마운트된 위치.

lsblk는 빠른 개요를 확인하는 데 유용하지만, lshw (list hardware) 명령어를 사용하면 훨씬 더 자세한 정보를 얻을 수 있습니다. lshw는 기본적으로 설치되어 있지 않을 수 있으므로 먼저 설치합니다.

sudo apt-get update && sudo apt-get install -y lshw

설치가 완료되면 lshw를 사용하여 특정 하드웨어 클래스에 대한 자세한 정보를 얻을 수 있습니다. 예를 들어, 스토리지 컨트롤러(SATA 또는 NVMe 컨트롤러 등)에 대한 세부 정보를 보려면 -class storage 옵션을 사용합니다.

sudo lshw -class storage

출력에는 스토리지 인터페이스 자체에 대한 정보가 표시됩니다.

  *-pnp00:03
       product: PnP device PNP0700
       physical id: 3
       capabilities: pnp
  *-ide
       description: IDE interface
       product: 82371SB PIIX3 IDE [Natoma/Triton II]
       vendor: Intel Corporation
       physical id: 1.1
       bus info: pci@0000:00:01.1
       version: 00
       width: 32 bits
       clock: 33MHz
       capabilities: ide isa_compat_mode bus_master
       configuration: driver=ata_piix latency=0
       resources: irq:0 ioport:1f0(size=8) ioport:3f6 ioport:170(size=8) ioport:376 ioport:c060(size=16)
  *-scsi
       description: SCSI storage controller
       product: Virtio block device
       vendor: Red Hat, Inc.
       physical id: 4
       bus info: pci@0000:00:04.0
       version: 00
       width: 64 bits
       clock: 33MHz
       capabilities: scsi msix bus_master cap_list
       configuration: driver=virtio-pci latency=0
       resources: irq:0 memory:fe000000-fe000fff memory:fe001000-fe001fff

파티션 및 논리 볼륨에 대해 lsblk보다 더 자세한 정보를 얻으려면 -class volume 옵션을 사용하세요.

sudo lshw -class volume

이 명령어는 각 파티션의 논리적 이름, 일련번호, 기능 등을 포함한 풍부한 정보를 제공합니다.

  *-volume:0
       description: BIOS Boot partition
       vendor: EFI
       physical id: 1
       bus info: scsi@0:0.0.0,1
       logical name: /dev/vda1
       serial: xxxx-xxxx
       size: 1MiB
       capacity: 1MiB
       capabilities: primary
  *-volume:1
       description: EFI partition
       vendor: EFI
       physical id: 2
       bus info: scsi@0:0.0.0,2
       logical name: /dev/vda2
       serial: XXXX-XXXX
       size: 200MiB
       capacity: 200MiB
       capabilities: boot fat initialized
       configuration: FATs=32 filesystem=fat mount.fstype=vfat mount.options=rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro state=mounted
  *-volume:2
       description: Linux filesystem
       physical id: 3
       bus info: scsi@0:0.0.0,3
       logical name: /dev/vda3
       size: 39GiB
       capacity: 39GiB
       capabilities: primary ext4 initialized
       configuration: filesystem=ext4 lastmountpoint=/ modified=2024-xx-xx mounted=2024-xx-xx state=mounted

lsblklshw를 사용하면 Linux 시스템의 저장 장치에 대해 상위 수준의 개요와 상세한 하위 수준 정보를 모두 얻을 수 있습니다.

udevadm을 사용한 장치 속성 검사

이전 단계에서는 블록 장치를 나열하는 방법을 배웠습니다. 이제 udevadm 명령어를 사용하여 이러한 장치의 특정 속성을 더 깊이 있게 검사해 보겠습니다. udev는 Linux 커널의 장치 관리자로, /dev 디렉터리의 장치 노드를 동적으로 관리합니다. udevadmudev를 제어하는 도구로, udev 데이터베이스를 쿼리하여 상세한 장치 정보를 얻을 수 있습니다. 이는 장치를 자동으로 관리하기 위한 사용자 지정 udev 규칙을 만들기 전에 특히 유용합니다.

루트 파일 시스템이 포함된 기본 디스크의 속성을 검사해 보겠습니다. 먼저 루트 파티션과 해당 부모 디스크를 식별합니다:

ROOT_PARTITION=$(findmnt -n -o SOURCE /)
DISK_NAME=$(lsblk -no PKNAME "$ROOT_PARTITION")
echo "$ROOT_PARTITION -> /dev/$DISK_NAME"

해당 디스크의 속성을 간단한 키-값 형식으로 표시하려면 다음 명령어를 실행하세요. -q property 플래그는 udevadm에게 장치의 모든 알려진 속성을 쿼리하도록 지시하며, -n "/dev/$DISK_NAME"은 장치 노드 이름을 지정합니다.

udevadm info -q property -n "/dev/$DISK_NAME"

출력은 장치를 설명하는 환경 변수 목록입니다. 정확한 값은 다를 수 있지만 출력은 다음과 유사해야 합니다:

DEVPATH=/devices/pci0000:00/0000:00:04.0/nvme/nvme0/nvme0n1
DEVNAME=/dev/nvme0n1
DEVTYPE=disk
MAJOR=259
MINOR=0
SUBSYSTEM=block
USEC_INITIALIZED=xxxxxxxxx
ID_MODEL=Alibaba Cloud Elastic Block Storage
ID_REVISION=1.0
ID_SERIAL=Alibaba_Cloud_Elastic_Block_Storage_xxxxxxxxxxxx
ID_SERIAL_SHORT=xxxxxxxxxxxx
ID_TYPE=disk
ID_PATH=pci-0000:00:04.0-nvme-1
ID_PATH_TAG=pci-0000_00_04_0-nvme-1
DEVLINKS=/dev/disk/by-id/nvme-... /dev/disk/by-path/pci-0000:00:04.0-nvme-1
TAGS=:systemd:

이 출력은 ID_MODEL, ID_PATH, 고유한 ID_SERIAL과 같은 유용한 세부 정보를 제공합니다. 이러한 속성은 커널이 감지한 순서와 관계없이 특정 장치에 적용되는 udev 규칙을 작성할 때 자주 사용됩니다.

더 자세한 계층적 보기를 보려면 sysfs 경로를 사용하여 장치를 쿼리할 수 있습니다. 먼저 선택한 디스크의 sysfs 경로를 찾습니다:

udevadm info -q path -n "/dev/$DISK_NAME"

출력은 /sys 파일 시스템 내의 장치 경로가 됩니다:

/devices/pci0000:00/0000:00:04.0/nvme/nvme0/nvme0n1

이제 이 경로와 -a (attribute walk), -p (path) 플래그를 사용하여 부모 장치부터 지정된 장치까지의 모든 장치 속성을 확인합니다. 이는 장치와 해당 부모 컨트롤러에 대한 전체적인 그림을 제공합니다.

udevadm info -a -p "$(udevadm info -q path -n "/dev/$DISK_NAME")"

이 명령어는 블록 장치 자체와 부모 스토리지 컨트롤러, PCI 장치에 대한 속성을 보여주는 훨씬 긴 출력을 생성합니다. 이러한 수준의 세부 정보는 고급 장치 관리 및 문제 해결에 필수적입니다. 출력 내용이 길어 여기서는 모두 보여드리지 않지만, 직접 확인해 보시기 바랍니다.

PCI 및 SCSI 버스 계층 구조 확인

이 단계에서는 시스템 버스에서 장치가 어떻게 구성되어 있는지 살펴봅니다. 버스는 컴퓨터 내부의 구성 요소 간에 데이터를 전송하는 통신 시스템입니다. 여기서는 PCI (Peripheral Component Interconnect)와 SCSI (Small Computer System Interface)라는 두 가지 중요한 버스에 집중합니다. 계층 구조를 이해하면 하드웨어 문제를 진단하고 하드 드라이브와 같은 장치가 시스템에 어떻게 연결되어 있는지 파악하는 데 도움이 됩니다.

먼저 마더보드의 대부분의 고속 구성 요소를 연결하는 PCI 버스를 검사해 보겠습니다. lspci 명령어가 표준 도구입니다. 이 명령어를 제공하는 pciutils 패키지는 일반적으로 미리 설치되어 있지만, 확인을 위해 설치합니다.

sudo apt-get update && sudo apt-get install -y pciutils

이제 PCI 버스 계층 구조를 트리 구조로 표시하려면 -t 옵션과 함께 lspci 명령어를 사용합니다.

lspci -t

출력은 버스와 장치 간의 연결을 보여주며 다음과 같이 나타납니다:

-[0000:00]-+-00.0
           +-01.0
           +-01.1
           +-01.3
           +-04.0
           \-05.0

이 트리는 연결 상태를 보여주지만 장치가 무엇인지는 나타내지 않습니다. 더 유용하게 만들려면 -v (verbose) 옵션을 추가하세요. 이렇게 하면 각 장치에 대한 장치 이름과 사용 중인 커널 드라이버가 포함됩니다. 출력이 길 수 있으므로 more로 파이프하여 스크롤할 수 있게 합니다. 스페이스바를 눌러 아래로 스크롤하고 q를 눌러 종료하세요.

lspci -tv | more

출력은 훨씬 더 자세해집니다:

-[0000:00]-+-00.0  Intel Corporation 440FX - 82441FX PMC [Natoma]
           +-01.0  Intel Corporation 82371SB PIIX3 ISA [Natoma/Triton II]
           +-01.3  Intel Corporation 82371AB/EB/MB PIIX4 ACPI
           +-02.0  Cirrus Logic GD 5446
           +-03.0  Red Hat, Inc. Virtio console
           +-04.0  Intel Corporation QEMU NVM Express Controller
           +-05.0  Red Hat, Inc. Virtio network device
           \-06.0  Red Hat, Inc. Virtio memory balloon

이 출력에서 NVMe 스토리지 컨트롤러 및 기타 가상 장치와 같이 PCI 버스에 연결된 특정 하드웨어 구성 요소를 확인할 수 있습니다.

다음으로 SCSI 버스를 살펴보겠습니다. 이 VM에서 기본 디스크는 Virtio나 SCSI 대신 NVMe를 통해 노출될 수 있지만, 여전히 존재하는 SCSI 장치를 탐색할 수 있습니다. 이 정보를 확인하는 사용자 친화적인 방법은 systool 명령어를 사용하는 것입니다. 이를 제공하는 sysfsutils 패키지를 설치합니다.

sudo apt-get install -y sysfsutils

이제 -b scsi 옵션과 함께 systool을 사용하여 SCSI 버스의 장치를 나열합니다.

systool -b scsi

이 명령어는 SCSI 버스에 연결된 장치를 보여줍니다:

Bus = "scsi"

  Device = "host0"
  Device = "host1"

/proc에서 하위 수준 시스템 리소스 검사

이 단계에서는 /proc 가상 파일 시스템을 탐색하여 하위 수준 시스템 리소스를 검사합니다. /proc 파일 시스템은 디스크에 실제 파일이 포함되어 있지 않으며, 커널 데이터 구조에 대한 직접적인 인터페이스입니다. /proc의 파일을 읽음으로써 DMA 채널, 인터럽트, I/O 포트와 같은 하드웨어 리소스를 시스템이 어떻게 관리하는지 실시간으로 확인할 수 있습니다.

먼저 DMA (Direct Memory Access) 채널을 살펴보겠습니다. DMA를 사용하면 특정 하드웨어 장치가 CPU를 거치지 않고 시스템 메모리에 직접 액세스할 수 있어 성능이 향상됩니다. 현재 사용 중인 DMA 채널을 확인하려면 /proc/dma 파일의 내용을 봅니다.

cat /proc/dma

출력은 일반적으로 매우 간단하며, 특히 최신 시스템이나 가상화된 시스템에서는 더욱 그렇습니다.

 4: cascade

이 출력은 등록된 DMA 채널을 보여줍니다. cascade 채널은 구형 인터럽트 컨트롤러를 연결하는 데 사용되며 최신 하드웨어에서는 유일하게 나열되는 경우가 많습니다.

다음으로 IRQ (Interrupt Request)를 검사해 보겠습니다. 하드웨어 장치가 CPU의 주의가 필요할 때 인터럽트 신호를 보냅니다. /proc/interrupts 파일은 각 IRQ 번호에 대해 수신된 인터럽트 횟수에 대한 통계를 제공합니다.

cat /proc/interrupts

출력은 CPU 코어별 인터럽트 활동에 대한 상세한 분석을 보여줍니다.

           CPU0
  0:         10   IO-APIC   2-edge      timer
  1:          2   IO-APIC   1-edge      i8042
  8:          1   IO-APIC   8-edge      rtc0
  9:          0   IO-APIC   9-fasteoi   acpi
 11:        ...   IO-APIC  11-fasteoi   ata_piix, uhci_hcd
 12:          4   IO-APIC  12-edge      i8042
NMI:          0   Non-maskable interrupts
LOC:      ...   Local timer interrupts
...

각 열의 의미는 다음과 같습니다:

  • 첫 번째 열은 IRQ 번호입니다.
  • CPU0 열(및 다른 CPU 열이 있는 경우)은 해당 CPU 코어가 처리한 인터럽트 횟수를 보여줍니다.
  • 마지막 열은 해당 인터럽트와 관련된 장치 드라이버의 이름을 보여줍니다. 이는 하드웨어 충돌을 디버깅하는 데 매우 유용합니다.

마지막으로 I/O 포트를 살펴보겠습니다. 이는 CPU가 하드웨어 장치와 직접 통신하는 데 사용하는 특수 메모리 주소입니다. /proc/ioports 파일은 현재 장치용으로 예약된 I/O 포트 영역을 나열합니다. 목록이 길 수 있으므로 less로 보는 것이 좋습니다. 화살표 키로 스크롤하고 q를 눌러 종료할 수 있습니다.

less /proc/ioports

메모리 범위와 이를 사용하는 장치 목록이 표시됩니다.

0000-0cf7 : PCI Bus 0000:00
  0020-0021 : PIC1
  0040-0043 : timer0
  0050-0053 : timer1
  0060-0060 : keyboard
  0064-0064 : keyboard
  0070-0077 : rtc0
  0080-008f : dma page reg
  00a0-00a1 : PIC2
  00c0-00df : dma2
  00f0-00ff : fpu
0170-0177 : 0000:00:01.1
  0170-0177 : ata_piix
01f0-01f7 : 0000:00:01.1
  01f0-01f7 : ata_piix
...

이 출력은 메모리 주소 범위와 해당 범위를 점유한 장치를 보여줍니다. 예를 들어 키보드, 타이머, 이전 단계에서 본 ata_piix 디스크 컨트롤러에 대한 범위를 확인할 수 있습니다.

/sys 파일 시스템에서 장치 정보 탐색

마지막 단계에서는 /sys에 마운트된 sysfs 파일 시스템을 탐색합니다. /proc이 프로세스와 일부 하드웨어 리소스에 대한 정보를 제공한다면, /sys는 시스템 장치 모델에 대한 더 구조화된 보기를 제공합니다. 이는 커널 객체, 장치 및 드라이버의 계층적 표현을 내보냅니다. 이전 단계에서 사용한 lsblkudevadm과 같은 많은 도구들이 /sys를 읽어 정보를 가져옵니다.

먼저 블록 장치가 어떻게 표현되는지 살펴보겠습니다. /sys/block 디렉터리에는 시스템에 알려진 각 블록 장치에 대한 하위 디렉터리가 포함되어 있습니다.

/sys/block의 내용을 나열하여 장치를 확인하세요:

ls -l /sys/block

출력에는 루프 장치와 기본 디스크를 포함한 블록 장치가 표시됩니다. 이들은 /sys/devices 계층 내의 실제 위치를 가리키는 심볼릭 링크입니다.

total 0
lrwxrwxrwx 1 root root 0 Jan  1 00:00 loop0 -> ../devices/virtual/block/loop0
lrwxrwxrwx 1 root root 0 Jan  1 00:00 loop1 -> ../devices/virtual/block/loop1
...
lrwxrwxrwx 1 root root 0 Jan  1 00:00 nvme0n1 -> ../devices/pci0000:00/0000:00:04.0/nvme/nvme0/nvme0n1

루트 파일 시스템의 부모 디스크를 다시 찾은 다음 해당 디렉터리를 검사합니다. 이 디렉터리에는 장치의 속성을 나타내는 다양한 파일이 포함되어 있습니다.

ROOT_PARTITION=$(findmnt -n -o SOURCE /)
DISK_NAME=$(lsblk -no PKNAME "$ROOT_PARTITION")
ls /sys/block/"$DISK_NAME"

파일 및 디렉터리 목록이 표시됩니다:

alignment_offset  diskseq  holders  nvme0n1p2  ro       uevent
bdi               events   inflight nvme0n1p3  size     wwid
capability        events_async integrity power  slaves
dev               events_poll_msecs mq    queue  stat
device            ext_range nsid    range  subsystem
discard_alignment hidden    nvme0n1p1 removable trace

각 파일은 특정 정보를 담고 있습니다. 예를 들어 디스크 크기를 찾으려면 size 파일을 읽으면 됩니다.

cat /sys/block/"$DISK_NAME"/size

출력은 숫자입니다:

83886080

이 숫자는 512바이트 섹터 단위의 장치 크기를 나타냅니다. 또한 nvme0n1p1, nvme0n1p2, nvme0n1p3와 같이 각 파티션에 대한 디렉터리도 볼 수 있으며, 여기에는 자체 속성 세트가 포함되어 있습니다. 다른 이미지에서는 파티션 이름에 다른 장치 접두사가 사용될 수 있습니다.

다음으로 /sys/bus 디렉터리에서 장치가 버스 유형별로 어떻게 구성되어 있는지 살펴보겠습니다. 이는 장치 계층을 탐색하는 또 다른 방법을 제공합니다.

ls /sys/bus

커널이 지원하는 다양한 버스 유형 목록이 표시됩니다:

acpi  amba  clocksource  container  cpu  event_source  hid  i2c  i8042  ide  mdio_bus  memory  pci  pci_express  platform  scsi  serial  serio  soc  system  usb  virtio  workqueue

스토리지 디스크가 Virtio 블록 장치가 아니더라도 VM은 여전히 다른 Virtio 장치를 노출할 수 있습니다. /sys/bus/virtio/devices 디렉터리를 확인하여 나열해 보겠습니다.

ls -l /sys/bus/virtio/devices

출력에는 장치 ID로 식별되는 Virtio 장치가 표시됩니다. 이들 역시 메인 장치 트리를 가리키는 심볼릭 링크입니다.

total 0
lrwxrwxrwx 1 root root 0 Jan  1 00:00 virtio0 -> ../../../devices/pci0000:00/0000:00:05.0/virtio0
lrwxrwxrwx 1 root root 0 Jan  1 00:00 virtio1 -> ../../../devices/pci0000:00/0000:00:04.0/virtio1

/sys를 탐색하면 상위 수준 도구들이 시스템 하드웨어 정보를 보고할 때 사용하는 원시 데이터에 직접 액세스할 수 있습니다. 이는 Linux 커널이 장치를 어떻게 보고 구성하는지 이해하는 강력한 방법입니다.

요약

이 실습에서는 Linux 환경에서 하드웨어 장치를 식별하고 검사하는 방법을 배웠습니다. lsblk 명령어를 사용하여 블록 장치와 파티션을 트리 형식으로 나열하고, lshw 명령어를 사용하여 더 자세한 하드웨어 사양을 얻는 연습을 했습니다. 또한 udevadm을 사용하여 udev 하위 시스템이 관리하는 장치 속성을 검사하고, PCI 및 SCSI 장치에 대한 시스템 버스 계층 구조를 확인하는 방법도 다루었습니다.

나아가 커널이 의사 파일 시스템(pseudo-filesystem)을 통해 제공하는 하위 수준 정보를 탐색했습니다. /proc 파일 시스템을 검사하여 원시 시스템 리소스 데이터를 확인하고, /sys 파일 시스템을 탐색하여 시스템 장치와 그 속성에 대한 구조화된 표현을 살펴보았습니다. 이를 통해 운영 체제에서 직접 하드웨어 정보를 찾고 해석하는 방법에 대한 포괄적인 이해를 얻었습니다.