Asus RT-AC58U - структура флеша и прошивок

Обсуждаем OpenSource прошивки.
Аватара пользователя
Zyxmon
Администратор
Сообщения: 1331
Зарегистрирован: 09 авг 2015, 14:33

Сообщение Zyxmon » 24 авг 2017, 12:55

Asus RT-AC58U - достаточно бюджетный (4000-5000р на момент написания этого поста) гигабитный, двухдиапазонный, 802.11ac роутер, для которого кроме стоковой прошивки (asuswrt) есть еще альфа прошивка lede (бац1, бац2 - подробнее об этом тут).
Тут я начну разговор о структуре флеш памяти (nand) этого роутера и коснусь структуры прошивок (стока и lede).

Итак. Память nand (128 метров). В самом начале идут разделы с загрузчиками (их два), каллибровками и прочей "ерундой"
Вот так "видит" флеш прошивка lede

Код: Выделить всё

root@LEDE:~# cat /proc/mtd
dev:    size   erasesize  name
mtd0: 00040000 00010000 "SBL1"
mtd1: 00020000 00010000 "MIBIB"
mtd2: 00060000 00010000 "QSEE"
mtd3: 00010000 00010000 "CDT"
mtd4: 00010000 00010000 "DDRPARAMS"
mtd5: 00010000 00010000 "APPSBLENV"
mtd6: 00080000 00010000 "APPSBL"
mtd7: 00010000 00010000 "ART"
mtd8: 08000000 00020000 "UBI_DEV"

Сразу скажу разделы mtd0-mtd7 видны в стоковой прошивке как один раздел mtd0. Собственно эти разделы не стоит трогать, переписывать, портить - получите кирпич и потребуется программатор. Из интересного тут SBL1 - первый бутлоадер, который передает управление APPSBL бутлоадеру U-Boot (адаптированному компанией Асус именно для этой модели). В свою очереть U-Boot загружает ядро и передает ему управление.
Самое интересное будет дальше....
А пока для начала как "видит" разделы флеша стоковая прошивка от Asus -

Код: Выделить всё

dev:    size   erasesize  name
mtd0: 00200000 00010000 "Bootloader"
mtd1: 08000000 00020000 "UBI_DEV"
mtd2: 0005d000 0001f000 "nvram"
mtd3: 0001f000 0001f000 "Factory"
mtd4: 0001f000 0001f000 "Factory2"
mtd5: 03013000 0001f000 "linux"
mtd6: 02e145c8 0001f000 "rootfs"
mtd7: 03013000 0001f000 "linux2"
mtd8: 02e145c8 0001f000 "rootfs2"

Тут mtd0 - это все разделы mtd0-mtd7 прошивки lede.
mtd1 - это остальная часть флеша, а mtd2-mtd8 подразделы этой "остальной части".

Так вот UBI_DEV это (определение из википедии) том несортированных блоков (англ. Unsorted Block Images, UBI). Этот том разделен на ubifs volumes (разделы). Разбиение на разделы физически хранится на томе и это разбиение разное для стока и lede.
Собственно ubifs volumes видны на стоковой прошивке как mtd2-mtd8.
На nand флеше могут при работе возникать плохие блоки, которые исключаются драйвером nand из работы. Если возникнет потеря данных из-за плохого блока, то загрузчик U-Boot скопирует копию из одного вольюма в другой. По крайней мере вот код из исходников U-Boot асуса, который копирует kernel (раздел linux).

Аватара пользователя
Zyxmon
Администратор
Сообщения: 1331
Зарегистрирован: 09 авг 2015, 14:33

Сообщение Zyxmon » 24 авг 2017, 13:42

Разделене на тома в lede другое. Из лога загрузки, через uart-usb

Код: Выделить всё

UBI:   vol_id  reserved_pebs  alignment  data_pad  vol_type  usable_leb_size  used_ebs  used_bytes  last_eb_bytes  corrupted  upd_marker  name_len  name
UBI:        0              3          1         0   dynamic            1f000         3       5d000          1f000          0           0         5  nvram
UBI:        1              1          1         0   dynamic            1f000         1       1f000          1f000          0           0         7  Factory
UBI:        2              1          1         0   dynamic            1f000         1       1f000          1f000          0           0         8  Factory2
UBI:        3             11          1         0   dynamic            1f000        11      20f000          1f000          0           0         5  linux
UBI:        4            18d          1         0   dynamic            1f000       18d     3013000          1f000          0           0         6  linux2
UBI:        5             19          1         0   dynamic            1f000        19      307000          1f000          0           0         6  rootfs
UBI:        6            22c          1         0   dynamic            1f000       22c     4354000          1f000          0           0         b  rootfs_data
UBI: 7fffefff              2          1         0   dynamic            1f000         2       3e000              2          0           0         d  layout volume

Размеры и ID первых трех разделов совпадают, volume linux заметно уменьшен, размер linux2 такой же, вольюм rootfs_data появился вместо rootfs2. Дублирования (копий) разделов нет!
Если посмотреть код U-boot от Asus, то в нем жестко прописаны имена и размеры ubifs volumes и есть поппытка исправить разметку. Если размер тома меньше, чем записано в коде или же id другой - об этом просто сообщается в лог, если тома с нужным именем нет, Uboot пытается его создать.

Аватара пользователя
Zyxmon
Администратор
Сообщения: 1331
Зарегистрирован: 09 авг 2015, 14:33

Сообщение Zyxmon » 24 авг 2017, 13:54

Именно разница разметки ubifs усложняет установку прошивки lede поверх стока и восстановление стока при установленном lede.

рассмотрим процесс установки прошивки lede. Первоисточник - https://github.com/chunkeey/LEDE-IPQ40X ... 49ecfa4369
Цитата
внимание английский
To boot the initramfs image, you have to select option 1
(1: Load System code to SDRAM via TFTP.) during the boot
sequence, (If your serial console is good, you can savely
just mash "1" key, until you reach the next step).
After that, the board asks you for it's IPv4 addres, the
ipv4 address of your tftp server on the same network and
the name of the initramfs image. After hitting enter on
the last item, the bootloader will automatically load and
run the image.

To install the image permanently, you have to do the following
steps in the listed order.

Note: There's an temporary step involved to get from the
temporary *-factory.trx image to a fully working image that
keeps its settings and data after reboots.

Note2: Access via the serial console is not necessary for this.
But it helps immensely!

1. Connect your router via one of the four LAN-ports (yellow)
to a PC which can set the IP-Address and ssh and scp from.

If possible set your PC's IPv4 Address to 192.168.1.70
(As this is the IP-Address the Router's bootloader expects
for the tftp server)

2. Install the factory.trx image
This can be done via the web-interface or via serial
console.
- For the web-console you just upload the .trx file.
1. login into your router
2. Select "Administration" under "Advanced Settings".
3. Select the "Firmware Upgrade" tab
4. Click on the "Choose File" button and select the
firmware file.
(If the web-interface doesn't accept the file, try
to rename it to:
FW_RT-AC58U_3.1.1.1_380_6516-g6772678.trx)

5. Hit "Upload" Button
- For the serial console you press the 2-key during the boot menu
and choose "2: Load System code then write to Flash via TFTP."
and follow the instruction on the serial console.

After the image is written to the NAND, the router will reboot

3. Connect to the intermediate/temporary LEDE installation

Wait for your router's status LED to stop blinking rapidly and
get a solid blue. (The LAN LED should also be a solid blue)

The default IPv4-Address of your router will be 192.168.1.1.

1. Copy over the lede-sysupgrade.tar image to your router's
temporary directory

# scp lede-sysupgrade.tar root@192.168.1.1:/tmp

2. ssh from your PC into your router as root.

# ssh root@192.168.1.1

The default LEDE-Image won't ask for a password. Simply hit the Enter-Key.

Once connected...: run the following commands on your temporary installation

3. delete the "jffs2" ubi partition to make room for your new root partition

# ubirmvol /dev/ubi0 --name=jffs2

4. make a full LEDE installation

# sysupgrade -v /tmp/lede-sysupgrade.tar

It will automatically reboot.

Done.
Свернуть

Т.е. сначала устанавливается промежуточная ramfs прошивка lede, а уже из нее выполняется обновление sysupgrade. sysupgrade это скрипт, вы легко можете изучить исходники. Он удаляет ненужные volumes (ubirmvol) создает новые (ubimkvol). При этом в разных прошивках lede размеры rootfs (это файловая система squashfs) и rootfs_data (это /overlay или свободное место) могут быть разными, размеры друх последних вольюмов в этом случае меняются.

Аватара пользователя
Zyxmon
Администратор
Сообщения: 1331
Зарегистрирован: 09 авг 2015, 14:33

Сообщение Zyxmon » 24 авг 2017, 13:55

Если попытаться восстановить роутер с lede стоковой прошивкой, то запись в раздел linux не пройдет (будет ругань на маленький размер). В результате при загрузке будет или т.н. Kernel Panic или bootloop - прошивка не загрузится:

Код: Выделить всё

size > volume size! Aborting!
ra_flash_erase_write: write volume [linux] fail. (r = 22)
....
Starting kernel ...

[    0.000000] Booting Linux on physical CPU 0x0
[    0.000000] Linux version 4.9.44 (dullish@GRAY-PC) (gcc version 5.4.0 (LEDE GCC 5.4.0 r32-f44a69e) ) #0 SMP Sun Aug 20 08:30:16 2017
....
removing ubiblock0_5
[   96.324047] block ubiblock0_5: released
Volume ID 3, size 17 LEBs (2158592 bytes, 2.1 MiB), LEB size 126976 bytes (124.0 KiB), dynamic, name "linux", alignment 1
Volume ID 5, size 25 LEBs (3174400 bytes, 3.0 MiB), LEB size 126976 bytes (124.0 KiB), dynamic, name "rootfs", alignment 1
Set volume size to 70598656
Volume ID 6, size 556 LEBs (70598656 bytes, 67.3 MiB), LEB size 126976 bytes (124.0 KiB), dynamic, name "rootfs_data", alignment 1
sysupgrade successful
....
презеагрузка в цикле

Ядро стока не поместилось, загрузился и попытался себя починить lede и перезагрузка в цикле.

Как же выйти из этой ситуации, если хочется вернутся на сток? Эмпирическим путем SilentAssasin нашел такой метод:

Сначала в прошивке lede делается sysupgrade с флагом -F <файл со стоковой trx прошивкой>.
Отмечу что в хелпе sysupgrade указано, что флаг -F опасен. Скрипт sysupgrade "сходит с ума". Он же должен распаковать trx (а это не архив), определить нужные размеры вольюмов, короче он портит все и после загрузки асусовский загрузчик U-Boot восстанавливает разделы. После этого через режим rescue успешно устанавливается стоковая прошивка. С одной стороны этот процесс проверен практикой, с другой стороны несколько опасен, т.к. последствия `sysupgrade -F` трудно предсказуемы. На форуме lede chunkeey предложил прекрасныйметод - загрузить rootfs прошивку lede, изменить вольюмы на требуемые стоковой прошивке и залить стоковую trx прошивку через rescue или tftp. Как это сделать ... продолжение следует... не раньше чем через 2 недели. Кстати можно попробовать просто удалить все ubi volums после Factory2 и U-Boot все нужные восстановит.

PS Вместо `sysupgrade -F asus.trx` с таким же успехом можно использовать нечто вроде `sysupgrade -F фото_тёщи.jpg`

Аватара пользователя
Zyxmon
Администратор
Сообщения: 1331
Зарегистрирован: 09 авг 2015, 14:33

Сообщение Zyxmon » 24 авг 2017, 14:02

Автор понимает, что все, написаное выше может быть полным бредом. Написанное отражает его понимание на момент написания.
Автор благодарен chunkey за информацию на форуме lede - https://forum.lede-project.org/t/how-to ... mware/4513
Автор благодарен dullish за предоставленные логи с usb-uart.
Автор благодарен SilentAssasin за смелые эксперименты со своим роутером.
Автор благодарен dullish и SilentAssasin за полезные обсуждения.


Вернуться в «Прошивки OpenWrt/DD-WRT/AsusWrt/TomatoUSB/Wive-NG/Padavan/"от Энтузиастов "»

Кто сейчас на конференции

Всего 0 посетителей :: 0 зарегистрированных, 0 скрытых и 0 гостей (основано на активности пользователей за последние 5 минут)
Больше всего посетителей (121) здесь было 18 май 2016, 18:19

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей