LINUX.ORG.RU

прошу помощи по Openwrt

 , ,


0

1

Доброго времени суток всем обитателям форума.Обращаюсь к вам за помощью,подсказкой или хоть за какой либо информацией по теме openwrt.суть проблемы в следующем: Установил прошивку openwrt 24.10 на роутер tp-link tl wr841n ver.13.Роутер имеет 8mb флешки, что как я полагаю,должно было быть достаточно для установки пакета openvpn на openwrt.Однако в web интерфейсе system-software я вижу,что у меня 2,25mb всего,из них свободно 1,86mb и соответственно на роутере не достаточно памяти для openvpn + зависимости,которые ,как показывает установщик пакетов, требуют +- 4mb.Возникает вопрос, почему веб интерфейс показывает только 2mb из 8mb имеющихся.Ранее я ставил прошивку openwrt 18.xx на wr841n ver.9, который имеет 4mb флешки,и веб интерфейс отображал 21%свободной памяти-68kb,что будет 100%= -+350kb. Кто может обьяснить почему так отображается память и где те 6 из 8mb?Всех отозвавшихся заранее благодарю!



Последнее исправление: telecom24 (всего исправлений: 1)
Ответ на: комментарий от Xenius

Я пока отложил 6020 и решил попрактиковаться на 470/480, там проще, так что вопросы уже немного сменились, ну и понемногу приходит понимание отдельных моментов.

Просто, например, упомянутая выше команда с записью в раздел firmware - в контексте PC это примерно как сделать «cat /boot/vmlinuz > /dev/sda», что, естественно, работать не будет - хотелось бы избежать такого хождения по граблям.
Раздел firmware виртуален (как и остальные, впрочем) и мапится на всю флешку целиком, так что и писать на него надо исключительно полный образ. То, что сгенерировал imagebuilder, судя по всему, ядро + initrd со скриптами для модификации системы. В каталоге imagebuilder'а есть отдельно ядро, отдельно образ rootfs, которые тоже можно использовать.

Ок, к 470/480 и вопросам выше.

Я не очень понимаю как это. По идее UART на 3.3 вольта или на 5 вольт, зачем тебе сдвиг уровней, ты же не к 12-вольтовому комп-порту подключаешь а к USB-адаптеру уже на нужные уровни?

Проц у 470/480 на 3,3В. У 6020 - вроде на 1,8. В первом случае гребенка подключена напрямую в проц. Во втором, как уже сказал, на плате есть нераспаянная микросхема с двумя питаниями (3,3 и 1,8), парой линий к процу и парой линий к гребенке. Откуда бы на гребенке взяться другим, «удобным» уровням, если у проца такое питание?

Далее, есть, например, USB-адаптер на pl2303. Да, там гребенка на 5 ног с 3,3В и 5В для удобства ПИТАНИЯ внешнего устройства. Но вот уровни железно завязаны на 5В, чтобы переделать их на 3,3 - надо оторвать одну ногу микросхемы от 5 и пересадить на 3,3, что, скажем так, не особо удобно. Подробности тут - https://forums.raspberrypi.com/viewtopic.php?t=57935 - вполне согласен с последним сообщением.

Занятно, кстати, что по даташиту та нога вообще не должна была быть на 5В: https://www.prolific.com.tw/UserFiles/files/ds_pl2303HXD_v1_4_4.pdf

RS232 VDD. The power pin for the serial port signals. When the serial port is 3.3V, this should be 3.3V. When the serial port is 2.5V, this should be 2.5V. The range can be from 1.8V~3.3V

Если использовать уровни 5В напрямую с логикой на 3,3 - возможны спецэффекты. Что уж говорить про 6020, где изначально на плате планировался шифтер, но который просто не поставили для экономии?

Так или иначе, для 3,3 со второй попытки сделал: https://upload.jabberworld.info/u/ec27dcda43c1bdb422cd46afa492a43811cee88a/lL...

Для 1,8 потом сделаю аналогичный, когда буду снова заниматься 6020, просто придется сделать отдельно источник питания на нужное напряжение.

Допаял гребенку и резистор на плату, подключился, консоль (с оговорками) есть. Параллельно и еще до того подампил отдельно разделы. Да, разделы, если что, такие:

dev:    size   erasesize  name
mtd0: 00040000 00010000 "bootloader"
mtd1: 00150000 00010000 "kernel"
mtd2: 00b90000 00010000 "rootfs"
mtd3: 00020000 00010000 "device-info"
mtd4: 00010000 00010000 "support-list"
mtd5: 00010000 00010000 "firmware-info"
mtd6: 00010000 00010000 "tddp"
mtd7: 00020000 00010000 "log"
mtd8: 00200000 00010000 "rootfs_data"
mtd9: 01000000 00010000 "firmware"

Тут явно попроще и понятнее, чем у 6020 :)

Натравил strings на раздел с загрузчиком, нашлось, что там старенький u-boot 1.1.3. Уже после получения консоли влез и в меню загрузчика - https://linuxoid.in/isida-paste/28860f7e0.txt (тут чуть вперемешку, кусок с «Booting image» от обычного процесса загрузки). Поправил таймаут загрузки для удобства.

Один раздел может быть внутри другого.

Ок, но я все же подозреваю наличие небольших запасов на случай обновления. Смотри по ядру:

rain@walkbook:~/work/tplink/480/tplink480-mtd$ file mtd1kernel 
mtd1kernel: u-boot legacy uImage, MIPS OpenWrt Linux-3.10.14, Linux/MIPS, Multi-File Image (lzma), 1310728 bytes, Fri Mar 13 02:37:35 2020, Load Address: 0x80000000, Entry Point: 0x80000000, Header CRC: 0xEEDC6CD4, Data CRC: 0x540C7460

При этом
mtd1: 00150000 00010000 «kernel»

size 00150000 дает нам 1376256, реальный размер 1310728, initrd отсутствует. Остается 65528 байт. И концовка раздела реально пустая:
https://upload.jabberworld.info/u/ec27dcda43c1bdb422cd46afa492a43811cee88a/0f...
Так что, подозреваю, просто задел под возможность обновления. Аналогично, думаю, и с корнем.

Никак. Место выделенное на файловую систему делится на образ squashfs и всё остальное. Чем меньше squashfs тем больше места на перезаписываемом разделе. Собери без ненужного софта, места под юзера будет больше. Но вообще в squashfs сжатие, так что выгоднее все нужные пакеты хранить в образе ядра, а перезаписываемое место оставить только для конфигов.

Суть в том, что надо в обратную сторону. Ядро в железке - 1376256. Типичный размер ядра современного OpenWRT в imagebuilder'е - уже порядка 2 МБ:

u-boot legacy uImage, MIPS OpenWrt Linux-6.6.73, Linux/MIPS, OS Kernel Image (lzma), 2024703 bytes, Mon Feb  3 23:09:37 2025, Load Address: 0x80000000, Entry Point: 0x80000000, Header CRC: 0xF78D1E3C, Data CRC: 0x310AA505


Т.е., чтобы втиснуть его - надо делать переразметку флешки.

Т.е., в целом, я сейчас где-то на этом моменте - понять, где определяются границы «разделов», научиться выковыривать конфигурацию из существующего u-boot'а - если это возможно. И, возможно, собрать что-то более свежее. В более свежем даже команды управления разбивкой есть прямо в загрузчике.

А дальше уже можно будет влить ядро и rootfs в разделы с новыми размерами и, по-идее, получится то, что надо.

YAR ★★★★★
()
Последнее исправление: YAR (всего исправлений: 1)
Ответ на: комментарий от Xenius

у Xiaomi роутеров анальное рабство

Анальное рабство у Владимира)

А AX3000T даже на разных чипах памяти и свитча относительно легко шьется на OpenWRT 23.x/24.x .

Подтверждением чему является профильная тема на 4PDA.

Twissell
()
Ответ на: комментарий от YAR

«cat /boot/vmlinuz > /dev/sda», что, естественно, работать не будет - хотелось бы избежать такого хождения по граблям.

В arm и mips часто именно так и делают, только не /dev/sda, а например /dev/sda3 отдельный раздел, откуда загрузчик берёт ядро, не заморачиваясь с файловой системой.

Раздел firmware виртуален (как и остальные, впрочем) и мапится на всю флешку целиком

Посмотри лог загрузки или вывод dmesg, там карта разделов есть. Не надо гадать.

Далее, есть, например, USB-адаптер на pl2303. Да, там гребенка на 5 ног с 3,3В и 5В для удобства ПИТАНИЯ внешнего устройства. Но вот уровни железно завязаны на 5В, чтобы переделать их на 3,3

Можно просто купить три разных адаптера, на 5, 3.3 и 1.8 вольт или один с переключением джампером. Правда на 1.8 почему-то дорогие.

Уже после получения консоли влез и в меню загрузчика - https://linuxoid.in/isida-paste/28860f7e0.txt (тут чуть вперемешку, кусок с «Booting image» от обычного процесса загрузки). Поправил таймаут загрузки для удобства.

Сделай полный лог загрузки от начала до конца. Там будет карта разделов.

bootargs=console=ttyS1,115200 root=31:02 rootfstype=jffs2 init=/sbin/init mtdparts=raspi:256k(u-boot),64k(u-boot-env),2240k(rootfs),1408k(uImage),64k(mib0),64k(ART)

Но тут похоже разделы заданы в командной строке ядра которая прописана в uImage ядра, который есть ядро с заголовком в формате uboot.

Что такое mib0 не знаю, остальное вроде понятно.

Так что, подозреваю, просто задел под возможность обновления. Аналогично, думаю, и с корнем.

Это не задел на возможность обновления, просто размеры раздела должны быть кратны eraseblock-у, то есть 64 килобайта. У тебя хвост раздела чуть-чуть меньше 64 килобайтов

Т.е., чтобы втиснуть его - надо делать переразметку флешки.

Я так понимаю что разметка флешки находится в образе OpenWrt, и там это всё учтено. Но на всякий случай прочитай уже полный лог загрузки или dmesg.

научиться выковыривать конфигурацию из существующего u-boot’а - если это возможно.

Это просто строки, разделенные нулевыми байтами, раздел uboot-env. Просто tr -s '\000\377' '\n' < uboot-env.img делаешь или как-то так и читаешь.

Т.е., чтобы втиснуть его - надо делать переразметку флешки.

Не надо никакой переразметки. Таблица разделов в командной строке ядра, которая прописана в заголовки образа OpenWrt. Но может зависеть от конкретного роутера. Ещё раз, внимательно прочитай лог загрузки той системы которая уже работает!

Xenius ★★★★★
()
Ответ на: комментарий от Xenius

В arm и mips часто именно так и делают, только не /dev/sda, а например /dev/sda3 отдельный раздел, откуда загрузчик берёт ядро, не заморачиваясь с файловой системой.

Ну так оно так и есть. И /dev/mtd9 - это как раз аналог /dev/sda

Посмотри лог загрузки или вывод dmesg, там карта разделов есть. Не надо гадать.

Я не гадаю, я исходя из этого и сделал выводы.

[    1.452000] 0x000000000000-0x000000040000 : "bootloader"
[    1.460000] 0x000000040000-0x000000190000 : "kernel"
[    1.468000] 0x000000190000-0x000000d20000 : "rootfs"
[    1.472000] mtd: device 2 (rootfs) set to be root filesystem
[    1.480000] 0x000000d20000-0x000000d40000 : "device-info"
[    1.488000] 0x000000d40000-0x000000d50000 : "support-list"
[    1.492000] 0x000000d50000-0x000000d60000 : "firmware-info"
[    1.500000] 0x000000d60000-0x000000d70000 : "tddp"
[    1.508000] 0x000000d70000-0x000000d90000 : "log"
[    1.512000] 0x000000e00000-0x000001000000 : "rootfs_data"
[    1.520000] 0x000000000000-0x000001000000 : "firmware"


Вот последняя строка и охватывает самый первый и самый последний адреса. Писать туда что-либо без загрузчика - получить на выходе кирпич.

Можно просто купить три разных адаптера, на 5, 3.3 и 1.8 вольт или один с переключением джампером. Правда на 1.8 почему-то дорогие.

Или использовать жменю тех, что уже есть :). Шифтеры тоже есть. Всего-то посидеть полчаса с паяльником.

Но тут похоже разделы заданы в командной строке ядра которая прописана в uImage ядра, который есть ядро с заголовком в формате uboot.

Вопрос еще в том, используется ли оно где-то вообще или нет. В системе никакого boot-env уже нет.
Тут и MAC-адрес вон задан «для галочки». По факту он записан в разделе tddp.
Да и ART-раздел для роутера без wifi не особо нужен вроде как.

Это не задел на возможность обновления, просто размеры раздела должны быть кратны eraseblock-у, то есть 64 килобайта. У тебя хвост раздела чуть-чуть меньше 64 килобайтов

Ну, может и так.

раздел uboot-env

Нет его. Список разделов привел.
По факту таблица описывается в device-info (mtd3), можно попробовать поиграться с ней.

YAR ★★★★★
()
Ответ на: комментарий от YAR

Я не гадаю, я исходя из этого и сделал выводы.

Выше и ниже посмотри, там вероятно написано откуда берётся таблица разделов.

раздел uboot-env Нет его. Список разделов привел.

Возможно, что uboot-env у тебя по факту в разделе u-boot, используй команду tr -cs '\040-\176' '\n' чтобы прочитать его содержимое. Ну или strings. Смотри то что будет выведено в конце. В принципе эта команда - аналог strings, переводит все непечатные байты в переводы строки, но из последовательности нескольких выводит только один. Если в конце строки env=value это и есть uboot-env, но там может быть что он дублируется.

Писать туда что-либо без загрузчика - получить на выходе кирпич.

Зато удобно сделать дамп всей флешки без программатора можно.

По факту таблица описывается в device-info (mtd3), можно попробовать поиграться с ней.

У тебя сейчас фабричная прошивка, которая на основе OpenWrt, а ты хочешь ванильную OpenWrt?

Прошить ты не можешь потому что она требует особый формат образа? Ну вот вариант такой - загружаешь свой образ системы через UART в оперативную память, загружаешься и заходишь уже в ванильную OpenWrt (примерный аналог livecd) и потом из неё делаешь sysupgrade которому уже пофиг будет на формат образа.

В загрузчике на моём роутере были команды чтобы загрузить по UART или TFTP ядро с initrd и запустить их.

Насколько я понимаю там формат не такой как у образа sysupgrade и надо загрузочный образ собирать отдельно.

Скорее всего в ванильной OpenWrt сама система начинётся сразу после загрузчика и все остальные мелкие разделы специфичные для родной прошивки будут затёрты. У тебя они неудобно расположены, между ядром и корнем, так что придётся их грохнуть.

Ещё один вариант вручную образ uboot на 256кб и после него sysupgrade от OpenWrt склеить и прошить в начало firmware. Но тут опасность окирпичить если пропадёт питание между стиранием раздела firmware и записью новых данных.

Надеюсь резервная копия всех разделов у тебя уже есть.

loadb - load binary file over serial line (kermit mode)

Вот этой командой записываешь в оперативную память образ ядра и файловой системы который может называться openwrt-*-initramfs-kernel.bin передав его по протоколу kermit, затем командой bootm загружаешь. Адрес наверное 80000000 подходит, я так понимаю что bc040000 — это флешка, с которой ядро берётся.

Но надо точно проверить, чтобы не окирпичить.

Xenius ★★★★★
()
Последнее исправление: Xenius (всего исправлений: 6)
Ответ на: комментарий от Xenius

Выше и ниже посмотри, там вероятно написано откуда берётся таблица разделов.

Таблицу оно как-то «автодетектит».

[    1.428000] mtd .name = raspi, .size = 0x01000000 (16M) .erasesize = 0x00010000 (64K) .numeraseregions = 0
[    1.436000] @@-----debug r470/r480 tplink flash parse--------
[    1.444000] 10 tp-link partitions found on MTD device raspi
[    1.448000] Creating 10 MTD partitions on "raspi":


https://linuxoid.in/isida-paste/288622512.txt

Т.е., раз это не часть флешки, то должна передаваться как-то со стороны загрузчика. Потому что ладно еще rootfs, но, например, разделы log или device-info нигде не фигурируют - ни в mtdparts у загрузчика, ни где-либо еще. Однако ж ядро их находит и создает соответствующее устройство.

Я попробовал уменьшить раздел log в device-info со 128 до 64 КБ (он все равно пустой), но ничего не поменялось. Т.е., таблица хранится как-то иначе.

Возможно, что uboot-env у тебя по факту в разделе u-boot

Да что-то как-то не особо. Там всего несколько осмысленных строк:

U-Boot 1.1.3 (Apr 14 2017 - 09:10:38)
Board: Ralink APSoC
u-boot image

Остальное - набор символов.

Зато удобно сделать дамп всей флешки без программатора можно.

Это да.

У тебя сейчас фабричная прошивка, которая на основе OpenWrt, а ты хочешь ванильную OpenWrt?

Да. Ну и что-то более свежее, а не 15-летней давности. RAM/Flash вполне позволяет втиснуть и более современную OpenWRT. Просто ее никто не делал.

Прошить ты не можешь потому что она требует особый формат образа?

Если брать mtd write, то надо иметь либо альтернативную прошивку целиком (аналог того образа, что я сдампил программатором. Ну или вот люди коллекционируют - https://4pda.to/forum/index.php?showtopic=733456), либо, если зашивать по разделам (о, пока писал - нашел пример, где firmware - не весь диск, а исключая загрузчик: https://openwrt.org/docs/techref/flash.layout) - то надо иметь ядро/корень, которые впишутся в текущие «разделы» (иначе как оно сможет записать файл большего размера за пределы раздела?). Как, например, тут - https://openwrt.org/toh/xiaomi/mir3g

cd /extdisks/sda1
mtd write mir3g-squashfs-kernel1.bin kernel1
mtd write mir3g-squashfs-rootfs0.bin rootfs0
nvram set flag_try_sys1_failed=1
nvram commit
reboot


Вот пример, когда шьется отдельно ядро и рут. Да, тут механизм вполне понятен.

Если брать sysupgrade - то да, либо сильно большая разница между версиями, либо какой-то шаг потерян. Так или иначе, если поразглядывать размеры в imagebuilder'e, то:

rain@walkbook:/tmp/ramips/openwrt-imagebuilder-24.10.0-ramips-mt76x8.Linux-x86_64$ ls -lh build_dir/target-mipsel_24kc_musl/linux-ramips_mt76x8/root.squashfs bin/targets/ramips/mt76x8/openwrt-24.10.0-ramips-mt76x8-7links_wlr-1230-squashfs-sysupgrade.bin 
-rw-r--r-- 1 rain rain 5,6M фев 23 01:37 bin/targets/ramips/mt76x8/openwrt-24.10.0-ramips-mt76x8-7links_wlr-1230-squashfs-sysupgrade.bin
-rw-r--r-- 1 rain rain 3,6M фев 23 01:37 build_dir/target-mipsel_24kc_musl/linux-ramips_mt76x8/root.squashfs

Как уже говорил, где-то 2 МБ ядро. Т.е., образ openwrt-24.10.0-ramips-mt76x8-7links_wlr-1230-squashfs-sysupgrade.bin (который file показывает как

u-boot legacy uImage, MIPS OpenWrt Linux-6.6.73, Linux/MIPS, OS Kernel Image (lzma), 2024667 bytes, Mon Feb 3 23:09:37 2025, Load Address: 0x80000000, Entry Point: 0x80000000, Header CRC: 0xB4AF954D, Data CRC: 0x4F2CE058

- это просто склейка ядра + rootfs. Ядро я не конфигурировал, а размер rootfs зависит от выбранного профиля и за вычетом / с добавлением указанных в переменной PACKAGES пакетов.

Так или иначе, sysupgrade должен его куда-то запихнуть и потом уже при следующей загрузке выполнить (так как делается это с работающей системы и чего-то вроде kexec'а тут нет). Подозреваю, что раскладка разделов сильно отличается между тем, под что готовится образ и тем, что реально на моей железке присутствует.

*** в этом месте написал идею со склейкой и только потом прочитал, что ты тоже ее предложил :) ***

В общем, надо экспериментировать. Да, дампы все есть в любых вариантах - что пофайлово, что целиком. Попробую как-то. Но научиться собирать свой u-boot тоже хочу попробовать.

YAR ★★★★★
()
Ответ на: комментарий от YAR

Таблицу оно как-то «автодетектит».

Не как-то, а 10 tp-link partitions found on MTD device raspi в явном виде же написано.

Вот только доки мне сходу найти не удалось, но ты можешь поизучать исходники ядра или погрепать по именам разделов в образе всего флеша. Может это всё-таки структура по какому-то конкретному оффсету в самом флеше.

Вот тут что-то такое есть

Но образ OpenWrt никто не заставляет использовать этот же формат. Возможны разные варианты

Да что-то как-то не особо. Там всего несколько осмысленных строк:

Похоже что в родной прошивке u-boot-env затёрт ядром, там у тебя есть сообщение что он не подгружается и используется захардкоженый дефолт.

Подозреваю, что раскладка разделов сильно отличается между тем, под что готовится образ и тем, что реально на моей железке присутствует.

Именно так. Как только загрузится ядро от OpenWrt там будет уже другая таблица разделов, которая прописана в образе.

Тебе нужно собрать ещё и openwrt-*-initramfs-kernel.bin и попробовать его запустить.

Это менее рисковано чем склейка. Так как если ты загрузишь образ по UART и он не стартанёт то после перезагрузки останется прежняя прошивка.

Xenius ★★★★★
()