Cài đặt Ubuntu Server 20.04 trên SSD cho Raspberry Pi
Hiện tại mình đang sử dụng Raspberry Pi 4, việc cài Ubuntu Server 20.10 trên SSD thì ok, nhưng với bản 20.04 thì không thể boot được, cài trên SD-Card thì bình thường.
Cách này được chia sẻ trên medium của tác giả @zsmahi. Mình dịch và leech về cho ae nào cần sử dụng như mình.
Say Goodbye SD-Card
Kể từ tháng 5 năm 2020, Raspberry Pi Foundation đã công bố chương trình lớn của mình “ sự xuất hiện của USB boot trên Raspberry Pi 4 trong phiên bản beta ”.
Chuẩn bị:
- Raspberry Pi 4b (RAM ít nhất 4 GB)
- Thẻ SD (ít nhất 8 GB)
- Box SSD cắm qua cổng USB (Mình đang sử dụng box SSD M2 128GB)
- BalenaEtcher được cài đặt để flash Thẻ SD và ổ SSD → https://www.balena.io/etcher/
- File img hệ điều hành Raspberry Pi → https://www.raspberrypi.org/downloads/raspberry-pi-os/
- Ubuntu Server 20.04 (64 bits) dành cho Raspberry Pi → https://ubuntu.com/download/raspberry-pi
Lets go
Đầu tiên, tôi xin nói rằng quy trình này có thể được áp dụng cho bất kỳ hệ điều hành ARM nào chứ không chỉ Ubuntu Server.
1. Ghi Raspberry OS lên thẻ SD bằng BalenaEtcher.
2. Ghi Ubuntu 20.04 lên ổ SSD bằng BalenaEtcher.
3. Khởi động Raspberry Pi của bạn bằng thẻ SD (hiện tại không cắm box SSD). Nếu bạn muốn truy cập Raspberry Pi của mình từ ssh
, đừng quên thêm tệp ‘ssh‘ vào phân vùng khởi động.
4. Trong trường hợp của tôi, tôi đang truy cập Raspberry Pi của mình qua ssh (user mặc định: pi
và mật khẩu: raspberry
, đừng quên thay đổi chúng sau khi đăng nhập).192.168.0.20
là địa chỉ IP của Raspberry của tôi.
5. Bây giờ hãy update cho Raspberry bằng lệnh sau:
sudo apt update && sudo apt full-upgrade -y
Thao tác này sẽ nâng cấp hệ thống và tất cả các ứng dụng đã cài đặt.
6. Bây giờ, cắm box SSD vào Raspberry Pi qua cổng USB 3.0 và mount các phân vùng của nó.
(a) – Chúng ta hãy tìm tên của ổ SSD bằng lệnh sau:
lsblk
/dev/sda1
: phân vùng khởi động trên SSD./dev/sda2
: phân vùng chính trên SSD.
(b) – Giờ chúng ta mount
2 phân vùng này bằng lệnh sau:
sudo mkdir /mnt/boot && sudo mount /dev/sda1 /mnt/boot
sudo mkdir /mnt/principal && sudo mount /dev/sda2 /mnt/principal
7. Bây giờ chúng ta sẽ sao chép nội dung (các tệp *.dat & *.elf) của phân vùng /boot
vào /mnt/boot
.
cd /mnt/boot
sudo cp /boot/*.elf /mnt/boot/
sudo sudo cp /boot/*.dat /mnt/boot/
8. Giải nén tệp vmlinuz
trên phân vùng khởi động (https://en.wikipedia.org/wiki/Vmlinux)
cd /mnt/boot
zcat vmlinuz > vmlinux
Note: nếu ai bị lỗi -bash: vmlinux: Permission denied
thì gõ sudo -i
rồi gõ lại lệnh bên trên
9. Cập nhật [pi4] trên tệp config.txt (nằm trên /mnt/boot
) như sau:
sudo nano /mnt/boot/config.txt
Thêm các dòng sau vào và lưu tệp.
dtoverlay=vc4-fkms-v3d
boot_delay
kernel=vmlinux
initramfs initrd.img followkernel
10. Bây giờ chúng ta sẽ thêm một tập lệnh để tự động giải nén Kernel trong phân vùng khởi động ( /mnt/boot/
) và đặt tên nó là auto_decompress_kernel
sudo nano /mnt/boot/auto_decompress_kernel
Thêm vào nội dung sau và lưu lại:
#!/bin/bash -e
# auto_decompress_kernel script
#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
Xét quyền để nó có thể chạy được:
chmod +x auto_decompress_kernel
11. Bây giờ, chúng ta sẽ tạo một script 999_decompress_rpi_kernel
trong thư mục /mnt/principal/etc/apt/apt.conf.d/
để giải nén kernel rpi.
sudo nano /mnt/principal/etc/apt/apt.conf.d/999_decompress_rpi_kernel
Thêm vào nội dung sau và lưu lại:
DPkg::Post-Invoke {"/bin/bash /boot/firmware/auto_decompress_kernel"; };
Sét quyền cho file:
chmod +x /mnt/principal/etc/apt/apt.conf.d/999_decompress_rpi_kernel
12. Đến bước này là đã xong, hãy tắt Raspberry Pi và rút thẻ SD-Card, bật nó lên và tận hưởng khả năng khởi động từ ổ SSD. Tôi sẽ truy cập Raspberry Pi của mình ngay bây giờ thông qua ssh nhưng với Ubuntu Server 20.04 (user và pass mặc định là ubuntu / ubuntu
).
Sau lần đăng nhập đầu tiên, hệ điều hành sẽ yêu cầu bạn thay đổi mật khẩu mặc định.
Hy vọng bạn thích cái hướng dẫn nhỏ này và build được những dự án thú vị trên con Raspberry Pi của mình 😀