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

  • Цей посібник описує, як зробити резервне копіювання/відновлення на рівні блоків через CLI.
  • Для резервного копіювання на рівні файлів використовуйте цей посібник.

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

  • Last modified: 2025/05/29 20:12
  • by vazaz