새소식

라즈베리파이

라즈베리파이4B SSD(USB)로 부팅하는 방법

  • -

우선 라즈베리파이4B 부터는 eeprom(4MBits/512KB)이 장착되어 있으며
eeprom에는 시스템을 부팅하는 코드가 내장되어 있으며 이 부트로더를 업데이트할 수 있습니다
즉 eeprom에 부트로더용 펌웨어를 수정함으로써 USB나 SSD와 같은 외부 저장장치를 통해서 라즈베리파이를 부팅시킬 수 있습니다(4버전이 아닌 이전 버전은 eeprom이 없기 때문에 다른 방법을 이용해야 함)

** 참고로 아래 글에서 제가 사용한 SSD는 WD BLUE 500G SATA3 SSD 입니다

 

라즈베리파이를 SSD로 부팅시키려는 이유

SSD로 부팅하도록 바꾸려는 이유는 2가지가 있습니다
1. 속도
2. 안정성

당연히 sd카드 보다는 SSD가 속도가 훨씬 빠릅니다. SSD로 부팅 설정을 마쳐보면 확실히 체감이 됩니다.
또한 sd 카드 같은 경우 라즈베리파이를 많이 써보신 분은 알겠지만 고장이 자주 일어납니다
뺏다 꼈다하는 과정에서의 물리적인 손상도 있고
SD 카드는 수명이 SSD에 비해 길지 않기 때문에 안정성면에서 훨씬 좋습니다

 

라즈베리파이4의 부팅 흐름

라즈베리파이4의 부팅 흐름은 아래에서 참고하였습니다

https://wikidocs.net/65030

 

Pi4 부팅 흐름

# Pi4 부팅 흐름 BCM2711 SoC가 포함된 Pi4는 새롭고 더욱 정교한 부팅 프로세스가 있습니다. EEPROM이 추가되어 `/boot`의 `bootcode.bin ...

wikidocs.net

라즈베리파이4가 되면서 BCM2711 SoC를 탑재하였고 EEPROM이 추가 되었습니다.
그래서 더 이상 /boot의 bootcode.bin 파일이 필요하지 않다고 합니다
라즈베리파이4의 부팅 흐름은 다음과 같습니다

1. BCM2711 SoC 전원 공급
2. 온보드 부트롬은 SD 카드에서 부트 로더 복구파일(recovery.bin)을 확인. 발견되면 이를 실행하여 EEPROM을 플래시하고 recovery.bin이 재설정을 트리거

3. 발견되지 않으면 부트롬은 EEPROM에서 주 부트 로더를 로드
4. 부트 로더는 내장된 BOOT_ORDER 구성 항목을 확인하여 수행할 부팅 유형 결정

- SD 카드
- 네트워크
- USB 대용량 저장장치

즉 BOOT_ORDER에 USB저장장치를 포함시켜주면 USB로 부팅이 가능해지지만 기본 부트로더로는 지원하지 않기 때문에 이를 최신버전의 부트로더로 업데이트 해주어야 합니다

 

부트로더 최신으로 업데이트

우선 진행하기 전에 아래 명령어를 통해 패키지 관련해서 최신화를 진행합니다

sudo apt-get update
sudo apt-get upgrade

 

그 다음 아래처럼 명령어를 입력합니다
그렇게 되면 업데이트가 필요하다면 자동으로 업데이트를 진행합니다

sudo rpi-eeprom-update -d -a

 

그리고 아래 명령어를 통해 라즈베리파이를 재부팅합니다

sudo reboot

재부팅하게 되면 /boot에 recovery.bin 외에 다른 파일들도 생성되게 되고
재부팅시에 recovery.bin을 인식하여 새로운 부트로더 이미지파일을 eeprom에 쓰고 생성된 파일들은 사라지게 된다고 합니다

옵션 없이 실행하게 되면 위와 같이 나오게 됩니다
수동으로 업데이트가 필요한지 여부를
펌웨어 디렉토리인 /lib/firmware/raspberrypi/bootloader/default의 버전과 비교하여 업데이트가 필요한지 확인합니다
up to date로 나온다면 최신 버전으로 업데이트 성공!!

 

부팅순서 변경

아래 명령어를 입력하여 부팅순서를 변경합니다

sudo raspi-config

그러면 위와 같은 창이 나오게 됩니다
여기서 Advanced Options로 이동하여 Enter 입력

 

다음 Bootloader Version 으로 이동하여 Enter

 

Latest User the latest version boot ROM software 에서 Enter 입력

 

No에서 Enter 입력

 

Ok에서 Enter 입력

 

다시 Advanced Options -> Boot Order로 이동합니다

 

그리고 여기서 부팅 순서를 변경할 수 있는데 여기서 USB Boot에서 Enter 입력

 

OK 입력

 

Finish에서 Enter입력

 

No 에서 Enter 입력

 

부팅순서 변경 확인

위 명령어를 입력하여 부팅순서가 변경된 것을 확인할 수 있습니다
아마 기존에는 BOOT_ORDER=0x1(sd카드로만 부팅 설정 되어있다는 뜻)로 되어있었을 것입니다
위 처럼 4가 추가 되었다는 것은 USB로 부팅도 추가 되었다는 뜻입니다
다만 저는 순서가 SD카드가 먼저 되어있는 것 같네요
순서도 변경하고 싶으시다면 아래 명령어를 통해 수정할 수 있습니다
BOOT_ORDER=0xf41 로 변경해줍니다

sudo -E rpi-eeprom-config --edit

그러면 텍스트 편집기(EDITOR 환경 변수에 따라 다른 편집기)를 통해서 EEPROM 구성을 로드하고 변경할 수 있습니다
편집기를 닫게 되면 rpi-eeprom-config가 업데이트된 구성을 사용가능한 최신 EEPROM 릴리즈에 적용하여 rpi-eeprom-update를 사용해 시스템이 재부팅될 때 업데이트가 되도록 스케줄링 한다고 합니다

sudo reboot

그리고 재부팅합니다

 

SD 카드의 내용을 SSD로 복사하기(rpi-clone)

그리고 가장 간단한 방법은 SSD를 USB처럼 인식시켜서 라즈베리파이 OS 이미지를 새로 굽는 방법입니다
USB라면 balenaEtcher와 같은 프로그램을 이용해 이미지를 구울 수 있겠지만 SSD는 그게 쉽지 않습니다
그래서 기존 SD카드에 있는 파일을 옮겨서 진행하려고 합니다
그걸 가능하게 해주는 오픈소스인 rpi-clone을 이용해 진행하려고 합니다
(GUI가 없는 이미지로 구웠기 때문에 아래처럼 진행, GUI가 있다면 GUI 상에서 SD Card Copier를 이용해 간단하게 복사 가능)

sudo apt-get install git-core -y

git이 설치가 안 되어 있다면 위 명령어를 통해 우선 git을 설치해줍니다

 

git clone https://github.com/billw2/rpi-clone.git

위 명령어를 통해 rpi-clone repo를 clone 떠옵니다

 

cd rpi-clone

그리고 clone 받은 파일의 디렉토리로 이동합니다

 

sudo cp rpi-clone rpi-clone-setup /usr/local/sbin

그리고 rpi-clone이라는 파일을 복사합니다
이는 호스트 이름을 설정하기 위한 것입니다

 

echo $PATH

PATH 환경 변수를 확인하여 /usr/local/sbin이 있는지 확인합니다

 

sudo rpi-clone-setup -t testhostname

위 명령어를 이용하여 테스트를 진행합니다
그리고 /tmp/clone-test 밑의 파일을 확인하여 정상적으로 수정되었는지 확인해보면 됩니다
위 과정은 정상작동하는지 테스트하는 것으로 보입니다. 정상적으로 되었다면 다음 단계로 넘어가면 됩니다

 

rpi-clone을 실행합니다
sda는 저의 SSD가 있는 곳입니다
혹시 모르겠다면 lsblk 명령어를 입력하여 확인해 볼 수 있습니다
yes를 입력하고 라벨이 없다는 에러가 발생했기 때문에 라벨도 적어줍니다
저는 WD-SSD-500으로 입력하였습니다
위에 보이다시피 /boot는 sda1로 sync되고 root는 sda2로 sync 됩니다

 

그러면 위와 같이 자동으로 dd, mkfs, rsync 명령어를 통해
sd 카드에서 ssd로 자동으로 복사해줍니다

 

다 되었다면 lsblk를 통해 확인해봅니다
/boot가 sda1로 잘 sync 된 것으로 보입니다

 

sudo mount /dev/sda1 /boot
sudo mount /dev/sda2 /

조금 헤맸어서 정확히 기억이 나지는 않는데 저대로 sd카드를 빼고 부팅했을때
mount는 되지 않아 부팅이 되지 않았던 것으로 기억합니다 (이렇게 먼저 해보세요!!!)
그래서 위 명령어를 통해 mount를 진행합니다
root도 위 처럼 mount를 해주었던것 같습니다(제 기억으로는...)

 

mount가 정상적으로 되었다면 위 처럼 나오게 됩니다
그리고 이제 전원을 끄고 sd 카드를 제거한 뒤 라즈베리파이를4b를 재부팅합니다
부팅이 정상적으로 된다면 성공!!!!
저도 한 2,3번 정도 sd 카드 뺏다 꽂았다
mount도 다시 했다 한 기억이 있어서 끝에 조금 헷갈리는 부분이 있습니다
혹시나 잘 못된 부분이 발견 된다면 알려주시면 감사하겠습니다~~

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.