Резервне копіювання 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.

This website uses cookies. By using the website, you agree with storing cookies on your computer. Also you acknowledge that you have read and understand our Privacy Policy. If you do not agree leave the website.More information about cookies
  • Last modified: 2025/05/29 20:12
  • by vazaz