이전 글 먼저 진행해야됩니다!
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카드 빼주고 라즈베리파이에 넣어서 전원 넣고 부팅
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.
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
라즈베리파이로 들어가서 실행해주면
쭈루룩 나옴.
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는 주로 플래시 메모리와 같은 비휘발성 메모리 디바이스에 대한 추상화 계층을 제공하며, 이를 통해 리눅스 시스템이 이러한 디바이스를 사용할 수 있도록 합니다.
'Linux BSP' 카테고리의 다른 글
[RaspberryPi DeviceDriver] 디바이스 드라이버 코드 수정해서 커널에 포함시키기 (0) | 2024.02.21 |
---|---|
[RaspberryPi DeviceDriver] Yocto Project 설정 초기화 및 디바이스 파일 만들어보기 (0) | 2024.02.21 |
[Linux] fork()와 exec()를 이용한 프로세스 생성 과정 (1) | 2024.02.19 |
[Linux File System] Linux Root File System (0) | 2024.02.19 |
[Linux File System] Yocto Project (0) | 2024.02.19 |