February 6, 2014 · nic order udev

[FAQ] NIC의 순서가 부팅 때마다 바뀌는 증상

이미 여러 인터넷 커뮤니티에서 알려진대로 RHEL 기준으로 RHEL5 부터 서버를 리부팅 할 때 마다 네트워크 카드의 순서가 뒤 바뀌는 증상이 발생하곤 한다.

예를 들어 PCI 장치번호로 00:08.0이 eth0 였고 00:09.0가 eth1이었는데 리부팅을 하고 보니 eth0가 eth1으로 잡히고 eth1이 eth2로 잡히는 증상 또는 서로 바뀌는 증상들이 발생하는 것이다.

이것에 대한 해결 방법은 여러가지가 존재하는데 하나씩 살펴보면

NIC의 MAC 주소를 이용하는 방법

가장 정확하고 간편한 방법 중의 하나로 네트워크 장치 설정에 대해서 MAC 주소를 지정하는 방법이다. Redhat 계열로 예를 들면

/etc/sysconfig/network-scripts/ifcfg-eth0

위 파일에 HWADDR 항목을 추가해서 실제 NIC 장치의 MAC주소를 지정하면 몇 번을 리부팅해도 바뀌지 않는다.

DEVICE=eth0
BOOTPROTO=static
BROADCAST=123.123.123.255
IPADDR=123.123.123.123
NETMASK=255.255.255.224
NETWORK=123.123.123.0
HWADDR=00:A0:D1:12:E7:11

다만, 이와 같은 방법의 경우 서버시스템의 장애로 인해 서버를 교체하게 되면 (즉, 디스크는 유지하고 서버만 교체) HWADDR이 달라지게 되므로 다시 수정해 주어야 하는 번거로움이 생길 수 있다.

참고가 되는 문서 : 레드햇 KBASE

udev 룰셋을 통한 해결방법

최근 리눅스에서는 udev를 통해서 장치를 관리할 수 있고 원하는대로 룰셋을 지정할 수 있다. 이러한 udev의 룰셋을 이용하는 방법으로 아래와 같은 udev 룰을 추가한다.

파일위치 : /etc/udev/rules.d/10-local.rules (없는 파일이므로 새로생성)

SUBSYSTEM=="pci", SYSFS{class}=="0x020000", OPTIONS="ignore_device"

해당 파일에 기록한 udev의 의미는 sysfs의 해당 클래스에 대해서 룰셋 지정을 무시하라는 것이다. 기본적으로 60-net.rules 파일에 기록된 내용에 의해서 추가되기전에 이와 같은 룰셋을 지정하여 순서대로 (일반적으로 PCI 버스 순서) 인식하도록 하는 방법이다.

룰셋 파일 하나만 추가해주면 되고 생각보다 잘 적용되는 방법이다. 이와 유사하게 커널 부트 파라미터로 지정해서 장치인식을 Legacy 방식으로 하는 방법도 있지만 udev를 쓰는 환경이라면 이러한 방법을 더 추천한다.

참고할만한 링크 : Redhat bugzilla

/etc/iftab 설정파일로 지정하기

다른 배포판은 확인을 못해봤지만 wireless-tools 패키지에 들어있는 ifrename 유틸리티를 이용하는 방법이다. /etc/iftab이란 설정파일을 아래와 같은 방식으로 작성하고

eth0 businfo 0000:00:08.0
eth1 businfo 0000:00:09.0

위의 내용에서 0000:00:08.0은 lspci 등의 명령으로 확인할 수 있는 PCI 장치 번호이다. iftab을 작성했으면 아래의 rc 스크립트를 등록한다.

파일명 : /etc/init.d/ifrename

#!/bin/sh

NAME=ifrename
IFRENAME=/sbin/ifrename
IFTAB=/etc/iftab

test -f $IFRENAME || exit 0
test -f $IFTAB || exit 0

case "$1" in
        start|reload|force-reload|restart)
        $IFRENAME
        ;;
        test)
        $IFRENAME -DV
        ;;
        stop)
        ;;
        *)
        echo "Usage: $NAME {start|stop|reload|force-reload|restart}"
        ;;
esac

exit 0

그리고, 부팅하는 런레벨에 맞추어 S09ifrename 정도로 심볼릭을 걸어준다.

ln -s /etc/init.d/ifrename /etc/rc3.d/S09ifrename

이 방법은 서버가 바뀌어도 H/W 스펙이 같다면 PCI 값이 바뀌는 경우가 없기 때문에 유용한 방법이지만 대체로 udev 룰셋보다 번거롭기 때문에 잘 쓰이지는 않는다. 하지만, 별도의 멀티포트 NIC카드를 구매해서 장착한 경우라면 앞서 설명한 udev 룰셋으로 해결이 안될 수 있기 때문에 (즉, 내가 장착한 카드를 eth0로 잡고 싶지만 버스순서 때문에 온보드 NIC이 먼저 잡히는 경우 등) 이러한 방법을 사용하면 된다.

참고할 만한 링크

  • LinkedIn
  • Tumblr
  • Reddit
  • Google+
  • Pinterest
  • Pocket