Linux - Network Driver Setting (lsmod, lspci)
Posted 08 27, 2009 11:53, Filed under: System/UNIX리눅스 Network Driver Setting
개요
이 문서에서는 Ethernet PCI 네트워크 카드를 리눅스 상에서 인식시키는 과정을 상세히 설명한다. 따라서 ifconfig 라든지 route add등의 application 레벨의 설명은 이 문서에서 하지 않는다. 기본적인 네트워크 application에 관해서는 다른 문서에서 상세히 다룰 것이다. 그리고 기본적인 IP, Gateway, DNS, Subnet Mask 등은 정상적으로 설정되어 있다고 가정한다.
설정
설정에 관련된 주요 명령어 및 관련 파일은 다음과 같다
주 명령어
/sbin/ifconfig
/sbin/lspci
/sbin/lsmod
관련 파일
/etc/modprobe.conf
/etc/modules.conf
/etc/conf.modules
/etc/sysconfig/network-script/ifcfg-eth*
/lib/modules/`uname –r`/kernel/drivers/net/*.{ko,o}
현재 정상적으로 동작하는 시스템(sniffer)에서 네트웍 드라이버가 어떻게 잡혀 있는지에 대해서 보면서 리눅스 네트웍 드라이버 설정에 대해 알아봅니다.
물론 위에 리스팅한 설정파일과 명령어로 시스템 상황을 확인합니다.
시스템 확인
일단은 내 컴퓨터에 어떤 pci 카드가 있는 지를 확인해야 합니다. 물론 이 문서에서는 pci와 pci-x 네트웍 카드에 대해서만 언급합니다. ISA 방식의 옛날 카드에 대해서는 문서를 찾아 보시길 바랍니다. 어떤 pci 카드가 시스템에 장착되어 있는 지는 lspci 명령어로 볼 수 있습니다. 보다 자세한 사항을 알고 싶다면 –v 옵션을 이용해 확인 할 수 있습니다.
현재 장비의 pci 카드 현황입니다.
| $ lspci 00:00.0 Host bridge: Intel Corp.: Unknown device 254c (rev 01) 00:00.1 Class ff00: Intel Corp. e7500 [Plumas] DRAM Controller Error Reporting (rev 01) 00:03.0 PCI bridge: Intel Corp. e7500 [Plumas] HI_C Virtual PCI Bridge (F0) (rev 01) 00:03.1 Class ff00: Intel Corp. e7500 [Plumas] HI_C Virtual PCI Bridge (F1) (rev 01) 00:1d.0 USB Controller: Intel Corp. 82801CA/CAM USB (Hub #1) (rev 02) 00:1d.1 USB Controller: Intel Corp. 82801CA/CAM USB (Hub #2) (rev 02) 00:1d.2 USB Controller: Intel Corp. 82801CA/CAM USB (Hub #3) (rev 02) 00:1e.0 PCI bridge: Intel Corp. 82801BA/CA/DB PCI Bridge (rev 42) 00:1f.0 ISA bridge: Intel Corp. 82801CA ISA Bridge (LPC) (rev 02) 00:1f.1 IDE interface: Intel Corp. 82801CA IDE U100 (rev 02) 00:1f.3 SMBus: Intel Corp. 82801CA/CAM SMBus (rev 02) 01:03.0 Ethernet controller: Intel Corp. 82557/8/9 [Ethernet Pro 100] (rev 0d) 01:04.0 Ethernet controller: Intel Corp. 82540EM Gigabit Ethernet Controller (rev 02) 01:0c.0 VGA compatible controller: ATI Technologies Inc Rage XL (rev 27) 02:1c.0 PIC: Intel Corp. 82870P2 P64H2 I/OxAPIC (rev 04) 02:1d.0 PCI bridge: Intel Corp. 82870P2 P64H2 Hub PCI Bridge (rev 04) 02:1e.0 PIC: Intel Corp. 82870P2 P64H2 I/OxAPIC (rev 04) 02:1f.0 PCI bridge: Intel Corp. 82870P2 P64H2 Hub PCI Bridge (rev 04) 03:03.0 SCSI storage controller: Adaptec AIC-7901A U320 (rev 03) |
위의 결과와 같이 현재 장비에는 Intel제품인 eepro 100 카드(82557 chip)와 82540EM Gigabit Ethernet Card가 장착 되어 있습니다. 두개의 네트웍 카드가 있다는 거지요. 리눅스는 커널이 올라 오면서 각각의 pci 카드를 등록시킵니다. 네트웍 카드의 경우 등록 될 때 마다 아이디가 순차적으로 부여가 되는게 그 이름이 ethx(eth0, eth1, eth2, …)의 형태를 가지게 됩니다. 부여되는 번호는 커널에서 pci장치를 등록시키는 순서가 됩니다. 스니퍼 시스템의 경우 eepro100 카드가 먼저 인식되어 eth0이 되고 82540EM 카드가 eth1이 되겠지요. 모든 이더넷 카드의 번호는 0부터 시작됩니다.
eepro100의 드라이버는 intel 사이트를 찾아보면 e100 이라는 모듈을 사용하고, 82540EM 카드는 e1000이라는 모듈을 사용합니다. 드라이버에 대해서 이야기 하기 전에 모듈에 대해 먼저 간략하게 이야기 하겠습니다. 현재 대부분의 리눅스는 동적으로 장치들의 드라이버를 올릴 수 있습니다. 말그대로 필요할 때 드라이버를 올리고 내릴 수 있다는 겁니다. 이때 동적으로 올리고 내릴 수 있는 드라이버를 모듈이라고 명명합니다.
이더넷 카드의 드라이버 모듈은 대부분 리눅스 패키지에 포함되어 있지만, 최신 broadcom 57xx Optical Card 같은 경우(bcm5700 모듈)는 패키지에 포함되지 않아서 개인적으로 파일을 받아서 모듈을 만들어야 합니다. 모듈을 만드는 과정은 다음 섹션에서 확인 할 수 있습니다.
일단 어떤 카드가 어떤 드라이버를 가져야하는지를 알고 있다는 가정하에 올바른 네트웍 설정이 되었는지를 다음을 통해서 확인합니다. 어떤 카드가 지금 어떤 드라이버를 사용하고 있는 지를 확인하는 것입니다. 그 내용은 /etc/modules.conf에서 확인 할 수 있습니다.
물론 리눅스 버전에 따라서 그 이름이 달라 질 수 있습니다. 최신 레드햇 ES4등의 경우 /etc/modprobe.conf에 그 설정이 있고, 레드햇 9.0의 경우 /etc/modules.conf에 설정이 있습니다. 그 이전 버전일 경우 /etc/conf.modules에서 확인 할 수도 있습니다.
스니퍼는 레드햇 9.0이기에 /etc/modules.conf에서 확인 가능합니다.
| $ cat /etc/modules.conf alias eth0 e100 alias eth1 e1000 #options e1000 AutoNeg=0x05 Speed=1000 Duplex=2 alias scsi_hostadapter aic79xx alias usb-controller usb-uhci |
보시는 바와 같이 형태는 다음과 같습니다.
| alias ethx driver-name options driver-name optionlist… |
스니퍼의 eth0의 설정을 보면 다음과 같습니다.
| alias eth0 e100 |
네트웍 카드 eth0, 즉 82557 칩을 가지는 eepro100 이더넷 카드는 e100 이라는 이름을 가지는 드라이버 모듈을 사용한다는 의미입니다. options는 세세한 설정시 필요하므로 일반적으로 설정을 안하셔도 무방합니다. 그렇다면 e100이라는 이름을 가지는 드라이버가 실제 커널 모듈로 존재하는지 또한 모듈로 커널에 동적으로 올라가 있는지를 확인해야겠지요?
모든 커널 모듈들은 /lib/modules/`uname –r`/kernel/drivers/net 디렉토리 밑에 xxx.o 혹은 최신 버전의 리눅스일 경우 xxx.ko란 이름으로 존재 합니다. 스니퍼에서 eth0의 경우 e100이라는 드라이버를 쓴다고 설정했기에 모듈디렉토리 내에 e100.o라는 파일이 존재해야합니다.
| $ cd /lib/modules/`uname -r`/kernel/drivers/net $ ls e100* e100: 합계 80 80 e100.o e1000: 합계 68 68 e1000.o |
위 장비에선 net/e100/e100.o란 파일이 존재 합니다. 따라서 /etc/modules.conf에서 설정한 내용내로 e100.o란 파일이 커널 모듈로 올라갑니다. 이제 마지막으로 모듈로서 커널에 e100드라이버가 올라가 있는지만 확인하면 됩니다.
| $ lsmod Module Size Used by Not tainted parport_pc 19204 1 (autoclean) lp 9188 0 (autoclean) parport 39072 1 (autoclean) [parport_pc lp] nfs 84600 1 (autoclean) lockd 59536 1 (autoclean) [nfs] sunrpc 87516 1 (autoclean) [nfs lockd] e1000 50924 1 e100 62340 1 keybdev 2976 0 (unused) mousedev 5656 1 hid 22308 0 (unused) input 6208 0 [keybdev mousedev hid] usb-uhci 27404 0 (unused) usbcore 82592 1 [hid usb-uhci] ext3 73376 4 jbd 56336 4 [ext3] aic79xx 142084 1 sd_mod 13452 2 scsi_mod 110488 2 [aic79xx sd_mod] |
현재 네트웍 드라이버 모듈로 e100과 e1000이 둘다 올라 가 있는 것을 확인 할 수 있습니다. 이젠 정상적으로 네트웍 모듈이 올라가 있고 IP, GW, Netmask, DNS등이 정상적으로 설정되어 있을 경우 네트웍은 별 이상 없이 될겁니다.
지금부턴 네트웍 설정을 확인해보겠습니다. 네트웍 설정은 /etc/sysconfig 디렉토리 내부에 설정 파일들이 존재합니다.
| $ ls /etc/sysconfig/network-scripts/ 합계 184 4 darketh1 4 ifdown-ipv6* 4 ifup-cipcb* 4 ifup-ppp* 4 ifcfg-eth0 0 ifdown-isdn@ 12 ifup-ippp* 4 ifup-routes* 4 ifcfg-eth1 4 ifdown-post* 12 ifup-ipv6* 4 ifup-sit* 0 ifcfg-lo@ 4 ifdown-ppp* 4 ifup-ipx* 4 ifup-sl* 0 ifdown@ 4 ifdown-sit* 0 ifup-isdn@ 4 ifup-wireless* 4 ifdown-aliases* 4 ifdown-sl* 4 ifup-plip* 8 init.ipv6-global* 4 ifdown-cipcb* 0 ifup@ 4 ifup-plusb* 8 network-functions 4 ifdown-ippp* 16 ifup-aliases* 4 ifup-post* 44 network-functions-ipv6 |
설정 내용을 보고 간단히 짚어 보겠습니다. 먼저 default gateway 및 dns 설정을 보겠습니다. Gateway는 /etc/sysconfig/network라는 파일에 설정되어있습니다.
| $ cd /etc/sysconfig/ $ cat network NETWORKING=yes HOSTNAME=sniffer GATEWAY=xxx.xxx.xxx.xxx |
위 설정 내용을 보면 hostname을 sniffer, default gateway를 xxx.xxx.xxx.xxx번으로 설정했습니다. 물론 ifconfig 명령을 통해 ip, gw, netmask등을 쉽게 설정할 수 있지만 여기에선 제가 주로 하는 설정파일 변경을 통해 설정하는 것을 위주로 설명하겠습니다.
다음은 dns 설정입니다. dns 설정은 /etc/resolve.conf 파일에 있습니다.
| $ cat /etc/resolv.conf nameserver yyy.yyy.yyy.yyy nameserver xxx.xxx.xxx.xxx |
현재 두개의 dns 설정을 했습니다. yyy.yyy.yyy.yyy, xxx.xxx.xxx.xxx 이 둘을 dns로 시스템에 등록한 상태입니다.
다음으로 가장 중요하게 봐야할 IP, NETMASK설정을 보겠습니다. 이 설정 파일들은 /etc/sysconfig/network-scripts 디렉토리 내에 있습니다. eth0의 설정은 ifconfig-eth0이고, eth1의 설정은 ifconfig-eth1에 있습니다. 다음은 eth0의 설정을 보도록 하겠습니다.
| $ cat ifcfg-eth0 DEVICE=eth0 BOOTPROTO=static BROADCAST=xxx.xxx.xxx.255 IPADDR=xxx.xxx.xxx.xxx NETMASK=255.255.255.128 NETWORK=xxx.xxx.xxx.128 ONBOOT=yes |
각 필드를 설명하면 다음과 같습니다.
| DEVICE=eth0 : 이설정은 eth0에 대한 설정이란 말입니다 BOOTPROTO=static : 이 말은 부팅시 정적으로 할당받은 아이피를 사용한다는 말입니다. DHCP를 사용할 경우 DHCP로 설정할 수 있습니다. BROADCAST=xxx.xxx.xxx.255 : 그 네트웍에서 broadcasting시 쓰는 아이피입니다. IPADDR=xxx.xxx.xxx.xxx : eth0 카드의 ip address입니다. NETMASK=255.255.255.128 : eth0 카드의 network mask입니다. NETWORK=xxx.xxx.xxx.128 : 그 네트웍에서 네트웍 설정입니다. 이는 대게 앞 세자리는 아이피와 동일하고 마지막 필드는 netmask의 마지막 필드와 동일합니다. ONBOOT=yes : 부팅시 네트웍 모듈을 올린다는 설정입니다. |
eth1의 설정 내용입니다.
| $ cat ifcfg-eth1 DEVICE=eth1 BOOTPROTO=static BROADCAST=10.1.1.255 IPADDR=10.1.1.1 NETMASK=255.255.255.0 NETWORK=10.1.1.0 ONBOOT=yes |
이렇게 설정이 다 되었을 경우 설정을 반영하기 위해서는 네트웍을 내렸다가 올려야 합니다. 가장간단한 방법으로 /etc/sysconfig/network-scripts/디렉토리 내에 있는 ifup과 ifdown 스크립트를 이용하는 것입니다.
eth0 네트웍을 내릴 경우 : ./ifdown eth0
eth0 네트웍을 올릴 경우 : ./ifup eth0
모든 설정이 끝난 후 네트웍 카드의 설정을 ifconfig –a로 확인합니다.
eth0에 위에서 설정한 대로 아이피와 netmaks, broadcast 등의 설정을 확인 할 수 있습니다.
| $ ifconfig -a eth0 Link encap:Ethernet HWaddr XX:XX:XX:XX:XX:XX inet addr:xxx.xxx.xxx.xxx Bcast:xxx.xxx.xxx.255 Mask:255.255.255.128 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:1354744815 errors:0 dropped:0 overruns:1353 frame:0 TX packets:996350230 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 RX bytes:4027093106 (3840.5 Mb) TX bytes:1960627340 (1869.7 Mb) Interrupt:20 Base address:0x1400 Memory:fe7e0000-fe7e0038 eth1 Link encap:Ethernet HWaddr XX:XX:XX:XX:XX:YY inet addr:10.1.1.1 Bcast:10.1.1.255 Mask:255.255.255.0 UP BROADCAST MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 RX bytes:0 (0.0 b) TX bytes:0 (0.0 b) Interrupt:21 Base address:0x1440 Memory:fe760000-fe780000 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:10193680 errors:0 dropped:0 overruns:0 frame:0 TX packets:10193680 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:1728195772 (1648.1 Mb) TX bytes:1728195772 (1648.1 Mb) |
eth1 의 경우 네트웍 설정이 10.1.1.1로 되어있는데 이는 예전에 다른 머신과 1:1 크로스로 연결되있던 거라 아무 아이피나 설정한 것입니다. 외부 네트웍을 쓰기위해서는 특정 ISP에서 할당된 공인 아이피를 써야 합니다. 물론 방화벽 내부에서는 내부 아이피를 따로 설정해서 쓸 수 있습니다.
이로써 기본적인 네트웍 드라이버 설정 및 네트웍 설정을 알아 봤습니다. ifconfig 에 대한 자세한 내용은 man page를 통해 알 수 있습니다.
네트워크 드라이버 컴파일
이번 섹션에서는 설치 디스크에 존재하지 않는 드라이버를 웹사이트로부터 다운 받아서 설치하는 과정을 알아 보겠습니다
카드확인
대상 네트웍 카드는 다음과 같습니다. 이를 확인하는 명령어는 앞 섹션에서 처럼 lspci를 통해서 확인할 수 있습니다.
Broadcom Corporation NetXtreme BCM5704 Gigabit Ethernet
드라이버 다운로드
이 네트웍 카드는 BroadCom 웹사이트(http://www.broadcom.com)에서 드라이버를 찾을 수 있습니다.
드라이버는 bcm5700이란 이름을 가지고 다음 url에서 다운 받을 수 있습니다.
드라이버 URL : http://www.broadcom.com/support/ethernet_nic/downloaddrivers.php
드라이버를 다운 받으면 linux-8.2.18.zip이 파일이 생성됩니다. 압축을 풀면 다음의 파일들이 생성됩니다.
| ./linux-8.2.18/Server/Linux/Driver/bcm5700-8.2.18.tar.gz ./linux-8.2.18/Server/Linux/Driver/bcm_sup-8.2.18.tar.gz ./linux-8.2.18/Server/Linux/Driver/bcm5700-8.2.18-1.src.rpm ./linux-8.2.18/Server/Linux/Driver/DISTRIB.TXT ./linux-8.2.18/Server/Linux/Driver/README.TXT |
실제로 드라이버를 설치하는 과정은 README.TXT에 자세하게 나와있습니다.
설치
먼저 rpm 소스 파일을 설치 합니다. Root 계정으로 설치가 가능합니다.
| $ rpm -Uvh bcm5700-8.2.18-1.src.rpm 1:bcm5700 ########################################### [100%] |
루트 권한으로 그림처러 설치를 합니다. Rpm 소스파일들의 기본 설치 디렉토리는 /usr/src/redhat 입니다. 그 디렉토리로 이동합니다.
그리고 드라이버를 빌드 합니다. 이때 기본적으로 gcc등 개발 관련 유틸리티들이 설치 되어 있어야 합니다. (설치확인 : rpm –qa | grep gcc)
| $ rpmbuild -bb SPECS/bcm5700.spec Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.42561 + umask 022 + cd /usr/src/redhat/BUILD + LANG=C + export LANG + cd /usr/src/redhat/BUILD + rm -rf bcm5700-8.2.18 + /bin/mkdir -p bcm5700-8.2.18 + cd bcm5700-8.2.18 /usr/src/redhat/BUILD/bcm5700-8.2.18 + /usr/bin/gzip -dc /usr/src/redhat/SOURCES/bcm5700-8.2.18.tgz + tar -xvvf - -rw-r--r-- root/root 1935 2005-08-02 02:33:05 5701rls.c -rw-r--r-- root/root 7954 2005-08-02 02:33:05 5701rls.h -rw-r--r-- root/root 14209 2005-08-02 02:33:05 autoneg.c -rw-r--r-- root/root 14308 2005-08-02 02:33:05 autoneg.h -rw-r--r-- root/root 26702 2005-08-02 02:33:05 b57diag.c -rw-r--r-- root/root 16625 2005-08-02 08:27:20 b57proc.c -rw-r--r-- root/root 150197 2005-08-02 09:22:09 b57um.c -rw-r--r-- root/root 151409 2005-08-02 02:33:05 b57um.org.c -rw-r--r-- root/root 2486 2005-08-02 02:33:05 bits.h -rw-r--r-- root/root 13411 2005-08-02 02:33:05 fw_lso05.h -rw-r--r-- root/root 24994 2005-08-02 02:33:05 fw_stkoffld.h -rw-r--r-- root/root 19860 2005-08-02 02:33:05 lm.h -rw-r--r-- root/root 15567 2005-08-02 02:33:05 mm.h |
빌드는 rpmbuild 명령을 통해서 할 수 있습니다. 이 명령이 성공적으로 끝나면 RPMS/i386/bcm5700-<version>.i386.rpm 파일이 생성 됩니다. 이 파일을 설치합니다.
| $ rpm –Uvh RPMS/i386/bcm5700-<version>.i386.rpm |
이 과정을 통해 설치가 끝나게 되면 드라이버가 생성됩니다.
| 2.4.X 커널 /lib/modules/<kernel_version>/kernel/drivers/net/bcm5700.o 2.6.X 커널 /lib/modules/<kernel_version>/kernel/drivers/net/bcm/bcm5700.ko |
생성을 확인 한 후 드라이버를 시스템에 등록합니다.
| $ modprobe bcm5700 |
위 모든 과정을 성공적으로 마칠 경우 2.1섹션에서의 설정과정을 통해 네트웍 드라이버를 커널에 올릴 수 있습니다.
"System / UNIX" 분류의 다른 글
| Linux - Telnet 서비스 비활성및 실행 (0) | 2012/01/10 |
| Unix - 대량 파일 이동, 삭제시 Argument list too long (0) | 2011/12/26 |
| Unix - unix, Contos 용 파일질라 (0) | 2011/10/27 |
| Solaris - TCP 접속자 정보(IP, Port) 로그 남기기 (0) | 2011/10/17 |
| Solaris - 텔넷(telnet) 데몬에 심각한 취약점 (0) | 2011/10/17 |
| Solaris8 - SSH 설치 (0) | 2011/10/17 |
| Unix - Sendmail 보내고 받는 메일 용량 제한 (0) | 2011/10/04 |
| Unix - 깨진 파일명을 가진 파일 검색및 삭제. (0) | 2011/07/14 |
| Linux - 영문, 한글 DNS 설정및 apache virtualhost 설정 (0) | 2010/06/23 |
| Unix - CRON실행(Solaris 9 or earlier versions, Solaris 10) (0) | 2010/05/07 |
Trackback URL : http://develop.sunshiny.co.kr/trackback/288