7.4. 장치 관리

7.4.1. 네트워크 장치

Udev는 기본적으로 펌웨어/BIOS 데이터 또는 버스, 슬롯, MAC 주소와 같은 물리적 특성에 따라 네트워크 장치를 명명한다. 이 명명 규칙의 목적은 네트워크 장치 이름이 장치가 인식된 시간에 근거하지 않고 일관성 있게 명명되도록 하는 것이다. 예를 들어 인텔과 리얼텍의 네트워크 카드가 두 개 있는 컴퓨터에서, 인텔 네트워크 카드 이름이 eht0, 리얼텍 카드는 eth1이 되었다면 재부팅 후에는 카드 번호가 서로 반대로 매겨지기도 한다.

새로운 명명 체계에서 일반적인 네트워크 장치 이름은 enp5s0 또는 wlp3s0과 같은 것이 될 것이다. 이 명명 규칙을 원하지 않는다면, 전통적인 명명 방식이나 사용자 정의 방식도 사용할 수 있다.

7.4.1.1. 커널 명령줄에서 영구 명명 비활성화

eth0, eth1과 같이 명명하는 기존 방식은 커널 명령줄에 net.ifnames=0을 추가하여 복원할 수 있다. 이는 동일한 유형의 이더넷 장치가 단 한 개만 존재하는 시스템에 가장 적합하다. 노트북은 흔히 eth0과 wlan0이라는 이름으로 이더넷 연결 방식을 여러 개 가지고 있으며 이 방법을 사용할 법한 대상이기도 하다. 명령행은 GRUB 구성 파일에서 전달된다. 8.4.4절. “GRUB 구성 파일 생성”를 참고하라.

7.4.1.2. 사용자 지정 Udev 규칙 생성

명명 방식은 사용자 지정 Udev 규칙을 생성함으로써 변경할 수 있다. 초기 규칙을 생성하는 스크립트가 포함되어있다. 다음을 실행하여 이러한 규칙들을 생성하라:

bash /lib/udev/init-net-rules.sh

이제 /etc/udev/rules.d/70-persistent-net.rules 파일을 열어 어떤 네트워크 장치에 어떤 이름이 할당되었는지 확인하라:

cat /etc/udev/rules.d/70-persistent-net.rules
[참고]

참고

MAC 주소가 네트워크 카드에 수동으로 할당되었거나, Qemu, Xen과 같은 가상 환경에서 MAC 주소를 할당받은 경우와 같은 일부 상황에서는 주소가 일관되게 할당되지 않았기 때문에 네트워크 규칙 파일이 생성되지 않았을 수 있다. 이런 경우엔 이 방법을 사용할 수 없다.

이 파일은 각 NIC에 대해 두 줄씩 이어지는 주석 블록으로 시작한다. 각 NIC의 첫 번째 줄은 드라이버를 찾을 수 있는 경우 괄호 안의 드라이버와 함께 해당 하드웨어 ID(PCI 카드를 예로 들면 PCI 공급 업체와 장치 ID)를 보여주는 주석이다. 하드웨어 ID나 드라이버 모두 인터페이스를 제공할 이름을 명명하는 데 사용되지 않는다; 이 정보는 참조용일 뿐이다. 두 번째 줄이 이 NIC와 일치하며 실제로 이름을 할당하는 Udev 규칙이다.

모든 Udev 규칙은 쉼표와 선택적 공백으로 구분된 여러 개의 키로 구성된다. 이 규칙의 키와 각각의 설명은 다음과 같다:

  • SUBSYSTEM=="net" - 네트워크 카드가 아닌 장치들을 무시한다.

  • ACTION=="add" - add가 아닌 uevent에 대해서는 이 규칙을 무시하도록 한다("remove" 및 "change" uevents도 발생하지만 네트워크 인터페이스의 이름을 바꿀 필요는 없다).

  • DRIVERS=="?*" - Udev가 VLAN이나 브릿지 하위 인터페이스를 무시하도록 한다(이 하위 인터페이스들은 드라이버를 갖지 않기 때문). 이 하위 인터페이스들은 할당될 이름이 부모 장치와 충돌하기 때문에 건너뛴다.

  • ATTR{address} - NIC의 MAC 주소이다.

  • ATTR{type}=="1" - 여러 가상 인터페이스를 생성하는 특정 무선 드라이버의 경우 규칙이 주 인터페이스와만 짝을 이루도록 한다. VLAN과 브릿지 하위 인터페이스와 같은 이유로 보조 인터페이스는 생략된다: 그렇지 않으면 이름이 충돌할 수 있다.

  • NAME - Udev가 이 인터페이스에 할당할 이름이다.

NAME의 값이 중요한 부분이다. 계속하기 전에 각 네트워크 카드에 할당된 이름을 정확히 숙지하고 아래 구성 파일을 만들 때 해당 NAME 값을 사용하라.

7.4.2. CD-ROM symlinks

추후 설치할지도 모르는 일부 소프트웨어(예: 다양한 미디어 플레이어)에는 CD-ROM이나 DVD-ROM을 가리키는 /dev/cdrom/dev/dvd 심볼릭 링크가 필요하다. 또 이러한 심볼릭 링크들을 참조하도록 /etc/fstab에 추가하는 것이 편리할 것이다. Udev에는 각 장치의 기능에 따라 이러한 심볼릭 링크를 생성하기 위해 규칙 파일을 생성하는 스크립트가 함께 제공되지만, 스크립트를 사용하도록 하려면 두 가지 작동 모드 중 어떤 모드를 사용할지 결정해야 한다.

첫째는 스크립트가 by-path 모드(USB 및 FireWire 장치에서 기본적으로 사용됨)로 작동할 수 있고, 여기서는 스크립트가 생성하는 규칙이 CD나 DVD 장치의 물리적 경로에 따라 달라진다. 둘째는 by-id 모드(IDE와 SCSI 장치에서의 기본값)로 작동할 수 있으며, 여기서 생성되는 규칙은 CD나 DVD 장치 자체에 저장된 식별 문자열에 따라 달라진다. 경로는 Udev의 path_id 스크립트에 의해 결정되며, 식별 문자열은 보유하고 있는 장치 유형에 따라 ata_idscsi_id 프로그램에 의해 하드웨어로부터 인식된다.

각 접근법마다 장점이 있다; 어떤 방법을 사용할지는 어떤 종류의 장치가 변경될 수 있는지에 따라 달라질 것이다. 드라이브를 다른 IDE 포트나 다른 USB 커넥터로 옮기려는 때와 같이, 장치에 대한 물리적 경로(즉, 연결되는 포트 또는 슬롯)가 변경될 것이라면 by-id 모드를 사용하라. 반면에 장치 수명이 끝나가서 동일한 기능의 다른 장치로 교체하고 동일한 커넥터에 꽂는다면, 장치의 식별이 변경될 것이기 때문에 by-path 모드를 사용해야 한다.

두 경우 모두 일어날 것 같다면, 더 자주 발생할 것으로 예상되는 상황에 따라 모드를 선택하라.

[중요]

중요

외부 장치(예: USB 연결 CD 드라이브)는 장치를 새 외부 포트에 연결할 때마다 물리적 경로가 변경되기 때문에 by-path 모드를 사용해선 안 된다. 모든 외부 연결식 장치들은, 물리적 경로로 인식하도록 Udev 규칙을 작성할 경우 이 문제가 발생할 것이다; 이러한 문제는 CD와 DVD 드라이브에만 국한되지 않는다.

Udev 스크립트가 사용할 값을 보려면 해당 CD-ROM에 대해, /sys 아래(예를 들면 /sys/block/hdd)에서 해당 디렉토리를 찾아 다음과 유사한 명령을 실행하라:

udevadm test /sys/block/hdd

다양한 *_id 프로그램의 출력이 나오는 행을 살펴보라. by-id 모드는 ID_SERIAL 값이 존재하고 비어있지 않으면 그 값을 사용하고, 그렇지 않으면 ID_MODEL과 ID_REVISION의 조합을 사용한다. by-path 모드는 ID_PATH 값을 사용할 것이다.

기본 모드가 사용자의 상황에 적합하지 않은 경우 /etc/udev/rules.d/83-cdrom-symlinks.rules 파일을 다음과 같이 수정할 수 있다(여기서 모드by-id 또는 by-path 중 하나임):

sed -i -e 's/"write_cd_rules"/"write_cd_rules mode"/' \
    /etc/udev/rules.d/83-cdrom-symlinks.rules

지금은 규칙 파일이나 심볼릭 링크를 생성할 필요가 없다는 점을 참고하라. 왜냐하면 LFS 시스템에 호스트의 /dev 디렉토리를 바인딩 마운트했으며 호스트에 심볼릭 링크가 존재한다고 가정하기 때문이다. LFS 시스템을 처음 부팅하면 규칙과 심볼릭 링크가 생성될 것이다.

그러나, 만약 CD-ROM 장치가 여러 개 있다면 장치가 예측 가능한 순서대로 검색되지 않기 때문에, 해당 시점에 생성된 심볼릭 링크가 호스트에서 가리키던 장치와는 다른 장치를 가리킬 수 있다. LFS 시스템을 처음 부팅할 때 할당되는 링크는 안정적이기 때문에, 동일한 장치를 가리키는 데에 양쪽 시스템 모두 심볼릭 링크가 필요한 경우에만 문제가 된다. 필요하다면 부팅 후 생성된 /etc/udev/rules.d/70-persistent-cd.rules 파일을 검사하고 편집하여 할당된 심볼릭 링크가 필요한 것과 일치하도록 하라.

7.4.3. 중복 장치 처리

7.3절. “장치 및 모듈 핸들링 개요”에서 설명했듯이, 동일한 기능의 장치끼리는 /dev에 나타나는 순서가 본질적으로 무작위이다. 가령 USB 웹 카메라와 TV 튜너가 있을 때 /dev/video0은 카메라를, /dev/video1은 튜너를 참조할 때가 있고, 재부팅 후에는 순서가 반대로 될 수도 있다. 이 문제는 사운드 카드와 네트워크 카드를 제외한 모든 종류의 하드웨어에 대해 사용자 지정 영구 심볼릭 링크를 위한 Udev 규칙을 생성하여 해결할 수 있다. 네트워크 카드의 경우는 7.5절. “일반 네트워크 구성”에서 별도로 다루며, 사운드 카드 구성은 BLFS에서 확인할 수 있다.

이 문제가 발생할 가능성이 높은 각 장치에 대해(현재 사용 중인 리눅스 배포판에서 문제가 없더라도), /sys/class/sys/block 아래에서 해당 디렉토리를 찾아보라. 비디오 장치는 아마 /sys/class/video4linux/videoX일 것이다. 장치를 고유하게 식별하는 속성을 파악하라(보통은 공급 업체와 제품 ID 그리고/또는 시리얼 넘버가 이에 속한다):

udevadm info -a -p /sys/class/video4linux/video0

그리고나서 심볼릭 링크를 생성하는 규칙을 작성한다. 예를 들어:

cat > /etc/udev/rules.d/83-duplicate_devs.rules << "EOF"

# Persistent symlinks for webcam and tuner
KERNEL=="video*", ATTRS{idProduct}=="1910", ATTRS{idVendor}=="0d81", \
    SYMLINK+="webcam"
KERNEL=="video*", ATTRS{device}=="0x036f", ATTRS{vendor}=="0x109e", \
    SYMLINK+="tvtuner"

EOF

그 결과, /dev/video0/dev/video1 장치는 여전히 튜너와 웹 카메라를 무작위로 가리키겠지만(따라서 직접 사용해서는 안 된다), /dev/tvtuner/dev/webcam 심볼릭 링크는 항상 올바른 장치를 가리킬 것이다.