четверг, 29 ноября 2018 г.

Восстание мамонта Dir-300 B1

Появилось желание потыкать палочкой Openwrt. Чтобы не ломать работающую домашнюю сеть на основе Asus RT-N16, взял, что было под рукой - D-Link DIR-300 B1.


Поглумимся над старичком!


18.06.1 из основного репозитория ставится успешно, но не остается места под раздел overlay для хранения настроек. А каждый раз начинать сначала как-то печально.
Зато весело взлетела предыдущая сборка еще под именем LEDE. Настройки сохраняются, все работает, но под дополнительные пакеты совсем не остается места.

Наткнулся на описание sd-mod extroot. Покурил форум и проштудировал документ.
Пересобирать-так пересобирать! И да, легких путей мы не ищем, так что собираем на основе новой версии 18.06.1.
Предварительно подпаял MicroSD-адаптер к GPIO в соответствии с описанием:
Data Input = GPIO9 (Green Power LED)
Data Output = GPIO13 (WPS LED)
Clock = GPIO8 (Amber Power LED)
ChipSel = GPIO0 (WPS Switch)
Заодно прокачал тачку с 320МГц до 384Мгц перепаиванием R27 на R28.
UPD. overclock меняет частоту на интерфейсе UART, поэтому пришлось отказаться от разгона.
В днище корпуса проковырял технологическое отверстие для доступа к гребенке UART, чтоб былО!

Начнем-с!

Сдуваем пыль с Debian 9, выкачиваем зеркало репозитория:
git clone git://github.com/openwrt/openwrt.git -b v18.06.1
Запускаем обновление чего-то там:
./scripts/feeds update -a
И... получаем большой кукиш доступа к git.openwrt.org. 

Спасибо РКН, оно всегда стоит на страже беспокойствия граждан. Эту ночь я провел покуривая статейки про обход блокировок РКН, благо давно хотел разобраться с этим недоразумением.


Как я боролся с РКН

Проверил тип блокировки DPI с помощью blockcheck.
Хотелось все сделать один раз и в одном месте, поэтому начал щупать по ssh домашний роутер.
Получил список заблокированных ресурсов с помощью zapret. Кстати, скрипт ipset/get_combined.sh выдал мне довольно быстро список (zapret-ip-ipban.txt) IP-адресов https ресурсов, а вот построение списка http ресурсов (zapret-ip.txt) мне надоело ждать спустя полтора часа.. Зато get_antizapret.sh получил этот список всего за минуту.

Долго думал как реализовать обход. Сначала порывался через прокси antizapret.prostovpn.org, но поймал затык, решил использовать tor как боле универсальное средство.
tor присутствовал в прошивке. Для прозрачной проксификации в конфиге должны быть строки:
AutomapHostsOnResolve 1
TransPort 192.168.1.1:9040
DNSPort 192.168.1.1:9053
Запускаем tor -f ./torrc. Дожидаемся 100% Bootstarping.

Так как на роутере отсутствовал модуль set для iptables, а заниматься сборкой под dd-wrt не хотелось, вместо умного правила для проксификации только заблокированных ресурсов из списка ipban
iptables -t nat -A PREROUTING -d ! 192.168.1.0/24 -p tcp --syn -j REDIRECT -m set --match-set ipban dst --to-ports 9040
пришлось запускать времянку на весь трафик
iptables -t nat -I PREROUTING -d ! 192.168.1.0/24 -p tcp --syn -j REDIRECT --to-ports 9040
По окончанию обновления репозитория git.openwrt.org проксификация отключается
iptables -t nat -D PREROUTING 1
и умный обход по ipset оставляется до лучших времен.

Продолжение веселья

Повторяем обновление репозитория в обход РКН
./scripts/feeds update -a
./scripts/feeds install -a
Конфигурируем сборку
# make prereq
или
# make menuconfig
Выбираем целевую платформу
Target System (MediaTek Ralink MIPS)
Subtarget (RT3x5x/RT5350 based boards)
Target Profile (D-Link DIR-300 B1)
Провайдер не радует меня IPv6-адресацией, поэтому отключаем для уменьшения размера.

Для уменьшения размера прошивки пришлось временно отказаться от luci. Выключил из сборки все пункты в разделе
> LuCI
Включаем модули для поддержки SD-карты через GPIO
> Kernel modules > SPI Support > kmod-spi-gpio
> Kernel modules > SPI Support > kmod-mmc-spi
Включаем поддержку файловой системы, в которую отформатировали SD-карту (F2FS у меня долго монтируется, перешел на ext4)
> Kernel modules > Filesystems > kmod-fs-f2fs
или
> Kernel modules > Filesystems > kmod-fs-ext4
Правим дерево устройств openwrt/target/linux/ramips/dts/DIR-300-B1.dts. (UPD. патч для 19.07 на github)
Отключаем светодиоды и кнопку wps, используем освободившиеся контакты для ногодрыга SPI.

--- DIR-300-B1.dts_orig 2018-11-25 21:52:25.000000000 +0300
+++ DIR-300-B1.dts 2018-11-29 04:08:48.587063382 +0300
@@ -52,27 +52,11 @@
  gpios = <&gpio0 10 GPIO_ACTIVE_LOW>;
  linux,code = <KEY_RESTART>;
  };
-
- wps {
- label = "wps";
- gpios = <&gpio0 0 GPIO_ACTIVE_LOW>;
- linux,code = <KEY_WPS_BUTTON>;
- };
  };

  gpio-leds {
  compatible = "gpio-leds";

- status {
- label = "dir-300-b1:amber:status";
- gpios = <&gpio0 8 GPIO_ACTIVE_LOW>;
- };
-
- status2 {
- label = "dir-300-b1:green:status";
- gpios = <&gpio0 9 GPIO_ACTIVE_LOW>;
- };
-
  wan {
  label = "dir-300-b1:amber:wan";
  gpios = <&gpio0 14 GPIO_ACTIVE_LOW>;
@@ -82,10 +66,24 @@
  label = "dir-300-b1:green:wan";
  gpios = <&gpio0 12 GPIO_ACTIVE_LOW>;
  };
+ };

- wps {
- label = "dir-300-b1:blue:wps";
- gpios = <&gpio0 13 GPIO_ACTIVE_LOW>;
+ spi {
+ compatible = "spi-gpio";
+ #address-cells = <0x1>;
+ ranges;
+
+ gpio-sck = <&gpio0 8 GPIO_ACTIVE_LOW>;
+ gpio-miso = <&gpio0 13 GPIO_ACTIVE_LOW>;
+ gpio-mosi = <&gpio0 9 GPIO_ACTIVE_LOW>;
+ cs-gpios = <&gpio0 0 GPIO_ACTIVE_LOW>;
+ num-chipselects = <1>;
+
+ mmc-slot@0 {
+ compatible = "mmc-spi-slot";
+ reg = <0>;
+ voltage-ranges = <3300 3300>;
+ spi-max-frequency = <30000000>;
  };
  };
 };

После чего собираем прошивку на полном ходу
# make -j9 V=-1
Должны получить файл openwrt/bin/targets/ramips/rt305x/openwrt-ramips-rt305x-dir-300-b1-squashfs-sysupgrade.bin. Прошиваем в роутер поверх openwrt через web-интерфейс или через CLI
# sysupgrade -v /tmp/openwrt-ramips-rt305x-dir-300-b1-squashfs-sysupgrade.bin

Второй этап

Загружаемся и осматриваемся. Если флешка вставлена, то должна определиться
# dmesg | grep mmc
[   10.328909] mmc_spi spi1.0: SD/MMC host mmc0, no WP, no poweroff, cd polling
[   10.385538] mmc0: host does not support reading read-only switch, assuming write-enable
[   10.401830] mmc0: new SD card on SPI
[   10.433934] mmcblk0: mmc0:0000 SA02G 1.84 GiB
[   10.687521]  mmcblk0: p1
Указываем список модулей (зависимости модулей загружаются сами) для монтирования SD-карты при старте:
# mkdir -p /overlay/upper/etc/modules-boot.d
# vi /overlay/upper/etc/modules-boot.d/mmc
mmc_core
mmc_block
spi_gpio
mmc_spi
Подключаем интернет c использованием CLI и доустанавливаем набор утилит для монтирования блочных устройств (sd, hdd, usb flash..).
# opkg update && opkg install block-mount
Если включать пакет при компилировании прошивки > Base system >block-mount, то kmodloader читает файл /etc/modules-boot.d/ из /rom, вместо internal overlay, где мы указали список модулей.
Можно еще собрать пакет отдельным модулем *.ipk и затем поставить
# opkg install /tmp/block-mount*.ipk
Пишем конфиг автомонтирования
# vi /etc/config/fstab
config 'global'
option anon_swap '0'
option anon_mount '0'
option auto_swap '1'
option auto_mount '1'
option delay_root '5'
option check_fs '0'
config 'mount'
option target '/overlay'
option device '/dev/mmcblk0p1'
option fstype 'ext4'
option options 'rw,sync,noatime' # for ext4 only
option enabled '1'
Копируем нажитый overlay c внутренней памяти jffs на sd
# mount /dev/mmcblk0p1 /mnt ; tar -C /overlay -cvf - . | tar -C /mnt -xf - ; umount /mnt
Перезагружаемся
# reboot

Анализ результатов

После перезагрузки ожидаем увидеть чудо:
# dmesg
[    2.957655] kmodloader: loading kernel modules from /etc/modules-boot.d/*
[    3.231238] kmodloader: done loading kernel modules from /etc/modules-boot.d/*
[    3.256787] init: - preinit -
[    4.612794] 8021q: adding VLAN 0 to HW filter on device eth0
[    8.102922] jffs2: notice: (315) jffs2_build_xattr_subsystem: complete building xattr subsystem, 12 of xdatum (0 unchecked, 9 orphan) and 33 of xref (10 dead, 4 orphan) found.
[    8.138391] mount_root: loading kmods from internal overlay
[    8.195050] kmodloader: loading kernel modules from /tmp/overlay/upper/etc/modules-boot.d/*
[    8.342225] random: procd: uninitialized urandom read (4 bytes read)
[    8.398886] mmc_spi spi1.0: SD/MMC host mmc0, no WP, no poweroff, cd polling
[    8.421279] kmodloader: done loading kernel modules from /tmp/overlay/upper/etc/modules-boot.d/*
[    8.453394] mmc0: host does not support reading read-only switch, assuming write-enable
[    8.469662] mmc0: new SD card on SPI
[    8.508346] mmcblk0: mmc0:0000 SA02G 1.84 GiB 
[    8.609736]  mmcblk0: p1
[    8.625306] block: attempting to load /tmp/jffs_cfg/upper/etc/config/fstab
[    8.642334] block: extroot: device not present, retrying in 5 seconds
[   19.213708] EXT4-fs (mmcblk0p1): recovery complete
[   19.474353] EXT4-fs (mmcblk0p1): mounted filesystem with ordered data mode. Opts: 
[   21.075582] mount_root: switched to extroot

Поясню процесс загрузки:

  1. kmodloader загружает все модули как описано в прошивке (раздел /rom) /etc/modules-boot.d/*
  2. Выполняется монтирование внутреннего раздела overlay jffs по пути /tmp/overlay/
  3. kmodloader загружает все модули, заданные пользователем (из раздела overlay jffs) /tmp/overlay/upper/etc/modules-boot.d/*. В том числе загружаются модули, которые мы указали в файле /overlay/upper/etc/modules-boot.d/mmc
  4. Загруженные модули определяют подключенную флешку sd
  5. Раздел флешки монтируется как /overlay

А вот видим много свободного места под дополнительные программы:
# df -h
Filesystem                Size      Used Available Use% Mounted on
/dev/root                 2.0M      2.0M         0 100% /rom
tmpfs                    13.8M     76.0K     13.7M   1% /tmp
/dev/mmcblk0p1            1.8G     26.6M      1.6G   2% /overlay
overlayfs:/overlay        1.8G     26.6M      1.6G   2% /tmpfs                   512.0K         0    512.0K   0% /dev
Максимальная cкорость записи получилась смехотворной, порядка 100Кб/сек:
# time dd if=/dev/zero of=/overlay/testspeed bs=1M count=1 conv=fsync
1+0 records in
1+0 records out
real 0m 9.79s
user 0m 0.00s
sys 0m 0.06s
Скорость чтения чуть повыше:
# echo 3 > /proc/sys/vm/drop_caches
# time dd of=/dev/null if=/overlay/testspeed bs=1M
1+0 records in
1+0 records out
real 0m 8.65s
user 0m 0.02s
sys 0m 0.00s
Ах да, восстанавливаем web-интерфейс
opkg update && opkg install luci
Продолжаем дендропоступательные движения...

Прошивки (с поддержкой ext4 и f2fs), config и dts сложил сюда

1 комментарий:

  1. Спасибо... Лежит такой же, Залил в него загрузчик breed. Собрал padavan... да все руки не доходят до мамонта :)

    ОтветитьУдалить