TP-Link TL-MR3040 OpenWRT и перенос рута на флешку


  1. Заменить прошивку на OpenWRT
  2. Подготовить флешку на компьютере с Unix системой
  3. Подготовить операционку роутера к вставлению флешки
  4. Вставить в USB роутера подготовленную флешку и перенести /overlay на Ext4 партицию на флешке тем самым решив проблему нехватки места под софт
  5. Добавить и включить свопинг

1.

Смена прошивки на OpenWRT

  1. http://192.168.0.1/ admin admin дефолтное состояние роутера
  2. Прошиваем его сначала barrier breaker (файл ow-1505-factory.bin)
  3. После ребута дефолтный адрес становится 192.168.1.1
  4. Прошиваем его 12.0.9 прошивкой OpenWRT (файл ow-1209.bin)
  5. После ребута меняем его адрес на 192.168.1.7
  6. ставим passwd root Epp9mrf3
  7. Убеждаемся в том, что роутер доступен по ssh (программа putty) и в веб интерфейсе
В конечном итоге на экране в программе putty получится следующее:
Using username "root".
root@192.168.1.7's password:


BusyBox v1.19.4 (2013-03-14 11:28:31 UTC) built-in shell (ash)
Enter 'help' for a list of built-in commands.

  _______                     ________        __
 |       |.-----.-----.-----.|  |  |  |.----.|  |_
 |   -   ||  _  |  -__|     ||  |  |  ||   _||   _|
 |_______||   __|_____|__|__||________||__|  |____|
          |__| W I R E L E S S   F R E E D O M
 -----------------------------------------------------
 ATTITUDE ADJUSTMENT (12.09, r36088)
 -----------------------------------------------------
  * 1/4 oz Vodka      Pour all ingredients into mixing
  * 1/4 oz Gin        tin with ice, strain into glass.
  * 1/4 oz Amaretto
  * 1/4 oz Triple sec
  * 1/4 oz Peach schnapps
  * 1/4 oz Sour mix
  * 1 splash Cranberry juice
 -----------------------------------------------------
root@OpenWrt:~#

2.

Подготовка флешки

Несмотря на то, что OpenWRT - почти полноценный Линукс, для установки всех необходимых программ ДО того, как /overlay перенесён на больший носитель - сильно затруднено. Поэтому "делать все пдготовительные работы на самом роутере" мы не будем.

Это означает, что для создания правильной флешки нужен компьютер с практически любой современной Unix системой, умеющей работать с USB носителями. Также хватит любого установочного диска, с которого можео загрузиться в rescue mode и войти в шелл.

Вставив свежекупленную флешку в такой компьютер, следует убедиться в том, что до вставления устройства /dev/sdb не было, а после вставления - /dev/sdb появилось. В зависимости от числа жёстких дисков и вставленных устройств последняя буква меняется (/dev/sda /dev/sdc). Далее я поразумеваю, что флешка подключилась как /dev/sdb.

Сначала стираем единственную (как правило, флешка отформатирована "как супердискета", если смотреть интеллектуальной программой типа Acronis Disk Director)

Опыт показывает, что для получения нужного нам результата правильнее начать с создания чистой partition table, но в случае стандартной форматированной "как супердискета" флешки достаточно сделать так:

root@LinuxWs:~# ls /dev/sdb*
/dev/sdb /dev/sdb1
root@LinuxWs:~# fdisk /dev/sdb
fdisk> d
...
Command (m for help): w
...
root@LinuxWs:~#
Замечание 1
Некоторые операционки после этого предупреждают, что не поймут отредактированную partition table без перезагрузки. А некоторые не предупреждают, но в самом деле могут не понять. Потому по крайней мере выньте флешку и вставьте её обратно. Если на эту команду вы получили только /dev/sdb - всё в порядке, переходите к следующему пункту. Если sdb1 снова виден - перезагрузите компьютер.
root@LinuxWs:~# ls /dev/sdb*
/dev/sdb
root@LinuxWs:~#

Создание трёх партиций нужных типов и размеров

Замечание 2
Практика обращения с флешками, на которых есть исключительно линуксовые партиции, показывает, что при вставлении такой флешки в виндовый компьютер пользователь может ненавязчиво отформатировать её Windows на основании мнения Windows, что флешка якобы не отформатирована.

Чтобы застраховать эту флешку от такой неприятности (мало ли, вытащите сами случайно и вставите), я лично делаю разбивку флешки, в которй первой партицией идёт FAT32 партиция "для Windows", своп второй партицией, будущий рут роутера - третьей партицией.

Так же я лично проверил. Что если "партицию для Windows" сделать НЕ ПЕРВОЙ, то Windows 8 и 10 при её монтировании ошибается в её размере, и показывает размер первой, линуксовой партиции. Поэтому делать "партицию для Windows" первой - в конечном итоге более безопасный вариант, нежели все прочие.

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

root@LinuxWs:~# ls /dev/sdb*
/dev/sdb /dev/sdb1
root@LinuxWs:~# fdisk /dev/sdb
Command (m for help): n
Command (m for help): p
First (...):
Last sector (...): +8G
Command (m for help): t
...
Hex (l for available codes): b
Command (m for help): n
Command (m for help): p
First (...):
Last sector (...): +512M
Command (m for help): t
...
Hex (l for available codes): 82
Command (m for help): n
Command (m for help): p
First (...):
Last sector (...):
...
Command (m for help): w
...
root@LinuxWs:~#
В этом месте так же должно быть замечание 1.

Форматирование созданных партиций

Правильно отформатировать партицию под своп может и сам роутер. А "виндовую" и собственно будущий /overlay форматируем на компе.
mkfs.fat /dev/sdb1
mkfs.ext4 /dev/sdb3
Любое сообщение об ошибке на этом этапе, даже если это warning - не следует игнорировать! Если warning на этапе создания журнала - вместо mkfs.ext4 можно использовать mkfs.ext2 - для нашей задачи нет никакой разницы.
Проверка результата на компе
По окончании процесса можно попробовать на этом же компе маунтить эти партиции и записывать на них файлы. Перед вытаскиванием флешки не забудьте сделать umount всего, что примаунтили.
root@LinuxWs:~# mkdir /mnt
root@LinuxWs:~# mount /dev/sdb1 /mnt
root@LinuxWs:~# touch /mnt/Test
root@LinuxWs:~# ls /mnt/
Test lost+found
root@LinuxWs:~# umount /mnt
root@LinuxWs:~# mount /dev/sdb3 /mnt
root@LinuxWs:~# touch /mnt/Test
root@LinuxWs:~# ls /mnt/
Test lost+found
root@LinuxWs:~# umount /mnt

Замечание 3. Файловые системы на роутере

До переноса /overlay на флешку
root@OpenWrt:~# df -h
Filesystem                Size      Used Available Use% Mounted on
rootfs                    1.1M    212.0K    876.0K  19% /
/dev/root                 2.0M      2.0M         0 100% /rom
tmpfs                    14.3M    436.0K     13.8M   3% /tmp
tmpfs                   512.0K         0    512.0K   0% /dev
/dev/mtdblock3            1.1M    212.0K    876.0K  19% /overlay
overlayfs:/overlay        1.1M    212.0K    876.0K  19% /
root@OpenWrt:~#
Как хорошо видно, тут на overlay 876 килобайт свободного места. В версии 12.0.9 эта партиция хотя бы 1 мегабайт размером. А вот в 14 и 15 версиях - 512K. Именно поэтому мной выбрана 12.0.9, хотя народ в сети рекомендует ставить более поздние.
3.

Подготовка операционки к вставлению флешки

Для этого надо установить необходимый минимум софта именно на вот эти свободные 867 килобайт

Репозитории пакетов

Добавляем строку src/gz attitude_adjustment http://downloads.openwrt.org/attitude_adjustment/12.09/ar71xx/generic/packages/ в /etc/opkg.conf
Грустное замечание
Если вы читаете это в эпоху, когда репозиторий OpenWRT по указанному адресу уже прекратил своё существование - для этой конкретной версии я сотворил зеркало http://d2.gfns.net/openwrt/downloads.openwrt.org/attitude_adjustment/12.09/ar71xx/generic/packages/

Собственно установка

opkg update
opkg install block-mount kmod-usb-ohci kmod-usb-storage kmod-fs-ext4
opkg install kmod-usb-uhci
insmod uhci
insmod usb-ohci
Подводный камень. При установке этого набора пакетов в более поздние версии OpenWRT может просто не хватить места.
4.

Вставляем подготовленную флешку у роутер и переносим

Проверяем получилось ли

Вставьте флэшку в роутер. Проверьте, что она определилась.
root@OpenWrt:~# ls /dev | grep sda
sda
sda1
sda2
sda3
root@OpenWrt:~# mkdir /mnt/sda3
root@OpenWrt:~# mount /dev/sda3 /mnt/sda3
Важное замечание - в OpenWRT скорее всего сработает автомонтирование, и если флешка и файловые системы на ней полностью исправны, mkdir и-или mount покажут, что уже всё есть.

Если же смонтировать диск не получилось и "руками" - вероятнее всего, что файловая система повреждена.

Перенос содержимого на /dev/sda3

root@OpenWrt:~# tar -C /overlay -cvf - . | tar -C /mnt/sda3 -xf -

Добавление в /etc/config/fstab автоподключения /dev/sda3

Содержимое fstab должно теперь стать таким:
config global automount
        option from_fstab 1
        option anon_mount 1

config global autoswap
        option from_fstab 1
        option anon_swap 0

config mount
        option target   /overlay
        option device   /dev/sda3
        option fstype   ext4
        option options  rw,sync
        option enabled  1
        option enabled_fsck 0

config swap
        option device   /dev/sda2
        option enabled  0
Перезагрузите роутер
root@OpenWrt:~# reboot
Если вы не можете зайти через ssh, значит копирование файлов прошло неправильно. Выньте флэшку, перезагрузите его через питание. Когда он запустится, вы сможете зайти туда через ssh. Затем снова вставьте флэшку и повторите предыдущие шаги, внимательно исследуя, где ошиблись.

Проверяем состояние

root@OpenWrt:~# df -h
Filesystem                Size      Used Available Use% Mounted on
rootfs                    6.3G      5.2M      6.0G   0% /
/dev/root                 2.0M      2.0M         0 100% /rom
tmpfs                    14.3M    356.0K     13.9M   2% /tmp
tmpfs                   512.0K         0    512.0K   0% /dev
/dev/sda3                 6.3G      5.2M      6.0G   0% /overlay
overlayfs:/overlay        6.3G      5.2M      6.0G   0% /
root@OpenWrt:~#
Вот теперь у нас 6 гигабайт свободного места!
5.

Включаем свопинг и убеждаемся, что он стартует

У роутера мало оперативной памяти, а мы намерены запустить на нём долговременно процессы, которые её используют. Посмотреть сколько памяти свободно, можно командой free
root@OpenWrt:~# free
             total         used         free       shared      buffers
Mem:         29212        18816        10396            0         2444
-/+ buffers:              16372        12840
Swap:            0            0            0
root@OpenWrt:~#
Для решения проблем с памятью можно использовать партицию swap, под которую мы отвели на флешке 512M.

Проверим, что своп работает

root@OpenWrt:~# mkswap /dev/sda2
Setting up swapspace version 1, size = 524284 KiB
no label, UUID=29de33e2-ffb7-4f3e-866b-8c80adca50ac
root@OpenWrt:~# swapon /dev/sda2
root@OpenWrt:~# free
             total         used         free       shared      buffers
Mem:         29212        19196        10016            0         2456
-/+ buffers:              16740        12472
Swap:       524284            0       524284
root@OpenWrt:~#

Стартовый скрипт

Чтобы после перезагрузки свопинг стал включён, ему надо создать скрипт автозапуска, который будет запускаться в правильной последовательности с прочими стартовыми скриптами системы
root@OpenWrt:~# vi /etc/init.d/swapon
Содержимое скрипта:
#!/bin/ash /etc/rc.common

START=109
STOP=151

start() {
    echo "start swap"
    swapon /dev/sda2
}

stop(){
    echo "stop"
}
Сделайте его исполняемым:
root@OpenWrt:~# chmod +x /etc/init.d/swapon
Теперь нужно сделать symlink с /etc/rc.d на него:
root@OpenWrt:~# ln -s /etc/init.d/swapon /etc/rc.d/S109swapon
S109 сообщает системе приоритет скрипта. Все файлы в /etc/rc.d начинаются с S##. S109 должен разместить его в самом конце, после того, как запустятся все остальные.

Проверяем автостарт скрипта

Перезагрузимся, зайдём через ssh и проверим подключение свопа:
root@OpenWrt:~# free
             total         used         free       shared      buffers
Mem:         29212        19196        10016            0         2456
-/+ buffers:              16740        12472
Swap:       524284            0       524284
root@OpenWrt:~#

На данном этапе мы добились того, что "на корневой партиции" стало много места, и оперативной памяти тоже "стало больше". Это наконец и позвляет нам устанавливать разнообразный софт и писать собственные скрипты.