Table of Contents

Резервне копіювання NOR флеш пам'яті

Пристрої на базі 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.