본문 바로가기
Linux BSP

[Linux File System] Yocto Project 2

by TYB 2024. 2. 20.
반응형

이전 글 먼저 진행해야됩니다!

 

[Linux File System] Yocto Project

Linux에서 부팅되고, 로그인되고, 다양한 데몬 구동, 배쉬 할당 등을 위해 반드시 필요한 파일들을 Root File System이라고 함. 폴더 만드는 건 생략. rootfs와 그 하위에 yocto 디렉터리 생성 필요한 패키

program-developers-story.tistory.com

 

 

ubuntu08@ubuntu08-VirtualBox:~/pi_bsp/rootfs/yocto/poky$ source oe-init-build-env

ubuntu08@ubuntu08-VirtualBox:~/pi_bsp/rootfs/yocto/poky/build/tmp/deploy/images/raspberrypi4$ ls

해보면 zImage도 있고, ext3가 라즈베리파이에서 사용되는 최종 파일시스템임.

ubuntu08@ubuntu08-VirtualBox:~/pi_bsp/rootfs/yocto/poky/build/tmp/deploy/images/raspberrypi4$ ls *.ext3
core-image-minimal-raspberrypi4-20240219024304.rootfs.ext3  core-image-minimal-raspberrypi4.ext3

ubuntu08@ubuntu08-VirtualBox:~/pi_bsp/rootfs/yocto/poky/build/tmp/deploy/images/raspberrypi4$ ls -l *.ext3
-rw-r--r-- 2 ubuntu08 ubuntu08 12582912  2월 19 13:00 core-image-minimal-raspberrypi4-20240219024304.rootfs.ext3
lrwxrwxrwx 2 ubuntu08 ubuntu08       58  2월 19 13:00 core-image-minimal-raspberrypi4.ext3 -> core-image-minimal-raspberrypi4-20240219024304.rootfs.ext3

ubuntu08@ubuntu08-VirtualBox:~/pi_bsp/rootfs/yocto/poky/build/tmp/deploy/images/raspberrypi4$ sudo dd if=core-image-minimal-raspberrypi4.ext3 of=/dev/sdb2 bs=1M status=progress

 

if input file

of output file(sdb2가 파일시스템)

bs block speed = 1MB

status를 출력해달라(progress)

 

하고 복사 다 되면 sd카드 빼주고 라즈베리파이에 넣어서 전원 넣고 부팅

 

usb serial putty를 통해서 보면 로그인 창이 나옴.

id: root로 로그인 해주고

 

df를 쳐보면 확장되지 않은 sd카드의 전체 용량에 비해 매우 적은 메모리가 보일거임.

 

 

 


1. sd카드 리더기로 쓰는 방법

sd카드 리더기를 USB에 꽂고나서 가상환경에서 장치->USB를 선택해준 후

 

dmesg를 쳐주면 제일 아래에 아래와 같이 출력됨.

혹은

 

 


1번 방식으로 하면 파일시스템 크기를 확장해줘야되는데 

확장하려면

 

가상환경에서

$ sudo partprobe /dev/loop0
$ sudo gparted /dev/loop0

를 통해서 GUI로 하면 된다.

 

 


 

 

 

2. bz2를 sd카드에 저장하고 압축을 푸는 방법

 

ubuntu08@ubuntu08-VirtualBox:~/pi_bsp/rootfs/yocto/poky/build/tmp/deploy/images/raspberrypi4$ ls -l *.bz2
-rw-r--r-- 2 ubuntu08 ubuntu08  2555288  2월 19 13:00 core-image-minimal-raspberrypi4-20240219024304.rootfs.tar.bz2
-rw-r--r-- 2 ubuntu08 ubuntu08 23026851  2월 19 13:00 core-image-minimal-raspberrypi4-20240219024304.rootfs.wic.bz2
lrwxrwxrwx 2 ubuntu08 ubuntu08       61  2월 19 13:00 core-image-minimal-raspberrypi4.tar.bz2 -> core-image-minimal-raspberrypi4-20240219024304.rootfs.tar.bz2
lrwxrwxrwx 2 ubuntu08 ubuntu08       61  2월 19 13:00 core-image-minimal-raspberrypi4.wic.bz2 -> core-image-minimal-raspberrypi4-20240219024304.rootfs.

 

meta-rpilinux.tar
0.01MB

 

 

 

ubuntu08@ubuntu08-VirtualBox:~/pi_bsp/rootfs/yocto/poky$ tar xcf meta-rpilinux.tar



ubuntu08@ubuntu08-VirtualBox:~/pi_bsp/rootfs/yocto/poky$ tar xvf meta-rpilinux.tar
meta-rpilinux/
meta-rpilinux/conf/
meta-rpilinux/conf/layer.conf
meta-rpilinux/recipes-rpilinux/
meta-rpilinux/recipes-rpilinux/images/
meta-rpilinux/recipes-rpilinux/images/rpilinux-image.bb

 

ubuntu08@ubuntu08-VirtualBox:~/pi_bsp/rootfs/yocto/poky$ cat meta-rpilinux/conf/layer.conf
# We have a conf and classes directory, add to BBPATH
BBPATH .= ":${LAYERDIR}"

# We have recipes-* directories, add to BBFILES
BBFILES += "${LAYERDIR}/recipes-*/*/*.bb \
  ${LAYERDIR}/recipes-*/*/*.bbappend"

BBFILE_COLLECTIONS += "rpilinux"
BBFILE_PATTERN_rpilinux = "^${LAYERDIR}/"
BBFILE_PRIORITY_rpilinux = "6"

LAYERSERIES_COMPAT_rpilinux = "kirkstone"

 

 

ubuntu08@ubuntu08-VirtualBox:~/pi_bsp/rootfs/yocto/poky$ vi meta-rpilinux/conf/layer.conf

추가

 13 IMAGE_INSTALL += "libstdc++ mtd-utils"
 14 IMAGE_INSTALL += "openssh openssl openssh-sftp-server"

 

 

ubuntu08@ubuntu08-VirtualBox:~/pi_bsp/rootfs/yocto/poky/build/conf$ vi bblayers.conf

추가

13   /home/ubuntu08/pi_bsp/rootfs/yocto/poky/meta-rpilinux \

 

 

 

ubuntu08@ubuntu08-VirtualBox:~/pi_bsp/rootfs/yocto/poky$ source oe-init-build-env

 

 

 

 

ubuntu08@ubuntu08-VirtualBox:~/pi_bsp/rootfs/yocto/poky/build$ bitbake -s core-image-minimal | grep openssh
nativesdk-openssh                                   :8.9p1-r0                                                  
openssh                                             :8.9p1-r0                                                  
packagegroup-core-ssh-openssh                         :1.0-r1                                                  

-s옵션을 주면 show옵션으로 기존에 만든것 중 찾겠다는 의미고 grep이 있으니 openssh가 들어간 찾겠다는 의미임.

 

 

ubuntu08@ubuntu08-VirtualBox:~/pi_bsp/rootfs/yocto/poky/build$ bitbake -c cleanall core-image-minimal

 

 

ubuntu08@ubuntu08-VirtualBox:~/pi_bsp/rootfs/yocto/poky/build$ bitbake rpilinux-image

하면 새로운 이미지가 만들어짐. 이전 글에서  긴 시간동안 만들어 놓은거에 우리가 추가한 부분에 대해서만 다시 빌드를 하는거라 금방 끝남.

몇개 추가하니까 사이즈가 커졌죠? 시간도 최신시간으로 바뀐게 보이고

ubuntu08@ubuntu08-VirtualBox:~/pi_bsp/rootfs/yocto/poky/build/tmp/deploy/images/raspberrypi4$ ls -l *.ext3
-rw-r--r-- 2 ubuntu08 ubuntu08 20971520  2월 20 13:49 rpilinux-image-raspberrypi4-20240220044847.rootfs.ext3
lrwxrwxrwx 2 ubuntu08 ubuntu08       54  2월 20 13:49 rpilinux-image-raspberrypi4.ext3 -> rpilinux-image-raspberrypi4-20240220044847.rootfs.ext3




ubuntu08@ubuntu08-VirtualBox:~/pi_bsp/rootfs/yocto/poky/build/tmp/deploy/images/raspberrypi4$ ls -l *.bz2
-rw-r--r-- 2 ubuntu08 ubuntu08  6375142  2월 20 13:49 rpilinux-image-raspberrypi4-20240220044847.rootfs.tar.bz2
-rw-r--r-- 2 ubuntu08 ubuntu08 26939720  2월 20 13:49 rpilinux-image-raspberrypi4-20240220044847.rootfs.wic.bz2
lrwxrwxrwx 2 ubuntu08 ubuntu08       57  2월 20 13:49 rpilinux-image-raspberrypi4.tar.bz2 -> rpilinux-image-raspberrypi4-20240220044847.rootfs.tar.bz2
lrwxrwxrwx 2 ubuntu08 ubuntu08       57  2월 20 13:49 rpilinux-image-raspberrypi4.wic.bz2 -> rpilinux-image-raspberrypi4-20240220044847.rootfs.wic.bz2

 

 

bz2파일을  이제 sd카드에 넣읍시다 다시 sd카드 리더기 연결해주고 언마운트

 

ubuntu08@ubuntu08-VirtualBox:~/pi_bsp/rootfs/yocto/poky/build/tmp/deploy/images/raspberrypi4$ df

ubuntu08@ubuntu08-VirtualBox:~/pi_bsp/rootfs/yocto/poky/build/tmp/deploy/images/raspberrypi4$ umount /dev/sdb?

 

sdb1은 부트로드, 커널, 디바이스 트리 파일 등이 들어 있음. 건드리면 안되고

sdb2는 부팅 후 커널에서 사용하는 루트 파일 시스템이 들어있음.

sdb2만 포맷

ubuntu08@ubuntu08-VirtualBox:~/pi_bsp/rootfs/yocto/poky/build/tmp/deploy/images/raspberrypi4$ sudo mkfs.ext3 /dev/sdb2

 

다시 연결하고

ubuntu08@ubuntu08-VirtualBox:~/pi_bsp/rootfs/yocto/poky/build/tmp/deploy/images/raspberrypi4$ sudo e2label /dev/sdb2 rootfs

다시 해제하고 연결

ubuntu08@ubuntu08-VirtualBox:~/pi_bsp/rootfs/yocto/poky/build/tmp/deploy/images/raspberrypi4$ ls -l /media/ubuntu08/rootfs/
total 16
drwx------ 2 root root 16384  2월 20 13:57 lost+found

파일 복구시스템만 남아있고 파일이 포맷되어 있음.

ubuntu08@ubuntu08-VirtualBox:~/pi_bsp/rootfs/yocto/poky/build/tmp/deploy/images/raspberrypi4$ df -h


Filesystem                 Size  Used Avail Use% Mounted on

/dev/sdb1                  510M  129M  382M  26% /media/ubuntu08/bootfs
/dev/sdb2                   29G  156K   28G   1% /media/ubuntu08/rootfs

 

첫번째 방식은 하고 나서 파일 시스템의 디스크를 확장시켜줘야함. 파일 크기에 맞춰서 줄어들어 있으므로,

하지만 두번째 방식은 파일 사이즈가 이미 확장이 되어 있음. 장단점이 있음. 맞는걸로 ㄱ ㄱ

 

sd 카드 안에 압축 풀어주고

ubuntu08@ubuntu08-VirtualBox:~/pi_bsp/rootfs/yocto/poky/build/tmp/deploy/images/raspberrypi4$ sudo tar xvfp rpilinux-image-raspberrypi4.tar.bz2  -C /media/ubuntu08/rootfs/

 

sd카드 잘 들어가 있는지 확인하고

ubuntu08@ubuntu08-VirtualBox:/media/ubuntu08/rootfs$ ls
bin  boot  dev  etc  home  lib  lost+found  media  mnt  proc  run  sbin  sys  tmp  usr  var

ubuntu08@ubuntu08-VirtualBox:/media/ubuntu08/rootfs$ sudo find . |grep getty
./bin/start_getty
./sbin/getty
./usr/lib/opkg/alternatives/getty

getty가 로그인을 담당하는 영역임


sd카드 이제 라즈베리파이에 꽂고 부팅하면 

 

이제 ssh가 들어가 있으므로, ip를 통한 putty 원격 쉘 접속이 가능함. 

하기 전에 adduser pi 하고 비밀번호를 설정해서 putty에서 접속할 user를 만들어줘야함.

 

 

 

print_for.c를 준비해주고

  1 #include <stdio.h>
  2
  3 int main(void){
  4
  5     int i=0;
  6     for(i=0; i<999999; i++)
  7     {
  8         printf("%d",i);
  9     }
 10     return  0;
 11 }

 

 

 

이제 잘 동작하는지 보기 위해 우분투 환경에서 크로스 컴파일한 실행파일을 scp를 통해 라즈베리파이로 넘겨주겠다.

먼저 우분투에서

ubuntu08@ubuntu08-VirtualBox:~$ $ sudo apt install crossbuild-essential-armhf //arm 32bit 툴체인 설치

ubuntu08@ubuntu08-VirtualBox:~$ arm-linux-gnueabihf-gcc print_for.c -o print_for

ubuntu08@ubuntu08-VirtualBox:~$ scp print_for pi@10.10.15.212:~/pi/.

마지막 줄에 ip는 라즈베리파이에서 ifconfig로 확인을 해줘야됨.


크로스컴파일 까먹었다면 복습하고 오자

https://program-developers-story.tistory.com/75

 

[Linux BSP] Linux 교차 개발 환경 세팅하기

gcc main.c만 하면 기본 실행파일인 a.out으로 빌드됨 실행할때는 ./a.out도 되고 ./a도 된다. 만약 실행파일의 이름을 정해주고 싶다면 gcc main.c -o main 으로 쳐주면 main이라는 이름의 실행파일이 생성된

program-developers-story.tistory.com


 

 

라즈베리파이로 들어가서 실행해주면

쭈루룩 나옴.

root@raspberrypi4:~# cd ~pi

root@raspberrypi4:/home/pi# ls
pi
root@raspberrypi4:/home/pi# ./pi

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

압축 전 파일시스템 위치는 아래와 같다.

ubuntu08@ubuntu08-VirtualBox:~/pi_bsp/rootfs/yocto/poky/build/tmp/work/raspberrypi4-poky-linux-gnueabi/rpilinux-image/1.0-r0/rootfs$ du -h -d 1
4.0K    ./dev
4.0K    ./proc
9.3M    ./usr
4.0K    ./boot
4.0K    ./sys
4.0K    ./mnt
4.0K    ./tmp
904K    ./sbin
8.0K    ./home
4.0K    ./run
628K    ./bin
40K     ./var
2.4M    ./lib
980K    ./etc
4.0K    ./media
15M     .

 

 

 

ubuntu08 계정으로 만들었으므로, user와 group이 ubuntu08로 되는데, pi라는 user로 넣어줘야 pi로 넘겼을 때 정상적으로 작동할 거임.

 

 

ubuntu08@ubuntu08-VirtualBox:~/pi_bsp/rootfs/yocto/poky/build/tmp/work/raspberrypi4-poky-linux-gnueabi/rpilinux-image/1.0-r0/rootfs/home$ rm -r pi

다시 지워주고

ubuntu08@ubuntu08-VirtualBox:~/pi_bsp/rootfs/yocto/poky/build/tmp/work/raspberrypi4-poky-linux-gnueabi/rpilinux-image/1.0-r0/rootfs/home$ sudo adduser pi

비번은 라즈베리에서 설정했던거랑 똑같게 해주고

 

 

 

위에서 만든 rpilinux-image는 지워주고

ubuntu08@ubuntu08-VirtualBox:~/pi_bsp/rootfs/yocto/poky/build$ bitbake -c cleanall rpilinux-image

 

클린 하고 나면 rpilinux-image의 내용이 다 없어지고 당연하게도 rootfs가 없어짐..

 

ubuntu08@ubuntu08-VirtualBox:~/pi_bsp/rootfs/yocto/poky/build/tmp/work/raspberrypi4-poky-linux-gnueabi/rpilinux-image/1.0-r0/rootfs/home$ ls

 

 

다시 빌드해주자.

ubuntu08@ubuntu08-VirtualBox:~/pi_bsp/rootfs/yocto/poky/build$ bitbake rpilinux-image

만약 rootfs가 안보인다? 아래명령어를 실행

ubuntu08@ubuntu08-VirtualBox:~/pi_bsp/rootfs/yocto/poky/build$ bitbake -b rpilinux-image -c rootfs

 

 

ubuntu08@ubuntu08-VirtualBox:~/pi_bsp/rootfs/yocto/poky/build/tmp/work/raspberrypi4-poky-linux-gnueabi/rpilinux-image/1.0-r0/rootfs/home$  ls -l

해보면 775로 되어 있음.

 

ubuntu08@ubuntu08-VirtualBox:~/pi_bsp/rootfs/yocto/poky/build/tmp/work/raspberrypi4-poky-linux-gnueabi/rpilinux-image/1.0-r0/rootfs/home$  sudo chmod 755 pi

디렉터리의 디폴트 값인 755로 바꿔줌.

 

ubuntu08@ubuntu08-VirtualBox:~/pi_bsp/rootfs/yocto/poky/build/tmp/work/raspberrypi4-poky-linux-gnueabi/rpilinux-image/1.0-r0/rootfs/home$ sudo chown pi:pi pi

 

ubuntu08@ubuntu08-VirtualBox:~/pi_bsp/rootfs/yocto/poky/build/tmp/work/raspberrypi4-poky-linux-gnueabi/rpilinux-image/1.0-r0/rootfs$ su pi
Password:

 

계정 바꿀 때 명령어 차이.

su - pi      //pi의 홈디렉터리로 로그인됨. 디렉터리가 바뀐다는 얘기임.

su pi       // 권한만 pi로 바뀌고 디렉터리는 유지됨.

 

ubuntu08@ubuntu08-VirtualBox:~/pi_bsp/rootfs/yocto/poky/build/tmp/work/raspberrypi4-poky-linux-gnueabi/rpilinux-image/1.0-r0/rootfs/home/pi$ cp ~ubuntu/linuxC/main_arm .

 

ubuntu08@ubuntu08-VirtualBox:~/pi_bsp/rootfs/yocto/poky/build/tmp/work/raspberrypi4-poky-linux-gnueabi/rpilinux-image/1.0-r0/rootfs/home/pi$  cd ../../

 

 

$exit를 치면 pi서브쉘에서 기존의 ubuntu 쉘로 넘어감.


ubuntu08@ubuntu08-VirtualBox:~/pi_bsp/rootfs/yocto/poky/build/tmp/work/raspberrypi4-poky-linux-gnueabi/rpilinux-image/1.0-r0/rootfs/etc$ vi passwd

G해서 바닥으로 내려가고 아까 라즈베리파이에서 직접 만든 파일을 그대로 복사하면 되겠죠?

대신 1000번은 있으니까 1001로 줘야겠죠?

pi:x:1001:1001:Linux User,,,:/home/pi:/bin/sh

저장하고 나가고


ubuntu08@ubuntu08-VirtualBox:~/pi_bsp/rootfs/yocto/poky/build/tmp/work/raspberrypi4-poky-linux-gnueabi/rpilinux-image/1.0-r0/rootfs/etc$ vi group

 

G해서 바닥으로 내려가서 

pi:x:1001:

 

root@raspberrypi4:/home/pi# cat /etc/group

pi:x:1000:

 

 


암호화된 비밀번호도 넣어줘야겠쬬?

ubuntu08@ubuntu08-VirtualBox:~/pi_bsp/rootfs/yocto/poky/build/tmp/work/raspberrypi4-poky-linux-gnueabi/rpilinux-image/1.0-r0/rootfs/etc$ vi shadow

 

G해서 바닥으로 내려가서 

pi:$6$8C1OmnAMsuA8pMsr$BUCAxT8.WpvB5uDAAWYf/MAbJ3MNJWPzndlDDeft0j7VvlDpY0gVFFUsTtGDr1AiLMfvR6Cl7u06EbXCXdjZg/:17599:0:99999:7:::

 

root@raspberrypi4:/home/pi# cat /etc/shadow

pi:$6$8C1OmnAMsuA8pMsr$BUCAxT8.WpvB5uDAAWYf/MAbJ3MNJWPzndlDDeft0j7VvlDpY0gVFFUsTtGDr1AiLMfvR6Cl7u06EbXCXdjZg/:17599:0:99999:7:::


 

ubuntu08@ubuntu08-VirtualBox:~/pi_bsp/rootfs/yocto/poky/build/tmp/work/raspberrypi4-poky-linux-gnueabi/rpilinux-image/1.0-r0/rootfs$ cd home/pi/

 

 


 

bitbake의 다른 것도 써보고 1번 방식으로 write해보자.

 

 

 

 

 

 

 

 

본인만의 root file system을 구축해야 하는 경우가 있는데 

이 때, 타켓의 메모리 사이즈를 보고 그 크기에 맞게 Yocto Project를 통해 만들어주는 방법이 있다는 것을 알고

사용하면 되겠다.

Yocto가 리눅스의 MTD를 활용해서 하는거 라고 생각하면 될듯?

"Mtd"는 "Memory Technology Device"의 약어로, 리눅스 커널에서 사용되는 메모리 디바이스 관련 개념입니다. MTD는 주로 플래시 메모리와 같은 비휘발성 메모리 디바이스에 대한 추상화 계층을 제공하며, 이를 통해 리눅스 시스템이 이러한 디바이스를 사용할 수 있도록 합니다.

 

 

 

 

 

반응형