출처: 라즈베리파이4 B+에 Ubuntu 20.04 설치하기(USB) (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 부팅 가능하도록 부트로더를 수정합니다.
1단계. 사전 준비
우선 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
|
4단계. 아래 링크에서 에서 최신 펌웨어를 다운 받습니다.
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 호환 여부를 확인해야합니다.
글이 도움이 되셨다면 왼쪽 아래의 공감버튼과 광고 클릭 부탁드립니다. 고마움을 표현할 수 있는 가장 쉬운 방법입니다.
감사합니다.
'언어 > 라즈베리파이' 카테고리의 다른 글
Backing up an OS Image and convert to Berryboot. Ubuntu Mate download Links. Raspberry Pi 4 (0) | 2021.02.10 |
---|---|
RealVNC Server on UBUNTU 20.10 (ARM64) on Raspberry Pi 4 (8GB) by jorgemtds (0) | 2021.02.10 |
Setting Up Bluetooth Serial Port Profile on Raspberry Pi using sdptool (0) | 2021.01.10 |
Bluetooth (0) | 2021.01.10 |
라즈베리파이 고정 IP 할당하기 (0) | 2021.01.08 |