Настройка Linksys NSLU2 для домашних нужд. Домашний сервер из тостера. How-to

May 30, 2009 23:12

Как-то попался мне в руки данный девайс, и решил я его приспособить для дела. Так как история приручения улитки (часто его именуют SLUG из-за созвучия) оказалась похожей на квест, то выложу свой путь к победе. Вдруг кому-то пригодится.

Устройство обладает довольно солидной начинкой - 32Мб оперативки, 8Мб ПЗУ, 133МГц XScale процессор, 2 порта USB2, 1 порт Ethernet. И при этом поддаётся следующим модернизациям.
  1. Процессор работает на заниженной вдвое частоте, и очень легко переводится в штатный режим (об этом чуть позже).
  2. На плате разведены, но не распаяны ещё 3 порта USB2. Фактически надо только подпаять разъёмы, и поменять источник питания на более мощный - каждое подключённое устройство может потреблять до 0.5А.
  3. Разведён COM порт. Тоже - только разъём подпаять. Правда кому теперь он нужен?
Остальные манипуляции (коих немало) требуют существенного вмешательства и на мой взгляд совершенно не оправданы - проще купить более мощное устройство. Подробнее о хаках здесь.

Комплект поставки - сильно БУ, причём побывал в руках безвестных умельцев, благодаря чему утратил часть навыков, данных ему от рождения. Если точнее - была произведена попытка кастомизации штатной прошивки из-за чего некоторые сервисы не работали. Доступа по терминалу (ни telnet, ни ssh) не было, так как устройство стабильно крешилось при попытках коннекта. Перепрошивка штатными средствами тоже не работала, выдавая неведомый Error. Было принято решение привести его в чувство кардинальными методами.

Аппаратные доработки

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

Проблема первая. Вскрытие корпуса

На эту тему даже написана специальная хаутушка (есть по ссылке выше).



Итак. Половинки корпуса крепятся на пластиковых клапанах (2), которые входят в пазы (1). Но крышка содержит рёбра жесткости (3), поэтому просто сжатие не приводит к открытию корпуса. Надо прицельно сжимать корпус в месте клапанов (1-2), и отжимать их чем-нибудь подходящим. Я для этого применил небольшую отвёртку с плоским шлицом. Но это ещё не всё - низ корпуса снабжён направляющими (4), и открывать корпус надо сдвигая крышку по ним вверх, как показано на рисунке. Наловчившись, я уже достаточно легко его открывал.
 Увеличение частоты процессора

Плата ничем особым, типа неожиданными маркировками элементов, или большим количеством нераспаяных элементов, не отличалась.  Отмечу только три посадочных места под светодиоды с левого края платы (D2, D3, D6). Настоящий интерес представляло лишь увеличение частоты процессора вдвое, которое достигалось отпаиванием резистора R83. На картинке он внизу и подсвечен красным.



Это же место, более крупным планом, резистор обведён. Для пытливых сообщаю - номинал всех четырёх резисторов 10КОм.



Отпаялся резистор легко, и больше в плате я не копался по причинам озвученным выше.

Прошивка

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

В качестве основы был выбран специализированный дистрибутив OpenWRT. Есть любители установки десктопных дистрибутивов на подобные устройства, но на мой взгляд это извращение. Образ был взят отсюда. Версия 8.09. (Именно этот, так как находящийся рядом 16Мбайтный подходит только для модифицированного устройства, с расширенным ПЗУ. Если вы попытаетесь прошить его в обычное устройство, то оно станет неработоспособно и восстановить его вы не сможете). Кроме самого образа, к дистрибутиву прилагается неплохая подборка пакетов. Они находятся здесь.Как уже говорилось, штатные средства не работали, поэтому пришлось всё делать через инженерный режим.

Во-первых, понадобилась специальная утилита upslug2. Во многих дистрибутивах Linux она доступна через репозиторий. Для своего OpenSuSe, я выполнил запрос software.opensuse.org/search. Для остальных описание находится здесь.

Во-вторых, для неё нужно узнать Mac-адрес. Это можно сделать последовательностью команд. Сначала

# ping 192.168.1.77

192.168.1.77 - ip адрес устройства. Потом

# arp

Эта команда покажет hardware address, который нам и нужен.

В-третьих, надо входить в инженерный режим. Для этого выключаем устройство. На задней панели находим отверстие, под которым прячется кнопка Reset и нажимаем на неё. Не отпуская её, включаем питание. Удерживаем секунд десять - индикатор Ethernet должен загореться красным. Это нормально. Как только он загорелся - сразу отпускаем кнопку Reset. Теперь индикатор Ethernet будет мигать попеременно красным и зелёным. Что сигнализирует об успешном входе в нужный нам режим. Если это не удалось - выключите устройство и попробуйте снова. Это безопасно.

Теперь запускаем нашу утилиту (target указывает mac адрес)

# upslug2 --target="xx:xx:xx:xx:xx:xx" --image="openwrt-nslu2-squashfs.bin"

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

Настройка

После перепрошивки устройству по умолчанию был назначен новый ip адрес 192.168.1.1 (в более старых версиях 192.168.0.1). Он был определён как статический, поэтому команды DHCP на него не действовали. Нужно иметь это в виду, чтобы не получить проблемы с одинаковыми адресами в сети. По этому адресу можно получить доступ к веб-интерфейсу (логин/пароль admin/openWRT) и по ssh - пароль ореnWRT (Внимание! Регистр учитывается). Доступ в консольном режиме по ssh делается так

# ssh 192.168.1.1

Теперь у нас спросят пароль и мы уже на девайсе.

Сама прошивка устроена очень разумно. Оригинальная от linksys находится в запакованном состоянии. При загрузке устройства часть оперативной памяти выделяется под RAM диск, куда происходит распаковка и последующий запуск (а при возможности отъедается ещё и часть подключенного hdd диска).

OpenWRT определяет запакованный образ как упакованную файловую систему squashfs, и монтирует её напрямую, экономя таким образом оперативную память (и не требуя отдельных разделов на подключаемых hdd). И образ столь мал, что на нужды пользователя остаётся ещё 4,88Мб флеша, для записи в которые уже не требуется никаких ухищрений с утилитами и режимами.

А теперь сюрприз - в настройках по-умолчанию USB не поддерживается, доступна только внутренняя сеть, и wget не работает. Причина очевидна - базовая конфигурация была рассчитана на WiFi роутер, но от этого не легче.

Проблема вторая. Установка пакетов и настройка

Как установить нужные пакеты? Я скачал их с сайта OpenWRT (ссылка была выше) на домашний комп и использовал netcat для пересылки на устройство. На домашнем компе выполнял команду вида

# cat nano.ipk | netcat -lp 8080

И в то же время в консоли устройства (в директории /jffs/home)

# nc 192.168.1.3 8080 > nano.ipk

Смысл этого действа таков. На десктопе утилита netcat получает на вход файл nano.ipk, и находится в режиме ожидания (ключ l), слушая порт 8080 (ключ p). На устройстве утилита nc (тот же netcat, но переименованный) обращается к десктопу (по адресу 192.168.1.3) и из порта 8080 получает поток, который записывает в файл nano.ipk. Таким незамысловатым образом я быстро перегнал нужные мне пакеты.

Установка их производится по команде
# opkg install nano.ipk

Здесь и выше nano.ipk - имя пакета. Я установил следующие. Для поддержки внешних USB накопителей с файловой системой ext3.

kmod-fs-ext3_2.6.26.6-ixp4xx-1_armeb.ipk
kmod-scsi-core_2.6.26.6-ixp4xx-1_armeb.ipk
kmod-usb2_2.6.26.6-ixp4xx-1_armeb.ipk
kmod-usb-core_2.6.26.6-ixp4xx-1_armeb.ipk
kmod-usb-ohci_2.6.26.6-ixp4xx-1_armeb.ipk
kmod-usb-storage_2.6.26.6-ixp4xx-1_armeb.ipk

Проблема третья. Монтирование внешнего накопителя

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

May 20 21:04:44 OpenWrt user.info : mount: mounting /dev/sda1 on /home failed: No such file or directory
May 20 21:04:45 OpenWrt user.notice root: usb device is mass storage
...
May 20 21:04:49 OpenWrt user.notice root: waiting on usb drive 4 ...
May 20 21:04:49 OpenWrt user.notice kernel: scsi 0:0:0:0: Direct-Access WDC WD10 EADS-65L5B1 1A01 PQ: 0 ANSI: 2 CCS
May 20 21:04:49 OpenWrt user.notice kernel: sd 0:0:0:0: [sda] 1953525168 512-byte hardware sectors (1000205 MB)

Попытка монтирования осуществляется раньше, чем загрузятся нужные модули ядра. Это происходит потому, что устройства USB монтируются наравне с корневой файловой системой, что неправильно. Решить проблему несложно. Достаточно написать отдельный командный файл, в котором явно вызвать команду монтирования диска и дать задержку. Например, его содержание может быть таким (как создать файл, поместить его в директорию /etc/init.d и назначить права на исполнение, надеюсь, и так всем понятно).

start () {
   sleep 10
   mount /dev/sda1 /mnt/usbdrive
}
stop () {
   umount /mnt/usbdrive
}

Далее ссылку на него следует указать в директории /etc/rc.d

# cd /etc/rc.d
# ln -s /etc/init.d/startusb S70startusb

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

Для редактирования конфигурационных файлов (ну не переношу я vi).

libncurses_5.6-1_armeb.ipknano_2.0.7-1_armeb.ipk

Проблема четвёртая. Работа сети

Теперь, загрузив подходящий редактор, можно окончательно решить проблему сети. Способ решения очень прост. Надо найти файл /etc/sysctl.conf, и заменить в нём параметр net.ipv4.tcp_ecn=1 на net.ipv4.tcp_ecn=0. Смысл этого таков. У протокола TCP есть такая фича - Explicit Congestion Notification. Сиречь - уведомление о перегрузке. Когда два устройства, обменивающиеся данными по сети, практически полностью забивают канал, они обмениваются этими сообщениями и несколько снижают скорость передачи данных. Когда устройство находится в локальной домашней сети за маршрутизатором (за NAT), то оно пытается обменяться этими сигналами с маршрутизатором. Если домашний маршрутизатор не поддерживает эту фичу, то и на устройстве её стоит отключить и не мучить бедную железяку. В противном случае сеть за маршрутизатором будет недоступна. Другие варианты решения - подключить устройство через порт DMZ, или использовать маршрутизатор, который это умеет. В обычных домашних условиях эта функция бесполезна, так как узким местом является канал интернет где-то у провайдера.

Дополнительно стоит выполнить команду.

# opkg update

С помощью неё загружается информация об имеющихся в репозитории пакетах. Дальнейшая установка и настройка станут проще.

Для поддержки NFS
libwrap_7.6-1_armeb.ipk
portmap_6.0-2_armeb.ipk
unfs3_0.9.20-1_armeb.ipk

По умолчанию NFS расшаривает директорию /mnt в режиме только чтение. Это описано в файле /etc/exports.

Проблема пятая. Настройка демона NFS

После установки надо на устройстве в директории /etc/rc.d создать линк на portmap, иначе NFS не работает и при загрузке выдаёт ошибку - "Cannot register service: RPC: Unable to receive; errno = Connection refused unable to register (NFS3_PROGRAM, NFS_V3, udp)". Это делается так

# cd /etc/rc.d
# ln -s /etc/init.d/portmap S50portmap
 Happy end

Всё. С этого момента устройство заработало как надо. Скорость передачи данных по сети составила чуть больше 4Мб в секунду. Её можно немного увеличить, подобрав подходяще параметры NFS (специфичные для каждой отдельной сети). Возможны и дальнейшие настройки и усовершенствования, но основные трудности уже преодолены.

linux openwrt nslu slug

Next post
Up