Відновлення ARТ
Резервне копіювання ваших даних ART — це мудрий запобіжний захід, оскільки вони є незамінними.
Ця процедура не застосовується для копіювання даних ART з одного маршрутизатора на інший!
Дані ART сучасних маршрутизаторів зазвичай специфічні для конкретного пристрою і містять калібрувальні дані.
Хоча ваш маршрутизатор може здаватися справним, цілком можливо, що він працює неправильно, потенційно поза межами допустимих параметрів.
Порушення параметрів часто є незаконним і може викликати перешкоди для інших бездротових пристроїв — як ваших, так і сусідських.
Зверніть увагу, що вказані інструменти непридатні для маршрутизаторів на основі NAND і можуть спричинити додаткові пошкодження, якщо їх використовувати.
Уся процедура була протестована на Netgear WNDAP360 та BUFFALO WZR-HP-AG300H
Переконайтесь, що зміщення (offsets) у вашому розділі / пристрої збігаються!! (перевіривши MAC)
Під час експериментів із моїм маршрутизатором я пошкодив розділ ART.
Якщо розділ ART буде стертий або пошкоджений, радіомодулі ath не зможуть запуститися.
Розділ ART містить калібрувальні дані, тому, якщо ви не створили резервну копію, ваші радіомодулі можуть працювати гірше, ніж раніше (я все ж вважаю, що краще, щоб вони працювали хоч якось, ніж не працювали взагалі :) ).
Передумови
Ідеальна ситуація — ви створили резервну копію розділу ART. Це легко зробити в OpenWrt та деяких стокових прошивках на базі Linux через консоль.
На пристрої знайдіть розділ ART:
cat /proc/mtd
Шукайте рядок, що містить `art` або `ART`.
(Припустимо, у мене це `mtd5`)
Зробіть дамп:
dd if=/dev/mtd5 of=/tmp/art.backup
Скопіюйте цей файл на ПК (через SSH або іншим способом).
Якщо у вас є резервна копія — переходьте до розділу 'Flash-ування розділу ART'. Якщо ні... доведеться покладатися на удачу і зробити трохи більше роботи.
Зміна MAC-адреси в розділі ART
Якщо ви не створили резервну копію свого розділу ART, потрібно отримати цей розділ від користувача з таким самим пристроєм (я не пробував з іншими моделями). Оскільки MAC зберігається в цьому розділі, його потрібно змінити. Але важливо знати: контрольні суми деяких частин повинні дорівнювати `0xffff` (згідно з драйвером ath9k). Якщо контрольна сума неправильна — радіомодуль не запуститься.
На ПК відкрийте файл дампу (назвемо його `art.backup`) у будь-якому HEX-редакторі (я використовував `ghex`).
Мій пристрій має два радіомодулі, отже два MAC-и та дві контрольні суми.
Для зміни MAC:
- Перейдіть до зсуву `0x120c` для `radio0` (у мене це 2.4GHz) і змініть MAC на свій (уважно — не змінюйте більше байтів!).
- Перейдіть до зсуву `0x520c` для `radio1` (5GHz) і змініть MAC (я додав 1 до MAC з 2.4GHz).
Потім потрібно стерти байти контрольної суми:
- Перейдіть до зсуву `0x1202` (radio0) і вставте `FF FF`
- Перейдіть до `0x5202` (radio1) і також вставте `FF FF`
Збережіть файл і прошийте його в розділ ART (див. наступний розділ).
Після перезавантаження маршрутизатора інтерфейси Wi-Fi не піднімуться через неправильну контрольну суму. У журналі будуть повідомлення типу: `Bad EEPROM checksum: 0xad22`
Запишіть ці значення контрольних сум для обох радіомодулів.
Поверніться в HEX-редактор:
- Перейдіть до зсуву `0x1202` (radio0) і запишіть байти з повідомлення (наприклад `AD 22`)
- Перейдіть до `0x5202` (radio1) і зробіть те саме для другого модуля
Збережіть файл, прошийте його назад у маршрутизатор і насолоджуйтесь роботою Wi-Fi з правильними MAC-адресами.
Flash-ування розділу ART
Це можна зробити з рівня ОС (якщо розділ НЕ тільки для читання).
Якщо він лише для читання, можна:
- встановити або зібрати пакет kmod-mtd-rw і тимчасово дозволити запис:
insmod mtd-rw.ko i_want_a_brick=1
- або змінити це у вихідному коді OpenWrt і перекомпілювати ядро
- або використати U-Boot для запису
Прошивка через OpenWrt
Це доволі просто: помістіть дамп розділу ART у `/tmp`, а потім виконайте:
mtd -r write /tmp/art.backup art
Ця команда автоматично перезавантажить пристрій після прошивки, і це необхідно.
Якщо ж ваш розділ тільки для читання, і ви не маєте доступу до консолі, вам потрібно зробити його доступним для запису, змінивши визначення розділу у `images/Makefile`, після чого перекомпілювати прошивку і встановити її на пристрій. Також можна використати модуль ядра для запису ART без перекомпіляції — див. kmod-mtd-rw.
Після виправлення розділу ART НАПОЛЕГЛИВО рекомендую встановити коректну прошивку назад, де розділ ART буде знову тільки для читання.
Прошивка через uBoot
ВАЖЛИВО: Якщо ви зробите помилку на цьому етапі — ви можете назавжди пошкодити пристрій (brick)!
Якщо у вас є доступ до робочої консолі і ваш розділ ART доступний тільки для читання (що трапляється часто), ви можете скористатися цим методом. Конкретні дії залежать від моделі маршрутизатора, але загальна інструкція така:
Перед початком
Переконайтесь, що ви точно знаєте, де починається ваш розділ ART. Подивіться `dmesg` або `logread` — там будуть записи на кшталт:
0x000000000000-0x000000040000 : "u-boot" 0x000000040000-0x000000050000 : "u-boot-env" 0x000000050000-0x000000200000 : "kernel" 0x000000200000-0x0000007f0000 : "rootfs" 0x0000003f0000-0x0000007f0000 : "rootfs_data" 0x0000007f0000-0x000000800000 : "art" 0x000000050000-0x0000007f0000 : "firmware"
Отже, в моєму випадку ART починається з `0x0000007f0000`, що на платформі Atheros (AR7161) у `uBoot` відповідає:
0xbf7f0000
Для цього вам потрібен робочий TFTP-сервер
Зі статичною IP-адресою, яку uBoot очікує як `serverip` (перевірити можна командою `printenv` у консолі uBoot).
Перевірте стартову адресу пам’яті:
bdinfo
Припустимо, вона становить:
0x80000000
Завантаження образу в пам’ять
ar7100> tftpboot 0x80000000 art.backup Trying eth0 Using eth0 device TFTP from server 192.168.1.1; our IP address is 192.168.1.2 Filename 'art.backup'. Load address: 0x8000000 Loading: ################################################################# done Bytes transferred = 65536 (10000 hex)
Зверніть увагу на розмір завантаженого файлу: `10000` (hex)
Стирання старого розділу ART
Використайте адресу початку розділу з прикладу вище. Укажіть правильний розмір (завантажений файл), додавши префікс `+0x`:
erase 0xbf7f0000 +0x10000
Копіювання з пам’яті у flash
Команда має вигляд:
cp.b 0x8000000 0xbf7f0000 0x10000