1. Ghi file Image vào thẻ SD Card
Phương pháp 1: Sử dụng balenaEtcher (Khuyến nghị)
Công cụ balenaEtcher giao diện đồ họa, tự động tìm đúng device và flash an toàn hơn so với lệnh dd thủ công, tránh ghi nhầm vào ổ cứng của máy chủ.
Trước tiên, hãy đảm bảo thẻ SD Card đã được cắm vào máy tính host (Linux/Windows/macOS) và file image bootable đã được tạo ở Phần 6 (ví dụ: hackberrypi_cm5_rootfs.img).
sudo apt update && sudo apt install etcher-cli -y
Chạy lệnh trên để cài đặt phiên bản dòng lệnh của Etcher. Sau đó thực hiện flash với lệnh:
etcher-cli flash hackberrypi_cm5_rootfs.img /dev/sdX
Thay thế /dev/sdX bằng đúng đường dẫn của thẻ SD Card (ví dụ: /dev/sdb). Để kiểm tra tên device chính xác trước khi chạy, dùng lệnh lsblk để xác định dung lượng.
Kết quả mong đợi: BalenaEtcher sẽ hiển thị quá trình Write, Verify và thông báo "Flash Complete!" khi thành công.
Phương pháp 2: Sử dụng lệnh dd (Truyền thống)
Sử dụng dd để copy byte-for-byte file image vào block device. Phương pháp này nhanh nhưng nguy hiểm nếu gõ sai tên thiết bị.
Xác định tên thiết bị thẻ SD Card bằng lệnh:
lsblk
Giả sử thẻ SD Card là /dev/sdb. Thực hiện ghi image với các tham số tối ưu tốc độ:
sudo dd if=hackberrypi_cm5_rootfs.img of=/dev/sdb bs=4M status=progress oflag=sync
Tham số bs=4M tăng kích thước block để ghi nhanh hơn, oflag=sync đảm bảo dữ liệu được đẩy xuống vật lý trước khi kết thúc.
Kết quả mong đợi: Dòng lệnh hiển thị tốc độ ghi (MB/s) và tổng số byte đã copy, kết thúc bằng thông báo "copy complete".
Verify kết quả ghi
Sau khi flash xong, kiểm tra lại cấu trúc phân vùng của thẻ SD Card để đảm bảo bootloader và rootfs đã được nhận diện đúng:
sudo fdisk -l /dev/sdb
Bạn sẽ thấy danh sách các phân vùng (ví dụ: /dev/sdb1 là boot partition, /dev/sdb2 là root partition) với kích thước tương ứng file image đã tạo.
2. Chuẩn bị phần cứng và kết nối UART
Thiết lập kết nối Console qua UART
Với HackberryPi CM5, việc quan sát log khởi động qua UART là bắt buộc vì màn hình HDMI có thể chưa được kích hoạt ngay lập tức do driver GPU chưa load hoặc chưa có màn hình.
Sử dụng cáp USB-to-TTL (ví dụ: FTDI hoặc CP210x). Kết nối các chân như sau:
- TX của cáp vào chân RX của CM5
- RX của cáp vào chân TX của CM5
- GND của cáp vào chân GND của CM5 (Bắt buộc)
Trên máy tính host, xác định cổng serial được nhận diện:
ls /dev/ttyUSB* /dev/ttyACM* 2>/dev/null
Giả sử cổng nhận diện là /dev/ttyUSB0. Cài đặt công cụ screen hoặc minicom để kết nối:
sudo apt install screen -y
Khởi động session với baud rate tiêu chuẩn của U-Boot và Linux (thường là 115200):
screen /dev/ttyUSB0 115200
Kết quả mong đợi: Màn hình hiện lên dòng chữ Connected hoặc màn hình đen chờ tín hiệu. Khi cấp nguồn cho HackberryPi, log sẽ bắt đầu hiện ra ngay lập tức.
3. Khởi động hệ thống và quan sát Bootlog
Thao tác cắm thẻ SD và cấp nguồn
Cắm thẻ SD Card đã flash vào khe thẻ của HackberryPi CM5. Cấp nguồn cho board thông qua nguồn 5V/4A hoặc cáp USB-C.
Ngay lập tức quan sát cửa sổ screen trên máy tính host. Bạn sẽ thấy quá trình khởi động chia làm 3 giai đoạn:
- SPL (Secondary Program Loader): Code khởi động thấp nhất, chuẩn bị RAM và load U-Boot.
- U-Boot: Bootloader, hiển thị thông tin phần cứng, tìm file kernel và device tree.
- Kernel Linux: Load module, mount rootfs và khởi động init system (systemd).
Kiểm tra log U-Boot, bạn cần thấy dòng xác nhận tìm thấy file boot:
Found SD card device: mmcblk0
Và dòng load kernel:
Loading kernel from FIT image at 0x02000000...
Sau đó, log Kernel sẽ hiện lên với dòng [ 0.000000] Booting Linux on physical CPU 0x0 và tiếp tục là hàng loạt thông báo về driver, interrupt, và filesystem.
Verify quá trình Boot
Kiểm tra xem hệ thống đã vượt qua giai đoạn Kernel và chuyển sang Init System chưa. Tìm dòng log:
[ X.XXXXXX] systemd[1]: Started System V... or Started systemd-sysv-generator.service
Nếu thấy dòng Started System V hoặc Started User Manager for UID 0, nghĩa là Kernel đã boot thành công và đang chạy dịch vụ người dùng.
4. Xác nhận truy cập Shell và Kết nối Mạng
Đăng nhập vào Console
Khi quá trình boot hoàn tất, màn hình UART sẽ hiện dòng prompt chờ đăng nhập. Hệ thống mặc định thường dùng user root và không có mật khẩu (hoặc mật khẩu trống) cho mục đích phát triển.
Login: root
Password:
Nhấn Enter ngay sau dòng Password:. Nếu thành công, bạn sẽ thấy prompt shell:
root@hackberrypi:~#
Kiểm tra phiên bản Kernel đang chạy:
uname -r
Kết quả mong đợi: Trả về số phiên bản Kernel tương ứng với phần đã biên dịch ở Phần 3 (ví dụ: 5.15.0-hackberry).
Cấu hình và kiểm tra mạng
Để kiểm tra kết nối mạng, đầu tiên xác định tên interface mạng (thường là eth0 cho Ethernet hoặc wlan0 cho Wi-Fi nếu có module).
ip addr
Nếu chưa có IP, hãy kích hoạt DHCP để nhận IP tự động từ router:
dhclient eth0
Chờ vài giây, sau đó kiểm tra lại địa chỉ IP đã được cấp:
ip addr show eth0
Kiểm tra khả năng kết nối ra Internet bằng lệnh ping:
ping -c 4 8.8.8.8
Kết quả mong đợi: Trả về 4 gói tin thành công với 4 packets transmitted, 4 received, 0% packet loss.
Verify truy cập Shell từ xa
Để đảm bảo hệ thống hoạt động ổn định, hãy thử truy cập từ một máy tính khác trong cùng mạng LAN thông qua SSH.
Tra cứu IP của HackberryPi từ bước trên (ví dụ: 192.168.1.50). Từ máy tính khác, chạy lệnh:
ssh root@192.168.1.50
Nhấn yes khi được hỏi về fingerprint và nhấn Enter khi hỏi password (nếu để trống).
Kết quả mong đợi: Kết nối SSH thành công và hiện prompt shell root@hackberrypi:~# trên máy tính khác. Điều này xác nhận hệ điều hành Linux đã boot hoàn chỉnh, mạng đã hoạt động và dịch vụ SSH đã chạy.
Điều hướng series:
Mục lục: Series: Xây dựng hệ điều hành Linux từ source cho HackberryPi CM5
« Phần 6: Gói hóa hệ thống và tạo file bootable image
Phần 8: Cấu hình hệ thống sau khi boot và tối ưu hiệu năng »