Резервне копіювання NOR флеш пам'яті
- Цей посібник описує, як зробити резервне копіювання/відновлення на рівні блоків через CLI.
- Для резервного копіювання на рівні файлів використовуйте цей посібник.
Пристрої на базі NAND повинні використовувати утиліти з підтримкою NAND, оскільки `dd` не обробляє корекцію помилок або маркування пошкоджених блоків NAND-пам’яті.
Ознайомтеся з file_system і структурою розмітки флеш-пам’яті. Враховуйте, що OpenWrt охоплює лише розділ firmware
.
bootloader, а також розділи ART
/NVRAM
не є частиною прошивки OpenWrt.
Якщо дані на цих розділах пошкодяться, ви не зможете відновити їх через загальнодоступні джерела OpenWrt!
Оскільки OpenWrt не записує ці розділи, їх пошкодження безпосередньо OpenWrt є малоймовірним. Однак, якщо ви змінюєте завантажувач — зробіть резервну копію на ПК. У разі втрати даних, вам доведеться просити когось на форумі поділитися своєю копією, змінити MAC-адресу і прошити її через port.jtag, оскільки пристрій, ймовірно, вже не завантажиться.
Створення резервної копії ART
Якщо розділ 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` і збережіть у надійному місці.
Повне резервне копіювання MTD
Цей скрипт працює в 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
Повне резервне копіювання з OpenWrt (через UART)
У випадках, коли немає 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`, і потрібно працювати з офсетами. Тому варто їх записати під час резервного копіювання.
Відновлення з консолі OpenWrt
mtd write art.backup art
Цей метод може не спрацювати, бо розділ `art` зазвичай тільки для читання. Потрібно скомпілювати власне ядро зі змінами для запису. Після прошивки можна буде записати ART.
Перегляд MTD резервних копій
Щоб переглянути вміст резервної копії на ПК, без прошивки в OpenWrt, використовуйте jefferson:
jefferson mtd4_rootfs_data.backup -d rootfs
Файл `mtd4_rootfs_data.backup` — це розділ, який ви хочете дослідити. Зазвичай саме `rootfs_data` містить ваші налаштування в OpenWrt.