리눅스 하드웨어 장치 탐색하기

CompTIABeginner
지금 연습하기

소개

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

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

이 실습은 학습과 연습을 돕기 위해 단계별 지침을 제공하는 가이드 실습입니다. 각 단계를 완료하고 실무 경험을 쌓으려면 지침을 주의 깊게 따르십시오. 과거 데이터에 따르면 이 실습은 완료율 90%초급 수준 실습입니다. 학습자들로부터 98%의 긍정적인 평가를 받았습니다.

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
                                 /

각 열에 대한 간략한 설명은 다음과 같습니다.

  • NAME: 장치 이름입니다.
  • MAJ:MIN: 커널이 장치를 식별하는 데 사용하는 주 장치 번호와 부 장치 번호입니다.
  • 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를 함께 사용하면 리눅스 시스템의 저장 장치에 대해 상위 수준의 개요와 상세한 하위 수준의 정보를 모두 얻을 수 있습니다.

udevadm 을 사용하여 장치 속성 점검하기

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

이전 단계에서 확인한 메인 디스크인 /dev/vda의 속성을 점검해 보겠습니다.

/dev/vda의 속성을 간단한 키 - 값 형식으로 표시하려면 다음 명령어를 실행하십시오. -q property 플래그는 udevadm에게 장치의 알려진 모든 속성을 데이터베이스에서 조회하도록 지시하며, -n /dev/vda는 장치 노드 이름을 지정합니다.

udevadm info -q property -n /dev/vda

출력 결과는 장치를 설명하는 환경 변수 목록으로 나타납니다.

DEVPATH=/devices/pci0000:00/0000:00:04.0/virtio1/block/vda
DEVNAME=/dev/vda
DEVTYPE=disk
MAJOR=252
MINOR=0
SUBSYSTEM=block
USEC_INITIALIZED=xxxxxxxxx
ID_VENDOR=Virtio
ID_MODEL=Block_Device
ID_MODEL_ENC=Block\x20Device\x20\x20\x20\x20\x20\x20\x20
ID_REVISION=
ID_SERIAL=Virtio_Block_Device
ID_SERIAL_SHORT=Block_Device
ID_TYPE=disk
ID_BUS=virtio
ID_PATH=pci-0000:00:04.0-virtio-1
ID_PATH_TAG=pci-0000_00_04_0-virtio-1
DEVLINKS=/dev/disk/by-id/virtio-Block_Device /dev/disk/by-path/pci-0000:00:04.0-virtio-1
TAGS=:systemd:

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

더욱 상세한 계층적 보기를 위해 sysfs 경로를 사용하여 장치를 조회할 수 있습니다. 먼저 /dev/vdasysfs 경로를 찾습니다.

udevadm info -q path -n /dev/vda

출력 결과는 /sys 파일 시스템 내의 장치 경로입니다.

/devices/pci0000:00/0000:00:04.0/virtio1/block/vda

이제 이 경로와 함께 -a (attribute walk) 및 -p (path) 플래그를 사용하여 상위 장치부터 지정된 장치까지의 모든 장치 속성을 확인합니다. 이를 통해 장치와 해당 상위 컨트롤러에 대한 전체적인 그림을 파악할 수 있습니다.

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

이 명령어는 블록 장치 자체뿐만 아니라 상위 virtio 장치 및 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 버스 계층 구조를 트리 구조로 표시하려면 lspci 명령어에 -t 옵션을 사용하십시오.

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.1  Intel Corporation 82371SB PIIX3 IDE [Natoma/Triton II]
           +-01.3  Intel Corporation 82371AB/EB/MB PIIX4 ACPI
           +-04.0  Red Hat, Inc. Virtio block device
           \-05.0  Red Hat, Inc. Virtio network device

이 출력을 통해 IDE 컨트롤러 및 Virtio 장치와 같이 PCI 버스에 연결된 특정 하드웨어 구성 요소를 확인할 수 있습니다.

다음으로 SCSI 버스를 살펴보겠습니다. 우리의 가상 환경에서 하드 디스크 /dev/vda는 Virtio 블록 장치로 나타나지만, SCSI 장치가 있다면 여전히 탐색할 수 있습니다. 이 정보를 확인하는 사용자 친화적인 방법은 systool 명령어를 사용하는 것입니다. 이를 제공하는 sysfsutils 패키지를 설치해 보겠습니다.

sudo apt-get install -y sysfsutils

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

systool -b scsi

이 명령어는 SCSI 버스에 연결된 장치들을 보여줍니다.

Bus = "scsi"

  Device = "host0"
  Device = "host1"

/proc 에서 로우 레벨 시스템 리소스 점검하기

이 단계에서는 /proc 가상 파일 시스템을 심층적으로 분석하여 로우 레벨 시스템 리소스를 점검합니다. /proc 파일 시스템은 디스크에 실제 파일을 포함하지 않습니다. 대신 커널의 데이터 구조에 대한 직접적인 인터페이스 역할을 합니다. /proc에 있는 파일들을 읽음으로써 시스템이 DMA 채널, 인터럽트, I/O 포트와 같은 하드웨어 리소스를 어떻게 관리하고 있는지 실시간으로 확인할 수 있습니다.

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

cat /proc/dma

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

 4: cascade

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

다음으로 인터럽트 요청 (IRQ) 을 점검해 보겠습니다. 하드웨어 장치가 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 포트를 살펴보겠습니다. 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

출력 결과에는 루프 장치와 메인 디스크 vda를 포함한 블록 장치들이 표시됩니다. 이들은 /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 vda -> ../devices/pci0000:00/0000:00:04.0/virtio1/block/vda

이제 vda 장치의 디렉토리를 점검해 보겠습니다. 이 디렉토리에는 장치의 속성을 나타내는 다양한 파일들이 들어 있습니다.

ls /sys/block/vda

파일 및 디렉토리 목록이 표시됩니다.

alignment_offset  bdi  capability  dev  device  discard_alignment  events  events_async  events_poll_msecs  ext_range  holders  inflight  integrity  power  queue  range  removable  ro  vda1  vda2  vda3  size  slaves  stat  subsystem  trace  uevent

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

cat /sys/block/vda/size

출력 결과는 숫자로 나타납니다.

83886080

이 숫자는 512 바이트 섹터 단위의 장치 크기를 나타냅니다. 또한 vda1, vda2, vda3와 같이 각 파티션에 대한 디렉토리도 볼 수 있으며, 이들 역시 고유한 속성 세트를 포함하고 있습니다.

다음으로 /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

우리의 디스크 /dev/vda가 Virtio 블록 장치라는 것을 알고 있으므로 /sys/bus/virtio/devices 디렉토리 내부를 살펴보겠습니다. 여기에는 감지된 모든 Virtio 장치가 나열됩니다.

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를 탐색함으로써 상위 수준의 도구들이 시스템 하드웨어를 보고할 때 사용하는 원시 데이터에 직접 접근할 수 있습니다. 이는 리눅스 커널이 장치를 어떻게 인식하고 구성하는지 이해하는 강력한 방법입니다.

요약

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

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