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
'OS > Linux' 카테고리의 다른 글
Ubuntu - SSH Server 설치 및 접속하기 (0) | 2019.11.11 |
---|---|
하위 DNS 추가 및 Apache 가상 호스트 생성 (0) | 2019.03.18 |
screen, 자유롭고 안정적인 Linux session의 사용 (0) | 2017.01.21 |
Linux - iconv - 파일(File) 인코딩(Encoding) 변경 (0) | 2017.01.07 |
Linux/Ubuntu, Samba 설정하기. (0) | 2016.08.04 |
자기 자신 IP Address C 코드로 확인하기.(SIOCGIFADDR) (0) | 2016.07.27 |
Linux 접속 차단하기. (TCP Wrapper) (0) | 2016.07.22 |
Linux/Ubuntu, 용량 큰 파일/디렉토리 찾아내기. (0) | 2016.07.13 |