Пристрої на базі NAND повинні використовувати утиліти з підтримкою NAND, оскільки `dd` не обробляє корекцію помилок або маркування пошкоджених блоків NAND-пам’яті.
Ознайомтеся з file_system і структурою розмітки флеш-пам’яті. Враховуйте, що OpenWrt охоплює лише розділ firmware.
bootloader, а також розділи ART/NVRAM не є частиною прошивки OpenWrt.
Якщо дані на цих розділах пошкодяться, ви не зможете відновити їх через загальнодоступні джерела OpenWrt!
Оскільки OpenWrt не записує ці розділи, їх пошкодження безпосередньо OpenWrt є малоймовірним. Однак, якщо ви змінюєте завантажувач — зробіть резервну копію на ПК. У разі втрати даних, вам доведеться просити когось на форумі поділитися своєю копією, змінити MAC-адресу і прошити її через port.jtag, оскільки пристрій, ймовірно, вже не завантажиться.
Якщо розділ ART пошкоджено — OpenWrt все ще може завантажитись, але бездротова мережа не працюватиме.
Просте рішення через mtd:
dd if=/dev/$(sed -n -e '/:.*"art"/s///p' /proc/mtd) of=/tmp/art.backup
Якщо пошкоджено розділ завантажувача — ви не матимете навіть консолі завантажувача, а доступ лише через послідовний порт. Єдиний варіант — JTAG або десолдеринг чіпа флеш-пам’яті. Докладніше дивіться generic.debrick.
Однак після того, як ви отримаєте змогу знову писати у флеш-пам’ять, вам буде потрібно щось, що можна туди записати. І ось тут вам згодиться резервна копія:
dd if=/dev/mtd0 of=/tmp/boot.backup
Скопіюйте файл резервної копії на ПК за допомогою `scp` або `ssh` і збережіть у надійному місці.
Цей скрипт працює в Bash + SSH у Linux або WSL. Якщо IP вашого маршрутизатора інший — змініть змінну `OPENWRT`.
# Зберегти скрипт cat << "EOF" > mtdbk.sh #!/bin/bash set -e function die() { echo "${@}" exit 2 } OUTPUT_FILE="mtd_backup.tgz" OPENWRT="root@openwrt.lan" TMPDIR=$(mktemp -d) BACKUP_DIR="${TMPDIR}/mtd_backup" mkdir -p "${BACKUP_DIR}" SSH_CONTROL="${TMPDIR}/ssh_control" function cleanup() { set +e echo "Закриття SSH-з'єднання" "${SSH_CMD[@]}" -O stop echo "Видалення тимчасових файлів" rm -r "${TMPDIR}" } trap cleanup EXIT echo "Відкриття SSH-з'єднання" ssh -o "ControlMaster=yes" -o "ControlPath=${SSH_CONTROL}" -o "ControlPersist=10" -n -N "${OPENWRT}" SSH_CMD=(ssh -o "ControlMaster=no" -o "ControlPath=${SSH_CONTROL}" -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 "Копіюється ${MTD_DEV} (${MTD_NAME})" "${SSH_CMD[@]}" "dd if='/dev/${MTD_DEV}ro'" > "${BACKUP_DIR}/${MTD_DEV}_${MTD_NAME}.backup" || die "Помилка dd" done echo "Стиснення у файл \"${OUTPUT_FILE}\"" (cd "${TMPDIR}" && tar czf - "$(basename "${BACKUP_DIR}")") > "${OUTPUT_FILE}" || die 'Помилка tar' cleanup trap EXIT echo -e "\nРезервне копіювання завершено. Для розпакування:\ntar xzf \"${OUTPUT_FILE}\"" EOF chmod +x mtdbk.sh ./mtdbk.sh
У випадках, коли немає SSH-доступу, але є UART-доступ, наприклад TP-Link Archer C9 HW 5.0:
cat << "EOF" > /tmp/backup.sh #!/bin/sh BACKUP_HOST="pc.lan" BACKUP_USER="root" echo "Backup host ${BACKUP_HOST}" cat /proc/mtd | tail -n+2 | while read; do MTD_DEV=$(echo ${REPLY} | cut -f1 -d:) MTD_NAME=$(echo ${REPLY} | cut -f2 -d\") echo "Резервне копіювання ${MTD_DEV} (${MTD_NAME})" dd if=/dev/${MTD_DEV}ro | ssh -y ${BACKUP_USER}@${BACKUP_HOST} "dd of=~/${MTD_DEV}_${MTD_NAME}.backup" done EOF sh /tmp/backup.sh
Вам доведеться ввести SSH-пароль кілька разів.
Щоб переглядати прогрес резервування (на ПК):
watch -n 0.2 ls -l --block-size=K ~
Іноді потрібно зберегти дані з оригінальної прошивки. Залежно від завантажувача можна використовувати:
printenv bdinfo
Можна зробити дамп через серіал (`md`, `dump`) або запис на TFTP/NFS.
Багато завантажувачів дозволяють працювати з MTD, але ці розділи можуть відрізнятися від розділів ядра! Деякі не підтримують `mtd`, і потрібно працювати з офсетами. Тому варто їх записати під час резервного копіювання.
mtd write art.backup art
Цей метод може не спрацювати, бо розділ `art` зазвичай тільки для читання. Потрібно скомпілювати власне ядро зі змінами для запису. Після прошивки можна буде записати ART.
Щоб переглянути вміст резервної копії на ПК, без прошивки в OpenWrt, використовуйте jefferson:
jefferson mtd4_rootfs_data.backup -d rootfs
Файл `mtd4_rootfs_data.backup` — це розділ, який ви хочете дослідити. Зазвичай саме `rootfs_data` містить ваші налаштування в OpenWrt.