ipTIME N100UM은 리눅스를 위한 깔끔한 드라이버를 지원하기 때문에 설정방법은 간단하다. 해당 칩셋의 최신 소스코드는 ipTime 공식홈페이지의 다운로드 게시판에서 받을 수 있다. 내가 사용한 ip TIME N100UM을 드라이버는 여기에 올리겠다.
만약 첫번째 것이 컴파일 중 net_device 구조체에 priv라는 멤버가 없다는 에러가 난다면 두번째 것을 받아서 해보시라. 2009년 5월에 릴리즈된 커널 2.6.29부터 그 멤버는 제거됐다. 그러니까 커널 2.6.29 이상을 쓴다면 두번째 걸 받고, 아니라면 첫번째 걸 받으면 된다.
만약 두번째 것을 가지고 드라이버 모듈을 사용하는데 문제가 발생한다면 Section 5. v2.3.0.2 사용하기를 참고하시길 바란다.
문서 버전
2010/8/20 버전(현재)
- 새 드라이버 파일 첨부와 설명(section 5)
-iwpriv를 이용한 설정법을 추가함
-전체적인 문맥 교정
-초벌
무선랜카드를 꽂고나서 lsusb 명령을 내려보자.
(...생략...)
Bus 001 Device 003: ID 148f:3070 Ralink Technology, Corp.
(...생략...)
저기 보이는게 ipTIME N100UM에 대한 정보이다. idVendor는 148f고 idProduct는 3070이다. 이 무선랜카드는 Ralink Technology 칩셋을 사용한다는 정보를 알 수 있다. 이제 이 정보를 바탕으로 grep을 이용해 커널 소스를 검색해보면 이 무선랜카드를 지원하는 장치 드라이버의 이름이 뭔지 알 수 있는 단서가 발견된다.
이 명령으로 많은 결과물이 나오는데, 그 중에서 net/wireless/rt2x00/rt2800usb.c에 적당한 내용이 들어있다는 걸 파악할 수 있다.
net/wireless/rt2x00/rt2800usb.c 내용 중
* rt2800usb module information.
*/
static struct usb_device_id rt2800usb_device_table[] = {
(... 중략...)
{ USB_DEVICE(0x148f, 0x2070), USB_DEVICE_DATA(&rt2800usb_ops) },
{ USB_DEVICE(0x148f, 0x2770), USB_DEVICE_DATA(&rt2800usb_ops) },
{ USB_DEVICE(0x148f, 0x2870), USB_DEVICE_DATA(&rt2800usb_ops) },
{ USB_DEVICE(0x148f, 0x3070), USB_DEVICE_DATA(&rt2800usb_ops) },
{ USB_DEVICE(0x148f, 0x3071), USB_DEVICE_DATA(&rt2800usb_ops) },
{ USB_DEVICE(0x148f, 0x3072), USB_DEVICE_DATA(&rt2800usb_ops) },
{ USB_DEVICE(0x148f, 0x3572), USB_DEVICE_DATA(&rt2800usb_ops) },
/* Samsung */
{ USB_DEVICE(0x04e8, 0x2018),
... 이하 생략...
위 결과는 rt2800usb이 지원하는 장치의 종류를 적어놓은 테이블이다(이 테이블로써 장치드라이버는 커널에게 자신이 지원하는 디바이스가 무엇무엇이 있다고 알려주는 역할을 한다. 즉 0x148f, 0x3070 이라는 장치도 지원한다고 써있는 셈이다).
리눅스 주류 커널도 이 무선랜카드의 장치 드라이버를 지원한다고 하니, 이제 우리가 ipTIME N100UM을 사용하는 방법은 크게 두가지가 됐다. 하나는 리눅스 커널에서 제공하는 장치드라이버를 사용하는 것이고, 다른 하나는 Ralink Technologies에서 제공한 장치드라이버를 사용하는 방법이다.
그러나 이 문서에서는 두번째 방법에 대해서만 설명하겠다. 왜냐하면 제품을 만든 회사에서 나온 드라이버는 리눅스 커널이 제공하는 드라이버가 미처 가지고 못한 feature들을 모두 제공하기 때문이다. 아무리 리눅스 커널 장치드라이버가 재능있는 사람의 자발적 참여에 의해 만들어졌다 한들, 그 장치를 직접 만든 사람이 만든 드라이버 보다는 부족할 것이다.
Section 2. 설치와 사용
1절에서 조금 쓸모 없는 얘기를 한 것 같은데 이제 각설하고 본론만 말하겠다. ;^)
장치드라이버 소스파일 압축을 풀고 컴파일 한다. ./configure가 없기 때문에 사용자 설정을 위해서는 Makefile을 직접 수정해야 한다. Makefile에 수정할 만한 사항은 컴파일러의 경로 설정이나 컴파일 옵션 그리고 wpa_supplicant를 사용할지 결정하는 일이랑 wext function을 사용할지 결정하는 일 정도다. 그러나 자신이 언젠가 리눅스를 마음대로 뜯어 고친 적이 없다면 그대로 컴파일해도 탈없으니 그냥 컴파일해도 된다.
$ cd 2009_0424_RT3070_Linux_STA_v2.1.0.0
$ make
마지막에 잔에러가 나지만 전혀 신경쓰지 않아도 된다.
루트권한으로 /etc/Wireless/RT2870STA 디렉터리를 만들고 RT2870STA.dat 설정파일을 옮긴다.
# mkdir -p /etc/Wireless/RT2870STA/
# cp RT2870STA.dat /etc/Wireless/RT2870STA/
2009_0424_RT3070_Linux_STA_v2.1.0.0/include/os/rt_linux.h 헤더파일에
#define STA_PROFILE_PATH "/etc/Wireless/RT2870STA/RT2870STA.dat"
이렇게 경로가 하드코딩되어있는 걸 보았다. 흠. 근데 이렇게 하드코딩된 걸 보니 뭔가 고치기가 껄끄러워서 그냥 두었다.
/etc/Wireless/RT2870STA/RT2870STA.dat을 자신의 액세스포인트에 맞게 설정한다. 내 무선환경은 인증방법은 WPAPSK이고 암호화방법은 TKIP이다. 이 방식은 WPA pre-shared key가 필요하기 때문에 WPAPSK도 올바르게 써줬다.
AuthMode=WPAPSK
EncryptType=TKIP
WPAPSK=some secure pass
아까 컴파일 시 생성된 리눅스 커널 모듈을 적재한다.
모듈이 적재되면 비로소 ra0 인터페이스가 나타난다.
그전까지는 그저 정체불명의 디바이스일 뿐이었으나 모듈이 적재된 후부터 비로소 네트워크 카드 구실을 하게 된 것이다.
# iwconfig 명령으로도 ra0인터페이스가 보일 것이다.
이제 네트워크 설정만 하면 끝난다. 이제부턴 eth0 인터페이스를 다룰 때 했던 것처럼 하면된다. ra0나 eth0나 그냥 인터페이스일 뿐이다. 그 둘의 하드웨어 차이는 운영체제나 고민할 문제다.
자신의 무선 네트워크 환경이 동적 아이피를 사용한다면 dhcpcd 명령으로 ip를 할당받는다.
정적 아이피를 사용한다면 ifconfig 로 정해진 아이피를 할당시키고 route명령으로 라우팅 설정을 해준다.
# route add default gw 192.168.0.1
이제 인터넷을 쓸 수 있다.
Section 3. 부팅 시 ra0 자동 설정하기
SLAX가 부팅할 때마다 자동으로 무선 네트워크가 되게 설정하는 것은 간단하다.
a. 아까 생성한 리눅스 커널 모듈을 현재 자신의 시스템의 커널이 사용하는 모듈이 있는 디렉터리로 옮긴다. 리눅스 커널 모듈은 리눅스 커널 버전에 따라 다른 디렉터리에 있다. 만약 현재 커널말고 다른 커널로 재부팅할 거면 $(uname -r) 부분 대신 재부팅할 커널의 버전을 써야 한다.
b. depmod -A 를 해도 되지만 부팅 시에 depmod -A 를 하는 부분이 있으므로 굳이 안 해줘도 무방하다. depmod 명령으로 모든 모듈간의 의존성을 정의한 파일이 재생성된다. 이제 modprobe로써 insmod 명령어보다 편리하게 모듈을 적재/제거 할 수 있다.
c. /etc/rc.d/rc.modules를 수정해서 부팅시 rt3070sta를 적재한다(꼭 이 파일 안에 넣을 필요는 없지만 네트워크 인터페이스를 검색하는 스크립트보다는 앞서야 하기 때문에 rc.local 같은 후발주자에 넣으면 안 되고, rc.S 스크립트가 호출하는 스크립트 안에 들어가야 한다.
/etc/rc.d/rc.modules 스크립트 맨 뒤에 다음을 추가한다:
섹션2에서도 말했듯이, 모듈을 로드해야 인터페이스가 생긴다. 모듈을 로드하기 전까진 무선랜카드는 한낱 정체불명의 디바이스에 불과하다(김춘수의 꽃). 참고로, eth0같은 다른 인터페이스들은 슬랙스의 라이브스크립트에서 이미 modprobe를 했기 때문에 존재하는 것이다(궁금하면 initrd.gz 을 열고 마운트해서 liblinuxlive 스크립트를 뒤져보라. 랜카드 리눅스커널모듈을 로드하는 함수가 있다).
참고로, 네트워크 인터페이스는 ifconfig -a 명령이나 cat /proc/net/dev 로도 보이고 ls /sys/class/net으로도 보인다.
아무튼 모듈이 올라가서 정상적인 디바이스 제어를 시작하면 N100UM의 설계 대로 평상시에는 LED가 꺼져있게 된다. 종종 리눅스 커널이 제공하는 장치 드라이버를 쓰면 쓸데없이 USB메모리 같은 장치의 LED가 계속 켜져있는 걸 볼 수 있는데, 그건 그 장치드라이버가 해당 장치의 특성을 100퍼센트 알지 못하기 때문이다.
d. /etc/rc.d/rc.inet1 을 수정한다.
다른 인터페이스는 네트워크 설정이 필요 없으니까 42번째 줄을 다음과 같이 수정한다.
이렇게 하면 부팅시 dhcpcd를 이용해 ra0인터페이스에 ip를 할당한다.
Section 3까지 따라해서 문제 없이 쓰시는 분들은 이 절을 읽을 필요가 없다.
우선 2절에서 했던 얘기를 다시 한번 정리해보겠다. 무선랜 사용하기 위한 설치 과정은 요약하면 다음과 같다.
눈여겨 볼 만한 수정 사항은 하나뿐이다.
wpa_supplicant를 사용할 경우 wext function을 쓸지 결정(디폴트는 n)
2. make명령으로 컴파일
3. RT2870STA.dat 을 /etc/Wireless/RT2870STA/ 디렉터리로 옮김
4. RT2870STA.dat 을 수정함 (SSID, AuthMode, EncrypType, WPAPSK 정도만 수정해도 됨)
5. rt3070sta.o 리눅스커널모듈 로드
6. ifconfig와 route 또는 dhcpcd 를 사용해 네트워크 설정
이제 이번 섹션에서 다루고자 할 내용은 4번 과정의 대안이다 (dogot이라는 아이디를 사용하시는 분께서 좋은 질문을 해 주셨다).
RT2870STA.dat 이라는 설정파일을 이용해서 rt3070sta 리눅스커널모듈에 파라미터를 제공하는 방법은 네트워크 환경이 변하지 않는 곳에서는 유용하다. 그러나 노트북을 집에서도 쓰고 학교 또는 회사에서 사용해야 한다면, 장소에 따라서 당연히 설정값을 바꿔줘야 한다.
SSID=
AuthMode=
EncrypType=
WPAPSK=
iwconfig ra0결과
Mode:Auto Frequency=2.412 GHz
Link Quality=10/100 Signal level:0 dBm Noise level:-143 dBm
Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0
Tx excessive retries:0 Invalid misc:0 Missed beacon:0
ifconfig ra0 결과
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:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
ifconfig 결과
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:2 errors:0 dropped:0 overruns:0 frame:0
TX packets:2 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:100 (100.0 B) TX bytes:100 (100.0 B)
죽도 밥도 안 된 상태다. 일단 무선랜 인터페이스를 업시킨다.
그리고 무선 네트워크를 탐색한다
적절한 무선 네트워크를 골라서 거기에 나온 값을 보고 설정한다. 내 경우는 섹션2에서 설정했던 대로 하면 다음과 같다.
# iwpriv ra0 set EncrypType=TKIP
# iwpriv ra0 set SSID="someSSID"
# iwpriv ra0 set WPAPSK="some secure pass"
이렇게 하면 결론적으로 RT2870STA.dat 설정파일로써 rt3070sta 리눅스커널모듈 로드시 파라미터를 넘긴 것과 동일한 설정을 준 것이다. 그리고 마지막으로 ifconfig나 dhcpcd로써 네트워크 설정을 해주면 인터넷을 사용할 수 있다.
# route add default gw 192.168.0.1
회사에 가서도 똑같이 하면된다. 무선 네트워크를 검색해서 거기에 나온 설정 값들을 적어주면 된다. 위에 설명한 일련의 명령어들을 집용, 회사용, 학교용 이런식으로 따로따로 스크립트를 만들어두고 사용하면 편할 것이다.
예를 들어 집용 스크립트는
ifconfig ra0 up
iwpriv ra0 set AuthMode=WPAPSK
iwpriv ra0 set EncrypType=TKIP
iwpriv ra0 set SSID="someSSID"
iwpriv ra0 set WPAPSK="some secure pass"
dhcpcd -t 60 ra0
회사용 스크립트는
ifconfig ra0 up
iwpriv ra0 set AuthMode=OPEN
iwpriv ra0 set EncrypType=NONE
iwpriv ra0 set SSID="corpSSID"
dhcpcd -t 60 ra0
또 다른 예로 인증방법은 OPEN이고 암호화는 WEP 일 때
ifconfig ra0 up
iwconfig ra0 key s:12345
iwpriv ra0 set SSID="my wlan"
iwpriv ra0 set AuthMode="OPEN"
iwpriv ra0 set EncrypType="WEP"
dhcpcd -HD ra0
노트북을 매일 여기저기 가지고 다니면서 사용한다면 매번 올바른 스크립트를 직접 실행시키기 조차 번거로울 수 있다. 앞의 스크립트를 보다 자동화하면 이렇다. 이 내용을 rc.local 같은 start-up 스크립트에 넣으면 된다.
scanning() {
local SCAN=`iwlist ra0 ap|awk 'NR>1{print $1}'`
local i;
local j;
for i in $SCAN; do
for j in $AP; do
if [ "$i" == "$j" ]; then
WAP=$i
break 2
fi
done
done
if [ -n "$WAP" ]; then
return 0
else
return 1
fi
}
ifconfig ra0 up
AP="70:28:01:0E:9B:58 91:27:30:E9:10:7C 54:68:E8:C0:94:1D"
while ! scanning; do
sleep 0.7;
done
case $WAP in
"70:28:01:0E:9B:58")
iwpriv ra0 set NetworkType=Infra
iwpriv ra0 set AuthMode=OPEN
iwpriv ra0 set EncrypType=NONE
iwpriv ra0 set SSID="mygate"
;;
"91:27:30:E9:10:7C")
iwconfig ra0 key s:12345
iwpriv ra0 set SSID="my wlan"
iwpriv ra0 set AuthMode="OPEN"
iwpriv ra0 set EncrypType="WEP"
;;
"54:68:E8:C0:94:1D")
iwpriv ra0 set AuthMode=WPAPSK
iwpriv ra0 set EncrypType=TKIP
iwpriv ra0 set SSID="someSSID"
iwpriv ra0 set WPAPSK="some secure pass"
;;
*)
echo "Error: Not Found WAP" >&2
exit 1
dhcpcd ra0
$ iwlist ra0 ap 명령으로 주변 AP 들의 MAC 주소를 얻어온다. 그걸 보고 현재 노트북이 어느 장소에 놓여있는지 알 수 있고 어떤 설정 값을 가져야하는지 알 수 있다. scanning 이라는 함수를 만들고 while 문을 돌린 건 iwlist ra0 ap 명령이 부팅한지 얼마 안 됐을 땐 WAP 목록을 제대로 반환하지 못하기 때문이다. 부팅 후 약간 시간이 흘러야 모든 WAP 목록을 보여준다.
ap 명령은 obsolete 라서 지원을 하지 않는 드라이버도 많다고 하는데 다행히 우리가 사용하는 드라이버는 지원한다. scan 명령을 써도 되긴하지만 ap 명령보다 시간이 많이 소요되므로 이 스크립트에 넣기는 좋지 않다. 참고로 iwlist의 두번째 인자인 명령들은 짧게 쓸 수 있다. scanning 대신 scan, sca, sc, s까지 줄여서 쓸 수 있고 frequency는 f까지, keys는 k 등 모든 명령이 다른 명령과 구분이 가능한 최소 수준까지 줄여서 쓸 수 있다. 그래서 peers 랑 power 는 pe, po 까지만 줄여쓸 수 있다. 좋은 알고리즘이다 :D
두번째 첨부파일을 이용하는 데 어려움이 있으신 분들만 이 섹션을 읽어도 좋다.
이 섹션을 읽고 있는 분들은 아마 두번째 첨부파일을 이용하여 make 를 이용한 컴파일 과정에는 문제가 없었을 것이다. 그러나 insmod 나 modprobe 를 이용해 모듈을 적재할 때 문제가 발생했을 것이다. 방금 내 말이 틀렸다면 이 섹션은 더 이상 읽을 필요가 없다.
모듈 적재 시도 중에 나오는 에러에 따른 해결방법은 이렇다.
inserting 'rt3070sta.ko': -1 invalid module format
☞ 이 때는 현재 작동 중인 커널이 /usr/src/linux 에 있는 커널 트리로부터 빌드된 게 아니라서 그럴 수 있다. 벌써 몇 년 된 얘기지만 커널 2.6 대에 들어서 단지 커널 소스나 헤더만 가지고 모듈을 제대로 빌드할 수 없다. 현재 작동 중인 커널을 잉태한 커널 트리가 필요하다. 즉 현재의 커널을 빌드한 과정물들과 결과물들이 있어야 한다는 얘기다.
커널 컴파일을 위해 configuration 하는 것이 두렵다면 지금 문제 없이 쓰고있는 커널의 설정을 그대로 따라서 빌드해도 된다. 다만 매우 거대한 커널 이미지가 될 것이고 수천개의 모듈을 빌드해야 할 것이다. 많은 배포판들이 CONFIG_IKCONFIG_PROC=y 로 설정된 커널을 탑재할 것이므로 /proc/config.gz 파일을 볼 수 있을 것이다. 이것을 그대로 써서 커널을 빌드하면 된다.
# zcat /proc/config.gz > /usr/src/linux/.config
# make && make modules_install
커스터마이즈 하지 않고 그대로 컴파일하면 한참 걸린다. 밥한끼 드시고 오시길.
그리고 나서 생성된 커널 이미지를 /boot 로 옮기고 적절히 부트로더 설정을 해주고 재부팅한다.
'rt3070sta.ko': -1 Unknown symbol in module
☞ 이 문제는 빌드한 모듈이 라이센스가 GPL이 아니기 때문에 발생한다. 자유소프트웨어는 자유소프트웨어 정신을 갖추지 않은 사람에게는 배타적이다. 그래서 GPL이 아닌 모듈은 커널의 일부 기능을 사용하는데 제한이 있다. 원래는 이렇게까지 막아놓진 않았는데 언제부터 이랬는지는 잘 모르겠다. 자유소프트웨어가 아닌 소프트웨어에 대한 단호한 대처이고 자유소프트웨어의 의지를 보여주는 것 같아 좋다. 아무튼 해결방법은 os/linux/usb_main_dev.c 를 에디터로 열고 MODULE_LICENSE("GPL"); 매크로를 적어주고 빌드하면 된다.
resource device busy
☞ 이건 이미 그 장치를 제어하는 같은 이름의 다른 모듈이 떠 있기 때문이다. 그러나 잘 작동하진 않기 때문에 기존 것은 내리고 지금 빌드한 것을 쓰도록 하자. lsmod 를 하면 아마 rt2870sta 가 적재돼 있을 것이다. 이걸 제거한다.
$ modprobe -r rt2870sta
$ modprobe -r rt2800usb
그리고 나서 빌드한 모듈을 적재하면 된다. 이 두 모듈이 필요 없다면 지워버리는 게 차라리 낫다.
$ rm `find /lib/modules/2.6.33.4/kernel/ -name rt2870sta.ko`
$ rm `find /lib/modules/2.6.33.4/kernel -name rt2800usb.ko`
$ depmod -A
마지막으로 모듈 의존성을 다시 정의한다.
적재가 잘 됐다면 ifconfig -a 시 ra0 인터페이스가 보일 것이다.
틀린 내용, 이상한 내용, 손발이 오그라드는 내용이 있다면 한 수 가르쳐 주세요 (__)
궁금한 사항이 있으면 문의하세요
nothingknow /at/ 네이버