Một trong số các nguyên nhân làm RPi không thể boot từ USB là thời gian khởi tạo quá chậm của thiết bị nối với USB.
Tuy nhiên quá trình chuẩn bị để RPi boot từ USB đã quá đơn giản và đã có thể boot từ những thiết bị USB chậm.
Thiết bị cần dùng
- RPi
- Thẻ nhớ Micro SD card đã có ghi ảnh đĩa Jessie
- Thiết bị lưu trữ USB như HDD/SSD hay USB flash
Chuẩn bị
- Dùng Win32DiskImager hay Etcher để ghi ảnh đĩa Jessie lên thiết bị lưu trữ USB. Việc này tương tự như ghi lên Micro SD card. Tuy nhiên với HDD/SSD dung lượng cao chúng ta có thể phân chia đĩa thành nhiều partition trong đó có một partition FAT(32) để chứa các file boot, một partition ext4 chứa OS, một partition làm swap… , sau đó copy các file từ một Micro SD card vào. Thứ tự của partition FAT(32) không quan trọng, không cần phải là partition đầu tiên.
- Trong trường hợp thử nghiệm lần đầu, đơn giản nhất là ghi ảnh đĩa Jessie lên một USB flash.
- Thêm vào file config.txt trên Micro SD card dòng program_gpio_bootmode=1. Khởi động lại RPi với Micro SD card này, mục đích là để RPi ghi nhớ vào bộ nhớ OTP chọn lựa khởi động từ USB, sau đó có thể gỡ bỏ Micro SD card.
Thử nghiệm
Nối USB đã có OS và Boot partition vào RPi, gỡ bỏ Micro SD card. Tốt nhất nên có một màn hình nối với RPi để có thể quan sát quá trình khởi động. Cấp điện cho RPi.
- RPi tìm file cần thiết trên thẻ nhớ (5s), không có, do đã ghi nhớ ở OTP, RPi tìm partition FAT(32) ở các thiết bị lưu trữ USB gắn vào RPi (2s), nếu tìm thấy thì bắt đầu qui trình boot, nếu không tìm thấy (thí dụ do thiết bị USB khởi tạo quá chậm) thì boot thất bại.
- Chúng ta có thể tiết kiệm 5s RPi chờ thẻ nhớ được khởi tạo bằng cách gắn thẻ nhớ rỗng vào RPi.
- Nếu thiết bị USB khởi tạo quá chậm, có thể tăng thời gian chờ lên 5s bằng cách tạo file config.txt có chứa dòng program_usb_timeout=1 trên thẻ nhớ rỗng và thử khởi động lại với Micro SD card + thiết bị USB
- Vẫn không thể khởi động? Có thể tải file bootcode.bin phiên bản mới hơn và chỉ dành riêng cho USB Boot, đặt trên thẻ nhớ và thử khởi động lại với Micro SD card + thiết bị USB
- Tình huống thường gặp: RPi khởi động đến màn hình cầu vòng rồi ngừng luôn ở đấy. Hãy thêm vào file config.txt trên FAT(32) partition dòng boot_delay=5. Nếu khởi động suôn sẽ, thử giảm giá trị này xuống càng nhỏ thì khởi động càng nhanh.
Kết luận
- Nếu RPi có thể khởi động không cần thẻ nhớ? OK, xong
- Nếu RPi khởi động vẫn cần thẻ nhớ? Xem lại mục đích của việc khởi động từ USB là gì. Thông thường người ta tránh dùng thẻ nhớ do việc tắt nguồn đột ngột hay reboot có thể gây lỗi trên thẻ nhớ. Tuy nhiên lỗi tương tự vẫn xảy ra trên partition FAT(32) của HDD/SSD, vì vậy việc di chuyển phần lớn qui trình khởi động sang thiết bị lưu trữ trên USB cũng không có ích nhiều. Boot từ thẻ nhớ + OS trên HDD/SSD có thể vẫn là lựa chọn tốt, không cần quá quan tâm đến việc khởi động từ USB.
- Nếu RPi vẫn không thể khởi động từ thiết bị USB? Không sao, bootcode.bin vẫn đang được cải tiến vì vẫn còn lỗi và chưa bao quát hết các trường hợp thực tế. Chúng ta vẫn còn chọn lựa tốt là boot từ thẻ nhớ + OS trên HDD/SSD
- Một cách khác: Khởi động từ thẻ nhớ và làm việc trên FAT partition
Giả sử HDD có ít nhất 2 partition: FAT PARTUUID=bbbbbbb và EXT4 PARTUUID=00000000
Partition FAT chứa các file khởi động và partition EXT4 chứa OS Jessie
+ File cmdline.txt trên thẻ nhớ và trên FAT partition có dòng
dwc_otg.lpm_enable=0 … root=PARTUUID=00000000 …
+ File /etc/fstab trên partition OS mô tả
PARTUUID=bbbbbbb /boot vfat defaults 0 2
PARTUUID=00000000 / ext4 defaults,noatime 0 1
Khi đó RPi boot từ thẻ nhớ, mount partition FAT như /boot và partition OS như /
Sau giai đoạn boot, thẻ nhớ không có vai trò gì nữa và RPi hoạt động thực sự nhanh hơn khi /boot được mount từ /dev/mmcblk0p1
Thí dụ:
- /dev/sda1: Jessie OS, chỉ cần 4-5GB
- /dev/sda2: OS backup
- /dev/sda3: Swap
- /dev/sda4: FAT32 – Boot files
- /dev/sda5: Data
Ghi chú
- Với fdisk, ở MBR kiểu FAT32 có mã là c, ở GPT kiểu FAT32 có mã là 6
- Với gdisk, kiểu DOS có mã là 0700