우선 라즈베리파이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가 되면서 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도 다시 했다 한 기억이 있어서 끝에 조금 헷갈리는 부분이 있습니다 혹시나 잘 못된 부분이 발견 된다면 알려주시면 감사하겠습니다~~