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ị:

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 😀