소개
이 실습에서는 Linux 환경에서 하드웨어 장치를 탐색, 식별 및 검사하는 필수 기술을 배웁니다. 강력한 명령줄 유틸리티를 직접 사용해 보며 운영 체제가 물리적 구성 요소와 어떻게 상호 작용하는지 이해하게 됩니다. 이 실습의 목표는 시스템 관리, 성능 튜닝 및 문제 해결에 필수적인 Linux 하드웨어 관리에 대한 기초 지식을 쌓는 것입니다.
먼저 lsblk와 lshw를 사용하여 블록 장치를 나열하고 스토리지에 대한 개요를 파악합니다. 그 후 udevadm을 사용하여 장치의 세부 속성과 규칙을 검사합니다. 이어서 PCI 및 SCSI 버스 계층 구조를 확인하여 장치가 어떻게 연결되어 있는지 살펴봅니다. 마지막으로 /proc 및 /sys 가상 파일 시스템을 조사하여 커널 관점에서 시스템 하드웨어에 대한 포괄적인 정보를 확인합니다.
lsblk와 lshw를 사용한 블록 장치 나열
이 단계에서는 시스템에 연결된 블록 장치를 식별하고 나열하는 방법을 배웁니다. 블록 장치는 하드 드라이브, SSD, USB 플래시 드라이브와 같이 고정 크기 블록으로 데이터를 전송하는 저장 장치입니다. 이를 위해 lsblk와 lshw라는 두 가지 일반적인 명령어를 사용합니다.
먼저 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
lsblk와 lshw를 사용하면 Linux 시스템의 저장 장치에 대해 상위 수준의 개요와 상세한 하위 수준 정보를 모두 얻을 수 있습니다.
udevadm을 사용한 장치 속성 검사
이전 단계에서는 블록 장치를 나열하는 방법을 배웠습니다. 이제 udevadm 명령어를 사용하여 이러한 장치의 특정 속성을 더 깊이 있게 검사해 보겠습니다. udev는 Linux 커널의 장치 관리자로, /dev 디렉터리의 장치 노드를 동적으로 관리합니다. udevadm은 udev를 제어하는 도구로, 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는 시스템 장치 모델에 대한 더 구조화된 보기를 제공합니다. 이는 커널 객체, 장치 및 드라이버의 계층적 표현을 내보냅니다. 이전 단계에서 사용한 lsblk나 udevadm과 같은 많은 도구들이 /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 파일 시스템을 탐색하여 시스템 장치와 그 속성에 대한 구조화된 표현을 살펴보았습니다. 이를 통해 운영 체제에서 직접 하드웨어 정보를 찾고 해석하는 방법에 대한 포괄적인 이해를 얻었습니다.



