개요

Poky로 빌드된 Raspberry Pi 4의 이미지는 기본적으로 유선 이더넷 드라이버를 커널 빌트인 형태로 제공하지만, 와이파이 드라이버는 커널 모듈 형태로 제공한다. 하지만, 이미지를 빌드 후 rootfs를 살펴보면 와이파이 드라이버가 관련 디렉터리(/lib/modules/…/drivers/…)에 존재하지 않아 실질적으로 Raspberry Pi 4의 내장 와이파이를 유저가 사용하지 못하는 문제가 발생한다.

 

이를 해결하기 위해선 두가지 방법이 존재한다.

  1. 와이파이 드라이버/유틸리티가 빌트인으로 컴파일 될 수 있도록 커널 컴파일 옵션 조정
  2. 와이파이 드라이버/유틸리티가 모듈로 제공되도록 비트베이크 빌드 옵션 조정

 

위에서 1.의 방법은 커널 자체를 재컴파일해야 됨으로 오랜 시간이 걸린다. 하지만 1.과 다르게 2.의 방식은 기존에 컴파일되어 있는 드라이버와 유틸리티가 이미지의 rootfs에 포함될 수 있게끔만 하면 되기 때문에 비교적 빠르게 결과를 확인할 수 있다.

 

따라서, 본 페이지에서는 2.의 방법으로 Raspberry Pi 4의 내장 와이파이를 유저 영역에서 사용할 수 있게끔 관련 드라이버와 유틸리티를 모듈 형태로 이미지(rootfs)에 포함되게끔 하는 방법을 설명한다.

 

※ 본 페이지는 앞 7장의 내용에 이어서 설명하는 페이지이기 때문에 이해를 돕기 위해선 7장의 내용을 숙지하고 오는 편이 좋다.

 

Raspberry Pi 4 내장 와이파이 모듈 조사

와이파이 드라이버를 이미지에 등록하기 위해선 가장 먼저, Raspberry Pi 4에서 사용 중인 내장 와이파이 모듈에 대한 정보를 알아야한다.

이를 위해, ChatGPT(든든한 녀석..)에 물어보니 Broadcom BCM43455 계열의 와이파이 모듈인 CYW43455를 사용하는 것을 확인할 수 있었고, 해당 모듈의 드라이버는 brcmfmac이라는 것을 알 수 있었다.

 

이와 관련된 패키지가 존재하는지 찾아보기 위해 아래 명령을 활용하였다.

source path/to/poky/oe-init-build-env build
oe-pkgdata-util list-pkgs | grep bcm43455
oe-pkgdata-util list-pkgs | grep brcmfmac

 

명령어 실행 결과 linux-firmware-bcm43455와 kernel-module-brcmfmac이라는 패키지가 존재하는 것을 찾을 수 있었다.

커널 모듈을 나타내는 패키지의 경우 일반적으로 kernel-module-* 이라는 접두사가 붙는다.

이제, 이 패키지들을 앞 7장에서 빌드를 완료한 Raspberry Pi 4 이미지에 등록될 수 있도록 새로운 레이어를 생성하고 함께 빌드될 수 있도록 해준다. 이에 대한 설명은 다음 섹션에서 이어서 진행한다.

 

Raspberry Pi 4 사용자 설정을 위한 커스텀 레이어 생성

Poky(Yocto) 기반의 프로젝트의 경우, 이미지의 수정이나 드라이버 및 애플리케이션 추가를 위해선 새로운 레이어를 생성하는 것이 일반적이다. 따라서, 본 섹션에서는 와이파이 드라이버와 유틸리티를 추가로 이미지에 빌드시키기 위해 커스텀 레이어(meta-custom)를 새로이 생성한다.

 

새 레이어를 생성하기 위해 다음 명령을 따른다.

레이어 이름의 경우 주로 meta-* 접두사를 붙이는게 일반적이다. (Optional)

source path/to/poky/oe-init-build-env build

# 새 레이어 생성
bitbake-layers create-layer path/to/poky/meta-custom

# 생성된 새 레이어를 빌드에 추가 (build/conf/bblayers.conf에 자동으로 레이어 경로가 등록됨)
bitbake-layers add-layer path/to/poky/meta-custom

 

새 레이어(meta-custom) 생성을 마치면 기본적으로 recipes-example이라는 디렉터리가 존재하지만, 본 페이지에서는 recipes-example 디렉터리를 삭제 후 아래 사진과 같은 구성으로 레시피 디렉터리와 파일을 생성하였다.

 

아래와 같은 구성으로 디렉터리와 파일을 미리 구성해두면, 본 페이지에서 설명하는 내용을 따라오기 편할 것이기 때문에 미리 새 레이어를 아래와 같은 구성으로 생성(mkdir와 touch 명령을 활용하여)해두는 것을 추천한다. 각 레시피 파일(.bb, .bbappend)의 세부 내용은 다음 섹션에서 찬찬히 설명한다.

 레시피 파일이 저장된 각 디렉터리의 역할은 다음과 같다.

  • recipes-applications
    • 사용자 예제 애플리케이션(hello)을 이미지에 빌드시키기 위해 활용
    • 본 페이지(8장)에서는 설명하지 않으며, 다음 9장에서 설명할 예정
  • recipes-connectivity
    • 와이파이 연결을 위한 설정 파일을 이미지에 빌드시키기 위해 활용
  • recipes-core
    • 와이파이 연결을 위한 드라이버/유틸리티를 이미지에 빌드시키기 위해 활용

 

이제 각 레시피 파일에 어떠한 세부 내용들이 작성되어야 와이파이 드라이버와 유틸리티 그리고 설정 파일이 이미지에 함께 빌드될 수 있는지 설명한다.

 

Raspberry Pi 4 와이파이 드라이버 및 유틸리티 패키지 등록

가장 먼저, 이미지 빌드 시에 와이파이 드라이버와 유틸리티가 이미지에 포함될 수 있도록 해주어야 한다. 그러기 위해선 기존 이미지 레시피 파일에 내용을 추가해주어야 한다. 앞 장에서부터 이미지 레시피는 core-image-full-cmdline을 사용하였기 때문에 이를 기준으로 설명한다.

기존 core-image-full-cmdline.bb 레시피 파일은 poky/meta/recipes-extended/images/ 하위에 위치한다.


기존 이미지 파일에 내용을 추가하기 위해 .bbappend 파일을 생성한다.

vi path/to/poky/meta-custom/recipes-core/images/core-image-full-cmdline.bbappend


.bbappend 형태로 파일을 생성하였기 때문에, 기존 core-image-full-cmdline.bb 파일이 빌드 과정에서 파싱된 후 이어서 동일한 패키지 명을 가진 .bbappend 파일이 파싱된다. 여기서 주요한 점은 반드시 core-image-full-cmdline으로 .bbappend 파일을 생성해야 한다. 그렇지 않으면, 비트베이트는 다른 패키지라고 인식을하고 기존 이미지 파일(core-image-full-cmdline)과는 다른 패키지에 대한 레시피 파일(.bbappend)이라고 판단하게 되는 문제가 발생한다.

 

생성한 core-image-full-cmdline.bbappend 파일 내부에는 아래와 같이 내용을 작성한다. 앞서 살펴보았던 드라이버 관련 패키지와 함께 와이파이 유틸리티 패키지를 이미지에서 추가로 빌드할 수 있도록 하는 줄이다.

IMAGE_INSTALL 변수는 CORE_IMAGE_EXTRA_INSTALL 변수와 유사한 역할을 하며, 이미지 빌드 시 추가될 패키지를 정의하기 위해 사용된다. (5장 참조)

IMAGE_INSTALL:append = " linux-firmware-bcm43455 kernel-module-brcmfmac wpa-supplicant"

 

이제 이미지가 “bitbake core-image-full-cmdline” 명령으로 빌드될 때 Raspberr Pi 4의 내장 와이파이 모듈을 동작시키기 위한 관련 드라이버와 유틸리티를 자동으로 rootfs에 설치할 것이다. 다음 섹션에서는 Raspberry Pi 4에서 접근할 와이파이 AP에 대한 설정 파일이 이미지에 함께 빌드될 수 있도록 하는 방법을 설명한다.

 

Raspberry Pi 4 와이파이 설정 파일 오버라이딩

Poky로 빌드한 Rasbperry Pi 4 이미지의 경우 네트워크 인터페이스를 관리하기 위해 ifupdown와 wpa_suppilcant 유틸리티를 활용한다. 여기서 ifupdown의 경우에는 기본적으로 Raspberry Pi 4 이미지가 빌드될 때 함께 설치가 되지만 wpa_supplicant는 함께 설치되지 않는다. 그렇기 때문에 앞 섹션에서 IMAGE_INSTALL에 wpa-supplicant 패키지가 빌드될 수 있도록 해주었다.

Yocto에서 패키지명의 언더바(_) 뒤에는 패키지버전(PV)을 나타내는 곳이기 때문에 기존 wpa_supplicant라는 이름을 가진 유틸리티는 Yocto에서 wpa-supplicant라는 이름으로 관리된다.

ifupdown은 init-ifupdown 이라는 패키지명으로 관리되고 있는 것을 “oe-pkgdata-util find-path /etc/network/interfaces” 명령을 활용해 확인하였다. 이 /etc/network/interfaces 파일은 ifupdown 유틸리티가 특정 네트워크 인터페이스를 활성화시킬 때 참조하는 설정 파일이다.

 

기존의 /etc/network/interfaces는 위와 같은 내용으로 작성되어 있다. 여기서 중점적으로 볼 부분은 wlan0 인터페이스이다. 이 파일에서는 wlan0 인터페이스를 부팅 과정에서 자동으로 활성화 시켜주지 않고 있으며, 또한 “ifup wlan0”와 같은 명령으로 wlan0 인터페이스가 활성화 될 때에는 /etc/wpa_supplicant.conf 파일을 참조하여 wlan0 인터페이스를 초기화하는 것까지 파악하였다.

 

본 과정에서는 이 /etc/network/interfaces 파일을 아래와 같은 내용으로 오버라이딩 될 수 있도록, 새 interfaces 파일을 생성한다.

vi path/to/poky/meta-custom/recipes-connectivity/init-updown/files/interfaces

 

새로이 생성된 interfaces 파일은 아래와 같은 내용으로 작성한다. 이 파일은 wlan0 인터페이스가 부팅 과정에서 자동으로 활성화(auto wlan0) 될 수 있도록 하고, 활성화 과정에서는 /etc/wpa_supplicant.conf 파일을 참조하여 초기화 될 수 있도록 한다.

# /etc/network/interfaces -- configuration file for ifup(8), ifdown(8)

# The loopback interface
auto lo
iface lo inet loopback

# Wireless interfaces
auto wlan0
iface wlan0 inet dhcp
        wpa-conf /etc/wpa_supplicant.conf

# Wired or wireless interfaces
auto eth0
iface eth0 inet dhcp
iface eth1 inet dhcp

 

이제 생성된 interfaces 파일이 기존의 /etc/network/interfaces 파일을 오버라이딩 할 수 있도록 하기 위해 .bbappend 파일을 아래와 같이 생성해준다.

vi path/to/poky/meta-custom/recipes-connectivity/init-updown/init-updown_%.bbappend

 

생성한 init-updown_%.bbappend 파일의 내용은 아래와 같이 작성해준다. 이 레시피 파일은 기존의 init-updown.bb 레시피 파일의 do_install()이 끝난 후 실행된다. 그렇기 때문에 기존의 /etc/network/interfaces 파일을 새 interfaces 파일로 덮어쓸 수 있게된다.

FILESEXTRAPATHS:prepend := "${THISDIR}/files:"

SRC_URI += "file://interfaces"

do_install:append() {
    install -m 0644 ${WORKDIR}/interfaces ${D}${sysconfdir}/network/interfaces
}

 

init-updown 패키지의 오버라이딩을 위한 관련 파일 생성을 마쳤다면, 이제 앞선 방법과 동일한 방식으로 wpa_supplicant.conf 파일이 /etc/ 하위에 오버라이딩하는 방법을 설명한다.

 

가장 먼저, 새 wpa_supplicant.conf 파일을 생성해준 뒤 Raspberry Pi 4에서 접근할 와이파이 AP에 대한 SSID와 PW를 wpa_passphrase 명령으로 생성해준다.

cd path/to/meta-custom/recipes-connectivity/wpa-supplicant/files/
touch wpa_supplicant.conf
wpa_passphrase “SSID” “PW” >> wpa_supplicant.conf

 

생성된 wpa_supplicant.conf 내용은 아래 파일과 같은 형식으로 작성되어야 한다. 이 페이지를 따라하는 독자 환경에서의 와이파이 AP에 대한 SSID와 PW는 다를 것이므로 network = {} 내부의 내용은 다를 것이다. 하지만, 가장 윗 줄의 ctrl_interface는 동일하게 작성되어야 하므로 추가로 작성해준다.

ctrl_interface=DIR=/var/run/wpa_supplicant

# Typical minimal wifi setup:
network={
        ssid="KT_GiGA_5G_61DA"
        key_mgmt=WPA-PSK
        psk=c1eecfdaada84f88402828aeabe864cf3bc8e9ebf98365039dd59d5e3c802066
}

 

이제 생성된 wpa_supplicant.conf 파일이 기존의 /etc/wpa_supplicant.conf 파일을 오버라이딩 할 수 있도록 하기 위해 .bbappend 파일을 아래와 같이 생성해준다.

vi path/to/poky/meta-custom/recipes-connectivity/wpa-supplicant/wpa-supplicant_%.bbappend

 

생성한 wpa-supplicant_%.bbappend 파일의 내용은 아래와 같이 작성해준다. 이 레시피 파일은 기존의 wpa-supplicant.bb 레시피 파일의 do_install()이 끝난 후 실행된다. 그렇기 때문에 기존의 /etc/wpa_supplicant.conf 파일을 새 wpa_supplicant.conf 파일로 덮어쓸 수 있게된다.

FILESEXTRAPATHS:prepend := "${THISDIR}/files:"

SRC_URI += "file://wpa_supplicant.conf"

do_install:append() {
    install -m 0600 ${WORKDIR}/wpa_supplicant.conf ${D}${sysconfdir}/wpa_supplicant.conf
}

 

이제 Raspberry Pi 4의 내장 와이파이 모듈을 사용하기 위한 드라이버와 유틸리티 그리고 설정 파일을 이미지에 빌드시키기 위한 모든 준비 과정을 마쳤다. 다음 섹션에서는 실제 빌드를 수행 후 이미지를 SD 카드에 구운 뒤 Raspberry Pi 4에서 어떠한 결과가 나타나는지 확인한다.

 

Raspberry Pi 4 이미지 빌드 후 부팅 결과

앞 섹션 과정을 이미지에 빌드 시키기 위해 아래 명령을 실행한다.

source path/to/poky/oe-init-build-env build
bitbake core-image-full-cmdline

이미지 빌드를 성공적으로 마쳤다면, 빌드가 완료된 이미지가 저장된 경로에 위치한 .wic.bz2 파일을 SD 카드에 구워준다. 이를 위해 다음 명령을 사용한다.

 

※ SD 카드는 fdisk 명령 등을 활용해 완전히 초기화된 상태로 사용하는 것을 권장한다.

cd path/to/poky/build/tmp/deploy/images/raspberrypi4/
bzcat core-image-full-cmdline-raspberrypi4.wic.bz2 | sudo dd of=/dev/sde

 

이미지 굽기가 끝났다며 이제 SD 카드를 Raspberry Pi 4에 꽂은 후 부팅한다. 부팅 후 dmesg와 ip a 명령을 실행하면 관련 와이파이 드라이버가 실행된 결과를 커널 로그에 찍혀있는 것을 확인할 수 있으며, 동시에 wlan0 인터페이스가 자동으로 AP를 찾은 후 IP 주소를 할당받은 것을 확인 가능하다.

 

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기