본문 바로가기

언어/라즈베리파이

라즈베리파이4 B+에 Ubuntu 20.04 설치하기 [USB]

출처: 라즈베리파이4 B+에 Ubuntu 20.04 설치하기(USB) (tistory.com)

 

라즈베리파이4 B+에 Ubuntu 20.04 설치하기(USB)

Raspberry Pi OS는 한계가 명확합니다. 이전 글에서 설명했듯, Raspberry Pi OS는 깔끔하고 최적화가 잘 되어 있는 OS입니다. 그러나 그 장점은 어디까지나 라즈베리파이를 교육용으로 사용했을 때 유효

whiteknight3672.tistory.com

Raspberry Pi OS는 한계가 명확합니다.

  이전 글에서 설명했듯, Raspberry Pi OS는 깔끔하고 최적화가 잘 되어 있는 OS입니다. 그러나 그 장점은 어디까지나 라즈베리파이를 교육용으로 사용했을 때 유효합니다. 저는 ROS를 사용하기 위해 라즈베리파이를 구입했습니다. 그리고 ROS를 설치해야 했습니다. ROS Wiki에는 Raspberry Pi OS에서도 설치할 수 있다고는 하지만, 알 수 없는 오류로 설치가 수 차례 좌절되면서, 라즈베리파이에 그냥 우분투를 설치하고 우분투 환경에서 ROS를 구동하는 게 더 안정적이겠다 판단해, 우분투를 설치하게 되었습니다.
  이번 포스팅에서는 우분투를 설치하는 방법과, 설정 방법에 대해 자세한 설명과 옵션을 함께 포함해 설치해보도록 하겠습니다. 모든 내용은 Linux 환경에서 라즈베리파이에 우분투를 USB메모리에 담아서 부팅한다는 가정 하에 진행되었습니다. 

(2020/08/13 최초 작성)

0단계. 라즈베리파이4 부트로더 수정

 

USB로 라즈베리파이4 성능을 5배 향상시켜보자

microSD로 OS 구동은 도저히 쓸 수 없을 것 같았습니다. 유튜브로 라즈베리파이 구동 영상을 봤을 땐, 생각보다 빠릿빠릿하게 돌아가는 걸 확인할 수 있었습니다. 그런데 직접 돌려보니 실사용이 ��

whiteknight3672.tistory.com

위의 글을 통해 라즈베리파이를 USB 부팅 가능하도록 부트로더를 수정합니다.

 

1단계. 사전 준비

 

Install Ubuntu Server on a Raspberry Pi 2, 3 or 4 | Ubuntu

Ubuntu is an open-source operating system for cross platform development, there’s no better place to get started than with Ubuntu on a Raspberry Pi.

ubuntu.com

 

balena - The complete IoT fleet management platform

Infrastructure and tools to develop, deploy, and manage connected devices at scale. Your first ten devices are always free.

www.balena.io

우선 Raspberry Pi Imager는 사용하지 않는 걸 권장합니다. USB 메모리에 업로드하는데 시간이 너무 오래 걸립니다. 대신 위의 두 링크를 통해 라즈베리파이에 사용할 우분투 이미지를 다운받고, 와 BalenaEtcher를 다운받으시길 바랍니다. 목적에 맞는 우분투 버전과 아키텍처를 선택해 다운로드 받습니다. 저처럼 ROS를 사용한다면 Melodic 버전을 사용할 수 있는 Ubuntu 18.04 64bit를 추천합니다.

 

2단계. 파일을 USB메모리에 Flash하기

BalenaEtcher에서는 Raspberry Pi Imager만큼이나 손쉽게 이미지 파일을 저장소에 Flash할 수 있으며, Raspberry Pi Imager보다 빠르게 진행할 수 있습니다. Raspberry Pi Imager가 20-30분정도 소요되는 데 비해, BalenaEtcher는 5분이면 충분합니다.

 

3단계. 추가적인 옵션 진행하기(선택사항)

아래 옵션은 원하는 경우 진행하며, 아닐 경우 그냥 다음 단계로 넘어가도 됩니다. 옵션 진행을 위해서는 Flash가 끝난 후 USB를 뽑았다 다시 꼽아서 system-boot 혹은 boot라는 이름의 저장소가 윈도우에서 인식 된 이후 진행합니다.

  • ssh 접근할 수 있도록 설정
    이미지를 Flash한 boot 파티션에 ssh 라는 파일 하나를 만듭니다. 파일을 만드는 방법은 여러 가지가 있습니다.
    1. boot파티션에서 cmd 창을 연 후 echo >ssh 입력
    2. 빈 txt를 boot 파티션에 옮기고 이름 변경 (ex : ***.txt --> ssh)

  • wifi 세팅
    boot 파티션 보면 network-config가 있습니다. 그걸 notepad++로 엽니다. 그리고 아래 형식에 맞춥니다. 여기서 wifi 세팅을 하면 초기 부팅시 wifi에 연결할 수 있습니다. 되도록 그냥 아래에 작성한 것을 복사해서 network-config에 붙여넣고 ssid, password부분만 수정하기 바랍니다. 참고로 network-setting 파일을 읽어들일 때 들여쓰기는 스페이스바를 이용하시기 바랍니다. 탭(\t)은 인식하지 않습니다.
 
wifis:
 
wlan0:
 
dhcp4: true
 
optional: true
 
access-points:
 
"ssid":
 
password: "password"

 

  • 오버클럭
    config.txt 파일을 열어서 아래의 구문을 추가합니다. 오버클럭에 관한 자세한 정보는 아래 링크를 통해 확인할 수 있습니다.
 
over_voltage=4
 
arm_freq=2000 #CPU Overclock
 
gpu_freq=600 #GPU Overclock
 

Overclocking options in config.txt - Raspberry Pi Documentation

documentation > configuration > config-txt > overclocking Overclocking options in config.txt NOTE: Setting any overclocking parameters to values other than those used by raspi-config may set a permanent bit within the SoC, making it possible to detect that

www.raspberrypi.org

 

4단계. 아래 링크에서 에서 최신 펌웨어를 다운 받습니다.

 

raspberrypi/firmware

This repository contains pre-compiled binaries of the current Raspberry Pi kernel and modules, userspace libraries, and bootloader/GPU firmware. - raspberrypi/firmware

github.com

boot 폴더 안에 있는 모든 .dat와 .elf 파일을 복사해서 os가 구워져있는 USB 의 boot 파티션에 붙여넣습니다.

 

5단계. USB의 boot파티션에서 vmlinuz의 압축을 풉니다.

zcat vmlinuz > vmlinux

약 8MB 크기의 vmlinuz가 25MB 크기의 vmlinux가 되었습니다.

 

6단계. config.txt의 [pi4] 섹션의 값을 다음과 같이 수정합니다.

 
[pi4]
 
max_framebuffers=2
 
dtoverlay=vc4-fkms-v3d
 
boot_delay
 
kernel=vmlinux
 
initramfs initrd.img followkernel

 

7단계. auto_decompress_kernel 이라는 파일을 만들어 다음의 내용을 추가합니다.

 
#!/bin/bash -e
 
 
 
#Set Variables
 
BTPATH=/boot/firmware
 
CKPATH=$BTPATH/vmlinuz
 
DKPATH=$BTPATH/vmlinux
 
 
 
#Check if compression needs to be done.
 
if [ -e $BTPATH/check.md5 ]; then
 
if md5sum --status --ignore-missing -c $BTPATH/check.md5; then
 
echo -e "\e[32mFiles have not changed, Decompression not needed\e[0m"
 
exit 0
 
else echo -e "\e[31mHash failed, kernel will be compressed\e[0m"
 
fi
 
fi
 
 
 
#Backup the old decompressed kernel
 
mv $DKPATH $DKPATH.bak
 
 
 
if [ ! $? == 0 ]; then
 
echo -e "\e[31mDECOMPRESSED KERNEL BACKUP FAILED!\e[0m"
 
exit 1
 
else echo -e "\e[32mDecompressed kernel backup was successful\e[0m"
 
fi
 
 
 
#Decompress the new kernel
 
echo "Decompressing kernel: "$CKPATH".............."
 
 
 
zcat $CKPATH > $DKPATH
 
 
 
if [ ! $? == 0 ]; then
 
echo -e "\e[31mKERNEL FAILED TO DECOMPRESS!\e[0m"
 
exit 1
 
else
 
echo -e "\e[32mKernel Decompressed Succesfully\e[0m"
 
fi
 
 
 
#Hash the new kernel for checking
 
md5sum $CKPATH $DKPATH > $BTPATH/check.md5
 
 
 
if [ ! $? == 0 ]; then
 
echo -e "\e[31mMD5 GENERATION FAILED!\e[0m"
 
else echo -e "\e[32mMD5 generated Succesfully\e[0m"
 
fi
 
 
 
#Exit
 
exit 0

위의 내용을 가진 auto_decompress_kernel 스크립트 파일을 boot 파티션에 둡니다.(확장자가 없습니다.)

 

8단계. 권한을 추가합니다.

sudo chmod +x auto_decompress_kernel

여기까지만 하면 우선은 부팅이 됩니다. 그러나 라즈베리파이가 종료되고 그 다음부터는 부팅이 되지 않습니다. 따라서 다음 단계를 통해 라즈베리파이가 꺼졌다 켜져도 정상적으로 부팅이 될 수 있도록 해보겠습니다. 다음 과정은 일단 여기까지 진행해서 라즈베리파이를 부팅시킨 후에도 진행할 수 있습니다. 다만 번거로움을 피하기 위해 9-10단계에서 바로 파일을 세팅합니다.

 

9단계. USB를 꽂았을 때 함께 인식되는  스크립트를 만듭니다.

 
sudo nano /etc/apt/apt.conf.d/999_decompress_rpi_kernel
 
 
 
DPkg::Post-Invoke {"/bin/bash /boot/firmware/auto_decompress_kernel"; };

999_decompress_rpi_kernel 파일을 writable 파티션 내 /etc/apt/apt.conf.d 경로 안에 생성 후 3번째 줄의 내용을 추가합니다.

 

10단계. 권한을 추가합니다.

sudo chmod +x 999_decompress_rpi_kernel

여기까지 하면 라즈베리파이 종료 후에도 정상적으로 부팅이 가능하게 됩니다. 

11단계. 최초 로그인

 
Ubuntu Server 20.04 LTS tty1
 
Login :

  처음 부팅이 진행될때 라즈베리파이는 인터넷 연결을 확인합니다. 2. 에서 wifi 세팅을 했다지만 초기에는 되도록이면 이더넷 연결을 권장합니다. 연결이 안되어있다면 다음 과정으로 안넘어가기 때문입니다. 연결이 확인되었다면 CLI 환경에서 위와 같은 글자가 뜹니다. 초기 id/pw는 모두 ubuntu로 동일합니다. 그런데 이 때, ID, PW 칸에 모두 ubuntu를 입력했음에도 Login Incorrect 문구가 뜨면서 로그인이 안됩니다. 단순히 자격증명 관련된게 설치되기 전에 로그인하라는 창이 떠서 로그인을 해도 안되는 겁니다. 이 때는 SSH로 접속해도 계속 permission denied/refused 의 이유로 접속이 안됩니다. 당황할 필요 없이 그냥 조금 천천히 기다렸다 로그인하면 됩니다. 그래도 안된다면, 수 차례 재부팅을 해봅니다. 그러다보면 로그인이 됩니다.

 

12단계. wifi 설정(선택사항)

 
sudo apt-get install network-manager
 
sudo nmtui

wifi를 쓰고싶은데 부팅 과정에서 wifi를 못잡아 진행이 안되었던 분이라면 위의 명령어를 통해 network-manager를 설치하고, nmtui를 열어 wifi를 연결하기 바랍니다. 일단 한 번 연결되면, 그 뒤부턴 큰 탈 없이 wifi를 이용할 수 있습니다.

 

13단계. desktop 설정(필수에 가까운 선택사항)

 
sudo apt-get update
 
sudo apt-get upgrade
 
 
 
# 아래서부터 원하는 타입의 gui를 선택합니다.
 
sudo apt-get install ubuntu-desktop # 추천
 
sudo apt-get install --no-install-recommends ubuntu-desktop # 필수적인 프로그램만 설치 시
 
sudo apt-get install lubuntu-desktop

 우리는 지금까지 설치한 Ubuntu Server는 OS 구동에 필요한 최소의 툴만 설치되어 있습니다. 따라서 GUI 환경을 제공하지 않습니다. 로그인 후에 Bash 쉘이 뜨는 게 정상입니다. 그게 부팅이 완료되어 사용 준비 가능하다는 뜻입니다. 그렇지만 보통 생각하는 것처럼 웹브라우저를 띄우고 하려면 GUI 인터페이스를 설치해야합니다. 우분투에서 사용 가능한 GUI로는 ubuntu-desktop(Gnome), ubuntu MATE, lubuntu, xubuntu, kubuntu정도 있으며,개인적으로는 ubuntu-desktop이나 ubuntu MATE를 추천합니다. lubuntu는 가볍긴 하지만 뭔가 낯설어서 영 정이 가지 않았습니다. 참고로 이것들을 설치하는데 시간이 굉장히 오래 걸리니 (정확하진 않지만 3시간정도 걸리며, 쉘에서는 예상시간을 6시간,12시간까지 표시했었습니다.) 유념하시기 바랍니다.

 

14. It Works!

이제 하고 싶은 걸 라즈베리파이에 올려서 하시면 됩니다. 한 가지 알아둬야할 게 있다면, 라즈베리파이(armhf)는 일반 pc(amd64)와 기반이 다릅니다. 따라서 기존에 사용하던 프로그램이 라즈베리파이에서는 돌아가지 않을 수 있으니 armhf 호환 여부를 확인해야합니다.


글이 도움이 되셨다면 왼쪽 아래의 공감버튼과 광고 클릭 부탁드립니다. 고마움을 표현할 수 있는 가장 쉬운 방법입니다.
감사합니다.