개요

필자는 Yocto 학습을 위해 Windows 11 머신을 활용하고 있는 중이다. 그래서 WSLv2를 설치하고 그 위에 Ubuntu를 올려서 학습 환경을 구성하였다.

 

만약, 베어메탈로 Ubuntu 머신을 구성해서 사용한다면 Raspberry Pi 4의 SD 카드를 머신에서 구울 때 Passthrough가 필요 없겠지만, 앞서 설명하였다시피 필자는 WSL에 Ubuntu를 올려서 Yocto를 학습하고 있는터라 물리적인 장치(SD 카드)를 WSL/Ubuntu에서 인식되게 하려면 Passthrough를 구성하는 과정이 필수적으로 필요하다.

 

따라서, 본 페이지에서는 WSL/Ubuntu 환경에서 Yocto를 활용해 Raspberry Pi 4의 이미지를 빌드하는 과정을 먼저 설명하고, 그 이후에 SD 카드를 WSL/Ubuntu로 Passthrough하여 이미지를 굽는 과정을 설명한다.

 

Raspberry Pi 4 이미지 빌드

Raspberry Pi 4 이미지 빌드를 위해 가장 먼저, Poky 빌드 환경을 Git으로부터 다운로드 받는다.

git clone git://git.yoctoproject.org/poky -b kirkstone

Poky 빌드 환경을 다운로드 받았다면, 이제 Raspberry Pi를 빌드를 위한 레이어를 오픈 임베디드 프로젝트로부터 다운로드 받는다.

cd poky
source oe-init-build-env build
bitbake-layers layerindex-fetch meta-raspberrypi

Poky 빌드 환경과 Raspberry Pi 빌드 레이어를 다운로드 받았다면, 이제 Bitbake가 빌드를 수행할 때 Raspberry Pi 4 머신을 타겟으로 빌드할 수 있도록 설정 파일(conf/local.conf)을 수정한다.

vi build/conf/local.conf

 

이제 Raspberry Pi 4 빌드를 위해 Bitbake 명령으로 이미지 빌드를 수행한다. (꽤 오랜 시간 걸림.. WSL 환경 기준)

bitbake core-image-full-cmdline

Raspberry Pi 4 빌드가 완료되었다면 .wic.bz2 형식의 이미지 파일이 생성되었을 것이다. .wic 형식은 이미지 구성을 위한 디스크의 파티션 분할과 각 파티션에 대한 파일 포맷을 정의하기 위해 사용한다. Linux의 dd 명령은 이 .wic에 정의된 이미지 구성을 참조하여 SD 카드를 굽는다. (bz2는 압축 파일 형식이다.)

 

생성된 이미지 파일(.wic.bz2)은 poky/build/tmp/deploy/images/raspberrypi/ 하위에 위치한다.

 

이제, 이미지를 SD 카드에 굽기 위해 WSL/Ubuntu 환경으로 SD 카드를 Passthrough 하는 과정을 설명한다. 만약, 본인의 머신이 Passthrough가 굳이 필요하지 않는 환경이라면 다음 섹션(SD 카드를 WSL/Ubuntu로 Passthrough)은 생략하면 된다.

 

SD 카드를 WSL/Ubuntu로 Passthrough

Windows 머신에서 Powershell을 관리자 모드로 실행시킨 후 아래 명령을 입력한다.

winget install dorssel.usbipd-win

usbipd-win은 Windows 머신에 꽂힌 SD 카드를 WSL로 Passthrough하기 위해 사용하는 툴이다. 해당 툴을 다운로드 받은 뒤 SD 카드가 꽂힌 슬롯의 BUSID를 찾는다.

usbipd list

필자는 Windows 머신으로 삼성 갤럭시북을 사용하고 있으며, 이 갤럭시북에서 제공하는 SD 카드 슬롯은 Genesys Logic USB3.9 Card Reader로 인식된다. 인식된 슬롯은 BUSID는 2-16임을 최종적으로 확인하였다.

 

확인된 BUSID 값을 활용해 다음 명령을 통해 WSL 환경으로 Passthrough 한다. Passthrough 과정에서 WSL/Ubuntu 머신은 반드시 켜져있어야 한다.

usbipd bind --busid 2-16
usbipd attach --wsl --busid 2-16

 

이제 WSL/Ubuntu 머신에서 아래 명령을 실행시키면 SD 카드가 정상적으로 인식되는 것을 확인가능하다.

lsblk

위 그림에서 볼 수 있듯이 필자가 사용하던 SD 카드는 FAT32 형식으로 포맷되어 있다. 그래서 FAT32으로 포맷된 파티션을 제거하여 완전히 초기화된 상태의 SD 카드로 만들어주었다.

sudo fdisk /dev/sde

### fdisk 명령 ###
d # 디스크의 파티션 삭제
p # 디스크의 현재 파티션 확인
w # 디스크를 현재 상태로 저장 후 종료

 

이제 앞 섹션에서 생성한 이미지 파일(.wic.bz2)을 SD 카드로 구워준다. 굽는 과정은 다음 섹션을 참조하면 된다.

 

SD 카드에 Raspberry Pi 4 이미지 굽기

SD 카드에 Raspberry Pi 4 이미지를 굽기 위해서 dd 명령을 다음과 같이 활용한다.

bzcat core-image-full-cmdline-raspberrypi4.wic.bz2 | sudo dd of=/dev/sde

SD 카드로 이미지가 정상적으로 구워졌는지 확인하기 위해 lsblk와 mount 명령을 사용할 수 있다.

 

이제, Raspberry Pi 4 이미지가 구워진 SD 카드를 하드웨어(Raspberry Pi 4)에 꽂은 후 전원을 인가하여 부팅을 수행한다. 결과는 다음 섹션을 참조하면 된다.

 

구워진 SD 카드로 Raspberry Pi 4 부팅

하드웨어(Raspberry Pi 4)에 이미지가 구워진 SD 카드를 꽂은 후 전원을 인가하면, HDMI 케이블을 통해 다음과 같은 화면이 출력되는 것을 확인가능하다.

부팅이 완료된 후에는 계정명을 root로 입력하면 쉘이 실행되는 것을 확인할 수 있다.

 

※ 다음 장부터는 본 페이지에서 구성한 Raspberry Pi 4의 Poky 빌드 환경을 활용해 기본적인 WiFi 설정(8장)과 Hello 예제 애플리케이션(9장)을 빌드하여 이미지에 등록하는 방법에 대해서 설명한다.

 

트러블슈팅

gcc와 binutils 크로스컴파일 과정 중 의존성 문제 발생

이미지가 빌드되는 과정 중 gcc와 binutils 패키지가 정상적으로 빌드되지 않고 종료된 것을 확인하였다. 이를 위해 빌드 로그를 분석해보니 주로 링커가 라이브러리를 연결하는 과정에서 문제가 발생한 것이였다. WSL 환경에서 빌드를 수행하다보니 한정된 메모리를 사용하는 것이 문제가 된 것 같다. 그래서 이를 해결하고자 아래와 같은 방법으로 gcc와 binutils에 대한 빌드 캐시를 삭제하고 다시 설치를 진행하였다.

 

 

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