Появилось желание потыкать палочкой 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)
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)Провайдер не радует меня IPv6-адресацией, поэтому отключаем для уменьшения размера.
Subtarget (RT3x5x/RT5350 based boards)
Target Profile (D-Link DIR-300 B1)
Для уменьшения размера прошивки пришлось временно отказаться от luci. Выключил из сборки все пункты в разделе
> LuCIВключаем модули для поддержки SD-карты через GPIO
> Kernel modules > SPI Support > kmod-spi-gpioВключаем поддержку файловой системы, в которую отформатировали SD-карту (F2FS у меня долго монтируется, перешел на ext4)
> Kernel modules > SPI Support > kmod-mmc-spi
> 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>;
};
};
};
После чего собираем прошивку на полном ходу
Отключаем светодиоды и кнопку 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Указываем список модулей (зависимости модулей загружаются сами) для монтирования SD-карты при старте:
[ 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
# mkdir -p /overlay/upper/etc/modules-boot.d
# vi /overlay/upper/etc/modules-boot.d/mmcПодключаем интернет c использованием CLI и доустанавливаем набор утилит для монтирования блочных устройств (sd, hdd, usb flash..).
mmc_core
mmc_block
spi_gpio
mmc_spi
# 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'Копируем нажитый overlay c внутренней памяти jffs на sd
option target '/overlay'
option device '/dev/mmcblk0p1'
option fstype 'ext4'
option options 'rw,sync,noatime' # for ext4 only
option enabled '1'
# 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
- kmodloader загружает все модули как описано в прошивке (раздел /rom) /etc/modules-boot.d/*
- Выполняется монтирование внутреннего раздела overlay jffs по пути /tmp/overlay/
- kmodloader загружает все модули, заданные пользователем (из раздела overlay jffs) /tmp/overlay/upper/etc/modules-boot.d/*. В том числе загружаются модули, которые мы указали в файле /overlay/upper/etc/modules-boot.d/mmc
- Загруженные модули определяют подключенную флешку sd
- Раздел флешки монтируется как /overlay
А вот видим много свободного места под дополнительные программы:
# df -hМаксимальная cкорость записи получилась смехотворной, порядка 100Кб/сек:
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
# 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 сложил сюда
Спасибо... Лежит такой же, Залил в него загрузчик breed. Собрал padavan... да все руки не доходят до мамонта :)
ОтветитьУдалить