<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>박지의 IT 공부블로그</title>
    <link>https://pak-j.tistory.com/</link>
    <description>Profile : https://pak-ji.github.io/</description>
    <language>ko</language>
    <pubDate>Wed, 17 Jun 2026 20:56:40 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>pak-ji</managingEditor>
    <item>
      <title>임베디드 리눅스 장치에서의 GDB 디버깅</title>
      <link>https://pak-j.tistory.com/100</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #dddddd; font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;개요&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;GDB란?&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; C, C++, Rust, Go 등 다양한 언어로 개발된 프로그램을 코드 단위로 디버깅하기 위한 대표적인 리눅스 환경의 디버거로, 실행되기 전의 프로그램 혹은 실행되고 있는 중인 프로그램에 이 디버거를 붙여서 활용가능하다. 또한, 프로그램이 비정상적으로 종료되었을 경우 생성되는 Postmortem 파일인 코어파일을 디버깅하기 위해서도 활용가능하다. &lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;원격 디버깅이란?&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;임베디드 리눅스로 동작하는 장치는 메모리 등이 현저히 부족한 환경이 대다수로, 대부분의 임베디드 장치에서는 디버깅을 위한 심볼이나 관련 도구들을 저장하기 힘들다. 그래서, 이를 해결하기 위해 디버깅을 위한 SDK 들은 모두 호스트 환경에 두고 이에 따라 타겟의 프로그램을 원격으로 디버깅할 수 있도록 타겟에는 에이전트를 두는 방식으로 원격 디버깅한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;본&amp;nbsp;페이지에서는&amp;nbsp;GDB를&amp;nbsp;활용해&amp;nbsp;임베디드&amp;nbsp;리눅스&amp;nbsp;장치에&amp;nbsp;원격&amp;nbsp;디버깅을&amp;nbsp;위한&amp;nbsp;gdbserver&amp;nbsp;에이전트를&amp;nbsp;빌드시키는&amp;nbsp;방법과&amp;nbsp;호스트&amp;nbsp;환경에서&amp;nbsp;타겟의&amp;nbsp;에이전트를&amp;nbsp;통해&amp;nbsp;간단한&amp;nbsp;프로그램을&amp;nbsp;디버깅하는&amp;nbsp;방법을&amp;nbsp;설명한다.&amp;nbsp;또한,&amp;nbsp;비정상적인&amp;nbsp;동작(Seg&amp;nbsp;Fault&amp;nbsp;등)으로&amp;nbsp;종료된&amp;nbsp;프로그램에&amp;nbsp;대한&amp;nbsp;코어&amp;nbsp;파일을&amp;nbsp;생성시키는&amp;nbsp;방법&amp;nbsp;그리고&amp;nbsp;코어&amp;nbsp;파일을&amp;nbsp;GDB를&amp;nbsp;활용해&amp;nbsp;원격으로&amp;nbsp;디버깅하는&amp;nbsp;방법을&amp;nbsp;설명하고&amp;nbsp;마무리한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #dddddd; font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;임베디드 리눅스 GDB 활성화&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;753&quot; data-origin-height=&quot;53&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nsXh5/dJMcahkyf1S/8Dvm944i4DoQJk8V2qSzS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nsXh5/dJMcahkyf1S/8Dvm944i4DoQJk8V2qSzS1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nsXh5/dJMcahkyf1S/8Dvm944i4DoQJk8V2qSzS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnsXh5%2FdJMcahkyf1S%2F8Dvm944i4DoQJk8V2qSzS1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;753&quot; height=&quot;53&quot; data-origin-width=&quot;753&quot; data-origin-height=&quot;53&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 임베디드 리눅스 장치에 gdbserver 에이전트를 빌드시키려면, 위 그림과 같이 이미지 레시피의 IMAGE_INSTALL 변수에 gdbserver를 추가해주어야 한다. (반드시 :append 사용하기) &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이제, 이미지에 gdbserver를 빌드시킨 후 임베디드 리눅스 장치를 플래싱한다.&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #9d9d9d; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;필자는&amp;nbsp;Raspberry&amp;nbsp;Pi&amp;nbsp;4를&amp;nbsp;사용하고&amp;nbsp;있어서&amp;nbsp;SD&amp;nbsp;카드로&amp;nbsp;이미지를&amp;nbsp;구워주었다.&amp;nbsp;이를&amp;nbsp;위해서&amp;nbsp;bzcat과&amp;nbsp;dd&amp;nbsp;명령을&amp;nbsp;활용하였다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1781591804512&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 이미지에 gdbserver를 빌드시키기
(Host)$ source oe-init-build-env build
(Host)$ bitbake &amp;lt;target_image&amp;gt;

# 빌드된 이미지를 타겟 장치에 플래싱
# Raspberry Pi 4의 경우는 아래 명령을 사용 (참조링크: https://pak-j.tistory.com/96)
(Host)$ cd tmp/deploy/images/raspberrypi4/
# SD 카드와 같은 Block 장치의 경우 fdisk 명령 등으로 완전히 초기화시킨 후 아래 명령 진행
(Host)$ bzcat core-image-full-cmdline-raspberrypi4.wic.bz2 | sudo dd of=/dev/&amp;lt;blkfile-name&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 플래싱이 완료되었다면 타겟(임베디드 리눅스 장치)으로 접근(SSH 혹은 Serial 활용)하여 아래 명령을 통해 gdbserver가 정상적으로 빌드되었는지 확인한다. &lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1781591865255&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;(Target)$ gdbserver --version&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;702&quot; data-origin-height=&quot;99&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsR34M/dJMcahEKOje/O8CurfoFScw4ff5Wp6SGu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsR34M/dJMcahEKOje/O8CurfoFScw4ff5Wp6SGu0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsR34M/dJMcahEKOje/O8CurfoFScw4ff5Wp6SGu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsR34M%2FdJMcahEKOje%2FO8CurfoFScw4ff5Wp6SGu0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;702&quot; height=&quot;99&quot; data-origin-width=&quot;702&quot; data-origin-height=&quot;99&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 타겟에 정상적으로 gdbserver가 빌드된 것을 확인하였다면, 이제 타겟을 디버깅하기 위한 개발용 SDK를 호스트 환경에 설치해주어야 한다. 이를 위해 아래 명령을 실행시킨다. &lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1781591900070&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;(Host)$ bitbake -c populate_sdk &amp;lt;target_image&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; bitbake에서 -c 옵션은 특정 태스크(do_install, do_rootfs 등)만을 실행시키기 위해 활용한다. 이 -c 옵션을 활용해서 타겟 개발용 SDK를 호스트 환경에 설치해줄 수 있으며, 이때 사용하는 것이 populate_sdk 태스크이다. &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;타겟&amp;nbsp;개발용&amp;nbsp;SDK&amp;nbsp;설치가&amp;nbsp;완료되었다면,&amp;nbsp;SDK를&amp;nbsp;호스트&amp;nbsp;환경에서&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있도록&amp;nbsp;아카이브&amp;nbsp;해제와&amp;nbsp;디렉터리&amp;nbsp;위치&amp;nbsp;조정&amp;nbsp;등을&amp;nbsp;수행해주어야&amp;nbsp;한다.&amp;nbsp;이&amp;nbsp;과정은&amp;nbsp;한번에&amp;nbsp;수행할&amp;nbsp;수&amp;nbsp;있도록&amp;nbsp;Yocto에서&amp;nbsp;쉘&amp;nbsp;스크립트&amp;nbsp;형태로&amp;nbsp;제공한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1781591942811&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd build/tmp/deploy/sdk
./&amp;lt;target_image_sdk&amp;gt;.sh&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;586&quot; data-origin-height=&quot;146&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Dam4C/dJMcaftqPLQ/M41eHC04leofOIupoVYZM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Dam4C/dJMcaftqPLQ/M41eHC04leofOIupoVYZM1/img.png&quot; data-alt=&quot;SDK 설치 중&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Dam4C/dJMcaftqPLQ/M41eHC04leofOIupoVYZM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDam4C%2FdJMcaftqPLQ%2FM41eHC04leofOIupoVYZM1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;662&quot; height=&quot;165&quot; data-origin-width=&quot;586&quot; data-origin-height=&quot;146&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SDK 설치 중&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;584&quot; data-origin-height=&quot;75&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/C2Tt4/dJMcabxMwOz/TWZgsargeeMc61koeAU2Ik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/C2Tt4/dJMcabxMwOz/TWZgsargeeMc61koeAU2Ik/img.png&quot; data-alt=&quot;SDK 설치 완료&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/C2Tt4/dJMcabxMwOz/TWZgsargeeMc61koeAU2Ik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FC2Tt4%2FdJMcabxMwOz%2FTWZgsargeeMc61koeAU2Ik%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;662&quot; height=&quot;85&quot; data-origin-width=&quot;584&quot; data-origin-height=&quot;75&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SDK 설치 완료&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;쉘&amp;nbsp;스크립트(.sh)를&amp;nbsp;통한&amp;nbsp;설치&amp;nbsp;과정&amp;nbsp;중&amp;nbsp;SDK의&amp;nbsp;설치&amp;nbsp;경로를&amp;nbsp;Default로&amp;nbsp;설정하였다면,&amp;nbsp;타겟&amp;nbsp;개발용&amp;nbsp;SDK는&amp;nbsp;/opt/poky/&amp;lt;poky-version&amp;gt;&amp;nbsp;하위에&amp;nbsp;설치된다.&amp;nbsp;설치가&amp;nbsp;완료되었다면&amp;nbsp;이제&amp;nbsp;타겟&amp;nbsp;개발용&amp;nbsp;SDK가&amp;nbsp;설치된&amp;nbsp;경로로&amp;nbsp;이동하여&amp;nbsp;SDK&amp;nbsp;환경설정을&amp;nbsp;위한&amp;nbsp;스크립트&amp;nbsp;실행시켜준다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1781591973090&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd /opt/poky/&amp;lt;poky-version&amp;gt;
source &amp;lt;sdk_env&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;여기까지 진행되었다면 호스트에는 타겟 이미지의 디버깅 심볼과 타겟용 GDB가 들어있는 개발용 SDK 설치가 완료되었으며, 타겟에는 호스트 환경에서의 원격 디버깅을 위한 에이전트인 gdbserver 설치가 완료되었다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이제 호스트와 타겟에 세팅된 디버깅 환경을 활용한 GDB 원격 디버깅 방법을 다음 섹션에서 설명한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #dddddd; font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;임베디드 리눅스 GDB 원격 디버깅&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;먼저 타겟에서 디버깅할 애플리케이션에 gdbserver 에이전트를 다음과 같이 붙여준다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1781592059268&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# SSH 환경으로 설명
(Target)$ gdbserver :&amp;lt;port_number&amp;gt; &amp;lt;app_name&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;669&quot; data-origin-height=&quot;101&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcFIjM/dJMcaffXem0/Ls2WVKM0Kfk1vg3H0Ir1dK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcFIjM/dJMcaffXem0/Ls2WVKM0Kfk1vg3H0Ir1dK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcFIjM/dJMcaffXem0/Ls2WVKM0Kfk1vg3H0Ir1dK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcFIjM%2FdJMcaffXem0%2FLs2WVKM0Kfk1vg3H0Ir1dK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;596&quot; height=&quot;90&quot; data-origin-width=&quot;669&quot; data-origin-height=&quot;101&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 위와 같이 타겟 환경을 세팅하였다면, 이제 호스트에서 타겟의 gdbserver 에이전트로 붙이기 위한 작업을 다음과 같이 수행한다. &lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1781592093466&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 쉘 스크립트를 통해 타겟 개발용 SDK 환경을 호스트에 설정하였다면,
# 환경 변수($GDB)에 타겟의 cross-gdb가 세팅되어 있다.
(Host)$ $GDB /opt/poky/&amp;lt;poky-version&amp;gt;/sysroots/&amp;lt;application-binary-path&amp;gt;

# 실행되는 타겟의 바이너리에 대한 디버깅 심볼을 찾기 위해 sysroot를 등록한다.
(Host)$ (gdb) set sysroot /opt/poky/&amp;lt;poky-version&amp;gt;/sysroots/&amp;lt;target-sysroot-directory&amp;gt;

# (Optional) 만약 애플리케이션 소스 파일이 타겟 sysroot에 존재하지 않다면,
# 아래 명령으로 직접 애플리케이션 소스 파일의 위치를 등록해준다.
(Host)$ (gdb) directory path/to/poky/&amp;hellip;/&amp;lt;application-source-directory&amp;gt;/

# 타겟에서 대기 중인 gdbserver 에이전트에 아래 명령을 활용해 붙어준다.
(Host)$ (gdb) target remote &amp;lt;target-ip&amp;gt;:&amp;lt;gdbserver-port-number&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 호스트에서 타겟의 gdbserver 에이전트에 붙게되었다면 이제 아래 사진과 같이 GDB 명령을 활용해 소스 레벨에서의 디버깅을 수행하면 된다. 본 페이지에서는 GDB 명령에 대한 내용은 생략한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;732&quot; data-origin-height=&quot;286&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kLpoP/dJMcahdKnb3/DhzKY4jfbjl4pPmqlU3kKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kLpoP/dJMcahdKnb3/DhzKY4jfbjl4pPmqlU3kKK/img.png&quot; data-alt=&quot;호스트에서의 GDB 원격 디버깅 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kLpoP/dJMcahdKnb3/DhzKY4jfbjl4pPmqlU3kKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkLpoP%2FdJMcahdKnb3%2FDhzKY4jfbjl4pPmqlU3kKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;601&quot; height=&quot;235&quot; data-origin-width=&quot;732&quot; data-origin-height=&quot;286&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;호스트에서의 GDB 원격 디버깅 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 만약 디버깅 할 애플리케이션이 타겟이 부팅될 때 자동으로 실행되어 초기 단계의 디버깅이 불가할 경우, 리눅스의 init 프로그램(SysVinit, Busybox, Systemd 등)에서 참조하는 데몬 실행 명령을 다음과 같이 설정해주면 된다. &lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1781592134286&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# SysVinit
start-stop-daemon -S -x /usr/bin/gdbserver -- :&amp;lt;port-number&amp;gt; /usr/bin/&amp;lt;app-bin&amp;gt;

# systemd
ExecStart=/usr/bin/gdbserver :&amp;lt;port-number&amp;gt; /usr/bin/&amp;lt;app-bin&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;또한, 이미 실행 중인 애플리케이션에 gdbserver 에이전트를 붙여주는 방법도 존재한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1781592145492&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;(Target)$ gdbserver --attach :&amp;lt;port-number&amp;gt; $(pidof &amp;lt;app-bin&amp;gt;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #dddddd; font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;임베디드 리눅스 코어파일 생성방법&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;애플리케이션의 소스레벨 문제(Seg Fault 등)가 항시 발생하지 않고, 간헐적으로 발생하는 경우가 존재할 것이다. 이때에는 GDB를 붙여놓아도 문제를 곧바로 찾아내긴 어렵기 때문에 Postmortem 방식으로 디버깅을 수행해주어야 한다. 다시 말해, 애플리케이션의 비정상적인 종료에 대한 사후 분석을 수행해야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이를 위해 리눅스에서는 비정상적인 종료가 발생된 애플리케이션의 메모리를 그대로 덤프를 떠서 바이너리 형식의 파일로 저장해두는 기능을 제공한다. 이때 생성된 파일을 코어 파일이라고 불리운다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;코어 파일을 생성하기 위해선, 리눅스 시스템에서는 다음과 같은 명령을 활용해 코어 파일의 생성 경로와 허용 용량을 세팅해주어야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1781592169111&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 코어 파일의 생성 경로를 지정
# %e = 실행된 애플리케이션의 파일 이름
# %p = 실행된 애플리케이션의 프로세스 ID(PID)
# %s = 실행된 애플리케이션이 종료될 때 발생된 시그널 번호
# %t = 실행된 애플리케이션의 코어 덤프 발생 타임스탬프
(Target)$ sudo vi /etc/sysctl.conf
(Target)$ (vi) kernel.core_pattern=/tmp/core.%e.%p.%s.%t&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;614&quot; data-origin-height=&quot;57&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dcfUF0/dJMcaijoSAY/PLoiYMavu1d9eAupSB9cn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dcfUF0/dJMcaijoSAY/PLoiYMavu1d9eAupSB9cn0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dcfUF0/dJMcaijoSAY/PLoiYMavu1d9eAupSB9cn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdcfUF0%2FdJMcaijoSAY%2FPLoiYMavu1d9eAupSB9cn0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;528&quot; height=&quot;49&quot; data-origin-width=&quot;614&quot; data-origin-height=&quot;57&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1781592193409&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 재부팅 되어야 위에 설정한 코어 덤프에 대한 설정이 시스템 상에 적용된다.
(Target)$ sudo reboot

# ulimit의 -c 옵션은 애플리케이션에서 생성할 코어 파일의 용량을 설정하기 위해 사용한다.
# 기본적으로 코어 파일의 허용 용량은 0 이다.
# ulimit 설정은 재부팅하면 사라지므로, 계속 유지를 위해선 데몬 스크립트에 넣어두는게 좋다.
(Target)$ sudo ulimit -c unlimited&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 테스트를 위해서 kill 명령을 활용해 SEGV 시그널을 프로세스에 발생시켜 Seg Fault가 일어나게끔 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;493&quot; data-origin-height=&quot;256&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FhGYP/dJMcaiDH1Pa/WV4zuSD1SpVrrn9wnBSXuk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FhGYP/dJMcaiDH1Pa/WV4zuSD1SpVrrn9wnBSXuk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FhGYP/dJMcaiDH1Pa/WV4zuSD1SpVrrn9wnBSXuk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFhGYP%2FdJMcaiDH1Pa%2FWV4zuSD1SpVrrn9wnBSXuk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;435&quot; height=&quot;226&quot; data-origin-width=&quot;493&quot; data-origin-height=&quot;256&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; Seg Fault가 발생된 프로세스는 코어 덤프를 수행한 뒤 /tmp 하위에 코어 파일을 생성시킨다. 이 코어 파일은 호스트 환경에서 GDB를 활용해 분석(디버깅) 가능하다. &lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1781592230647&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 호스트에서 타겟에 저장된 코어 파일을 다운로드
(Host)$ scp &amp;lt;target-user&amp;gt;@&amp;lt;target-ip&amp;gt;:/tmp/&amp;lt;core-file&amp;gt; &amp;lt;download-path&amp;gt;

# 호스트에 타겟의 개발용 SDK 환경 세팅
(Host)$ cd /opt/poky/&amp;lt;poky-version&amp;gt;
(Host)$ source &amp;lt;sdk_env&amp;gt;

# 호스트에 타겟의 개발용 SDK 환경을 잘 세팅되었는지 확인
(Host)$ echo $GDB
(Host)$ echo $SDKTARGETSYSROOT

# Not Stripped 실행 파일 찾기
(Host)$ find ~/workspace/rpi4-poky/build/tmp/work -name onestep -type f
(Host)$ file &amp;lt;not-stripped-app-bin&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;728&quot; data-origin-height=&quot;84&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JNf0N/dJMcajoYQDj/V7lGuztGCmQ6fjNmotbJm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JNf0N/dJMcajoYQDj/V7lGuztGCmQ6fjNmotbJm1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JNf0N/dJMcajoYQDj/V7lGuztGCmQ6fjNmotbJm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJNf0N%2FdJMcajoYQDj%2FV7lGuztGCmQ6fjNmotbJm1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;728&quot; height=&quot;84&quot; data-origin-width=&quot;728&quot; data-origin-height=&quot;84&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1781592251624&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 코어 파일을 Not Stripped 실행 파일과 함께 GDB로 열기
(Host)$ $GDB /path/to/&amp;lt;not-stripped-app-bin&amp;gt; /path/to/&amp;lt;core-file&amp;gt;

# 실행되는 타겟의 바이너리에 대한 디버깅 심볼을 찾기 위해 sysroot를 등록한다.
(Host)$ (gdb) set sysroot /opt/poky/&amp;lt;poky-version&amp;gt;/sysroots/&amp;lt;target-sysroot-directory&amp;gt;

# (Optional) 만약 애플리케이션 소스 파일이 타겟 sysroot에 존재하지 않다면,
# 아래 명령으로 직접 애플리케이션 소스 파일의 위치를 등록해준다.
(Host)$ (gdb) directory path/to/poky/&amp;hellip;/&amp;lt;application-source-directory&amp;gt;/

# GDB 명령을 활용해 디버깅을 수행한다.
(Host)$ (gdb) list
(Host)$ (gdb) bt&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;736&quot; data-origin-height=&quot;320&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpG5Ix/dJMcafmIEcV/Z4lbmVwllPRfroemS4mU4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpG5Ix/dJMcafmIEcV/Z4lbmVwllPRfroemS4mU4k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpG5Ix/dJMcafmIEcV/Z4lbmVwllPRfroemS4mU4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpG5Ix%2FdJMcafmIEcV%2FZ4lbmVwllPRfroemS4mU4k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;791&quot; height=&quot;344&quot; data-origin-width=&quot;736&quot; data-origin-height=&quot;320&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 위 디버깅을 통해 Sleep 도중에 kill 명령에 의해 SIGSEGV이 발생되어 비정상적인 종료가 일어난 것을 알 수 있다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #dddddd; font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;결론&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;본 페이지에서는 임베디드 리눅스 환경에서 GDB와 gdbserver를 활용하여 원격 디버깅 환경을 구성하고, 호스트에서 타겟 애플리케이션을 소스 레벨로 분석하는 방법을 정리하였다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;임베디드 장치는 저장공간과 메모리 제약으로 인해 타겟 내부에 모든 디버깅 도구와 심볼을 포함하기 어렵다. 따라서 타겟에는 gdbserver만 배치하고, 호스트에는 Yocto SDK를 설치하여 Cross-GDB, Debugging Symbol, Target sysroot를 활용하는 방식이 일반적이다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;또한&amp;nbsp;이미&amp;nbsp;실행&amp;nbsp;중인&amp;nbsp;프로세스에는&amp;nbsp;gdbserver&amp;nbsp;--attach&amp;nbsp;방식으로&amp;nbsp;붙을&amp;nbsp;수&amp;nbsp;있으며,&amp;nbsp;부팅&amp;nbsp;시&amp;nbsp;자동&amp;nbsp;실행되는&amp;nbsp;애플리케이션은&amp;nbsp;init&amp;nbsp;script&amp;nbsp;또는&amp;nbsp;systemd의&amp;nbsp;실행&amp;nbsp;명령을&amp;nbsp;gdbserver로&amp;nbsp;감싸&amp;nbsp;초기&amp;nbsp;실행&amp;nbsp;시점부터&amp;nbsp;디버깅할&amp;nbsp;수&amp;nbsp;있다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;마지막으로, 간헐적으로 발생하는 Segmentation Fault와 같은 문제는 코어 덤프를 활성화하여 사후 분석할 수 있다. 이때 코어 파일은 살아 있는 프로세스가 아니므로 gdbserver로 원격 attach하는 방식이 아니라, 호스트로 가져온 뒤 not-stripped 실행파일과 SDK sysroot를 함께 사용하여 GDB에서 분석해야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;결국 임베디드 리눅스 디버깅 환경의 핵심은 다음 세 가지로 정리할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;타겟에는 gdbserver를 포함시킨다.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;호스트에는 Yocto SDK와 심볼 포함 실행파일을 준비한다.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;실시간 문제는 원격 디버깅으로, 종료된 문제는 코어 덤프 분석으로 접근한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000; text-align: justify;&quot;&gt;이 구성을 갖추면 제한적인 임베디드 환경에서도 애플리케이션의 실행 흐름, 크래시 원인, 메모리 상태를 비교적 빠르고 정확하게 추적할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #dddddd; font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;i&gt;&lt;b&gt;References&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #666666;&quot;&gt; &lt;i&gt;임베디드 리눅스 프로그래밍 완전정복 3/e, 19장 GDB로 디버깅하기&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>Linux/Embedded</category>
      <author>pak-ji</author>
      <guid isPermaLink="true">https://pak-j.tistory.com/100</guid>
      <comments>https://pak-j.tistory.com/100#entry100comment</comments>
      <pubDate>Tue, 16 Jun 2026 15:46:22 +0900</pubDate>
    </item>
    <item>
      <title>SysVinit(System V init)이란?</title>
      <link>https://pak-j.tistory.com/99</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;개요&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;init란?&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; init은 root 권한을 가진 첫번째로 실행되는 프로세스로 PID 1번을 갖는다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; init은 사용자 공간 앱의 부트 순서를 제어하고 이를 실행시키는 역할을 한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;init 프로세스를 통해 실행된 유저 앱은 데몬(Daemon)이라고 부른다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;init 프로세스는 부팅시점부터 종료때까지 시스템의 모든 데몬에 대한 라이프사이클을 제어한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 이러한 Linux의 init 프로그램에는 아래와 같이 3가지 종류가 존재한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;init 프로그램 종류&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;BusyBox&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;매우 낮은 복잡도를 가진 시스템에서 사용하기에 적절하다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;실행된 데몬의 로그를 정리하는 기능이 부족하다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1KB 이하의 크기로 동작시킬 수 있는 init 프로그램이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;SysVinit와 유사한 형태로 데몬을 관리한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;SysVinit&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;중간 정도의 복잡도를 가진 시스템에서 사용하기 적절하다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;실행된 데몬의 로그를 정리하는 기능이 부족하다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1KB 가량의 크기로 동작시킬 수 있는 init 프로그램이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;BusyBox와 유사한 형태로 데몬을 관리한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Systemd&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;높은 복잡도를 가진 시스템에서 사용하기 적절하다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;실행된 데몬의 로그를 정리하는 기능이 매우 풍부하다. (systemd-journald)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;30MB 이상의 크기로 동작시킬 수 있는 init 프로그램이다. (Desktop Linux에 주로 활용)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;메모리와 디스크 용량이 충분한 Embedded Linux에서도 많이 사용된다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;BusyBox와 SysVinit과는 다른 형태로 데몬을 관리한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 본 페이지에서는 앞서 설명한 세가지 init 프로그램 중 SysVinit에 대해서만 설명한다. 또한, 이 페이지는 임베디드 리눅스를 학습하면서 정리하는 것이므로 Yocto(4.0 LTS)를 기준으로 설명한다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #dddddd; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;SysVinit&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Yocto&amp;nbsp;시스템을&amp;nbsp;통해&amp;nbsp;빌드된&amp;nbsp;리눅스&amp;nbsp;배포판이&amp;nbsp;init&amp;nbsp;프로그램으로&amp;nbsp;SysVinit을&amp;nbsp;사용하기&amp;nbsp;위해서는&amp;nbsp;루트&amp;nbsp;설정&amp;nbsp;파일인&amp;nbsp;build/conf/local.conf의&amp;nbsp;가장&amp;nbsp;마지막&amp;nbsp;줄에&amp;nbsp;다음과&amp;nbsp;같이&amp;nbsp;작성주어야&amp;nbsp;한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780645736361&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;INIT_MANAGER = &amp;ldquo;sysvinit&amp;rdquo;

# init 프로그램을 BusyBox나 Systemd로 변경할 때에는 아래와 같이 작성한다.
# INIT_MANAGER = &amp;ldquo;busybox&amp;rdquo;
# INIT_MANAGER = &amp;ldquo;Systemd&amp;rdquo;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;SysVinit은 총 8가지의 런레벨을 갖고있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #999999; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;필자가 실무를 접할 때에는 0, 5, 6 레벨만 주로 활용했었다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;S: 일반 런레벨(0~6)과는 다른 부팅 전용 특수 런레벨&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;0: 시스템 종료 시 실행되는 런레벨&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1~5: 시스템 부팅이 완료된 후 사용자 앱을 실행시키기 위한 런레벨&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;6: 시스템 재시작 시 실행되는 런레벨&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;사용자 앱을 실행시키기 위한 5가지 런레벨은 Upstream Linux의 경우에는 주로 다음과 같이 할당하여 사용한다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1: 단일 사용자&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2: 네트워크 구성 요소를 사용하지 않는 다중 사용자&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;3: 네트워크 구성 요소를 사용하는 다중 사용자&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;4: 사용하지 않음&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;5: 그래픽 로그인을 사용하는 다중 사용자 (가장 많이 사용하는 런레벨)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; SysVinit에서는 이러한 여러 런레벨을 자유자재로 변경할 수 있으며, 이를 위해 아래와 같은 명령을 활용해 런레벨을 자유자재로 변경가능하다. &lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780645780382&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Runlevel 0
$ halt
$ /etc/init.d/rc 0

# Runlevel 1~5
$ /etc/init.d/rc &amp;lt;1~5&amp;gt;

# Runlevel 6
$ reboot
$ /etc/init.d/rc 6&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 위 명령 예시를 활용하여 리눅스 시스템을 특정 런레벨로 변경하게 되면, init 프로그램(SysVinit)은 해당 런레벨에 해당하는 모든 데몬을 재실행(kill &amp;rarr; start)시킨다. 각 런레벨에 해당하는 데몬은 /etc/rc&amp;lt;1~5&amp;gt;.d 디렉터리 하위에 쉘 스크립트 형태로 관리된다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1038&quot; data-origin-height=&quot;347&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/56S37/dJMcacXERjd/RyfdYUytim1DRzvKo2xzKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/56S37/dJMcacXERjd/RyfdYUytim1DRzvKo2xzKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/56S37/dJMcacXERjd/RyfdYUytim1DRzvKo2xzKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F56S37%2FdJMcacXERjd%2FRyfdYUytim1DRzvKo2xzKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;674&quot; height=&quot;225&quot; data-origin-width=&quot;1038&quot; data-origin-height=&quot;347&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;위 캡쳐는 런레벨 5에 해당하는 데몬들을 관리하기 위한 스크립트 파일들이다. 파일의 형태를 보면 알 수 있듯이, 실제로는 /etc/init.d 하위에 데몬을 종료/실행시키기 위한 스크립트 파일들이 작성되고, 이 파일들을 각 런레벨에 맞춰 링크하는 형식으로 존재한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 그리고 링크된 파일 이름의 앞에는 S00(K00도 존재함)를 붙이는 것을 알 수 있다. 이는 다음을 의미한다. &lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;S00&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;S는 Start를 의미하며, init 프로세스가 이를 보고 데몬 실행(start) 명령을 내린다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;00은 실행 순서를 의미하며, S00이 가장 먼저 실행되고 S99이 가장 늦게 실행된다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;K00&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;K는 Kill을 의미하며, init 프로세스가 이를 보고 데몬 종료(stop) 명령을 내린다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;00은 종료 순서를 의미하며, K00이 가장 먼저 종료되고 K99이 가장 늦게 종료된다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;또한, 데몬을 실행시키기 위한 스크립트는 일반적으로 다음과 같은 뼈대를 갖는다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #999999; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;export와 같은 환경변수도 주로 스크립트에 작성하며, 고객사별로 다르게 환경변수를 관리하기 위해서 configs/ 디렉터리를 추가로 생성하는 경우도 존재한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780646011019&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#! /bin/sh

case &amp;ldquo;$1&amp;rdquo; in
	start)
		echo &amp;ldquo;Start user daemon&amp;rdquo;
		start-stop-daemon -S -n &amp;lt;app-name&amp;gt; -x &amp;lt;app-start-command&amp;gt;
	stop)
		echo &amp;ldquo;Kill user daemon&amp;rdquo;
		start-stop-daemon -K -n &amp;lt;app-name&amp;gt;
	*)
		echo &amp;ldquo;Usage: $0 {start|stop}&amp;rdquo;
		exit 1
csac

exit 0&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;스크립트 파일 내용과 같이 특정 런레벨을 실행(halt, reboot, /etc/init.d/rc 등)할 시, 해당하는 런레벨의 데몬 관리 스크립트(/etc/rc&amp;lt;0~6&amp;gt;.d/*)로 접근하여 start 혹은 stop 명령을 내리게 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #999999; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;쉘 스크립트에서 $0은 파일명을 나타내고 $1은 첫번째 인자를 나타낸다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;정리하자면, SysVinit은 특정 유저 앱을 데몬 형태로 실행시키기 위해 다음과 같은 순서를 따른다.&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;init 프로그램 실행&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;현재 시스템의 런레벨 확인 (/etc/inittab에서 initdefault가 작성된 줄의 런레벨을 통해서)&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;현재 런레벨에 해당하는 디렉터리로 이동 (/etc/rc&amp;lt;0~6&amp;gt;.d/)&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;디렉터리에 존재하는 모든 스크립트를 실행 (S00 부터 S99까지 순서대로)&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;유저 앱이 백그라운드로 실행되어 데몬 형태로 동작&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;필자도 Busybox나 SysVinit을 직접적으로 사용을 해본적은 있지만 단순히 데몬을 실행시키기 위한 용도로만 활용했었다. 그러나 이번 계기로 init 프로그램이 무엇인지 다시 한번 알 수 있게 되었고, 리눅스의 init 프로그램에는 어떤 것들이 있는지, 그리고 각 init 프로그램가 어떠한 환경에서 사용하면 되는지, 또한 init 프로그램 중 SysVinit가 어떠한 순서에 따라서 유저 앱을 실행하는지 익힐 수 있게 되었다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #dddddd; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;i&gt;&lt;b&gt;References&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;i&gt;임베디드 리눅스 프로그래밍 완전정복 3/e, 13장 시스템구동: init 프로그램&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>Linux/Embedded</category>
      <author>pak-ji</author>
      <guid isPermaLink="true">https://pak-j.tistory.com/99</guid>
      <comments>https://pak-j.tistory.com/99#entry99comment</comments>
      <pubDate>Fri, 5 Jun 2026 16:54:29 +0900</pubDate>
    </item>
    <item>
      <title>[Yocto 학습] 9장: Poky를 활용한 Raspberry Pi 4 유저 애플리케이션 빌드</title>
      <link>https://pak-j.tistory.com/98</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #dddddd; color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;개요&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Poky로 빌드된 Raspberry Pi 4 이미지는 완전히 순수한 형태로 존재한다. 다시 말해, 기본적인 쉘 명령이나 유틸리티를 제외한 아무런 애플리케이션이 올라가 있지 않다. 따라서, 유저 애플리케이션을 이미지에 빌드시키기 위해서는 직접 새 애플리케이션을 구현하고 이를 이미지에도 빌드될 수 있도록 레시피 파일을 작성해주어야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;본 페이지에서는 예제로 &amp;ldquo;Hello, World&amp;rdquo;를 출력하는 C언어 유저 애플리케이션을 구현 후, 이를 Raspberry Pi 4 이미지내에 함께 빌드 될 수 있도록 레시피를 작성하는 방법에 대해서 설명한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #dddddd; color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Raspberry&amp;nbsp;Pi&amp;nbsp;4&amp;nbsp;사용자&amp;nbsp;설정을&amp;nbsp;위한&amp;nbsp;커스텀&amp;nbsp;레이어&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;새로운 유저 애플리케이션을 구현 후 패키지화하여 이미지에 빌드시키기 위해 아래와 같은 커스텀 레이어(meta-custom)를 작성하였다. 본 레이어를 생성하고 구성하는 방법은 앞 8장에 작성되어 있으니 참고하길 바란다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;참고로 새 레이어를 생성하기 위해서는 아래와 같은 명령을 따른다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780067451584&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;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&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;751&quot; data-origin-height=&quot;563&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/djsRXv/dJMcagTeYxD/o8cYHOlq1yzGGTtr3IhIS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/djsRXv/dJMcagTeYxD/o8cYHOlq1yzGGTtr3IhIS0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/djsRXv/dJMcagTeYxD/o8cYHOlq1yzGGTtr3IhIS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdjsRXv%2FdJMcagTeYxD%2Fo8cYHOlq1yzGGTtr3IhIS0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;550&quot; height=&quot;412&quot; data-origin-width=&quot;751&quot; data-origin-height=&quot;563&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 레시피 파일이 저장된 각 디렉터리의 역할은 다음과 같다. &lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;recipes-applications&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;사용자&amp;nbsp;예제&amp;nbsp;애플리케이션(hello)을&amp;nbsp;이미지에&amp;nbsp;빌드시키기&amp;nbsp;위해&amp;nbsp;활용&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;recipes-connectivity&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;와이파이&amp;nbsp;연결을&amp;nbsp;위한&amp;nbsp;설정&amp;nbsp;파일을&amp;nbsp;이미지에&amp;nbsp;빌드시키기&amp;nbsp;위해&amp;nbsp;활용&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이미&amp;nbsp;앞&amp;nbsp;8장에서&amp;nbsp;다룬&amp;nbsp;내용&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;recipes-core&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;유저&amp;nbsp;애플리케이션을&amp;nbsp;패키지&amp;nbsp;형태로&amp;nbsp;이미지에&amp;nbsp;빌드시키기&amp;nbsp;위해&amp;nbsp;활용&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;본&amp;nbsp;페이지에서는&amp;nbsp;recipes-applications에&amp;nbsp;들어가는&amp;nbsp;유저&amp;nbsp;애플리케이션(hello-app)을&amp;nbsp;구현하기&amp;nbsp;파일(C,&amp;nbsp;Makefile)과&amp;nbsp;이를&amp;nbsp;빌드하기&amp;nbsp;위한&amp;nbsp;레시피&amp;nbsp;파일의&amp;nbsp;세부&amp;nbsp;내용을&amp;nbsp;어떻게&amp;nbsp;구성하면&amp;nbsp;되는지&amp;nbsp;다음&amp;nbsp;섹션부터&amp;nbsp;설명한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #dddddd; color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Raspberry&amp;nbsp;Pi&amp;nbsp;4&amp;nbsp;유저&amp;nbsp;애플리케이션&amp;nbsp;구현&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;가장 먼저, Hello World가 출력되는 유저 애플리케이션을 구현하기 위해 아래 두 파일을 작성한다.&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780067558908&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;vi path/to/poky/meta-custom/recipes-applications/hello-app/files/hello-app.c
vi path/to/poky/meta-custom/recipes-applications/hello-app/files/Makefile&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;hello-app.c는 다음과 같은 내용으로 작성한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780067584483&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

int main() {
    printf(&amp;ldquo;Hello, pakji !!\n&amp;rdquo;);
    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;hello-app을&amp;nbsp;컴파일&amp;nbsp;할&amp;nbsp;Makefile은&amp;nbsp;다음과&amp;nbsp;같은&amp;nbsp;내용으로&amp;nbsp;작성한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780067597482&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;TARGET = hello
SRCS = hello-app.c

all: $(TARGET)

$(TARGET): $(SRCS)
    $(CC) $(CFLAGS) $(LDFLAGS) -o $(TARGET) $(SRCS)

clean:
    rm -f $(TARGET)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;유저&amp;nbsp;애플리케이션&amp;nbsp;구현을&amp;nbsp;마쳤으면,&amp;nbsp;이제&amp;nbsp;이&amp;nbsp;애플리케이션을&amp;nbsp;위한&amp;nbsp;레시피를&amp;nbsp;작성하여서&amp;nbsp;패키지&amp;nbsp;형태로&amp;nbsp;이미지에&amp;nbsp;빌드되도록&amp;nbsp;해준다.&amp;nbsp;이&amp;nbsp;과정은&amp;nbsp;다음&amp;nbsp;섹션을&amp;nbsp;참조하면&amp;nbsp;된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #dddddd; color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Raspberry&amp;nbsp;Pi&amp;nbsp;4&amp;nbsp;유저&amp;nbsp;애플리케이션&amp;nbsp;패키지&amp;nbsp;등록&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;유저&amp;nbsp;애플리케이션을&amp;nbsp;이미지에&amp;nbsp;빌드되도록&amp;nbsp;하기&amp;nbsp;위한&amp;nbsp;이미지&amp;nbsp;레시피(core-image-full-cmdline)의&amp;nbsp;IMAGE_INSTALL&amp;nbsp;변수에&amp;nbsp;hello-app&amp;nbsp;패키지를&amp;nbsp;등록한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780067615106&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;vi path/to/poky/meta-custom/recipes-core/images/core-image-full-cmdline.bbappend&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1780067624483&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# core-image-full-cmdline.bbappend

IMAGE_INSTALL:append = &quot; &amp;hellip; hello-app&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;패키지를&amp;nbsp;등록하였다면&amp;nbsp;이제&amp;nbsp;이&amp;nbsp;패키지를&amp;nbsp;빌드시키기&amp;nbsp;위한&amp;nbsp;레시피&amp;nbsp;파일을&amp;nbsp;작성해준다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780067651980&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;vi path/to/poky/meta-custom/recipes-applications/hello-app/hello-app.bb&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1780067664110&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# hello-app.bb

SUMMARY = &quot;Hello example application&quot;
LICENSE = &quot;CLOSED&quot;

SRC_URI += &quot; \
    file://hello-app.c \
    file://Makefile \
&quot;

S = &quot;${WORKDIR}&quot;

do_compile() {
    oe_runmake
}

do_install() {
    install -d ${D}${bindir}
    install -m 0755 ${WORKDIR}/hello ${D}${bindir}/hello
}

FILES:${PN} += &quot;${bindir}/hello&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;gcc나 make 명령을 실행시켜서 직접 컴파일이 가능하지만, 비트베이크의 빌드 시스템을 제대로 활용하기 위해선 제공하는 도구를 그대로 사용하는 것이 가장 적절하다. 왜냐하면, 빌드 시스템에서 관련 툴체인 등을 자동으로 불러와 사용할 수 있기 때문이다. 이를 위해 Makefile 등을 비트베이크에서 파싱할 수 있는 형태로 작성을 해주어야 한다. 그리고 Makefile의 경우에는 oe_runmake 명령문을 작성해서 간단하게 컴파일이 가능하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;.bb 레시피는 패키지 빌드에 필요한 메타데이터를 정의하는 파일이다. 레시피의 do_install 단계에서 설치한 파일이 최종 패키지와 rootfs에 포함되려면, 해당 파일이 어떤 패키지에 포함될지 패키징 규칙에 의해 매핑되어야 한다. 기본 패키징 경로에 포함되지 않는 파일은 FILES:${PN} 등을 사용해 명시적으로 지정한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #9d9d9d; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 앞 8장에서는 새로운 패키지를 정의하는 .bb 레시피가 아니라, 기존 레시피를 확장하는 .bbappend 파일을 작성하였다. 따라서 원본 레시피에서 이미 정의된 패키징 설정을 그대로 사용할 수 있었고, 추가한 결과물이 기존 FILES 변수에 포함되는 경로에 설치되었기 때문에 별도로 FILES:${PN}을 작성하지 않았다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #dddddd; color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Raspberry&amp;nbsp;Pi&amp;nbsp;4&amp;nbsp;이미지&amp;nbsp;빌드&amp;nbsp;및&amp;nbsp;결과&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;유저 애플리케이션 구현과 레시피 파일의 작성을 마쳤다면, 이제 이미지 빌드를 수행하고 이에 대한 결과를 Raspberry Pi 4에서 확인한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780067711943&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;source path/to/poky/oe-init-build-env build
bitbake core-image-full-cmdline&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1128&quot; data-origin-height=&quot;532&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAJzlK/dJMcaayJzkY/RPsRkZyjPK2tGPekKXZsn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAJzlK/dJMcaayJzkY/RPsRkZyjPK2tGPekKXZsn0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAJzlK/dJMcaayJzkY/RPsRkZyjPK2tGPekKXZsn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAJzlK%2FdJMcaayJzkY%2FRPsRkZyjPK2tGPekKXZsn0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1128&quot; height=&quot;532&quot; data-origin-width=&quot;1128&quot; data-origin-height=&quot;532&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;빌드가 정상적으로 완료되면, rootfs/usr/bin/ 경로에 유저 애플리케이션(hello)이 저장되어 있는 것을 확인할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1110&quot; data-origin-height=&quot;139&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNBGiT/dJMcadhUT48/eceWHX0VUk57m6Dauu8Uq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNBGiT/dJMcadhUT48/eceWHX0VUk57m6Dauu8Uq0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNBGiT/dJMcadhUT48/eceWHX0VUk57m6Dauu8Uq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNBGiT%2FdJMcadhUT48%2FeceWHX0VUk57m6Dauu8Uq0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1110&quot; height=&quot;139&quot; data-origin-width=&quot;1110&quot; data-origin-height=&quot;139&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이제 빌드가 완료된 이미지 파일(.wic.bz2)을 SD 카드에 구워준다. 이를 위해 다음 명령을 사용한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0000ff; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;※ SD 카드는 fdisk 명령 등을 활용해 완전히 초기화된 상태로 사용하는 것을 권장한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780067795379&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd path/to/poky/build/tmp/deploy/images/raspberrypi4/
bzcat core-image-full-cmdline-raspberrypi4.wic.bz2 | sudo dd of=/dev/sde&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이미지 굽기가 끝났다며 이제 SD 카드를 Raspberry Pi 4에 꽂은 후 부팅한다. 부팅을 하게 되면 앞 8장 과정에서 진행하였던 와이파이 연결을 활용해 Raspberry Pi 4로 원격으로 접근한 뒤 hello 결과를 확인한다. 기본적으로 이미지에서 SSH 서버를 제공하고 있을 것이므로 IP 주소를 활용해 원격 접근하면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780067811385&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# powershell 등 터미널 프로그램 활용

ssh root@&amp;lt;ip_address&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;원격 접근을 하였다면 이제 hello 명령을 실행시켜서 결과를 확인한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;90&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cYycT9/dJMcahdxOUZ/mdkRGoQBYkbtDUqQiBfOk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cYycT9/dJMcahdxOUZ/mdkRGoQBYkbtDUqQiBfOk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cYycT9/dJMcahdxOUZ/mdkRGoQBYkbtDUqQiBfOk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcYycT9%2FdJMcahdxOUZ%2FmdkRGoQBYkbtDUqQiBfOk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;509&quot; height=&quot;95&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;90&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;끝.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #dddddd; color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;Yocto&amp;nbsp;학습을&amp;nbsp;끝마치며&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;임베디드 리눅스 개발자는 필요한 디바이스 드라이버를 직접 구현하고, 해당 드라이버를 활용하는 애플리케이션까지 함께 개발할 수 있어야 한다고 생각한다. 나아가 이를 빌드 시스템에 통합하여 최종적으로 이미지 형태로 배포할 수 있는 역량도 중요하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;또한 애플리케이션 개발 과정에서 필요한 네트워크, 이미지, 오디오 등 특수 목적 라이브러리를 크로스 컴파일 환경에서 사용할 수 있도록 구성하고, 동적 라이브러리의 경우 타깃 이미지에 함께 포함되도록 배포 구조를 설계할 수 있어야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;뿐만 아니라 특정 하드웨어 장치에 맞는 리눅스 BSP를 구성하는 능력도 필요하다. 즉, 부트로더, 커널, 디바이스 드라이버와 같은 저수준 소프트웨어 요소를 하드웨어 특성에 맞게 설정하고 빌드하여, 안정적으로 동작하는 임베디드 리눅스 시스템을 구축할 수 있어야 한다고 생각한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이번 Yocto 학습은 내가 앞으로 어떤 역량을 더 갖춰야 하는지 명확히 인식하게 해준 과정이었다. 지금까지는 주로 드라이버와 애플리케이션 개발 역량을 중심으로 학습해왔지만, 임베디드 리눅스 시스템을 실제 제품 수준으로 구성하기 위해서는 그보다 더 넓은 관점이 필요하다는 것을 알게 되었다. 드라이버와 애플리케이션을 빌드 시스템에 통합하고, 필요한 라이브러리를 크로스 컴파일 환경에 맞게 구성하며, 최종 이미지를 생성하고, 하드웨어에 맞는 BSP까지 다룰 수 있어야 비로소 하나의 완성된 임베디드 리눅스 시스템을 구축할 수 있다고 생각한다. 따라서 앞으로는 현재의 역량에 만족하지 않고 Yocto, BSP, 커널, 라이브러리 통합, 이미지 배포 과정까지 지속적으로 학습하며 더 깊이 있는 임베디드 리눅스 개발자로 성장해 나가야겠다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Linux/Yocto</category>
      <author>pak-ji</author>
      <guid isPermaLink="true">https://pak-j.tistory.com/98</guid>
      <comments>https://pak-j.tistory.com/98#entry98comment</comments>
      <pubDate>Sat, 30 May 2026 00:17:14 +0900</pubDate>
    </item>
    <item>
      <title>[Yocto 학습] 8장: Poky를 활용한 Raspberry Pi 4 와이파이 초기화</title>
      <link>https://pak-j.tistory.com/97</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #dddddd; font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;개요&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Poky로 빌드된 Raspberry Pi 4의 이미지는 기본적으로 유선 이더넷 드라이버를 커널 빌트인 형태로 제공하지만, 와이파이 드라이버는 커널 모듈 형태로 제공한다. 하지만, 이미지를 빌드 후 rootfs를 살펴보면 와이파이 드라이버가 관련 디렉터리(/lib/modules/&amp;hellip;/drivers/&amp;hellip;)에 존재하지 않아 실질적으로 Raspberry Pi 4의 내장 와이파이를 유저가 사용하지 못하는 문제가 발생한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이를 해결하기 위해선 두가지 방법이 존재한다.&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;와이파이 드라이버/유틸리티가 빌트인으로 컴파일 될 수 있도록 커널 컴파일 옵션 조정&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;와이파이 드라이버/유틸리티가 모듈로 제공되도록 비트베이크 빌드 옵션 조정&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;위에서 1.의 방법은 커널 자체를 재컴파일해야 됨으로 오랜 시간이 걸린다. 하지만 1.과 다르게 2.의 방식은 기존에 컴파일되어 있는 드라이버와 유틸리티가 이미지의 rootfs에 포함될 수 있게끔만 하면 되기 때문에 비교적 빠르게 결과를 확인할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;따라서, 본 페이지에서는 2.의 방법으로 Raspberry Pi 4의 내장 와이파이를 유저 영역에서 사용할 수 있게끔 관련 드라이버와 유틸리티를 모듈 형태로 이미지(rootfs)에 포함되게끔 하는 방법을 설명한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;※ 본 페이지는 앞 7장의 내용에 이어서 설명하는 페이지이기 때문에 이해를 돕기 위해선 7장의 내용을 숙지하고 오는 편이 좋다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #dddddd; font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;Raspberry Pi 4 내장 와이파이 모듈 조사&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;와이파이 드라이버를 이미지에 등록하기 위해선 가장 먼저, Raspberry Pi 4에서 사용 중인 내장 와이파이 모듈에 대한 정보를 알아야한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;668&quot; data-origin-height=&quot;249&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Mcmbw/dJMcabqRpTY/ozDKli9viP5JfTn14MKbwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Mcmbw/dJMcabqRpTY/ozDKli9viP5JfTn14MKbwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Mcmbw/dJMcabqRpTY/ozDKli9viP5JfTn14MKbwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMcmbw%2FdJMcabqRpTY%2FozDKli9viP5JfTn14MKbwk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;585&quot; height=&quot;218&quot; data-origin-width=&quot;668&quot; data-origin-height=&quot;249&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이를 위해, ChatGPT(든든한 녀석..)에 물어보니 Broadcom BCM43455 계열의 와이파이 모듈인 CYW43455를 사용하는 것을 확인할 수 있었고, 해당 모듈의 드라이버는 brcmfmac이라는 것을 알 수 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이와 관련된 패키지가 존재하는지 찾아보기 위해 아래 명령을 활용하였다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780031467225&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;source path/to/poky/oe-init-build-env build
oe-pkgdata-util list-pkgs | grep bcm43455
oe-pkgdata-util list-pkgs | grep brcmfmac&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;명령어 실행 결과 linux-firmware-bcm43455와 kernel-module-brcmfmac이라는 패키지가 존재하는 것을 찾을 수 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #9d9d9d; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;커널 모듈을 나타내는 패키지의 경우 일반적으로 kernel-module-* 이라는 접두사가 붙는다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1126&quot; data-origin-height=&quot;91&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vrtOL/dJMcahxP4V9/g1IJezzMWQQ4rF2zUGAz6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vrtOL/dJMcahxP4V9/g1IJezzMWQQ4rF2zUGAz6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vrtOL/dJMcahxP4V9/g1IJezzMWQQ4rF2zUGAz6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvrtOL%2FdJMcahxP4V9%2Fg1IJezzMWQQ4rF2zUGAz6k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1126&quot; height=&quot;91&quot; data-origin-width=&quot;1126&quot; data-origin-height=&quot;91&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이제, 이 패키지들을 앞 7장에서 빌드를 완료한 Raspberry Pi 4 이미지에 등록될 수 있도록 새로운 레이어를 생성하고 함께 빌드될 수 있도록 해준다. 이에 대한 설명은 다음 섹션에서 이어서 진행한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;Raspberry Pi 4 사용자 설정을 위한 커스텀 레이어 생성&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Poky(Yocto) 기반의 프로젝트의 경우, 이미지의 수정이나 드라이버 및 애플리케이션 추가를 위해선 새로운 레이어를 생성하는 것이 일반적이다. 따라서, 본 섹션에서는 와이파이 드라이버와 유틸리티를 추가로 이미지에 빌드시키기 위해 커스텀 레이어(meta-custom)를 새로이 생성한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;새 레이어를 생성하기 위해 다음 명령을 따른다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #9d9d9d; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;레이어 이름의 경우 주로 meta-* 접두사를 붙이는게 일반적이다. (Optional)&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780031579220&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;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&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;새 레이어(meta-custom) 생성을 마치면 기본적으로 recipes-example이라는 디렉터리가 존재하지만, 본 페이지에서는 recipes-example 디렉터리를 삭제 후 아래 사진과 같은 구성으로 레시피 디렉터리와 파일을 생성하였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;아래와 같은 구성으로 디렉터리와 파일을 미리 구성해두면, 본 페이지에서 설명하는 내용을 따라오기 편할 것이기 때문에 미리 새 레이어를 아래와 같은 구성으로 생성(mkdir와 touch 명령을 활용하여)해두는 것을 추천한다. 각 레시피 파일(.bb, .bbappend)의 세부 내용은 다음 섹션에서 찬찬히 설명한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;683&quot; data-origin-height=&quot;513&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nDK7s/dJMcageCTg0/JwOYyljaQLtjRkO68KsWaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nDK7s/dJMcageCTg0/JwOYyljaQLtjRkO68KsWaK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nDK7s/dJMcageCTg0/JwOYyljaQLtjRkO68KsWaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnDK7s%2FdJMcageCTg0%2FJwOYyljaQLtjRkO68KsWaK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;587&quot; height=&quot;441&quot; data-origin-width=&quot;683&quot; data-origin-height=&quot;513&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;레시피 파일이 저장된 각 디렉터리의 역할은 다음과 같다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;recipes-applications&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;사용자 예제 애플리케이션(hello)을 이미지에 빌드시키기 위해 활용&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;본 페이지(8장)에서는 설명하지 않으며, 다음 9장에서 설명할 예정&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;recipes-connectivity&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;와이파이 연결을 위한 설정 파일을 이미지에 빌드시키기 위해 활용&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;recipes-core&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;와이파이 연결을 위한 드라이버/유틸리티를 이미지에 빌드시키기 위해 활용&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이제 각 레시피 파일에 어떠한 세부 내용들이 작성되어야 와이파이 드라이버와 유틸리티 그리고 설정 파일이 이미지에 함께 빌드될 수 있는지 설명한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #dddddd; font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;&lt;b&gt;&lt;/b&gt;Raspberry Pi 4 와이파이 드라이버 및 유틸리티 패키지 등록&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;가장 먼저, 이미지 빌드 시에 와이파이 드라이버와 유틸리티가 이미지에 포함될 수 있도록 해주어야 한다. 그러기 위해선 기존 이미지 레시피 파일에 내용을 추가해주어야 한다. 앞 장에서부터 이미지 레시피는 core-image-full-cmdline을 사용하였기 때문에 이를 기준으로 설명한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #9d9d9d; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;기존 core-image-full-cmdline.bb 레시피 파일은 poky/meta/recipes-extended/images/ 하위에 위치한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;기존 이미지 파일에 내용을 추가하기 위해 .bbappend 파일을 생성한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780032391091&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;vi path/to/poky/meta-custom/recipes-core/images/core-image-full-cmdline.bbappend&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;.bbappend 형태로 파일을 생성하였기 때문에, 기존 core-image-full-cmdline.bb 파일이 빌드 과정에서 파싱된 후 이어서 동일한 패키지 명을 가진 .bbappend 파일이 파싱된다. 여기서 주요한 점은 반드시 core-image-full-cmdline으로 .bbappend 파일을 생성해야 한다. 그렇지 않으면, 비트베이트는 다른 패키지라고 인식을하고 기존 이미지 파일(core-image-full-cmdline)과는 다른 패키지에 대한 레시피 파일(.bbappend)이라고 판단하게 되는 문제가 발생한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;생성한 core-image-full-cmdline.bbappend 파일 내부에는 아래와 같이 내용을 작성한다. 앞서 살펴보았던 드라이버 관련 패키지와 함께 와이파이 유틸리티 패키지를 이미지에서 추가로 빌드할 수 있도록 하는 줄이다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #9d9d9d; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;IMAGE_INSTALL 변수는 CORE_IMAGE_EXTRA_INSTALL 변수와 유사한 역할을 하며, 이미지 빌드 시 추가될 패키지를 정의하기 위해 사용된다. (5장 참조)&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780032421732&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;IMAGE_INSTALL:append = &quot; linux-firmware-bcm43455 kernel-module-brcmfmac wpa-supplicant&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이제 이미지가 &amp;ldquo;bitbake core-image-full-cmdline&amp;rdquo; 명령으로 빌드될 때 Raspberr Pi 4의 내장 와이파이 모듈을 동작시키기 위한 관련 드라이버와 유틸리티를 자동으로 rootfs에 설치할 것이다. 다음 섹션에서는 Raspberry Pi 4에서 접근할 와이파이 AP에 대한 설정 파일이 이미지에 함께 빌드될 수 있도록 하는 방법을 설명한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #dddddd; font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;Raspberry Pi 4 와이파이 설정 파일 오버라이딩&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Poky로 빌드한 Rasbperry Pi 4 이미지의 경우 네트워크 인터페이스를 관리하기 위해 ifupdown와 wpa_suppilcant 유틸리티를 활용한다. 여기서 ifupdown의 경우에는 기본적으로 Raspberry Pi 4 이미지가 빌드될 때 함께 설치가 되지만 wpa_supplicant는 함께 설치되지 않는다. 그렇기 때문에 앞 섹션에서 IMAGE_INSTALL에 wpa-supplicant 패키지가 빌드될 수 있도록 해주었다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;Yocto에서 패키지명의 언더바(_) 뒤에는 패키지버전(PV)을 나타내는 곳이기 때문에 기존 wpa_supplicant라는 이름을 가진 유틸리티는 Yocto에서 wpa-supplicant라는 이름으로 관리된다.&lt;/span&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1049&quot; data-origin-height=&quot;137&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxtwQW/dJMcafteiu6/AXFsGRpLV3x9xpv7ti2kPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxtwQW/dJMcafteiu6/AXFsGRpLV3x9xpv7ti2kPk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxtwQW/dJMcafteiu6/AXFsGRpLV3x9xpv7ti2kPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxtwQW%2FdJMcafteiu6%2FAXFsGRpLV3x9xpv7ti2kPk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1049&quot; height=&quot;137&quot; data-origin-width=&quot;1049&quot; data-origin-height=&quot;137&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;ifupdown은 init-ifupdown 이라는 패키지명으로 관리되고 있는 것을 &amp;ldquo;oe-pkgdata-util find-path /etc/network/interfaces&amp;rdquo; 명령을 활용해 확인하였다. 이 /etc/network/interfaces 파일은 ifupdown 유틸리티가 특정 네트워크 인터페이스를 활성화시킬 때 참조하는 설정 파일이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1115&quot; data-origin-height=&quot;643&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eg4sC2/dJMcagTet28/kLuzhEIHkC8tEmkCIBD4K1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eg4sC2/dJMcagTet28/kLuzhEIHkC8tEmkCIBD4K1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eg4sC2/dJMcagTet28/kLuzhEIHkC8tEmkCIBD4K1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Feg4sC2%2FdJMcagTet28%2FkLuzhEIHkC8tEmkCIBD4K1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1115&quot; height=&quot;643&quot; data-origin-width=&quot;1115&quot; data-origin-height=&quot;643&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;기존의 /etc/network/interfaces는 위와 같은 내용으로 작성되어 있다. 여기서 중점적으로 볼 부분은 wlan0 인터페이스이다. 이 파일에서는 wlan0 인터페이스를 부팅 과정에서 자동으로 활성화 시켜주지 않고 있으며, 또한 &amp;ldquo;ifup wlan0&amp;rdquo;와 같은 명령으로 wlan0 인터페이스가 활성화 될 때에는 /etc/wpa_supplicant.conf 파일을 참조하여 wlan0 인터페이스를 초기화하는 것까지 파악하였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;본 과정에서는 이 /etc/network/interfaces 파일을 아래와 같은 내용으로 오버라이딩 될 수 있도록, 새 interfaces 파일을 생성한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780032557371&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;vi path/to/poky/meta-custom/recipes-connectivity/init-updown/files/interfaces&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;새로이 생성된 interfaces 파일은 아래와 같은 내용으로 작성한다. 이 파일은 wlan0 인터페이스가 부팅 과정에서 자동으로 활성화(auto wlan0) 될 수 있도록 하고, 활성화 과정에서는 /etc/wpa_supplicant.conf 파일을 참조하여 초기화 될 수 있도록 한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780032571335&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# /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&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이제 생성된 interfaces 파일이 기존의 /etc/network/interfaces 파일을 오버라이딩 할 수 있도록 하기 위해 .bbappend 파일을 아래와 같이 생성해준다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780032589277&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;vi path/to/poky/meta-custom/recipes-connectivity/init-updown/init-updown_%.bbappend&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;생성한 init-updown_%.bbappend 파일의 내용은 아래와 같이 작성해준다. 이 레시피 파일은 기존의 init-updown.bb 레시피 파일의 do_install()이 끝난 후 실행된다. 그렇기 때문에 기존의 /etc/network/interfaces 파일을 새 interfaces 파일로 덮어쓸 수 있게된다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780032604535&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;FILESEXTRAPATHS:prepend := &quot;${THISDIR}/files:&quot;

SRC_URI += &quot;file://interfaces&quot;

do_install:append() {
    install -m 0644 ${WORKDIR}/interfaces ${D}${sysconfdir}/network/interfaces
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;init-updown 패키지의 오버라이딩을 위한 관련 파일 생성을 마쳤다면, 이제 앞선 방법과 동일한 방식으로 wpa_supplicant.conf 파일이 /etc/ 하위에 오버라이딩하는 방법을 설명한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;가장 먼저, 새 wpa_supplicant.conf 파일을 생성해준 뒤 Raspberry Pi 4에서 접근할 와이파이 AP에 대한 SSID와 PW를 wpa_passphrase 명령으로 생성해준다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780032619362&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd path/to/meta-custom/recipes-connectivity/wpa-supplicant/files/
touch wpa_supplicant.conf
wpa_passphrase &amp;ldquo;SSID&amp;rdquo; &amp;ldquo;PW&amp;rdquo; &amp;gt;&amp;gt; wpa_supplicant.conf&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;생성된 wpa_supplicant.conf 내용은 아래 파일과 같은 형식으로 작성되어야 한다. 이 페이지를 따라하는 독자 환경에서의 와이파이 AP에 대한 SSID와 PW는 다를 것이므로 network = {} 내부의 내용은 다를 것이다. 하지만, 가장 윗 줄의 ctrl_interface는 동일하게 작성되어야 하므로 추가로 작성해준다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780032636169&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ctrl_interface=DIR=/var/run/wpa_supplicant

# Typical minimal wifi setup:
network={
        ssid=&quot;KT_GiGA_5G_61DA&quot;
        key_mgmt=WPA-PSK
        psk=c1eecfdaada84f88402828aeabe864cf3bc8e9ebf98365039dd59d5e3c802066
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이제 생성된 wpa_supplicant.conf 파일이 기존의 /etc/wpa_supplicant.conf 파일을 오버라이딩 할 수 있도록 하기 위해 .bbappend 파일을 아래와 같이 생성해준다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780032650908&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;vi path/to/poky/meta-custom/recipes-connectivity/wpa-supplicant/wpa-supplicant_%.bbappend&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;생성한 wpa-supplicant_%.bbappend 파일의 내용은 아래와 같이 작성해준다. 이 레시피 파일은 기존의 wpa-supplicant.bb 레시피 파일의 do_install()이 끝난 후 실행된다. 그렇기 때문에 기존의 /etc/wpa_supplicant.conf 파일을 새 wpa_supplicant.conf 파일로 덮어쓸 수 있게된다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780032671478&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;FILESEXTRAPATHS:prepend := &quot;${THISDIR}/files:&quot;

SRC_URI += &quot;file://wpa_supplicant.conf&quot;

do_install:append() {
    install -m 0600 ${WORKDIR}/wpa_supplicant.conf ${D}${sysconfdir}/wpa_supplicant.conf
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이제 Raspberry Pi 4의 내장 와이파이 모듈을 사용하기 위한 드라이버와 유틸리티 그리고 설정 파일을 이미지에 빌드시키기 위한 모든 준비 과정을 마쳤다. 다음 섹션에서는 실제 빌드를 수행 후 이미지를 SD 카드에 구운 뒤 Raspberry Pi 4에서 어떠한 결과가 나타나는지 확인한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #dddddd; font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;Raspberry Pi 4 이미지 빌드 후 부팅 결과&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;앞 섹션 과정을 이미지에 빌드 시키기 위해 아래 명령을 실행한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780032694704&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;source path/to/poky/oe-init-build-env build
bitbake core-image-full-cmdline&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1086&quot; data-origin-height=&quot;658&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QIdFp/dJMb990TJSg/vCj4S82BN2X6fyVMCxknqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QIdFp/dJMb990TJSg/vCj4S82BN2X6fyVMCxknqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QIdFp/dJMb990TJSg/vCj4S82BN2X6fyVMCxknqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQIdFp%2FdJMb990TJSg%2FvCj4S82BN2X6fyVMCxknqk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;682&quot; height=&quot;413&quot; data-origin-width=&quot;1086&quot; data-origin-height=&quot;658&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR'; letter-spacing: 0px;&quot;&gt;이미지 빌드를 성공적으로 마쳤다면, 빌드가 완료된 이미지가 저장된 경로에 위치한 .wic.bz2 파일을 SD 카드에 구워준다. 이를 위해 다음 명령을 사용한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;※ SD 카드는 fdisk 명령 등을 활용해 완전히 초기화된 상태로 사용하는 것을 권장한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1780032838364&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd path/to/poky/build/tmp/deploy/images/raspberrypi4/
bzcat core-image-full-cmdline-raspberrypi4.wic.bz2 | sudo dd of=/dev/sde&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이미지 굽기가 끝났다며 이제 SD 카드를 Raspberry Pi 4에 꽂은 후 부팅한다. 부팅 후 dmesg와 ip a 명령을 실행하면 관련 와이파이 드라이버가 실행된 결과를 커널 로그에 찍혀있는 것을 확인할 수 있으며, 동시에 wlan0 인터페이스가 자동으로 AP를 찾은 후 IP 주소를 할당받은 것을 확인 가능하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1112&quot; data-origin-height=&quot;452&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccaOVA/dJMcagZWD1K/oKD9zGtxM5qZ11ouiokLsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccaOVA/dJMcagZWD1K/oKD9zGtxM5qZ11ouiokLsk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccaOVA/dJMcagZWD1K/oKD9zGtxM5qZ11ouiokLsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FccaOVA%2FdJMcagZWD1K%2FoKD9zGtxM5qZ11ouiokLsk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1112&quot; height=&quot;452&quot; data-origin-width=&quot;1112&quot; data-origin-height=&quot;452&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Linux/Yocto</category>
      <author>pak-ji</author>
      <guid isPermaLink="true">https://pak-j.tistory.com/97</guid>
      <comments>https://pak-j.tistory.com/97#entry97comment</comments>
      <pubDate>Fri, 29 May 2026 14:15:08 +0900</pubDate>
    </item>
    <item>
      <title>[Yocto 학습] 7장: Poky를 활용한 Raspberry Pi 4 이미지 빌드</title>
      <link>https://pak-j.tistory.com/96</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #dddddd; font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;개요&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;필자는 Yocto 학습을 위해 Windows 11 머신을 활용하고 있는 중이다. 그래서 WSLv2를 설치하고 그 위에 Ubuntu를 올려서 학습 환경을 구성하였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;만약, 베어메탈로 Ubuntu 머신을 구성해서 사용한다면 Raspberry Pi 4의 SD 카드를 머신에서 구울 때 Passthrough가 필요 없겠지만, 앞서 설명하였다시피 필자는 WSL에 Ubuntu를 올려서 Yocto를 학습하고 있는터라 물리적인 장치(SD 카드)를 WSL/Ubuntu에서 인식되게 하려면 Passthrough를 구성하는 과정이 필수적으로 필요하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;따라서, 본 페이지에서는 WSL/Ubuntu 환경에서 Yocto를 활용해 Raspberry Pi 4의 이미지를 빌드하는 과정을 먼저 설명하고, 그 이후에 SD 카드를 WSL/Ubuntu로 Passthrough하여 이미지를 굽는 과정을 설명한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #dddddd; font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;Raspberry Pi 4 이미지 빌드&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; Raspberry Pi 4 이미지 빌드를 위해 가장 먼저, Poky 빌드 환경을 Git으로부터 다운로드 받는다. &lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779777067225&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git clone git://git.yoctoproject.org/poky -b kirkstone&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;Poky&amp;nbsp;빌드&amp;nbsp;환경을&amp;nbsp;다운로드&amp;nbsp;받았다면,&amp;nbsp;이제&amp;nbsp;Raspberry&amp;nbsp;Pi를&amp;nbsp;빌드를&amp;nbsp;위한&amp;nbsp;레이어를&amp;nbsp;오픈&amp;nbsp;임베디드&amp;nbsp;프로젝트로부터&amp;nbsp;다운로드&amp;nbsp;받는다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779777087958&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd poky
source oe-init-build-env build
bitbake-layers layerindex-fetch meta-raspberrypi&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; Poky 빌드 환경과 Raspberry Pi 빌드 레이어를 다운로드 받았다면, 이제 Bitbake가 빌드를 수행할 때 Raspberry Pi 4 머신을 타겟으로 빌드할 수 있도록 설정 파일(conf/local.conf)을 수정한다. &lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779777124623&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;vi build/conf/local.conf&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;292&quot; data-origin-height=&quot;108&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rrFlC/dJMcah5EG7e/aYvXRHgKmyHLh3ajCxM9T1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rrFlC/dJMcah5EG7e/aYvXRHgKmyHLh3ajCxM9T1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rrFlC/dJMcah5EG7e/aYvXRHgKmyHLh3ajCxM9T1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrrFlC%2FdJMcah5EG7e%2FaYvXRHgKmyHLh3ajCxM9T1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;419&quot; height=&quot;155&quot; data-origin-width=&quot;292&quot; data-origin-height=&quot;108&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이제 Raspberry Pi 4 빌드를 위해 Bitbake 명령으로 이미지 빌드를 수행한다. (꽤 오랜 시간 걸림.. WSL 환경 기준)&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779777177466&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;bitbake core-image-full-cmdline&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;930&quot; data-origin-height=&quot;432&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpGNmI/dJMcaicq1xg/Hsen7Yp2TQBdIYqvVJ7s0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpGNmI/dJMcaicq1xg/Hsen7Yp2TQBdIYqvVJ7s0k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpGNmI/dJMcaicq1xg/Hsen7Yp2TQBdIYqvVJ7s0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpGNmI%2FdJMcaicq1xg%2FHsen7Yp2TQBdIYqvVJ7s0k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;930&quot; height=&quot;432&quot; data-origin-width=&quot;930&quot; data-origin-height=&quot;432&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; Raspberry Pi 4 빌드가 완료되었다면 .wic.bz2 형식의 이미지 파일이 생성되었을 것이다. .wic 형식은 이미지 구성을 위한 디스크의 파티션 분할과 각 파티션에 대한 파일 포맷을 정의하기 위해 사용한다. Linux의 dd 명령은 이 .wic에 정의된 이미지 구성을 참조하여 SD 카드를 굽는다. (bz2는 압축 파일 형식이다.)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1128&quot; data-origin-height=&quot;149&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dYPgUt/dJMcacpJlZH/FNkqSrgLiKnrlDj2eoBsZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dYPgUt/dJMcacpJlZH/FNkqSrgLiKnrlDj2eoBsZ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dYPgUt/dJMcacpJlZH/FNkqSrgLiKnrlDj2eoBsZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdYPgUt%2FdJMcacpJlZH%2FFNkqSrgLiKnrlDj2eoBsZ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1128&quot; height=&quot;149&quot; data-origin-width=&quot;1128&quot; data-origin-height=&quot;149&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;생성된 이미지 파일(.wic.bz2)은 poky/build/tmp/deploy/images/raspberrypi/ 하위에 위치한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이제, 이미지를 SD 카드에 굽기 위해 WSL/Ubuntu 환경으로 SD 카드를 Passthrough 하는 과정을 설명한다. 만약, 본인의 머신이 Passthrough가 굳이 필요하지 않는 환경이라면 다음 섹션(SD 카드를 WSL/Ubuntu로 Passthrough)은 생략하면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #dddddd; font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;SD 카드를 WSL/Ubuntu로 Passthrough&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Windows 머신에서 Powershell을 관리자 모드로 실행시킨 후 아래 명령을 입력한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779777368499&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;winget install dorssel.usbipd-win&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; usbipd-win은 Windows 머신에 꽂힌 SD 카드를 WSL로 Passthrough하기 위해 사용하는 툴이다. 해당 툴을 다운로드 받은 뒤 SD 카드가 꽂힌 슬롯의 BUSID를 찾는다. &lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779777395340&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;usbipd list&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;816&quot; data-origin-height=&quot;327&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rf0Dg/dJMb99T2QXg/wT154dfdHbvW7EZKs8zC8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rf0Dg/dJMb99T2QXg/wT154dfdHbvW7EZKs8zC8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rf0Dg/dJMb99T2QXg/wT154dfdHbvW7EZKs8zC8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Frf0Dg%2FdJMb99T2QXg%2FwT154dfdHbvW7EZKs8zC8k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;711&quot; height=&quot;285&quot; data-origin-width=&quot;816&quot; data-origin-height=&quot;327&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;필자는 Windows 머신으로 삼성 갤럭시북을 사용하고 있으며, 이 갤럭시북에서 제공하는 SD 카드 슬롯은 Genesys Logic USB3.9 Card Reader로 인식된다. 인식된 슬롯은 BUSID는 2-16임을 최종적으로 확인하였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;확인된 BUSID 값을 활용해 다음 명령을 통해 WSL 환경으로 Passthrough 한다. Passthrough 과정에서 WSL/Ubuntu 머신은 반드시 켜져있어야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779777454273&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;usbipd bind --busid 2-16
usbipd attach --wsl --busid 2-16&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;973&quot; data-origin-height=&quot;314&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsW0WN/dJMcaftbQgt/aARrBzFPHF0KqYosuVulKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsW0WN/dJMcaftbQgt/aARrBzFPHF0KqYosuVulKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsW0WN/dJMcaftbQgt/aARrBzFPHF0KqYosuVulKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsW0WN%2FdJMcaftbQgt%2FaARrBzFPHF0KqYosuVulKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;718&quot; height=&quot;232&quot; data-origin-width=&quot;973&quot; data-origin-height=&quot;314&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이제 WSL/Ubuntu 머신에서 아래 명령을 실행시키면 SD 카드가 정상적으로 인식되는 것을 확인가능하다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779777506676&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;lsblk&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1160&quot; data-origin-height=&quot;530&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ca9zjJ/dJMcagFGEBX/QAK8A59OE1PhuVybsbsiVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ca9zjJ/dJMcagFGEBX/QAK8A59OE1PhuVybsbsiVK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ca9zjJ/dJMcagFGEBX/QAK8A59OE1PhuVybsbsiVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fca9zjJ%2FdJMcagFGEBX%2FQAK8A59OE1PhuVybsbsiVK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;536&quot; height=&quot;530&quot; data-origin-width=&quot;1160&quot; data-origin-height=&quot;530&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;위 그림에서 볼 수 있듯이 필자가 사용하던 SD 카드는 FAT32 형식으로 포맷되어 있다. 그래서 FAT32으로 포맷된 파티션을 제거하여 완전히 초기화된 상태의 SD 카드로 만들어주었다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779777572503&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo fdisk /dev/sde

### fdisk 명령 ###
d # 디스크의 파티션 삭제
p # 디스크의 현재 파티션 확인
w # 디스크를 현재 상태로 저장 후 종료&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;859&quot; data-origin-height=&quot;589&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c42lDe/dJMcabRPc6Q/B2DUW6a5yw463p74pDTIXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c42lDe/dJMcabRPc6Q/B2DUW6a5yw463p74pDTIXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c42lDe/dJMcabRPc6Q/B2DUW6a5yw463p74pDTIXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc42lDe%2FdJMcabRPc6Q%2FB2DUW6a5yw463p74pDTIXk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;578&quot; height=&quot;396&quot; data-origin-width=&quot;859&quot; data-origin-height=&quot;589&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이제 앞 섹션에서 생성한 이미지 파일(.wic.bz2)을 SD 카드로 구워준다. 굽는 과정은 다음 섹션을 참조하면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #dddddd; font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;SD 카드에 Raspberry Pi 4 이미지 굽기&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;SD 카드에 Raspberry Pi 4 이미지를 굽기 위해서 dd 명령을 다음과 같이 활용한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1779777797376&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;bzcat core-image-full-cmdline-raspberrypi4.wic.bz2 | sudo dd of=/dev/sde&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;994&quot; data-origin-height=&quot;130&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJR44q/dJMcacDhmY6/dNVVoSrIeIvBShVdRRsBzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJR44q/dJMcacDhmY6/dNVVoSrIeIvBShVdRRsBzK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJR44q/dJMcacDhmY6/dNVVoSrIeIvBShVdRRsBzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJR44q%2FdJMcacDhmY6%2FdNVVoSrIeIvBShVdRRsBzK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;737&quot; height=&quot;96&quot; data-origin-width=&quot;994&quot; data-origin-height=&quot;130&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;SD 카드로 이미지가 정상적으로 구워졌는지 확인하기 위해 lsblk와 mount 명령을 사용할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1076&quot; data-origin-height=&quot;415&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vSUoR/dJMb997Anu3/Z2MNbsa1sseksaQv0DM9Jk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vSUoR/dJMb997Anu3/Z2MNbsa1sseksaQv0DM9Jk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vSUoR/dJMb997Anu3/Z2MNbsa1sseksaQv0DM9Jk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvSUoR%2FdJMb997Anu3%2FZ2MNbsa1sseksaQv0DM9Jk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;663&quot; height=&quot;256&quot; data-origin-width=&quot;1076&quot; data-origin-height=&quot;415&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1034&quot; data-origin-height=&quot;463&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qaiKb/dJMcabqO4Mf/GsGHZ55tSrdlbQkHeMMtak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qaiKb/dJMcabqO4Mf/GsGHZ55tSrdlbQkHeMMtak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qaiKb/dJMcabqO4Mf/GsGHZ55tSrdlbQkHeMMtak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqaiKb%2FdJMcabqO4Mf%2FGsGHZ55tSrdlbQkHeMMtak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;690&quot; height=&quot;309&quot; data-origin-width=&quot;1034&quot; data-origin-height=&quot;463&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 이제, Raspberry Pi 4 이미지가 구워진 SD 카드를 하드웨어(Raspberry Pi 4)에 꽂은 후 전원을 인가하여 부팅을 수행한다. 결과는 다음 섹션을 참조하면 된다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #dddddd; font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;구워진 SD 카드로 Raspberry Pi 4 부팅&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 하드웨어(Raspberry Pi 4)에 이미지가 구워진 SD 카드를 꽂은 후 전원을 인가하면, HDMI 케이블을 통해 다음과 같은 화면이 출력되는 것을 확인가능하다. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;332&quot; data-origin-height=&quot;324&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bh32Eh/dJMb997Anzr/50ef7E5icr9AXjqnyOw1y1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bh32Eh/dJMb997Anzr/50ef7E5icr9AXjqnyOw1y1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bh32Eh/dJMb997Anzr/50ef7E5icr9AXjqnyOw1y1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbh32Eh%2FdJMb997Anzr%2F50ef7E5icr9AXjqnyOw1y1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;281&quot; height=&quot;324&quot; data-origin-width=&quot;332&quot; data-origin-height=&quot;324&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt; 부팅이 완료된 후에는 계정명을 root로 입력하면 쉘이 실행되는 것을 확인할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;609&quot; data-origin-height=&quot;331&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcdzoj/dJMcaffH79c/tqKxDBM61V8J1sWh3OioF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcdzoj/dJMcaffH79c/tqKxDBM61V8J1sWh3OioF1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcdzoj/dJMcaffH79c/tqKxDBM61V8J1sWh3OioF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbcdzoj%2FdJMcaffH79c%2FtqKxDBM61V8J1sWh3OioF1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;488&quot; height=&quot;265&quot; data-origin-width=&quot;609&quot; data-origin-height=&quot;331&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;※ 다음 장부터는 본 페이지에서 구성한 Raspberry Pi 4의 Poky 빌드 환경을 활용해 기본적인 WiFi 설정(8장)과 Hello 예제 애플리케이션(9장)을 빌드하여 이미지에 등록하는 방법에 대해서 설명한다.&lt;/span&gt; &lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #dddddd; font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;&lt;b&gt;트러블슈팅&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;gcc와 binutils 크로스컴파일 과정 중 의존성 문제 발생&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1120&quot; data-origin-height=&quot;530&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ojEsZ/dJMcaf7LTsr/BbB2oKp4nQUNxnGsHnbz51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ojEsZ/dJMcaf7LTsr/BbB2oKp4nQUNxnGsHnbz51/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ojEsZ/dJMcaf7LTsr/BbB2oKp4nQUNxnGsHnbz51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FojEsZ%2FdJMcaf7LTsr%2FBbB2oKp4nQUNxnGsHnbz51%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1120&quot; height=&quot;530&quot; data-origin-width=&quot;1120&quot; data-origin-height=&quot;530&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #000000;&quot;&gt;이미지가 빌드되는 과정 중 gcc와 binutils 패키지가 정상적으로 빌드되지 않고 종료된 것을 확인하였다. 이를 위해 빌드 로그를 분석해보니 주로 링커가 라이브러리를 연결하는 과정에서 문제가 발생한 것이였다. WSL 환경에서 빌드를 수행하다보니 한정된 메모리를 사용하는 것이 문제가 된 것 같다. 그래서 이를 해결하고자 아래와 같은 방법으로 gcc와 binutils에 대한 빌드 캐시를 삭제하고 다시 설치를 진행하였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;375&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cFqwLV/dJMcaffH8jX/cNkGNiBmCvXWxguVq3R2n0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cFqwLV/dJMcaffH8jX/cNkGNiBmCvXWxguVq3R2n0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cFqwLV/dJMcaffH8jX/cNkGNiBmCvXWxguVq3R2n0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcFqwLV%2FdJMcaffH8jX%2FcNkGNiBmCvXWxguVq3R2n0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;768&quot; height=&quot;375&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;375&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;729&quot; data-origin-height=&quot;356&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkVrmY/dJMcafNyrQa/qfvmFZtrj4amFMgaf8Sy41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkVrmY/dJMcafNyrQa/qfvmFZtrj4amFMgaf8Sy41/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkVrmY/dJMcafNyrQa/qfvmFZtrj4amFMgaf8Sy41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkVrmY%2FdJMcafNyrQa%2FqfvmFZtrj4amFMgaf8Sy41%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;729&quot; height=&quot;356&quot; data-origin-width=&quot;729&quot; data-origin-height=&quot;356&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Linux/Yocto</category>
      <author>pak-ji</author>
      <guid isPermaLink="true">https://pak-j.tistory.com/96</guid>
      <comments>https://pak-j.tistory.com/96#entry96comment</comments>
      <pubDate>Tue, 26 May 2026 14:18:09 +0900</pubDate>
    </item>
    <item>
      <title>[Yocto 학습] 6장: 레시피(*.bb, *.bbappend) 커스터마이징 방법 - 2</title>
      <link>https://pak-j.tistory.com/94</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #dddddd; color: #000000;&quot;&gt;.bbappend 레시피의 사용 목적&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;일반적으로 프로젝트에는 필요한 기능을 이미 제공하는 일련의 레이어가 존재한다. 이러한 기존의 레이어에서 특정 요구사항을 반영하기 위해 변경을 가해야한다.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이를 위해서 .bbappend 파일을 활용 할 수 있으며, 이를 통해 기존 레이어 구조를 유지한 채로 변경이 가능하다.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;.bbappend의 파일명에는 % 와일드카드를 사용할 수 있으며, 주로 패키지의 버전별로 요구사항을 반영할 때 활용가능하다.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;예를 들어, app_1.2.3.bb 파일이 존재할 때 다음과 같은 규칙으로 .bbappend 파일을 생성할 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #dddddd; color: #000000;&quot;&gt;.bbappend로 .bb에 작성된 태스크 확장방법&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;앞 &amp;ldquo;3장: 비트베이크 문법&amp;rdquo;에서 :append와 :prepend 키워드를 살펴보았었다.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이 두 키워드는 변수의 확장뿐만 아니라 태스크의 확장 또한 가능하다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1778995383197&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;do_install:append() {
	# append task
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;예를 들어, 기존 레시피의 do_install()에 추가 태스크를 작업하려면 위와 같이 작성 가능하다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #dddddd; color: #000000;&quot;&gt;.bbappend로 .bb에 작성된 빌드 옵션 수정 방법&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Yocto 프로젝트의 경우 다양한 Make, Cargo, Autotools 등 다양한 빌드 시스템을 제공한다. 따라서, Yocto에서는 이를 위해 각 빌드 시스템의 빌드 옵션을 수정할 수 있는 변수들을 제공한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 89.8838%; height: 108px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;빌드 시스템&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;변수&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Autotools&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: left;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;EXTRA_OECONF&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Cargo&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: left;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;EXTRA_OECARGO&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;CMake&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: left;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;EXTRA_OECMAKE&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Make&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: left;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;EXTRA_OEMAKE&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Meson&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: left;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;EXTRA_OEMESON&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;NPM&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: left;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;EXTRA_OENPM&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;SCons&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: left;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;EXTRA_OESCONS&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;WAF&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: left;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;EXTRA_OEWAF&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Autotools 기반의 애플리케이션을 빌드하기 위한 빌드 옵션은 다음과 같이 작성할 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1778995637516&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 새 기능 활성화 및 예전 기능 비활성화
EXTRA_OECONF += &amp;ldquo;--enable-new-feature --disable-old-feature&amp;rdquo;

# arm 환경일 경우, 새 기능 활성화
EXTRA_OECONF:append:arm = &amp;ldquo;--enable-new-feature&amp;rdquo;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #dddddd; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;.bbappend로 .bb에 작성된 소스에 패치를 적용하는 방법 &lt;b&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;새 패치를 적용해야 하는 경우, 패치 파일을 비트베이크가 찾을 수 있도록 해주어야 한다.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;비트베이크는 패키지를 빌드하기 위한 소스 파일의 경로를 FILESPATH 변수로 검색한다.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;레시피에서는 일반적으로 FILESPATH를 건들이지 않고 FILESEXTRAPATH를 수정한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1778995681400&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 예시 1. 새 패치 적용 방법

FILESEXTRAPATHS:prepend := &amp;ldquo;${THISDIR}/${PN}-${PV}:&amp;rdquo;
SRC_URI += &amp;ldquo;file://newpatch.patch&amp;rdquo;

&amp;mdash;
# 예시 2. 새 설정 설치 방법

FILESEXTRAPATHS:prepend := &amp;ldquo;${THISDIR}/${PN}-${PV}:&amp;rdquo;
SRC_URI += &amp;ldquo;file://newconfig.conf

do_install:append() {
install -D -m 644 ${WORKDIR}/newconfig.conf ${D}${sysconfdir}/newconfig.conf
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;예시 1은 새 패치를 적용하기 위한 .patch 파일을 등록하는 .bbappend 예시이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;예시 2는 새 설정을 이미지에 설치하기 위한 .conf 파일을 등록하는 .bbappend 예시이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;예시 1과 2에 사용된 THISDIR과 PN 그리고 PV 변수는 다음과 같은 역할을 한다.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;THISDIR: 현재 .bbappend가 위치한 디렉터리 경로&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;PN: 패키지 이름 (Ex. app_1.2.3.bbappend에서 app 부분)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;PV: 패키지 버전 (Ex. app_1.2.3.bbappend에서 1.2.3. 부분)&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;비트베이크는 패키지를 빌드하기 위한 소스 파일을 다음과 같은 순서로 검색한다.&lt;/span&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;lt;recipe&amp;gt;-&amp;lt;version&amp;gt;/&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;lt;recipe&amp;gt;/&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;files/&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1340&quot; data-origin-height=&quot;207&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rkcN1/dJMcacb4rJH/efgT1UIEHXmYxOQXhehk11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rkcN1/dJMcacb4rJH/efgT1UIEHXmYxOQXhehk11/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rkcN1/dJMcacb4rJH/efgT1UIEHXmYxOQXhehk11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrkcN1%2FdJMcacb4rJH%2FefgT1UIEHXmYxOQXhehk11%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;693&quot; height=&quot;107&quot; data-origin-width=&quot;1340&quot; data-origin-height=&quot;207&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;주로 패치 파일은 &amp;lt;recipe&amp;gt;/files/ 하위에 존재한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1368&quot; data-origin-height=&quot;392&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/noqUB/dJMcaiJ4Z1p/XWTQsapcJi1UnKK3vz0KSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/noqUB/dJMcaiJ4Z1p/XWTQsapcJi1UnKK3vz0KSk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/noqUB/dJMcaiJ4Z1p/XWTQsapcJi1UnKK3vz0KSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnoqUB%2FdJMcaiJ4Z1p%2FXWTQsapcJi1UnKK3vz0KSk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;707&quot; height=&quot;203&quot; data-origin-width=&quot;1368&quot; data-origin-height=&quot;392&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;FILESPATH 혹은 FILESEXTRAPATH 등과 같은 변수가 잘 설정되었는지 확인하기 위해 bitbake-getvar 명령을 확인해볼 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #dddddd; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;레시피에서 참조하는 rootfs 경로 변수&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;아래 예시와 같이 레시피에 sysconfdir 등의 경로 변수가 사용되는 경우가 존재한다.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이는 일반적인 리눅스의 rootfs 이미지의 루트(/) 경로를 기반한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 89.8838%; height: 108px;&quot; border=&quot;1&quot; data-ke-style=&quot;style1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;변수&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;기본 경로&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;base_bindir&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;/bin&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;base_sbindir&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;/sbin&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;sysconfdir&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;/etc&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;localstatedir&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;/var&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;datadir&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;/usr/share&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;bindir&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;/usr/bin&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;sbindir&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;/usr/sbin&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;libdir&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;/usr/lib 또는 /usr/lib64&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;libexecdir&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;/usr/libexec&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;includedir&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;/usr/include&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;기본적으로 이 경로들은 poky/meta/conf/bitbake.conf 파일에서 시작되어 설정된다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1778996323858&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;FILESEXTRAPATHS:prepend := &amp;ldquo;${THISDIR}/${PN}-${PV}:&amp;rdquo;
SRC_URI += &amp;ldquo;file://newconfig.conf

do_install:append() {
install -D -m 644 ${WORKDIR}/newconfig.conf ${D}${sysconfdir}/newconfig.conf
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;예를 들어, 위와 같은 .bbappend 레시피 파일이 존재할 경우,&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;${D}${sysconfdir}은 /tmp/.../image/etc/를 나타낸다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이렇듯 레시피 결과물은 rootfs 구조를 따라 최종적으로 이미지로 변환되기 전에 임시 저장된다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #dddddd; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;레시피를 활용해 커널 컴파일 옵션을 변경하는 방법&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;리눅스 커널은 오픈소스로 관리되는 커널이기 때문에 매우 방대한 소스를 가지고 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그렇기에 커널 컴파일 옵션 설정 또한 패키지 관리에 중요한 능력이라고 볼 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;본 절에서는 리눅스 커널 컴파일 옵션을 .cfg 파일로 생성하는 방법을 알아본다.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;가장 먼저, 아래 명령을 통해서 커널 컴파일 옵션 메뉴를 실행시킨다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1778996418518&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ bitbake virtual/kernel -c menuconfig&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;컴파일 옵션 메뉴를 실행시켰으면, 필요한 옵션을 활성화/비활성화한다.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;본 절에서는 커널에 CAN 버스를 활성화시키는 것을 예시로 든다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1004&quot; data-origin-height=&quot;544&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/diIUhM/dJMcaarOrO4/4FFeNx0eZox6d565ZpOark/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/diIUhM/dJMcaarOrO4/4FFeNx0eZox6d565ZpOark/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/diIUhM/dJMcaarOrO4/4FFeNx0eZox6d565ZpOark/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdiIUhM%2FdJMcaarOrO4%2F4FFeNx0eZox6d565ZpOark%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;681&quot; height=&quot;369&quot; data-origin-width=&quot;1004&quot; data-origin-height=&quot;544&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;menuconfig을 통해 CAN 버스를 활성화하였다면 Save하여 .config 파일로 저장한다.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;그후 아래 명령을 통해서 기존 컴파일 옵션과 다른 부분을 .cfg 파일로 생성해낸다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1778996458826&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ bitbake virtual/kernel -c diffconfig&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1641&quot; data-origin-height=&quot;648&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tjAaj/dJMcaak0v0P/V73vC9x1RzKu2t5OKHdPP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tjAaj/dJMcaak0v0P/V73vC9x1RzKu2t5OKHdPP0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tjAaj/dJMcaak0v0P/V73vC9x1RzKu2t5OKHdPP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtjAaj%2FdJMcaak0v0P%2FV73vC9x1RzKu2t5OKHdPP0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;805&quot; height=&quot;275&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1641&quot; data-origin-height=&quot;648&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;생성된 설정 파일(.cfg)에 대한 경로가 출력되는 것을 볼 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;509&quot; data-origin-height=&quot;341&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cRDeiR/dJMcajvudVI/3yPge3hltyAxiNMR7t0jJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cRDeiR/dJMcajvudVI/3yPge3hltyAxiNMR7t0jJ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cRDeiR/dJMcajvudVI/3yPge3hltyAxiNMR7t0jJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcRDeiR%2FdJMcajvudVI%2F3yPge3hltyAxiNMR7t0jJ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;452&quot; height=&quot;303&quot; data-origin-width=&quot;509&quot; data-origin-height=&quot;341&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;.cfg 파일은 일반적인 리눅스 커널 컴파일을 위한 설정 파일과 동일한 형식임을 확인가능하다.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이렇게 생성된 .cfg 파일과 .bbappend 레시피 파일을 함께 활용해 커널 등의 컴파일 옵션을 수정 가능하다.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이는 KConfig을 활용하는 여러 프로젝트(U-Boot, Linux Kernel, BusyBox 등)에서 활용가능한 방법이다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;# 다음 장에서는 실제로 레이어를 구성하고 이를 위한 레시피를 작성해서 컴파일을 완료한 뒤에 라즈베리파이를 부팅시키는 예제를 설명한다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Linux/Yocto</category>
      <author>pak-ji</author>
      <guid isPermaLink="true">https://pak-j.tistory.com/94</guid>
      <comments>https://pak-j.tistory.com/94#entry94comment</comments>
      <pubDate>Tue, 12 May 2026 16:48:14 +0900</pubDate>
    </item>
    <item>
      <title>[Yocto 학습] 5장: 레시피(*.bb, *.bbappend) 커스터마이징 방법 - 1</title>
      <link>https://pak-j.tistory.com/93</link>
      <description>&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #dddddd; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;레시피의 종류&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;비트베이크의 레시피에는 두 종류의 레시피가 존재하며, 각 레시피는 간략히 다음과 역할을 한다.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Image 레시피: 패키지들을 묶어 최종 파일 시스템 구조(rootfs)를 생성&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Package 레시피: 소스코드를&amp;nbsp;가져와&amp;nbsp;컴파일하고&amp;nbsp;하나의&amp;nbsp;패키지로&amp;nbsp;생성 &lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Image 레시피&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1778569186422&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 1.

require recipes-extended/images/core-image-full-cmdline.bb

IMAGE_FEATURES:remove = &quot;splash&quot;
CORE_IMAGE_EXTRA_INSTALL += &quot;myapp&quot;

-------------------------
# 2.

inherit core-image

IMAGE_FEATURES += &quot;ssh-server-openssh splash&quot;
CORE_IMAGE_EXTRA_INSTALL += &quot;strace myapp&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Image 레시피는 기본적으로 위와 같은 구조를 가진다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;1.의 경우, 기존의 core-image-full-cmdline 레시피를 그대로 불러와 이를 수정하는 방법이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;2.의 경우, 이미지 생성을 위한 새 레시피를 작성하는 방법이다. 이땐 core-image를 레시피에서 상속한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;위 레시피에 사용된 IMAGE_FEATURES와 CORE_IMAGE_EXTRA_INSTALL 변수는 다음의 역할을 한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;IMAGE_FEATURES&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이미지에 특정한 기능을 활성화하기 위해 사용하는 변수이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;allow-root-login: SSH로 Root로 로그인할 수 있게 허용해주는 기능&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;allow-empty-password: SSH에서 빈 암호를 사용해 Root로 로그인할 수 있게 허용해주는 기능&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;empty-root-password: 빈 암호로 Root로 로그인 하기 위해 활성화 해줘야하는 기능&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;serial-autologin-root: 시리얼 콘솔에서 자동으로 Root로 접근을 허용해주는 기능&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;dbg-pkgs: 이미지에 설치된 모든 패키지에 디버그 심볼을 설치하는 기능&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;이 외에도 더 많은 기능을 제공하며 다음 링크를 참조하면 된다. &amp;rarr; &lt;a href=&quot;https://docs.yoctoproject.org/3.2.2/ref-manual/ref-features.html#image-features&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;링크&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;CORE_IMAGE_EXTRA_INSTALL&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이미지에 새 패키지를 등록하기 위한 변수이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Package 레시피로 작성된 패키지를 해당 변수에 등록해주면 된다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;여기에 패키지가 등록되어야, Package 레시피가 빌드 시스템에 의해 빌드된다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;레시피 간의 의존 관계&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;(DEPENDS, RDEPENDS 등)&lt;/span&gt;에 따라서도 Package 레시피는 빌드되기도 한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Package 레시피&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1778569404186&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DESCRIPTION = &quot;Simple Helloworld Application&quot;
SECTION = &quot;examples&quot;
LICENSE = &quot;MIT&quot;

SRC_URI = &quot;file://helloworld.c&quot;
SRC_URI[md5sum] = &quot;a1b2c3d4e5f6g7h8i9j0...&quot;
SRC_URI[sha256sum] = &quot;z9y8x7w6v5u4t3s2r1q0...&quot;

S = &quot;${WORKDIR}&quot;

do_compile() {
	${CC} helloworld.c -o helloworld
}

do_install() {
	install -D -m 0755 helloworld ${D}${bindir}/helloworld
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Image 레시피 혹은 의존 관계에 따라 Package 레시피는 비트베이크에 의해서 빌드가 진행된다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;위 Package 레시피는 이미지에 등록될 때 /usr/bin 하위에 바이너리 실행 파일로 등록되는 예제이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Package 레시피에서 사용되는 SRC_URI, D, bindir 등의 변수는 다음과 같은 역할을 한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;SRC_URI&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;빌드 과정 중 do_fetch 태스크 과정에서 소스코드를 다운로드받는 경로를 지정&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;SRC_URI[md5sum, sha256sum]은 다운로드 받은 소스가 변경되지 않았는지 확인하기 위한 목적&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span&gt;이 변수에 대한 자세한 내용은 &lt;a href=&quot;https://pak-j.tistory.com/89&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&quot;[Yocto 학습] 2장&quot;&lt;/a&gt;을 참고&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;D&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;임시 rootfs 경로를 나타냄&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;기본적으로 build/tmp/work/.../&amp;lt;recipe&amp;gt;/&amp;lt;version&amp;gt;/imgae/ 경로로 설정됨&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;bindir&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;rootfs 중 /usr/bin 경로를 가리킴&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;${bindir} 말고도 ${base_bindir}, ${base_sbindir} 등 다양한 rootfs 경로를 비트베이크에서 제공함&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다양한 rootfs 경로는 다음 장에서 이어서 설명&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #dddddd; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;autotools 클래스&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Autotools 기반 프로젝트를 자동으로 configure/build/install 해주는 표준 클래스이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;즉, autoconf와 automake 그리고 libtool 기반의 프로젝트의 자동 빌드를 수행해준다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;대표적으로 소스에 configure.ac, Makefile.am 등 있는 경우 자동 빌드를 수행해준다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1160&quot; data-origin-height=&quot;504&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TXAsn/dJMcabEa1d6/niuZD4iFkkf7sG1MpybqmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TXAsn/dJMcabEa1d6/niuZD4iFkkf7sG1MpybqmK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TXAsn/dJMcabEa1d6/niuZD4iFkkf7sG1MpybqmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTXAsn%2FdJMcabEa1d6%2FniuZD4iFkkf7sG1MpybqmK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1160&quot; height=&quot;504&quot; data-origin-width=&quot;1160&quot; data-origin-height=&quot;504&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;a href=&quot;https://github.com/avnet-embedded/dbus-wait/tree/master&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;dbus-wait 패키지&lt;/a&gt;를 예로 들자면, 해당 패키지는 autoconf와 automake 기반의 프로젝트이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;따라서, 패키지의 소스에는 configure.ac와 Makefile.am이 존재한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이 패키지를 빌드하기 위해서 위 캡쳐와 같이 레시피에서는 inherit autotools을 사용하는 것을 볼 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;inherit은 특정 클래스를 레시피에서 상속받아 사용하기 위한 키워드이다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;※ 다음 장에서는 레시피의 태스크 확장, 소스 패치, rootfs 경로 변수 등을 설명한다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Linux/Yocto</category>
      <author>pak-ji</author>
      <guid isPermaLink="true">https://pak-j.tistory.com/93</guid>
      <comments>https://pak-j.tistory.com/93#entry93comment</comments>
      <pubDate>Tue, 12 May 2026 16:15:44 +0900</pubDate>
    </item>
    <item>
      <title>[Yocto 학습] 4장: 레이어(meta-*) 생성 방법</title>
      <link>https://pak-j.tistory.com/92</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #dddddd; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;레이어 종류&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Poky에는 총 3개 종류의 레이어(BSP, Distro, &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Software&lt;/span&gt;)가 존재하며, 이에 대한 설명은 본 절에서 진행한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;간략하게 각 레이어의 역할은 다음과 같다.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;BSP: 하드웨어(보드)를 부팅시키기 위한 패키지(부트로더, 커널 등)를 정의 (하드웨어에 완전 종속)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Distro: OS에서 어떠한 정책으로 시스템을 운영할 것인지를 정의 (하드웨어에 일부 종속)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Software: 서비스하려는 시스템이 어떠한 기능들을 제공할 것인지를 정의 (하드웨어에 완전 독립)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;BSP(Board Support Package) 레이어&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;419&quot; data-origin-height=&quot;215&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCXpSf/dJMcaaL0Ntl/GOrL6VeK4uaV7PemKZYxk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCXpSf/dJMcaaL0Ntl/GOrL6VeK4uaV7PemKZYxk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCXpSf/dJMcaaL0Ntl/GOrL6VeK4uaV7PemKZYxk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCXpSf%2FdJMcaaL0Ntl%2FGOrL6VeK4uaV7PemKZYxk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;314&quot; height=&quot;161&quot; data-origin-width=&quot;419&quot; data-origin-height=&quot;215&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;특정 하드웨어(보드)를 부팅하고 동작시키기 위한 하드웨어 지원 레이어이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Poky를 다운로드 받으면 기본적으로 meta-yocto-bsp라는 레이어가 존재한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;meta-yocto-bsp에는 머신 설정 파일과 패키지 등 BSP를 위한 레퍼런스로 활용 가능하다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Distro(배포판) 레이어&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;536&quot; data-origin-height=&quot;398&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cT9fap/dJMcagrWe0h/NaYmCwqady41nRNfgDvCkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cT9fap/dJMcagrWe0h/NaYmCwqady41nRNfgDvCkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cT9fap/dJMcagrWe0h/NaYmCwqady41nRNfgDvCkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcT9fap%2FdJMcagrWe0h%2FNaYmCwqady41nRNfgDvCkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;297&quot; data-origin-width=&quot;536&quot; data-origin-height=&quot;398&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;rootfs read-only, package format(rpm/deb 등), debug symbol 추가 등 OS 정책을 정의하는 레이어이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Poky를 다운로드 받으면 기본적으로 meta-poky라는 레이어가 존재한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;새 제품을 구성할 때에 OS의 정책을 설정해야 한다면 meta-poky를 복사해서 주로 사용한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Software 레이어&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;535&quot; data-origin-height=&quot;395&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nPN4a/dJMcajvp9Oe/xvTgQ9n8ofZFNwlAGDNWiK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nPN4a/dJMcajvp9Oe/xvTgQ9n8ofZFNwlAGDNWiK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nPN4a/dJMcajvp9Oe/xvTgQ9n8ofZFNwlAGDNWiK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnPN4a%2FdJMcajvp9Oe%2FxvTgQ9n8ofZFNwlAGDNWiK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;388&quot; height=&quot;286&quot; data-origin-width=&quot;535&quot; data-origin-height=&quot;395&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;애플리케이션과 라이브러리 등 기능 패키지를 제공하는 레이어이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하드웨어에 종속되지 않으며 독립적으로 구성가능한 레이어이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;meta-java, meta-qt5, meta-browser 등 다양한 Software 레이어가 존재한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Software 레이어는 Poky를 다운로드 받을 때 기본적으로 제공되지 않는다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;따라서, Software 레이어는 필요에 따라 새로 작성하거나 다운로드 받아 사용한다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #dddddd; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;외부 레이어 추가 방법&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;새 레이어를 직접 작성해야하는지 아니면, 기존에 작성된 레이어를 사용해야 되는지 애매한 경우가 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이땐, &lt;a href=&quot;https://layers.openembedded.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://layers.openembedded.org/&lt;/a&gt;로 접근하여 필요한 레이어를 새로 작성할 필요가 있는지 확인한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1437&quot; data-origin-height=&quot;472&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/91MLW/dJMcabjUnnK/Pxt9Km2YGY2KMIByVHv5mk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/91MLW/dJMcabjUnnK/Pxt9Km2YGY2KMIByVHv5mk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/91MLW/dJMcabjUnnK/Pxt9Km2YGY2KMIByVHv5mk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F91MLW%2FdJMcabjUnnK%2FPxt9Km2YGY2KMIByVHv5mk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1437&quot; height=&quot;472&quot; data-origin-width=&quot;1437&quot; data-origin-height=&quot;472&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;위 사이트로 접근하면 오픈임베디드에서 관리하는 여러 레이어를 확인 가능하다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;현재 사용 중인 Poky의 버전(master, kirkstone 등)을 선택한 후 적절한 레이어를 검색하면 된다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1778565310575&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ git clone &amp;lt;reposiotry-url&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;적절한 레이어를 찾았다면, 레이어의 Repository 주소를 사용해 다운로드 받는다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1778565727811&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ cd path/to/poky/build/
$ bitbake-layers add-layer ../meta-&amp;lt;layer&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;레이어를 다운로드 받았다면 빌드 디렉터리로 이동한 후 bitbake-layers add-layer 명령을 실행시킨다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;bitbake-layers add-layer를 실행하면 자동으로 meta-&amp;lt;layer&amp;gt;가 빌드 시스템에 자동 등록된다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1303&quot; data-origin-height=&quot;469&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blOyON/dJMcabYuAYB/EaMvkqMBsZGkqwi8tNkEw1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blOyON/dJMcabYuAYB/EaMvkqMBsZGkqwi8tNkEw1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blOyON/dJMcabYuAYB/EaMvkqMBsZGkqwi8tNkEw1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblOyON%2FdJMcabYuAYB%2FEaMvkqMBsZGkqwi8tNkEw1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;788&quot; height=&quot;284&quot; data-origin-width=&quot;1303&quot; data-origin-height=&quot;469&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;위 캡쳐는 meta-oe와 meta-java 레이어를 다운로드 받은 후 bitbake-layers add-layer로 등록한 결과이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;bitbake-layers add-layer 명령으로 레이어를 등록하면, 자동으로 build/conf/bblayers.conf가 업데이트된다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;오픈임베디드에서 내려받은 대부분의 레이어의 경우 meta-oe에 종속되므로, 반드시 meta-oe를 먼저 등록해주어야 한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #dddddd; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;새 레이어 생성 방법&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;만약, 위 절에서 설명한 방법으로 검색해보아도 필요한 레이어가 보이지 않는다면 직접 작성해준다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1778565381942&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ bitbake-layers create-layer path/to/poky/meta-newlayer&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;새 레이어를 생성할 때에는 bitbake-layers create-layer라는 명령을 활용한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이 명령을 사용할 때에 레이어가 생성될 위치는 반드시 Poky 하위로 설정한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1778567347150&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ cd path/to/poky/build/
$ bitbake-layers add-layer ../meta-newlayer&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;새로운 레이어(meta-newlayer)를 생성하였다면, 이제 빌드 시스템에서 이를 인지할 수 있도록 한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;앞 절에서 설명하였다시피, bitbake-layers add-layer 명령으로 새 레이어를 빌드 시스템에 인지시킬 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1167&quot; data-origin-height=&quot;547&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kQvM7/dJMcadu9yUr/0w0V0JZKIt3DzCUhQdui3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kQvM7/dJMcadu9yUr/0w0V0JZKIt3DzCUhQdui3k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kQvM7/dJMcadu9yUr/0w0V0JZKIt3DzCUhQdui3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkQvM7%2FdJMcadu9yUr%2F0w0V0JZKIt3DzCUhQdui3k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;751&quot; height=&quot;352&quot; data-origin-width=&quot;1167&quot; data-origin-height=&quot;547&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;새롭게 생성한 레이어가 정상적으로 등록하면 위와 같은 결과를 확인가능하다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;※ 다음 장에서 새롭게 생성한 레이어 내부 메타데이터(레시피 등)를 커스텀하는 방법을 설명한다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Linux/Yocto</category>
      <author>pak-ji</author>
      <guid isPermaLink="true">https://pak-j.tistory.com/92</guid>
      <comments>https://pak-j.tistory.com/92#entry92comment</comments>
      <pubDate>Sun, 10 May 2026 22:03:35 +0900</pubDate>
    </item>
    <item>
      <title>[Yocto 학습] 3장: 비트베이크(bitbake) 문법</title>
      <link>https://pak-j.tistory.com/91</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #dddddd; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;클래스와 레시피&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;비트베이크는 클래스(.bbclass)와 레시피(.bb, .bbappend) 파일을 작성하기 위해 Python과 Shell Script가 혼합된 형태의 코드를 사용한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;여기에는 =, ?=, +=, .=, :=, :append, :prepend, &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;OVERRDIES, &lt;/span&gt;${@&amp;lt;python-command&amp;gt;} 등 다양한 문법이 존재한다. 각 문법들이 비트베이크에서는 어떠한 형식으로 해석하는지 본 페이지를 통해 설명한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #dddddd; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;변수 할당&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;비트베이크의 변수 할당에는 아래와 같이 3가지 타입의 변수 할당 연산자(=, ?=, ??=)가 존재한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;= (deferred&amp;nbsp;assignment)&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;지연 변수 할당을 위해 사용하는 연산자이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;여기서 지연(deferred)에 대한 개념 설명은 뒤 변수 확장 섹션에서 추가 설명한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1778047050200&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;FOO = &quot;bar&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;위 예시와 같이 사용하여, 특정 변수(FOO)에 특정 값(&quot;bar&quot;)을 할당가능하다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;?= (soft&amp;nbsp;assignment)&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;=보다 낮은 순위의 변수 할당을 위해 사용하는 연산자이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;?=는 주로 특정 변수에 기본값(default)을 할당할 때에 사용한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1778047209212&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;FOO ?= &quot;bar&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;위 예시와 같이 사용하여, 특정 변수(FOO)에 기본 값(&quot;bar&quot;)을 할당가능하다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1778047270832&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;FOO = &quot;bar&quot;
FOO ?= &quot;BAR&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;앞에서 ?=는 =보다 낮은 우선순위를 갖는다고 하였다. 이에 대한 설명을 위해 위와 같은 예시 코드를 작성하였다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;비트베이크는 레시피 내용을 파싱하고 빌드를 실행할 때 ?=보다 높은 우선순위인 =로 변수의 값을 할당한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;따라서, 비트베이크는 FOO에 &quot;bar&quot; 값을 할당하여 빌드를 수행하게 된다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;??= (weak&amp;nbsp;default&amp;nbsp;assignment)&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;?=보다 낮은 순위의 변수 할당을 위해 사용하는 연산자이다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1778047579340&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;FOO  ?= &quot;barbar&quot;
FOO   = &quot;barbarbar&quot;
FOO ??= &quot;bar&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;앞서 설명하였다시피 비트베이크는 레시피의 파싱을 수행하고 빌드를 진행할 때 변수 할당 연산자의 우선순위를 따진다. 그렇기 때문에, FOO에는 &quot;barbarbar&quot;가 담겨져 최종적으로 빌드가 수행된다. 다시 말해, 변수 할당 연산자는 &quot;= &amp;gt; ?= &amp;gt; ??=&quot;와 같은 관계를 가진다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이 세가지 연산자는 특정 레시피가 빌드될 때에 여러 환경의 조합으로 변수에 기본값(?=, ??=)을 사용할 지 혹은 지연된 값(=)을 사용할 지 목적에 따라 유연하게 사용될 수 있다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #dddddd; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;변수 확장&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1778048107409&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;A = &quot;aValue&quot;
B = &quot;before-${A}-after&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;비트베이크에는 변수 확장이라는 개념이 존재한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;예를 들어, 위 예시와 같이 작성되어 있다면 B에는 &quot;before-aValue-after&quot;라는 값으로 확장된다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1778048207568&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;A = &quot;aValue&quot;
B = &quot;before-${A}-after&quot;
A = &quot;aNewValue&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;여기서 일반적인 순차적 모델에 기반한 프로그래밍 언어를 접했던 개발자라면 B는 당연히 &quot;before-aValue-after&quot;이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;하지만 비트베이크는 빌드를 하는 그 순간까지 B를 &quot;before-${A}-after&quot; 형태로 저장해두며, 빌드를 수행(태스크가 실행되는)하는 그때, B에 A의 값을 대입시켜 &quot;before-aNewValue-after&quot;로 완성시킨다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1778048383225&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;A = &quot;aValue&quot;
B := &quot;before-${A}-after&quot;
A = &quot;aNewValue&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;여기서 한가지 재미난 점은 :=(immediate assignment) 연산자를 사용하면 즉시 변수를 확장할 수 있다는 점이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다시 말해, 위와 같은 예시에서 B는 :=로 인해서 즉시 &quot;before-aValue-after&quot;로 확장된다는 것이다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1778049219116&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;MIRROR = &quot;http://internal&quot;
SRC_URI := &quot;${MIRROR}/pkg.tar.gz&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;한가지 예시로 특정 소스를 내려받을 때 MIRROR 서버의 경로가 즉시 반영되어야 하는 경우가 존재한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;만약, 비트베이크가 빌드를 수행할 때에 MIRROR 값이 도중에 변경된다면 소스를 내려받는 경로가 달라져 빌드 결과물의 버전에 이상이 생길 수 있다. 그렇기에 적절하게 =와 :=를 사용하여 레시피 파일을 작성할 수 있어야 한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #dddddd; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;문자열 추가/삭제&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;빌드를 수행할 때에 특정 변수에 할당된 문자열 값에 여러 값들을 추가 혹은 삭제해야 하는 경우가 존재할 것이다. 이때에는 아래와 같은 5가지 타입의 할당자(+=, .=, :append, :prepend, :remove)를 사용가능하다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;+= (append with space), =+ (prepend with space)&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1778050111737&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;A = &quot;aValue&quot;
A += &quot;AfterNewValue&quot; # 1. aValue AfterNewValue
A =+ &quot;BeforeNewValue&quot; # 2. BeforeNewValue aValue AfterNewValue&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;+=와 =+를 통해서 특정 변수에 공백으로 구분된 문자열을 추가할 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;+=를 사용하게 되면, A 변수 뒤에 공백 문자와 추가할 문자열이 붙는다. (위 예시의 1. 참조)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;=+를 사용하게 되면, A 변수 앞에 공백 문자와 추가할 문자열이 붙는다. (위 예시의 2. 참조)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;.= (append without space), =. (prepend without space)&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1778050192563&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;A = &quot;aValue&quot;
A .= &quot;AfterNewValue&quot; # 1. aValueAfterNewValue
A =. &quot;BeforeNewValue&quot; # 2. BeforeNewValueaValueAfterNewValue&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;.=와 =.를 통해서 특정 변수에 공백 없이 문자열을 추가할 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;.=를 사용하게 되면, A 변수 뒤에 추가할 문자열이 공백 없이 붙는다. (위 예시의 1. 참조)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;=.를 사용하게 되면, A 변수 앞에 추가할 문자열이 공백 없이 붙는다. (위 예시의 2. 참조)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;:append, :prepend&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1778050805493&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;A = &quot;aValue&quot;
A:append  = &quot;AfterNewValue&quot; # 1. aValueAfterNewValue
A:prepend = &quot;BeforeNewValue&quot; # 2. BeforeNewValueaValueAfterNewValue&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;:append와 :prepend를 통해서 특정 변수에 공백 없이 문자열을 추가할 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;:append를 사용하게 되면, A 변수 뒤에 추가할 문자열이 공백 없이 붙는다. (위 예시의 1. 참조)&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;:prepend를 사용하게 되면, A 변수 앞에 추가할 문자열이 공백 없이 붙는다. (위 예시의 2. 참조)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이 두 연산자는 바로 앞 절의 연산자(.=, =.)와 동일한 연산을 수행하는 것을 알 수 있다. 하지만 아래 예시와 같이 연산이 실행되는 순서에서 차이가 존재한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1778051083747&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;A:append = &quot;AfterNewValue&quot;
A = &quot;aValue&quot; # 1. aValueAfterNewValue
B .= &quot;AfterNewValue&quot;
B = &quot;aValue&quot; # 2. aValue&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;:append 연산은 변수에 특정 값이 할당될 때에 동작한다. 따라서, 위 예시의 1.과 같은 결과를 확인가능하다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;.= 연산은 변수에 즉각적으로 할당된다. 따라서, 위 예시의 2.와 같은 결과를 확인가능하다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;:remove&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1778051349598&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;FOO = &quot;1 2&quot;
FOO:remove = &quot;2 3&quot;
FOO += &quot;3&quot;
FOO:append = &quot; 4&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;공백으로 구분된 문자열 중 특정 문자열을 삭제하기 위해 :remove 연산을 사용할 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;:remove 연산의 경우에는 문자열 추가 연산(+=, .=, :append 등)이 모두 실행된 후에 실행되는 연산자이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;따라서, 위 예시에서 FOO에는 &quot;1 4&quot;가 최종적으로 저장된다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #dddddd; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;조건적 변수 할당&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;OVERRIDES&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1778051650918&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;OVERRIDES = &quot;linux:arm:x86&quot; # 콜론(:)으로 조건에 해당하는 문자열을 구분

A = &quot;value&quot;
A:arm = &quot;armValue&quot; # 1. armValue
A:append:x86 = &quot; x86Value&quot; # 2. armValue x86Value
A:append:non = &quot; nonValue&quot; # 3. armValue x86Value&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;비트베이크는 파싱을 수행할 때 조건에 따른 변수 할당이 가능하며, 이때에는 OVERRIDES라는 변수를 참조한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;위 1.~3. 예시와 같이 :&amp;lt;condition&amp;gt; 형식으로 조건적으로 값을 할당 가능하다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;조건이 맞을 경우에는 위 예시의 1.과 같이 A 변수가 변경되는 모습을 확인 가능하다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;조건이 맞을 때 문자열을 추가하고 싶다면 2.와 같이 :append와 :&amp;lt;condition&amp;gt;을 함께 사용하면 된다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;당연히 조건이 맞지 않을 때에는 3.과 같은 결과를 확인 가능하다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #dddddd; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;파일 포함&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;include, require&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1778052451067&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# hello.inc

DESCRIPTION = &quot;Hello application&quot;
LICENSE = &quot;MIT&quot;
SRC_URI = &quot;file://hello.c&quot;

-----------------------------------

# hello.bb

include hello.inc
require hello.inc

include hello_tmp.inc # 1. Warning
require hello_tmp.inc # 2. Parse Error&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;클래스와 레시피에는 .inc 파일의 내용을 포함시킬 수 있으며, 이를 위해 include와 require 키워드를 사용한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;include는 가져오려는 .inc 파일이 존재하지 않으면 Warning을 발생시키지만 빌드는 종료되지 않는다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;require는 가져오려는 .inc 파일이 존재하지 않으면 Parse Error를 발생시키고 빌드가 종료된다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;비트베이크에서 클래스와 레시피에 .inc 파일을 포함할 때에는 .inc 파일의 내용을 그대로 복사/붙여넣기 한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;레시피에서 특정 클래스를 상속할 때에는 include나 require을 사용하지 않고 inherit 키워드를 사용한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; background-color: #dddddd;&quot;&gt;&lt;b&gt;파이썬 변수&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;${@&amp;lt;python-command&amp;gt;}&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1778053057441&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;A = &quot;${@time.strftime('%Y%m%d', time.gmtime())}&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;변수 할당을 수행할 때에는 ${@&amp;lt;python-command&amp;gt;}와 같은 형식으로 파이썬 함수를 사용가능하다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1778053519793&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;A = &quot;${@d.getVar('MACHINE')}&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;파이썬 함수에서는 비트베이크의 Bitbake Datastore Object로 접근할 수 있으며, 이때에는 d 객체를 활용한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;함수 정의&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Dash 셸(/bin/sh) 함수&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1778053235333&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;do_hello() {
    echo &quot;hello, world&quot;
    echo &quot;${MACHINE}&quot;
}

addtask hello before do_fetch&lt;/code&gt;&lt;/pre&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Python 함수&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1778053831520&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;python do_hello {
    print(&quot;hello, world&quot;)
    print(d.getVar(&quot;MACHINE&quot;)
}

addtask hello before do_fetch&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;태스크를 정의할 때에는 Dash Shell과 Python3 기반으로 작성가능하다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Python으로 태스크를 정의할 때에는 함수명 앞에 python을 붙여준다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;&quot;&gt;새롭게 정의된 태스크는 addtask 명령을 통해 비트베이크에 등록가능하다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;&quot;&gt;(여기서 addtask 명령의 문법은 다루지 않는다.)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Linux/Yocto</category>
      <author>pak-ji</author>
      <guid isPermaLink="true">https://pak-j.tistory.com/91</guid>
      <comments>https://pak-j.tistory.com/91#entry91comment</comments>
      <pubDate>Tue, 5 May 2026 20:14:57 +0900</pubDate>
    </item>
    <item>
      <title>[Yocto 학습] 2장: 비트베이크(bitbake)란?</title>
      <link>https://pak-j.tistory.com/89</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #dddddd; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;비트베이크란?&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;비트베이크는 GNU Make와 유사한 도구로 Python과 Shell Script가 혼합된 형태의 코드를 파싱하여 타겟 플랫폼 이미지를 빌드하는 툴(엔진)이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;비트베이크는 메타데이터라는 것을 파싱하여 빌드를 수행하며, 메타데이터에는 3가지 유형이 존재한다.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;환경설정(*.conf): 빌드 전체 동작 방식과 정책을 결정하는 변수 집합, 어떠한 레이어와 머신 등을 사용할 지 결정&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;레시피(*.bb, *.bbappend): &amp;ldquo;하나의 패키지를 어떻게 빌드할지&amp;rdquo;를 정의, Python과 Shell Script를 활용&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;클래스(*.bbclass): 여러 레시피에서 공통으로 사용하는 빌드 로직을 정의, Python과 Shell Script를 활용&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;레이어(meta-*): 비트베이크가 참조할 메타데이터(환경설정, 레시피, 클래스)를 논리적으로 묶어서 관리하는 단위&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;비트베이크는 일반적으로 다음과 같은 처리 순서를 가진다.&lt;br /&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;(각 과정에서 더 상세한 내용이 있지만 간략하게만 작성하면..)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;타겟 플랫폼 이미지를 빌드시키기 위한 비트베이크의 빌드 환경 준비 (source oe-init-build-env &amp;lt;target&amp;gt;)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;타겟 플랫폼 이미지인 &amp;lt;target&amp;gt;을 빌드하기 위한 비트베이크 실행 (bitbake &amp;lt;recipe_name&amp;gt;)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;비트베이크가 실행되면서 &amp;lt;target&amp;gt; 디렉터리 하위의 conf/bblayers.conf 확인&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;conf/bblayers.conf의 BBLAYERS 변수에 선언된 레이어(meta-*)들의 경로를 확인&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;레이어 디렉터리의 하위에 존재하는 conf/layer.conf를 확인&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;conf/layer.conf의 BBFILES 변수에 선언된 레시피들의 경로를 참조하여 의존성에 맞춰서 빌드 수행&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;환경 설정 파일(bblayers.conf, layer.conf)에&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;대해서&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;bblayers.conf&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;546&quot; data-origin-height=&quot;256&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/p9EM5/dJMcafzJm7m/QS3mGrRMHYqUCMv1c02Mi1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/p9EM5/dJMcafzJm7m/QS3mGrRMHYqUCMv1c02Mi1/img.png&quot; data-alt=&quot;&amp;amp;lt;target&amp;amp;gt;/conf/bblayers.conf&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/p9EM5/dJMcafzJm7m/QS3mGrRMHYqUCMv1c02Mi1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fp9EM5%2FdJMcafzJm7m%2FQS3mGrRMHYqUCMv1c02Mi1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;456&quot; height=&quot;214&quot; data-origin-width=&quot;546&quot; data-origin-height=&quot;256&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;&amp;lt;target&amp;gt;/conf/bblayers.conf&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&quot;source oe-init-build-env &amp;lt;target&amp;gt;&quot;를 시행하면 기본적으로 위 그림과 같은 bblayers.conf 파일이 생성된다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;bblayers.conf에서 BBPATH와 BBFILES는 그다지 중요하진 않으며, BBLAYRES가 가장 중요하다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;BBLAYERS 변수에는 &amp;lt;target&amp;gt;을 빌드하기 위해 필요한 레이어 목록을 선언하며, 각 레이어는 공백으로 구분된다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;비트베이크가 실행(bitbake 명령으로)되면 이 BBLAYERS에 있는 레이어 목록을 찾아가 레시피를 찾는다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;layer.conf&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;715&quot; data-origin-height=&quot;484&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l1k9Y/dJMcahK40BM/CecVWXKgBZK73ujmPtTJs0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l1k9Y/dJMcahK40BM/CecVWXKgBZK73ujmPtTJs0/img.png&quot; data-alt=&quot;meta-poky/conf/layers.conf&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l1k9Y/dJMcahK40BM/CecVWXKgBZK73ujmPtTJs0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl1k9Y%2FdJMcahK40BM%2FCecVWXKgBZK73ujmPtTJs0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;607&quot; height=&quot;411&quot; data-origin-width=&quot;715&quot; data-origin-height=&quot;484&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;meta-poky/conf/layers.conf&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;비트베이크는 conf/bblayers.conf의 BBLAYERS에 선언된 레이어를 접근한 뒤 conf/layer.conf를 찾는다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;layer.conf에는 패키지를 빌드하기 위한 레시피의 경로가 작성되어 있다. (패키지가 합쳐저 &amp;lt;target&amp;gt; 이미지 생성)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;layer.conf의&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;BBPATH는 레이어 경로를 비트베이크로 전달하기 위해 사용하는 변수이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;BBFILE은 레이어 하위의 패키지를 빌드하기 위한 레시피 파일의 경로를 나타내는 변수이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;BBFILE_COLLECTIONS는 레이어가 비트베이크로 식별되기 위한 본인의 식별자(ID)를 등록하는 변수이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;BBFILE_PATTERN_&amp;lt;collection&amp;gt;은 BBFILE 중에서 식별자가 바라볼 레시피를 구분하기 위한 변수이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;BBFILE_PRIORITY_&amp;lt;collection&amp;gt;은 식별자가 식별하고 있는 레시피의 우선순위를 설정하기 위한 변수이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;일반적으로 BBFILE_COLLECTIONS와 BBFILE_PATTERN, BBFILE_PRIOIRTY는 한몸처럼 움직인다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;LAYERDEPENDS_&amp;lt;collection&amp;gt;은 레이어가 의존하는 레이어가 무엇인지 나타내기 위해 사용하는 변수이다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;904&quot; data-origin-height=&quot;159&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIgOyv/dJMcah5n2UG/FvpkIHfX57OG3JvtbSRByK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIgOyv/dJMcah5n2UG/FvpkIHfX57OG3JvtbSRByK/img.png&quot; data-alt=&quot;bitbake-layers show-layers 실행 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIgOyv/dJMcah5n2UG/FvpkIHfX57OG3JvtbSRByK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIgOyv%2FdJMcah5n2UG%2FFvpkIHfX57OG3JvtbSRByK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;775&quot; height=&quot;136&quot; data-origin-width=&quot;904&quot; data-origin-height=&quot;159&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;bitbake-layers show-layers 실행 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&quot;bitbake-layers show-layers&quot; 명령을 활용해 &amp;lt;target&amp;gt;을 빌드하기 위해 필요한 레이어 목록을 확인할 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이 명령은 &quot;source oe-init-build-env&quot; 명령을 실행시켜서 비트베이크가 실행될 수 있는 환경을 세팅한 후에 실행 가능하다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #dddddd; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;비트베이크의 빌드 과정 중 의존성 처리&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;비트베이크는 빌드 과정에서 아래 두가지 유형의 의존성을 처리한다.&amp;nbsp;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;컴파일(빌드) 의존성: 타겟 이미지에 들어가는 바이너리 혹은 실행 환경(QEMU 등) 등을 컴파일하기 위해 호스트에서만 필요한 의존성으로, -native 접미사를 레시피 파일에 붙여&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;(Ex. &lt;/span&gt;qemu&lt;b&gt;-native&lt;/b&gt;_6.2.0.bb) 표현된다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;런타임 의존성: 타겟에서 특정 바이너리를 실행하기 위한 의존성으로, 동적 라이브러리나 인터프리터 등이 존재한다. 컴파일 의존성과 다르게 -native 접미사가 붙지 않은 레시피 파일로 표현된다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;또한, 비트베이크는 레시피 간의 의존성을 처리하기 위해 DEPENDS와 RDEPENDS 변수를 작성한다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #9d9d9d; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;(PROVIDES도 있는데 이는 그렇게 중요한지는 모르겠다.. 나중에 중요해보이면 추가로 정리해야겠다.)&lt;/span&gt;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;DEPENDS: 해당 레시피가 빌드하기 전에 반드시 먼저 빌드되어야 하는 패키지를 의미한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;RDEPENDS: 컴파일된 패키지가 타겟 환경에서 실행될 때 반드시 필요한 패키지를 의미한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #dddddd; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;비트베이크의 태스크 종류&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;비트베이크는 빌드를 위해 태스크를 실행시키며, 이 태스크는 레시피 파일에 의해서 작성된다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;비트베이크는 레시피 파일에 태스크를 정의하기 위한 프레임워크를 제공한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;비트베이크에서 제공하는 태스크는 다음과 같으며, 이를 실행되는 순서대로 정리하였다.&lt;/span&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;do_fetch&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;패키지를 빌드하기 위한 소스를 가져오는(다운로드하는) 단계이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;소스를 가져올 때에는 Remote(Git 등)나 Local(Disk)에서 가져올 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;do_unpack&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;do_fetch를 통해서 가져온 소스를 빌드할 수 있도록 풀어내는 단계이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;만약, 소스가 tar 등으로 압축되어 있다면 압축을 해제한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;만약, 소스가 Git을 통해 Clone 되었다면 Checkout을 수행한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;do_patch&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;do_unpack이 끝난 빌드 소스에 Patch를 적용시키는 단계이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;이 단계에서 *.patch 파일을 통해서 소스를 Patch 할 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Patch가 적용된 소스가 최종적으로 이미지 빌드에 사용된다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;do_configure, do_compile, do_install&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;do_configure, do_compile, do_install 단계별로 빌드를 수행한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;do_congiure: 패키지를 빌드하기 위해 설정하는 단계이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;do_compile: 패키지를 실제 컴파일하는 단계이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;do_install: 컴파일된 패키지를 임시 디렉터리(${D})에 설치하는 단계이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;동일한 환경 변수의 이름이더라도 각 단계마다 사용 목적이 다르다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;do_package&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;do_install로 인해서 임시 디렉터리에 설치된 패키지를 논리적으로 분할하는 단계이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;논리적으로 분할할 때에는 패키지의 유형(디버깅 심볼, 문서, 라이브러리 등)에 따라 수행된다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;do_rootfs&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;do_package에 의해서 논리적으로 분할된 패키지들을 활용해 Root File System을 생성하는 단계이다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #dddddd; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;비크베이크가 do_fetch 단계에서 소스 다운로드하는 방법&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;span&gt;(Yocto 학습을 위해 살펴보고 있는 서적에서 소스 다운로드하는 부분을 상세히 설명하고 있어서 추가로 정리한다.)&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;비트베이크는 패키지들을 빌드하는 태스크의 가장 첫 단계인 do_fetch에서 소스를 다운로드 받는다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;비트베이크는 소스코드를 다운로드 받기 위해 OpenSSH, &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;cURL, &lt;/span&gt;Git 등을 백엔드(Fetcher Backend)로 사용한다.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;OpenSSH는 Remote에 존재하는 tar.gz 등과 같은 압축 파일을 가져오기 위해 주로 활용한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;cURL은 Remote에 존재하는 tar.gz 등과 같은 압축 파일을 가져오기 위해 활용된다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Git은 Remote에 존재하는 Git Repository를 가져오기 위해 활용된다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;881&quot; data-origin-height=&quot;90&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kRdDc/dJMcadu36VR/hL1n36GXHRPrfNKDLDpvS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kRdDc/dJMcadu36VR/hL1n36GXHRPrfNKDLDpvS0/img.png&quot; data-alt=&quot;meta/recipes-bsp/pm-utils/pm-utils_1.4.1.bb&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kRdDc/dJMcadu36VR/hL1n36GXHRPrfNKDLDpvS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkRdDc%2FdJMcadu36VR%2FhL1n36GXHRPrfNKDLDpvS0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;762&quot; height=&quot;78&quot; data-origin-width=&quot;881&quot; data-origin-height=&quot;90&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;meta/recipes-bsp/pm-utils/pm-utils_1.4.1.bb&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;비트베이크는 do_fetch 단계에서 레시피 파일에 작성된 SRC_URI를 참고하여 소스를 가져온다.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;SRC_URI의 ${PV}는 패키지 버전을 의미하며, 레시피 이름에 있는 버전(pm-tuils_&lt;b&gt;1.4.1&lt;/b&gt;.bb)으로 대체된다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;SRC_URI가 ssh://로 되어 있다면 OpenSSH를 활용해 소스를 다운로드 받는다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;SRC_URI가 http:// 혹은 https://로 되어 있다면 cURL을 활용해 소스를 다운로드 받는다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;SRC_URI가 git://으로 되어 있다면 Git을 활용해 소스를 다운로드(Clone) 받는다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;SRC_URI가 file://로 되어 있다면 cp 등의 명령을 활용해 Local(Disk)에 존재하는 소스를 복사한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;다운로드가 완료된 소스의 경우에는 DL_DIR 환경 변수에 등록된 경로에 저장된다.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;기본적으로 ${DL_DIR}은 &amp;lt;target&amp;gt;/downloads 디렉터리로 설정된다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;lt;target&amp;gt;/conf/local.conf 파일에서 ${DL_DIR}의 경로를 재정의 가능하다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Remote에서 다운로드 할 때에는 MIRRORS, PREMIRROS 환경 변수로 미러 서버를 설정가능하다.&lt;/span&gt;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;lt;target&amp;gt;/conf/local.conf 파일에서 MIRRORS와 PREMIRROS를 재정의 가능하다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;Remote에서 다운로드 할 때 네트워크 접근을 할 수 없게 하려면 BB_NO_NETWORK를 활성화하면 된다.&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&amp;lt;target&amp;gt;/conf/local.conf 파일에서 BB_NO_NETWORK = &quot;1&quot;을 작성해서 활성화 가능하다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Linux/Yocto</category>
      <author>pak-ji</author>
      <guid isPermaLink="true">https://pak-j.tistory.com/89</guid>
      <comments>https://pak-j.tistory.com/89#entry89comment</comments>
      <pubDate>Sun, 3 May 2026 15:50:01 +0900</pubDate>
    </item>
  </channel>
</rss>