Sao lưu NOR ở mức block cho OpenWrt
- 1. Phân biệt backup cấu hình và backup MTD
- 2. Xác định loại flash và layout
- 3. Create ART backup
- 4. Sao lưu bootloader riêng
- 5. Create full MTD backup bằng SSH
- 6. Create full MTD backup từ OpenWrt/UART tới máy chủ
- 7. Kiểm tra tính toàn vẹn và lưu trữ
- 8. Restore từ bootloader console
- 9. Restore từ OpenWrt console
- 10. Kết luận
Bài này hướng dẫn sao lưu nội dung flash NOR ở mức block, khác với backup cấu hình bằng sysupgrade -b. Mục tiêu là tạo bản sao của các phân vùng MTD để dùng cho phân tích hoặc khôi phục đúng phân vùng khi có sự cố.
Cảnh báo: Chỉ dùng quy trình này khi đã xác định thiết bị dùng NOR. Không áp dụng
ddtùy tiện cho NAND vì NAND cần công cụ hiểu ECC và bad block. Không ghi dump của thiết bị khác lên router. Bootloader, ART/NVRAM, factory/calibration và các phân vùng tương tự có thể chứa dữ liệu riêng của từng máy; mất chúng có thể làm mất Wi‑Fi, MAC hoặc khiến thiết bị không khởi động được.
Nguồn tham khảo: OpenWrt Wiki – Generic NOR backup.
1. Phân biệt backup cấu hình và backup MTD
sysupgrade -b chỉ tạo archive các file cấu hình được liệt kê trong sysupgrade configuration. Nó không phải bản sao nguyên block flash. Backup MTD đọc nội dung thô của từng partition như bootloader, art, firmware hoặc mtdX.
OpenWrt thường chỉ quản lý phần firmware. Không mặc định ghi đè bootloader, ART/NVRAM hoặc dữ liệu hiệu chuẩn. Vì vậy các phân vùng này phải được sao lưu riêng trước khi can thiệp bootloader, layout flash hoặc firmware đặc biệt.
2. Xác định loại flash và layout
- Đăng nhập bằng SSH hoặc console UART.
- Xem thông tin board và release:
ubus call system boardcat /etc/openwrt_release
- Kiểm tra log để xác định NOR/NAND:
dmesg | grep -iE 'spi-nor|spi-nand|nand|mtd'
- In bảng MTD:
cat /proc/mtd
Ví dụ kết quả có dạng:
dev: size erasesize namemtd0: 00040000 00010000 "u-boot"mtd1: 00010000 00010000 "art"mtd2: 00100000 00010000 "firmware"
Tên và số thứ tự trên mỗi model có thể khác nhau. Không suy ra mtdX từ ví dụ; phải dùng đúng output của router. Ghi lại size, erasesize, tên partition và thời điểm backup.
3. Create ART backup
ART là vùng dữ liệu hiệu chuẩn vô tuyến trên một số thiết bị, đặc biệt các nền tảng Atheros/QCA. Không phải thiết bị nào cũng có partition tên art; có thiết bị dùng tên factory hoặc layout khác. Nếu không có art, không chạy lệnh với /dev/ rỗng và không tự đoán partition tương đương.
- Kiểm tra partition có tên
art:
sed -n -e '/:.*"art"/s///p' /proc/mtd
- Nếu output trả về đúng thiết bị, tạo ART backup:
dd if=/dev/$(sed -n -e '/:.*"art"/s///p' /proc/mtd) of=/tmp/art.backup
- Kiểm tra file đã tạo:
ls -l /tmp/art.backupsha256sum /tmp/art.backup
- Chép file về máy tính ngay, không chỉ để trong
/tmpvì/tmpcó thể mất sau reboot:
scp root@OPENWRT:/tmp/art.backup ./art.backupsha256sum ./art.backup
Thay OPENWRT bằng hostname/IP thật. Giữ file ở ít nhất hai nơi an toàn. Không commit dump vào Git hoặc đưa lên public repository.
4. Sao lưu bootloader riêng
Nếu bootloader bị hỏng, router có thể mất cả bootloader console UART; việc cứu hộ có thể cần JTAG hoặc tháo chip flash. Khi đã xác định đúng partition bootloader từ /proc/mtd, tạo bản sao riêng:
dd if=/dev/mtd0 of=/tmp/boot.backup
mtd0 trong lệnh chỉ là ví dụ của tài liệu. Thay bằng thiết bị đúng sau khi đối chiếu layout thực tế. Kiểm tra và tải về PC:
ls -l /tmp/boot.backupsha256sum /tmp/boot.backupscp root@OPENWRT:/tmp/boot.backup ./boot.backup
Không flash bootloader dump chỉ vì tên partition giống nhau. Bootloader có thể chứa MAC, environment, board data hoặc layout riêng của model.
5. Create full MTD backup bằng SSH
Phương án này chạy trên máy Unix-like hoặc WSL có Bash và SSH root vào router. Script đọc từng MTD device, lưu file riêng rồi nén thành mtd_backup.tgz.
- Tạo file script trên máy tính:
cat << "EOF" > mtdbk.sh#!/bin/bashset -efunction die() { echo "${@}" >&2; exit 2; }OUTPUT_FILE="mtd_backup.tgz"OPENWRT="[email protected]"TMPDIR=$(mktemp -d)BACKUP_DIR="${TMPDIR}/mtd_backup"SSH_CONTROL="${TMPDIR}/ssh_control"mkdir -p "${BACKUP_DIR}"function cleanup() { set +e echo "Closing master SSH connection" "${SSH_CMD[@]}" -O stop echo "Removing temporary backup files" rm -r "${TMPDIR}"}trap cleanup EXITSSH_CMD=(ssh -o "ControlMaster=no" -o "ControlPath=${SSH_CONTROL}" -n "${OPENWRT}")echo "Opening master SSH connection"ssh -o "ControlMaster=yes" -o "ControlPath=${SSH_CONTROL}" -o "ControlPersist=10" -n -N "${OPENWRT}""${SSH_CMD[@]}" 'cat /proc/mtd' | tail -n+2 | while read; do MTD_DEV=$(echo ${REPLY} | cut -f1 -d:) MTD_NAME=$(echo ${REPLY} | cut -f2 -d\") echo "Backing up ${MTD_DEV} (${MTD_NAME})" "${SSH_CMD[@]}" "dd if='/dev/${MTD_DEV}ro'" > "${BACKUP_DIR}/${MTD_DEV}_${MTD_NAME}.backup" || die "dd failed, aborting..."doneecho "Compressing backup files to \"${OUTPUT_FILE}\""(cd "${TMPDIR}" && tar czf - "$(basename "${BACKUP_DIR}")") > "${OUTPUT_FILE}" || die 'tar failed, aborting...'echo -e "\nMTD backup complete. Extract the files using:\ntar xzf \"${OUTPUT_FILE}\""EOFchmod +x mtdbk.sh./mtdbk.sh
- Sửa
OPENWRTthành tài khoản/hostname hoặc IP thật trước khi chạy. Không đặt password, private key hoặc token thật trong script đưa vào repository. - Script mở một master SSH connection để không phải xác thực cho từng partition. Output binary của
ddđược chuyển vào file; không thêmechovào stdout của lệnh đọc vì có thể làm hỏng dump. - Sau khi chạy, giải nén để kiểm tra:
tar tzf mtd_backup.tgztar xzf mtd_backup.tgzfind mtd_backup -type f -exec sha256sum {} \;
Các file sẽ có dạng mtd0_u-boot.backup, mtd1_art.backup… tùy layout. Đối chiếu kích thước từng file với cột size trong /proc/mtd.
6. Create full MTD backup từ OpenWrt/UART tới máy chủ
Dùng phương án này khi router có console UART nhưng không có SSH root thuận tiện. Router sẽ đọc từng MTD và pipe qua SSH tới máy tính backup.
- Trên máy chủ backup, bảo đảm có user nhận file SSH và đủ dung lượng.
- Trên router, tạo
/tmp/backup.sh:
cat << "EOF" > /tmp/backup.sh#!/bin/shBACKUP_HOST="pc.lan"BACKUP_USER="root"cat /proc/mtd | tail -n+2 | while read; do MTD_DEV=$(echo ${REPLY} | cut -f1 -d:) MTD_NAME=$(echo ${REPLY} | cut -f2 -d\") echo "Backing up ${MTD_DEV} (${MTD_NAME})" dd if=/dev/${MTD_DEV}ro | ssh -y ${BACKUP_USER}@${BACKUP_HOST} "dd of=~/${MTD_DEV}_${MTD_NAME}.backup"doneEOFchmod +x /tmp/backup.shsh /tmp/backup.sh
- Sửa
BACKUP_HOSTvàBACKUP_USERtheo máy thật. Không ghi password vào script. SSH có thể hỏi password cho từng MTD device; dùng key xác thực an toàn hơn nếu môi trường cho phép. - Khi hoàn tất, kiểm tra file trên máy chủ:
watch -n 0.2 ls -l --block-size=K ~
- Đối chiếu kích thước và hash file nhận được. Nếu pipe hoặc SSH lỗi, coi backup chưa hoàn chỉnh và chạy lại; không dùng file một phần để restore.
7. Kiểm tra tính toàn vẹn và lưu trữ
- So sánh kích thước file với
sizetừ/proc/mtd. - Tạo SHA-256 trên file sau khi tải về PC.
- Ghi kèm model, hardware revision, stock/OpenWrt version, output
/proc/mtd, loại flash và ngày backup. - Giữ bản gốc read-only/offline và một bản sao khác.
- Không sửa dump, đổi tên partition rồi flash sang thiết bị khác.
8. Restore từ bootloader console
Nhiều bootloader có lệnh thao tác MTD, nhưng layout trong bootloader không nhất thiết giống layout kernel trong /proc/mtd. Một số bootloader không dùng tên partition mà yêu cầu địa chỉ offset và kích thước.
Trước khi restore, phải có:
- Dump đúng model/hardware revision.
- Bảng offset/size của bootloader tại thời điểm tạo backup.
- Console ổn định, nguồn điện không bị ngắt.
- Cách recovery thay thế nếu thao tác thất bại.
Không đoán lệnh erase, địa chỉ hoặc kích thước. Với bootloader dùng offset, ghi lại chính xác địa chỉ bắt đầu và độ dài tương ứng từ layout của thiết bị trước khi chạy. Nếu tài liệu model không có quy trình rõ ràng, dừng ở bước backup và tìm hướng dẫn recovery đúng model.
9. Restore từ OpenWrt console
Với ART, cách cơ bản của tài liệu là:
mtd write art.backup art
Nhưng partition art thường được kernel đánh dấu read-only, nên lệnh có thể không thực hiện được. Không ép ghi bằng -F hoặc thay partition tùy tiện. Tài liệu OpenWrt cảnh báo có thể cần kernel tự build với thay đổi phù hợp để partition writable, sau đó boot image đó rồi mới ghi.
Quy tắc an toàn:
- Đặt đúng file backup vào
/tmphoặc đường dẫn đã kiểm tra. - Xác minh hash và kích thước trước khi ghi.
- Đối chiếu tên partition trên chính thiết bị.
- Không ghi full MTD dump vào partition firmware nếu chưa xác nhận layout/offset.
- Ưu tiên recovery chính thức của nhà sản xuất hoặc quy trình debrick đúng model.
- Sau khi restore, kiểm tra boot, Ethernet, Wi‑Fi calibration, MAC và các dịch vụ trước khi reboot lần tiếp theo.
10. Kết luận
Create ART backup và Create full MTD backup phục vụ các mục tiêu khác nhau. ART/factory/calibration cần giữ riêng theo từng máy; full MTD cần lưu toàn bộ layout để phân tích hoặc recovery. Backup cấu hình không thay thế cho hai loại backup này, và dd không phải công cụ phù hợp cho NAND.
Bình Luận & Thảo Luận
Góp ý, hỏi đáp và chia sẻ suy nghĩ của bạn