ls -l /dev/sda /dev/tty0
# brw-rw---- 1 root disk 8, 0 Sep 3 09:00 /dev/sda
# crw--w---- 1 root tty 4, 0 Sep 3 09:00 /dev/tty0
# │ │ │
# │ │ └── 부 번호 (minor)
# │ └───── 주 번호 (major)
# └──────────────────────────── b = 블록, c = 문자
일반 파일에서 크기가 표시되던 자리에 두 개의 숫자 가 나온다. 이것이 주 번호와 부 번호다.
번호 뜻 주 번호(major) 어떤 드라이버 가 담당하는가 (장치의 종류) 부 번호(minor) 그 드라이버가 다루는 몇 번째 장치 인가
$ ls -l /dev/sda /dev/sda1 /dev/sda2 /dev/sdb /dev/sdb1 /dev/null /dev/zero
brw-rw----. 1 root disk 8, 0 Sep 3 09:00 /dev/sda
brw-rw----. 1 root disk 8, 1 Sep 3 09:00 /dev/sda1
brw-rw----. 1 root disk 8, 2 Sep 3 09:00 /dev/sda2
brw-rw----. 1 root disk 8, 16 Sep 3 09:00 /dev/sdb
brw-rw----. 1 root disk 8, 17 Sep 3 09:00 /dev/sdb1
crw-rw-rw-. 1 root root 1, 3 Sep 3 09:00 /dev/null
crw-rw-rw-. 1 root root 1, 5 Sep 3 09:00 /dev/zero
디스크 다섯 줄은 주 번호가 모두 8 이다. 같은 드라이버(sd)가 맡는다는 뜻이고, 어느 디스크의 어느 파티션인지는 부 번호 가 가른다.
sd 드라이버는 디스크 하나에 부 번호 16개 를 떼어 준다. 그래서 sda가 0, sdb가 16에서 시작하고, 파티션은 거기에 번호를 더한다(sdb1 = 16 + 1 = 17).
/dev/null과 /dev/zero는 주 번호가 같고(1) 부 번호만 다르다. 실제 하드웨어가 없는 가상 장치지만 한 글자씩 흘려보내므로 문자 장치(c) 다.
어느 주 번호가 어느 드라이버인지는 /proc/devices 에서 볼 수 있다.
오해 실제 장치 파일 안에 데이터가 들어 있다 번호 두 개만 담은 표지판 이다. 읽고 쓰면 커널이 그 번호의 드라이버로 넘긴다이름(sda)이 장치를 정한다 커널이 보는 것은 종류(b/c)와 주·부 번호 다. 이름은 사람을 위한 것이다 권한과 무관하다 일반 파일처럼 rw- 권한 이 적용된다. /dev/sda는 root와 disk 그룹만 읽고 쓴다
장치 파일을 손으로 만드는 명령이 mknod 다 — mknod 이름 b|c 주번호 부번호. 지금은 udev가 대신 해 주므로 직접 쓸 일은 드물다.
구분 블록 장치 문자 장치 표시 bc다루는 단위 정해진 크기의 블록 한 글자씩(스트림) 버퍼 사용한다 거의 쓰지 않는다 임의 접근 가능 순차적 예 하드디스크, USB, CD-ROM 키보드, 마우스, 프린터, 터미널
디스크 계열은 블록, 입출력 계열은 문자 로 기억한다. "임의의 위치를 바로 읽을 수 있는가"가 가르는 기준이다. 디스크는 아무 데나 바로 읽지만 키보드는 눌린 순서대로 흘러온다.
장치 파일 무엇 /dev/sda첫 번째 SATA·SCSI·USB 디스크 /dev/sda1sda의 첫 번째 파티션 /dev/sdb두 번째 디스크 /dev/hda예전 IDE 방식 디스크 /dev/nvme0n1NVMe SSD/dev/sr0 (/dev/cdrom)CD/DVD 드라이브/dev/null버리는 곳 . 읽으면 아무것도 없다/dev/zero읽으면 0이 무한히 나온다 /dev/random, /dev/urandom난수 생성/dev/tty현재 터미널 /dev/lp0첫 번째 프린터 포트 /dev/fd0플로피 디스크
/dev/sd a 1
│ │ │
│ │ └── 파티션 번호 (1부터)
│ └──── 몇 번째 디스크 (a, b, c...)
└─────── sd = SATA/SCSI/USB, hd = IDE
예 뜻 /dev/sda첫 번째 디스크 전체 /dev/sda1첫 번째 디스크의 1번 파티션 /dev/sdb2두 번째 디스크의 2번 파티션
디스크는 알파벳, 파티션은 숫자 다. 이 조합을 그대로 묻는다.
요즘은 IDE 디스크도 sd로 인식하는 경우가 많다.
알파벳은 종류가 아니라 인식된 순서 다. 내장 디스크가 sda인 컴퓨터에 USB 메모리를 꽂으면 sdb가 되고, 하나 더 꽂으면 sdc가 된다. 꽂는 순서가 바뀌면 이름도 바뀐다.
이름 읽는 법 /dev/sdc1세 번째 sd 디스크의 1번 파티션/dev/hdb2IDE 두 번째 디스크의 2번 파티션 /dev/nvme0n1p2NVMe 0번 컨트롤러의 1번 장치, 그 2번 파티션 — 숫자로 끝나는 이름이라 파티션 앞에 p 가 붙는다 /dev/vda1가상 머신의 가상 디스크(virtio) 1번 파티션 /dev/sr0첫 번째 광학 드라이브. 번호가 0부터 시작하고 파티션 번호가 없다
장치 파일 무엇 /dev/tty1 ~ /dev/tty6모니터와 키보드에 직접 붙은 가상 콘솔 /dev/pts/0, /dev/pts/1 …의사 터미널 — SSH 접속이나 그래픽 화면의 터미널 창/dev/ttyS0첫 번째 직렬(시리얼) 포트 /dev/lp0첫 번째 병렬 포트 프린터 /dev/usb/lp0첫 번째 USB 프린터
$ tty
/dev/pts/0
$ echo hello > /dev/pts/0
hello
tty 명령 은 지금 내 터미널의 장치 파일을 알려 준다. 그 파일에 글자를 쓰면 화면에 나타난다 — "장치도 파일"이라는 말을 가장 쉽게 확인하는 방법이다.
장치 쓰임 예 /dev/null필요 없는 출력을 버린다 명령 > /dev/null 2>&1/dev/zero0으로 채운 빈 파일을 만든다 dd if=/dev/zero of=test.img bs=1M count=100 (100MB 파일)/dev/urandom무작위 값을 얻는다 임시 비밀번호·키 생성
/dev/null은 쓰면 사라지고, 읽으면 곧바로 끝(EOF) 이다. /dev/zero는 읽으면 0이 끝없이 나온다. "읽었을 때 무엇이 나오는가"로 둘을 가른다.
예전에는 /dev 아래에 쓰지도 않을 장치 파일이 수천 개 미리 만들어져 있었다.
장치 연결(USB 꽂기)
│
▼
커널이 감지 ──► udev ──► /dev/sdb 파일 생성
│ 권한·소유자 지정
▼ 이름 규칙 적용
장치 제거 ──► udev ──► 파일 삭제
udev는 장치가 연결·제거될 때 /dev 아래 파일을 실시간으로 만들고 지운다.
규칙 파일은 /etc/udev/rules.d/ 에 둔다. 특정 USB에 항상 같은 이름을 붙이는 식의 설정이 가능하다.
덕분에 실제로 있는 장치만 /dev에 존재한다.
/dev는 디스크에 저장된 디렉터리가 아니라 메모리에 만들어지는 파일 시스템 이다. 부팅할 때마다 그때 있는 장치에 맞춰 새로 채워진다.
udev는 커널 2.6 에서 예전 방식(devfs)을 대신하며 들어왔다. 지금은 systemd-udevd라는 데몬으로 돈다.
규칙 파일 위치 성격 /usr/lib/udev/rules.d/ (배포판에 따라 /lib/udev/rules.d/)배포판이 넣어 둔 기본 규칙 — 직접 고치지 않는다 /etc/udev/rules.d/관리자가 추가하는 규칙 — 같은 이름이면 이쪽이 우선한다
규칙 파일은 70-persistent-net.rules 처럼 숫자-이름.rules 꼴이며 숫자가 작은 것부터 읽는다.
KERNEL=="sd?1", ATTRS{idVendor}=="0781", SYMLINK+="myusb"
└────────── 조건 (==) ────────────────┘ └── 할 일 (+=) ──┘
==는 "이런 장치라면" 이라는 조건, =·+=는 "이렇게 하라" 는 지시다. 위 규칙은 커널이 붙인 이름이 sda1·sdb1처럼 sd?1 꼴이고 제조사 번호가 0781인 장치에 /dev/myusb라는 링크를 덧붙인다.
udev가 미리 만들어 주는 링크도 있다. /dev/cdrom은 /dev/sr0을 가리키는 심볼릭 링크 이고, /dev/disk/by-uuid/ 아래에는 UUID로 된 링크가 있다. sdb·sdc처럼 순서에 따라 바뀌는 이름 대신 변하지 않는 이름 을 쓰게 해 준다.
명령 보여 주는 것 lsblk블록 장치 를 트리로lsusb연결된 USB 장치 lspciPCI 장치 (그래픽·랜카드)lscpuCPU 정보 lsmod적재된 커널 모듈 dmesg커널 메시지 — 장치 인식 기록blkid장치의 UUID와 파일 시스템 종류
lsblk # 디스크와 파티션 구조
lsusb # USB 목록
dmesg | tail -20 # 방금 꽂은 장치가 무엇으로 인식됐나
ls로 시작하는 명령들이 한 묶음 이다 — lsblk, lsusb, lspci, lscpu, lsmod.
USB를 꽂았는데 안 보이면 dmesg 로 커널이 무엇으로 인식했는지 확인하는 것이 표준 절차다.
$ dmesg | tail -4
[ 4521.103422] usb 1-2: new high-speed USB device number 5 using xhci_hcd
[ 4521.812345] sd 6:0:0:0: [sdb] 31250000 512-byte logical blocks: (16.0 GB/14.9 GiB)
[ 4521.813990] sdb: sdb1
[ 4521.815102] sd 6:0:0:0: [sdb] Attached SCSI removable disk
$ lsusb
Bus 001 Device 005: ID 0781:5567 SanDisk Corp. Cruzer Blade
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 50G 0 disk
├─sda1 8:1 0 1G 0 part /boot
├─sda2 8:2 0 4G 0 part [SWAP]
└─sda3 8:3 0 45G 0 part /
sdb 8:16 1 14.9G 0 disk
└─sdb1 8:17 1 14.9G 0 part
sr0 11:0 1 1024M 0 rom
출력 읽는 법 dmesg의 [sdb]커널이 이 장치에 sdb라는 이름을 줬다 31250000 512-byte logical blocks512바이트 블록 31,250,000개 = 16,000,000,000바이트. 16.0 GB(10진)이자 14.9 GiB(2진) 다 sdb: sdb1파티션이 하나 있다 lsusb의 ID 0781:5567제조사 번호:제품 번호 . udev 규칙의 idVendor가 이 앞부분이다lsblk의 MAJ:MIN주 번호:부 번호 — ls -l /dev/sdb1의 8, 17과 같은 값 lsblk의 RM1이면 이동식 장치. sdb와 sr0이 1이다MOUNTPOINT가 비어 있음인식은 됐지만 아직 마운트하지 않았다
sda의 파티션을 더하면 1G + 4G + 45G = 50G로 디스크 크기와 맞는다. TYPE이 disk인 줄이 전체, part인 줄이 그 안의 조각 이다.
제품 상자의 "16GB"가 lsblk에서 14.9G로 보이는 것은 고장이 아니라 단위 차이 다.
dmesg의 메시지는 크기가 정해진 링 버퍼 에 쌓이므로 오래된 것은 밀려난다. 그래서 꽂은 직후 tail로 끝부분 을 본다.
알고 싶은 것 명령 디스크와 파티션이 어떻게 나뉘었나, 어디에 마운트됐나 lsblkUSB 장치가 연결은 됐는지 lsusb그래픽 카드·랜 카드 같은 내장 확장 카드 lspci커널이 장치를 어떤 이름으로 인식했나 , 오류는 없었나 dmesg파티션의 UUID와 파일 시스템 종류 blkid장치 드라이버(모듈)가 적재됐는지 lsmod
커널 모듈은 lsmod로 보고 modprobe 모듈명 으로 적재한다. modprobe는 필요한 다른 모듈까지 함께 올리고, insmod는 지정한 파일 하나만 올린다. 내릴 때는 rmmod를 쓴다.
lsblk # /dev/sdb1 로 잡혔는지 확인
sudo mount /dev/sdb1 /mnt # 붙이기
ls /mnt # 내용 확인
sudo umount /mnt # 떼기 — 뽑기 전에 반드시
요즘 데스크톱 환경은 /media/사용자명/ 아래에 자동으로 마운트 해 준다.
뽑기 전에 반드시 umount 한다. 쓰기 캐시가 남아 있으면 데이터가 손상된다.
mount에는 파티션(/dev/sdb1)을 준다. 디스크 전체(/dev/sdb)가 아니다. 파일 시스템은 파티션 안에 들어 있다.
명령 이름은 umount 다. unmount가 아니다.
매체 흔한 장치 파일 파일 시스템 예 USB 메모리 /dev/sdb1vfat (FAT32)mount -t vfat /dev/sdb1 /mntCD/DVD /dev/sr0 (/dev/cdrom)iso9660mount -t iso9660 /dev/cdrom /mnt
증상 원인 대처 umount: /mnt: target is busy누군가 그 안에 있다 — 내 셸의 현재 디렉터리 가 /mnt인 경우가 흔하다 cd로 밖으로 나온 뒤 다시lsblk에 아예 없다커널이 인식하지 못했다 lsusb, dmesg로 확인lsblk에는 있는데 내용이 안 보인다마운트하지 않았다 mount
CD/DVD는 eject 명령으로 꺼낸다. 마운트되어 있으면 먼저 떼고 트레이를 연다.
마운트 지점의 관례는 /mnt가 관리자가 잠시 손으로 붙이는 곳 , /media가 이동식 매체가 자동으로 붙는 곳 이다.
내일은 프린터·사운드·스캐너 같은 주변장치를 실제로 다루는 방법을 배운다.
장치 파일 : 하드웨어를 파일처럼 다루도록 /dev 아래에 만들어진 특수 파일.
블록 장치 : 정해진 크기의 블록 단위로 임의 접근하는 장치. 표시는 b이며 디스크가 해당한다.
문자 장치 : 데이터를 한 글자씩 순차적으로 주고받는 장치. 표시는 c이며 키보드·프린터가 해당한다.
주 번호(major) : 장치를 담당하는 드라이버를 구분하는 번호.
부 번호(minor) : 같은 드라이버가 다루는 개별 장치를 구분하는 번호.
udev : 장치의 연결과 제거를 감지해 /dev 아래 파일을 자동 생성·삭제하는 관리자.
/dev/null : 보낸 데이터를 버리는 장치 파일.
dmesg : 커널이 남긴 메시지를 출력하는 명령. 장치 인식 결과를 확인할 때 쓴다.
📝 연습 문제 선택지를 클릭하면 정답·해설이 펼쳐집니다.
다음 중 하드디스크와 같이 블록 단위로 데이터를 주고받는 장치의 ls -l 표시 문자로 알맞은 것은?
다음 중 문자 장치에 해당하는 것으로 알맞은 것은?
A 하드디스크 B USB 메모리 C 키보드 D CD-ROM 다음 중 첫 번째 SATA 디스크의 두 번째 파티션을 나타내는 장치 파일로 알맞은 것은?
A /dev/sdb1 B /dev/sda2 C /dev/sda1 D /dev/hdb2 다음 중 장치의 연결과 제거를 감지해 /dev 아래의 장치 파일을 자동으로 생성하고 삭제하는 것으로 알맞은 것은?
A systemd B fstab C mount D udev 다음 중 커널이 남긴 메시지를 출력해 새로 연결한 장치가 어떻게 인식되었는지 확인하는 명령으로 알맞은 것은?