본문 바로가기

프로그래밍/리눅스

Ubuntu에서 Intel Server NIC Driver 설치/업데이트 방법





출처 : http://ubuntu.or.kr/viewtopic.php?f=21&t=7194

최근 Ubuntu 8.10 x64를 사용하는 고객사에 Nehalem (Xeon 5500) 2Way 서버를 납품했습니다.
저희 서버 모델에는 최신 Intel NIC, 82574L가 설치되어 있어서 8.10에서 인식이 안되더군요.
다음은 Intel NIC Linux 드라이버를 사용하여 Ubuntu에서 Compile하는 방법입니다.
인식하지 못하는 Device 뿐만 아니라 해당 Kernel driver가 구 버전인 경우 업데이트에 활용해도 좋습니다.

우선 Onboard NIC가 인식되지 못하므로 'apt-get'을 사용하지 못합니다.
저는 이 문제를 해결하려고 보편적으로 많이 사용하는 NIC를 서버에 설치해서 인식시킨 후 작업을 진행했습니다. (따로 Soruce를 다운받아 Copy하여 설치하는 방법도 있겠죠...)

* Onboard NIC OS 인식 확인
Onboard NIC가 OS에서 인식되었는지 확인 (Driver load 와는 무관)
#lspci |grep 82574 (해당 NIC의 모델명으로 확인)

* 드라이버 Download
Intel web site에 가서 해당 NIC Controller 모델의 Linux 용 최신 드라이버를 Down 받습니다.

* Driver compile을 위한 Package 설치
일반 Linux에서 Driver를 Compile 하듯이 압축을 풀고 'src'로 이동하여 'make'를 치면 make가 없는 명령이라고 나옵니다. 또한 kernel source가 미설치 상태이므로 compile이 불가합니다.
따라서 다음 package 들을 설치합니다.

#apt-get install make
#apt-get install build-essential
#apt-get install linux-headers-['uname -r' 출력 텍스트 입력]

마지막 linux-headers-[kernel version] 부분이 매우 중요합니다. 이 것을 통해 linux soruce를 참조하여 드라이버를 Compile하게 됩니다.
linux-header는 설치 OS의 세부 kernel version과 정확히 일치해야만 compile이 진행되므로 주의합니다.

* Compile
일반 Linux에서 진행하듯이 '#make, #make install'을 진행하면 정상적으로 진행됩니다.
Compile을 진행하는 폴더에 'ko' 확장자를 가지는 driver module이 만들어졌으면 일부 Error는 무시해도 됩니다.

* 마지막 과정
원래 '#make install' 과정에서
'/lib/modules/<KERNEL VERSION>/kernel/drivers/net/e1000e/e1000e.ko' 파일이 새로 만든 ko 파일로 overwrite 되어야 하는데 이상이 있을 수 있습니다. rm으로 삭제하고 새로만든 'e1000e.ko'를 이 자리에 cp해 줍니다.
그리고 '/etc/modules' 파일을 열어서 'e1000e' module을 추가해줍니다.
Reboot을 하면 NIC가 올라옵니다.

* 추가 작업
앞서 인터넷 통신을 위해 설치했던 PCI NIC를 제거해도 Onboard NIC가 eth0, 1로 올라오지 않고 뒷번호로 올라오게 됩니다. 이는 추가 설치한 NIC 정보가 남아있기 때문입니다. 이를 eth0, 1로 숮어하기 위해서는 '/etc/udev/rules.d/70-persistent-net.rules' 파일을 수정해 줍니다.
제거한 NIC의 Model이나 MAC 주소 등을 확인해서 없는 것이면 삭제하고 Onboard NIC의 eth# 번호를 조정해 주면 됩니다.

# PCI device 0x10ec:0x8168 (r8169)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="xx:xx:xx:xx:xx:xx", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

# PCI device 0x10ec:0x8168 (r8168)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="xx:xx:xx:xx:xx:xx", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"