OS/Linux

Ubuntu, wpa_supplicant 빌드/컴파일 하기

TechNote.kr 2016. 12. 29. 01:46
728x90

 IEEE802.11, 즉 Wi-Fi를 linux 에서 공부하다보면 wpa_supplicant code를 보아야 하는 일이 자주 있다. 

 wpa_supplicant를 공부하기 위해서는 wpa_supplicant code에 로그를 넣어 보기도 하고 코드를 내용을 바꿔 보기도 하고 많은 시도를 해보아야 한다. 이를 위해서 기본 코드를 빌드하였을 때 정상적으로 동작하는 상태를 확보해야만 한다. 

 이에따라 Ubuntu에서 wpa_supplicant를 기본 code상태로 빌드하여 동작을 확인하고자 한다. 


Ubuntu 14.04.5 LTS
wpa_supplicant v2.1


겪었던 시행 착오를 모두 기술하였기에 다소 양이 방대할 수 있다. 핵심적으로 필요한 부분만 확인하고자 한다면 이 글의 제일 마지막 Summary 부분을 확인하면 된다. 기본적으로 root 권한이 필요하다.


step 1. 먼저 현재 ubuntu 에 설치된 wpa_supplicant 기준의 source code를 다운로드 받는다.

# apt-get source wpasupplicant

-. Ubuntu 에서 patch한 코드까지 자동으로 적용된다. 

아래와 같이 명령어를 실행한 디렉토리 바로 밑에 wpa-2.1 디렉토리가 생성된 것을 확인할 수 있다.


step 2. wpa-2.1/wpa_supplicant 에 진입해서 code build를 위해 make를 실행한다.

# cd wpa-2.1/wpa_supplicant
# make

-. 다운로드한 wpa-2.1 은 hostapd와 wpa_supplicant를 모두 빌드할 수 있는 source code이기 때문에 wpa_supplicant를 위한 디렉토리인 wpa-2.1/wpa_supplicant 로 이동해야 한다.

 하지만 make 수행 결과 error가 발생한다. 왜냐하면 wpa_supplicant 의 빌드를 위한 CONFIG 정보가 없기 때문이다. 사실 이 부분이 제일 난감한 부분이다. kernel 처럼 kernel의 .config를 가져올 수 있으면 좋은데 해당 정보를 알수가 없었다. 그래서 우선은 기본 설정인 defconfig를 적용해 빌드하고 나중에 추가하면서 최대한 config를 맞춰 보았다. 


step 3. defconfig를 .config로 복사한 후 다시 make를 한다.

# cp defconfig .config

 하지만 아래와 같이 openssl/ssl.h 파일을 찾을 수 없다는 error가 발생한다. libssh-dev package를 설치해 주어야 한다.


step 4. libssl-dev package를 설치한 후 다시 make를 한다.

# apt-get install libssl-dev

 하지만 이번엔 아래와 같이 netlink/genl/genl.h 파일을 찾을 수 없다는 에러가 발생한다. libnl-3-dev package를 설치하고 .config 파일을 수정해 주어야 한다.


step 4. libnl-3-dev package를 설치하고, .config 설정을 수정한 후 다시 make를 한다.

# apt-get install libnl-3-dev
# vi .config
# make

.config 설정 파일을 열어서 CONFIG_LIBNL32=y 의 주석을 풀어주고 CFLAGS += -I/usr/include/libnl3 을 추가해준다.

하지만 make를 하게 되면 아래와 같이 nl-genl-3 library를 찾을 수 없다는 error가 발생한다. libnl-genl-3-dev package를 설치해야 한다.


step 5. libnl-genl-3-dev package를 설치하고 다시 make를 한다.

# apt-get install libnl-genl-3-dev
# make

이번에는 성공적으로 make가 완료된다.

"ls"를 해보면 아래와 같이 wpa_supplicant 가 생성되어 있는 것을 확인할 수 있다.


step 6. 이제 생성된 wpa_supplicant를 기존 wpa_supplicant 와 교체해보자

-. 기존 wpa_supplicant 는 /sbin/에 존재하고 있다. 혹시 모를 상황에 대비하여 기존 wpa_supplicant 는 wpa_supplicant.bk로 복사해 놓고 새로 빌드된 wpa_supplicant로 replace하였다. 

# cd /sbin/
# cp wpa_supplicant wpa_supplicant.bk
# cp ~/wpa-2.1/wpa_supplicant/wpa_supplicant /sbin/

 내장 Wi-Fi 가 아니라면 wpa_supplicant 를 교체하는데 문제가 없었겠지만 혹시라도 내장 Wi-Fi 가 동작하고 있던 상황이라면 해당 파일 사용 중이라 교체에 실패하였을 것이다. 이 때는 network-manager를 stop하고 나서 wpa_supplicant 파일을 교체한 후 다시 network-manager를 구동시켜 주어야 한다.

# service network-manager stop
and replace wpa_supplicant
# service network-manager start

이제 무선 Wi-Fi Lan card를 꼽아 Wi-Fi 동작을 확인해 보았다. 

아래와 같이 wpa_supplicant 가 timeout이 발생한다.

Failed to activate service 'fi.w1.wpa_supplicant1': timed out

이번에는 .config에 몇가지 CONFIG를 추가해주어야 한다.


step 7. .config에 몇몇 CONFIG를 새롭게 추가하고 다시 make를 한다.

[mandatory]

CONFIG_CTRL_IFACE_DBUS_NEW=y
CONFIG_CTRL_IFACE_DBUS_INTRO=y

[optional]

CONFIG_DRIVER_NONE=y
CONFIG_DEBUG_FILE=y
CONFIG_DEBUG_SYSLOG=y

 wpa_supplicant가 구동되지 않는 근본적인 문제는 wpa_supplicant를 구동하는 network-manager와의 Interface 때문에 발생한다. dbus를 interface로 사용하지만 wpa_supplicant 안의 .config 에는 해당 Feature가 기본적으로 선언되어 있지 않다. 따라서 위에 mandatory라고 해놓은 CONFIG를 추가해야만 한다. optional로 추가한 CONFIG들은 기존 ubuntu에 설치되어 있던 wpa_supplicant의 option들을 동일하게 지원하기 위해 추가한 것으로 위 에러와는 큰 관련은 없다. 

"make"를 하게되면 이번에는 dbus/dbus.h 파일이 없다는 에러가 발생한다. libdbus-1-dev package를 설치해야 한다.


step 8. libdbus-1-dev package를 설치한 후 다시 make를 한다.

# apt-get install libdbus-1-dev

아래와 같이 정상적으로 build가 완성된다.


step 9. step 6에서와 같이 wpa_supplicant를 교체한다.


step 10. Wi-Fi를 구동하면 아래와 같이 정상적으로 동작함을 확인할 수 있다.

-. 이제 빌드가 확인된 source code가 확보되었으니, 여러가지 원하는 코드 수정을 해볼 수 있다. 


Summary (root 권한 필요)

1. 빌드시 필요한 package의 설치 

# apt-get install libssl-dev libnl-3-dev libnl-genl-3-dev libdbus-1-dev


2. wpa_supplicant의 Source code 다운로드

# apt-get source wpasupplicant


3. wpa_supplicant build config의 생성 및 CONFIG 추가 그리고 빌드

# cd wpa-2.1/wpa_supplicant
# cp defconfig .config
# vi .config

[아래 CONFIG를 .config에 추가]

CONFIG_LIBNL32=y
CFLAGS += -I/usr/include/libnl3

CONFIG_CTRL_IFACE_DBUS_NEW=y
CONFIG_CTRL_IFACE_DBUS_INTRO=y
CONFIG_DRIVER_NONE=y
CONFIG_DEBUG_FILE=y
CONFIG_DEBUG_SYSLOG=y

# make


4. build 후 생성된 wpa_supplicant 실행 파일을 적용 (기존 wpa_supplicant 는 backup)

# service network-manager stop
# cp /sbin/wpa_supplicant /sbin/wpa_supplicant.bk
# cp ~/wpa-2.1/wpa_supplicant/wpa_supplicant /sbin/
# service network-manager start

728x90