extroot dùng một thiết bị lưu trữ ngoài làm overlay ghi được, nhờ đó OpenWrt có thêm chỗ cài package và lưu dữ liệu mà không phải thay flash trong router. Bài này đi theo tài liệu OpenWrt từ lúc xác định thiết bị, tạo phân vùng, chuyển overlay, kiểm tra sau reboot cho tới các nhánh xử lý lỗi và tùy chọn nâng cao.1
Cảnh báo: Đây là thao tác với partition và filesystem. Hãy sao lưu cấu hình trước, xác định đúng
/dev/sdX, và coi lệnhpartedbên dưới là lệnh xóa toàn bộ đĩa. Không chạy nguyên mẫu trên một đĩa đang chứa dữ liệu.
1. Hiểu extroot và giới hạn của nó
Trên nhiều thiết bị, OpenWrt ghép rootfs chỉ đọc với rootfs_data hoặc ubifs ghi được thành overlay. Bảng khái niệm của tài liệu là:
| Thành phần | Mount point | Nén | Ghi được |
|---|---|---|---|
rootfs | /rom | Có | Không |
rootfs_data hoặc ubifs | /overlay, /rom/overlay | Không | Có |
overlay | / | Tùy filesystem | Có |
Extroot thêm một overlay trên USB, SATA, SD card hoặc một block device khác và mount nó trong quá trình boot. Nếu tháo thiết bị ngoài, router vẫn còn overlay nội bộ nên có thể quay về trạng thái trước khi cấu hình extroot.1
Một số firmware không có overlay partition trong /proc/mtd có thể bỏ qua cấu hình fstab; tài liệu gợi ý dùng / làm mount point trong trường hợp đặc biệt đó. Đây không phải lựa chọn mặc định, vì vậy trước tiên hãy kiểm tra layout thật của model.
2. Chuẩn bị
Tài liệu giả định tôi đã đăng nhập được vào shell bằng SSH hoặc console UART. LuCI có thể sửa nhiều mục, nhưng OpenWrt khuyến cáo thực hiện phần chuẩn bị bằng shell để nhìn rõ device và output.1
- Thiết bị có từ 8 MiB flash trở lên thường đủ chỗ cài package cần thiết. Với 4 MiB hoặc ít hơn, xem phần Custom image thay vì cố nhồi package vào overlay hiện tại.
- Filesystem mà
blockhỗ trợ gồmext2/3/4,f2fs,btrfs,ntfsvàubifs; FAT16/FAT32 không dùng được cho extroot theo tài liệu. - Ví dụ dưới đây dùng USB flash drive, một partition GPT và
ext4. SSD USB có thể cần thêmkmod-usb-storage-uas. - Nếu flash gần đầy, gỡ package thừa trước. Cài các package chuẩn:
| |
Xác định tên disk, không đoán từ ví dụ:
| |
Tôi phải phân biệt disk như /dev/sda với partition như /dev/sda1. Ghi lại output và chắc chắn USB đã nhận trước khi chuyển sang bước xóa dữ liệu.
3. Partition và format USB
Đây là phương án tạo một GPT partition rồi format ext4 theo tài liệu nguồn:
| |
Lệnh parted sẽ xóa partition table trên ${DISK}. Nếu đĩa không phải USB mới hoặc còn dữ liệu, dừng lại và thay bằng disk chính xác. Có thể dùng filesystem khác trong danh sách hỗ trợ, nhưng các lệnh format và package phải đổi theo filesystem đó; không được giữ mkfs.ext4 khi mục tiêu là f2fs hay btrfs.
4. Tạo mount entry cho extroot
Trước khi ghi fstab, kiểm tra OpenWrt nhận UUID của ${DEVICE} và mount point overlay hiện tại:
| |
Nếu một trong hai lệnh không trả output, đừng chạy tiếp; kiểm tra device, module filesystem và output của block info. Khi đã có output đúng, dùng chuỗi UCI của tài liệu để tạo mount entry:
| |
Ở đây ${UUID} được lấy từ partition ngoài còn ${MOUNT} là mount point overlay đang tồn tại. Không tự thay /overlay bằng một đường dẫn khác nếu chưa hiểu layout của firmware.
Cho phép truy cập overlay cũ
Phương án nguồn tiếp theo mount overlay cũ vào /rwm. Nó hữu ích khi cần đọc hoặc tùy chỉnh rootfs_data/ubifs sau khi extroot đã chiếm /overlay:
| |
Sau đó overlay gốc có thể xuất hiện ở /rwm; file fstab tương ứng trong lớp upper là /rwm/upper/etc/config/fstab. Hãy dùng đúng layout mà block info trả về.
5. Chuyển dữ liệu và áp dụng
Mount partition ngoài tạm thời vào /mnt, sau đó copy nội dung overlay hiện tại sang đó bằng pipeline của tài liệu:
| |
Khi copy xong, reboot:
| |
Không rút USB trước khi router boot lại hoàn tất. Nếu thao tác từ SSH qua Wi-Fi, nên chuyển sang Ethernet hoặc console để tránh mất kết nối giữa chừng.
6. Kiểm tra sau reboot
Qua LuCI
- Vào System → Mount Points: partition USB phải được mount với vai trò
overlay. - Vào System → Software: dung lượng trống của overlay phải tăng tương ứng với USB.
Qua command line
Partition ngoài phải mount tại /overlay, còn / là overlayfs dùng nó làm upper layer. Kiểm tra:
| |
Một output thành công sẽ cho thấy /dev/sda1 mount tại /overlay và dung lượng khả dụng của / trùng với /overlay; tên device và số liệu thực tế sẽ khác theo disk.
7. Troubleshooting và đường quay lại
Nếu boot log có vấn đề, xem block discovery, fstab và giai đoạn preinit:
| |
Lỗi UUID mismatch sau nâng cấp
Nếu log ghi block: extroot: UUID mismatch, mount partition và xóa hai marker mà tài liệu nêu:
| |
Thay /dev/sda1 bằng device thật. Không xóa nhầm partition khác.
Không dùng FAT/FAT32
vfat và FAT32 không hoạt động cho extroot. Nếu USB đang format sẵn FAT, cần format lại bằng ext4 sau khi cài e2fsprogs:
| |
Lệnh này cũng xóa dữ liệu trên /dev/sda1.
USB mount quá muộn
Nếu partition mount được thủ công nhưng không mount lúc boot, tài liệu gợi ý tăng delay_root. Ví dụ 15 giây:
| |
Chỉ tăng khi log và thử nghiệm cho thấy thiết bị lưu trữ sẵn sàng muộn; không dùng delay lớn như cách chữa mọi lỗi.
Firmware trước và sau 25.xx
Với release pre-25.xx, tài liệu cũ có hướng dẫn cho phép package lớn hơn phần còn trống trong /rom bằng:
| |
Đây không phải cách thay thế extroot và không nên áp dụng mù quáng. Với release post-25.xx, tài liệu trỏ sang hướng dẫn expand_root; hãy theo đúng tài liệu của release đang chạy thay vì trộn hai cơ chế.
Nếu một hệ rất cũ chỉ chạy được cách sửa /etc/rc.local, nguồn còn ghi phương án sau:
| |
Đây là nhánh tương thích lịch sử, có thể gây side effect; ưu tiên extroot chuẩn hoặc expand_root của release hiện tại.
extroot trên MMC/SD
Nếu block device không phải USB, các module cần để thiết bị xuất hiện sớm phải nằm trong /etc/modules-boot.d. Ví dụ cho SDHCI trên MT7688/MT7628, tài liệu nêu file /etc/modules-boot.d/mmc cần có:
| |
Tên module phụ thuộc SoC và driver thực tế; đây là ví dụ từ nguồn, không phải danh sách universal.
8. Các tiện ích sau khi có extroot
Lưu package list thay vì để trong RAM
Để package list sống qua reboot và giảm dùng RAM, chuyển thư mục list từ /var/opkg-lists sang /usr/lib/opkg/lists.
Trong LuCI: System → Software → Configuration, đổi lists_dir thành /usr/lib/opkg/lists, sau đó vào System → Software → Actions → Update lists.
Hoặc chạy:
| |
Tạo swap trên extroot
Nếu router chỉ có khoảng 32 MB RAM và package list không đọc được, nguồn đưa ra swap file 100 MiB trên extroot:
| |
Swap làm tăng số lần ghi lên thiết bị flash/USB và không biến router thành máy có RAM lớn. Chọn storage bền, theo dõi lỗi I/O và không đặt secret trong file swap.
USB dongle và usb-modeswitch
Có thể thêm usb-modeswitch vào image, nhưng nguồn cảnh báo một loại dongle có CD-ROM, modem và card reader chung: nếu /overlay nằm trên thẻ nhớ trong dongle, quá trình chuyển mode có thể làm filesystem biến mất. An toàn hơn là dùng dongle đã cấu hình sẵn để bật modem/network adapter và card reader khi cấp nguồn, không cần switch mode trên router.
Nguồn minh họa kiểm tra port bằng AT command:
| |
Danh sách ý nghĩa port được truy vấn bằng:
| |
Ví dụ nguồn cho biết 1 là modem, 2 là PCUI, 3 là DIAG, 16 là NCM và A2 là SD. Không tắt PCUI (2) vì có thể tự khóa quyền truy cập dongle. Một chuỗi cấu hình mẫu của tài liệu là:
| |
Đây là lệnh cho dòng dongle tương thích AT command tương ứng, không dùng cho modem khác chỉ vì có cùng tên cổng. Nguồn ghi ví dụ pre-configuration cho Huawei E3131s-2 firmware v21.158.47.00.1094.
Filesystem từ xa
Tài liệu chỉ liên kết tới hướng dẫn xử lý fstab không mount CIFS lúc boot, không cung cấp một quy trình CIFS hoàn chỉnh ngay trong bài. Tôi không biến link tham khảo đó thành lệnh mount chung chung; hãy kiểm tra credential, network availability và thứ tự boot theo model/release.
9. LUKS encrypted extroot: nhánh nâng cao
OpenWrt 22.03 được nguồn ghi là chưa hỗ trợ tốt việc mở LUKS trước bước extroot. Trước khi làm, cần tạo LUKS container theo tài liệu disk encryption, còn rootfs_data phải đủ chỗ cài cryptsetup và dependency. Sau khi volume đã mở, mới làm các bước extroot với filesystem bên trong và copy dữ liệu từ /overlay.1
Phương án PREINIT ưu tiên
Tài liệu mô tả phương án sạch hơn: trong PREINIT, mount_root tìm block trên ROM/overlay rồi gọi block extroot. Cách này cho phép thay wrapper block để mở crypto device trước khi gọi binary thật.
Các điều kiện không được bỏ qua:
- Cài
block-mountvàcryptsetup. - Cài script
decrypt.shtừ tài liệu disk encryption với quyền thực thi. - Di chuyển binary thật
/sbin/blockthành/sbin/block.bin. - Đặt wrapper
blockở/upper/sbin/blocktrên UBIFS overlay, hoặc/sbin/blocknếu đã ở overlayfs, rồi cấp quyền thực thi. - Dùng marker
/.use_crypt_extroottrên overlayfs hoặc/upper/.use_crypt_extroottrên/overlayđể bật/tắt cơ chế. - Đảm bảo
/etc/crypttabđã khai báo volume trước khi reboot.
Khi marker không tồn tại, extroot mã hóa sẽ không được bật; đây là đường tắt để vô hiệu hóa nó từ failsafe. Tài liệu có code block wrapper đầy đủ, nhưng wrapper này chạm vào PREINIT, tạo device node và nạp module crypto theo kernel; không nên chép một script chưa đối chiếu vào model khác. Hãy giữ nguyên logic và tham khảo code block gốc trước khi áp dụng.
Phương án /etc/rc.local dự phòng
Nguồn có một cách khác nhiều side effect hơn: extroot fail ở đường boot bình thường, sau đó /etc/rc.local mở LUKS ở cuối boot rồi gọi lại mount_root. Ví dụ dùng keyfile /root/extroot.key:
| |
Phương án này không đọc password tương tác trong /etc/rc.local; nguồn yêu cầu keyfile và nhắc phải tự đánh giá threat model khi lưu key tại /root/extroot.key. Web interface có thể xuất hiện muộn thêm khoảng 20–30 giây, trong khi SSH không nhất thiết bị trễ. Chỉ dùng đây khi phương án PREINIT không hoạt động và đã chuẩn bị failsafe.
10. Nâng cấp hệ thống và custom image
Không dùng opkg upgrade để nâng cả hệ thống
Nguồn cảnh báo không dùng opkg upgrade mù quáng trên snapshot: ABI uClibc có thể thay đổi, UUID của /rom hoặc /rwm có thể đổi làm extroot không mount, kernel/module mismatch có thể brick router, và nâng mọi package trừ kernel/module có thể làm package hỏng.1
Với stable release, hãy sysupgrade lên image đồng bộ. Sau nâng cấp, có thể phải lặp lại bước tạo mount entry và cài lại package, đặc biệt kernel module; kiểm tra UUID và cấu hình extroot trước reboot tiếp theo.
Custom image cho thiết bị 4 MiB
Với router 4 MiB hoặc nhỏ hơn, source hướng dẫn dùng Image Builder trên Linux 64-bit hoặc WSL:
- Tải Image Builder đúng target từ trang download của model.
- Giải nén và chạy:
| |
- Tìm profile đúng, ví dụ:
| |
- Build image với profile và package cần thiết:
| |
- Vào
bin/target/<device-type>/generic/, chọn imagefactoryhoặcsysupgradephù hợp rồi cài. - Format USB ext4 bằng Linux LiveCD hoặc GParted vì
e2fsprogsquá lớn để nhét vào thiết bị 4 MiB theo ví dụ nguồn.
Automated setup và automated upgrade
openwrt-auto-extrootlà frontend Image Builder có thể tự format và cấu hình extroot cho storage vừa cắm nhưng chưa setup.- Nhánh automated upgrade của nguồn kết hợp Hotplug extras và Opkg extras; package cần cho extroot được lưu trong profile
initrồi khôi phục sau nâng cấp. - Script restore dùng
/etc/uci-defaults/90-extroot-restore, kiểm trafstab.extroot,/etc/opkg-restore-init, mount tạm, chuyển thư mụcetc/upper, rồi reboot. Đây là code dành cho pipeline upgrade đã hiểu rõ layout; không chạy trên máy chưa backup.
Kết luận
Extroot không chỉ là cắm USB và chạy mount. Phần quan trọng là xác định đúng ${DEVICE}, giữ overlay cũ qua /rwm, copy đủ dữ liệu, kiểm tra /overlay sau reboot và chuẩn bị đường cứu hộ cho UUID mismatch hoặc storage mount quá muộn. Những nhánh usb-modeswitch, LUKS, custom image và automated upgrade có điều kiện riêng; nếu không chắc, hãy dừng ở extroot chuẩn và giữ bản backup ngoài router.


Góp Ý / Bình Luận / Đánh giá