D-Link DIR-620 и dd-wrt — подключение flash, установка программ, настройка NAS

Итак, после установки на роутер DIR-620 прошивки dd-wrt, можно подключить к нему флешку или внешний диск по USB, установить нужные программы и получить помимо самого роутера — NAS с закачкой торрентов.

Монтирование внешнего диска в dd-wrt

Для начала нужно включить поддержку USB на роутере через веб-интерфейс: Services — USB — USB Support — Core USB Support + USB Storage Support. После подключения внешнего диска проверить успешность при помощи вызова dmesg | grep scsi, где строки вида /dev/scsi/host2/bus0/target0/lun0: p1 p2 укажут на подключенный диск (в данном случае мой диск подключен к третьему порту USB-хаба — host2 и имеет два раздела — p1 p2.

Монтирование на прошивке с поддержкой файловых систем

Поскольку при каждой загрузке роутера его состояние обнуляется до того, что штатно позволяет прошивка, монтирование USB-дисков, применение нужных настроек и запуск требуемых программ следует прописать в startup-скрипте (Administration — Commands — Startup) через веб-интерфейс:

switch reg w 90 10007f7f
insmod jbd.ko
insmod mbcache.ko
insmod ext3.ko
sleep 10
mount -t ext3 -o noatime,nodiratime /dev/scsi/host0/bus0/target0/lun0/part1 /jffs
mount -o bind /jffs/opt /opt
mount -o bind /opt/etc/profile /etc/profile
mount -t ext3 /dev/scsi/host1/bus0/target0/lun0/part1 /mnt
/opt/bin/busybox swapon /mnt/routerswap.swp
sleep 1
/opt/bin/transmission-daemon -g /opt/etc/transmission

О некоторых строках расскажу подробней сразу, другие рассмотрены дальше в заметке. Первая — исправляет ошибку невключения WAN-порта, возникующую в dd-wrt 17201 после прошивки загрузчика uboot 3.3.2. Вторая-четвертая — загрузка модулей для поддержки работы с файловыми системами, модули находятся в /lib/modules/версия_ядра, если прошивка без модулей поддержки ФС — см. ниже. Шестая и девятая строки отвечают за монтирование внешних дисков (флешки для установки софта и USB-HDD, выступающего в роли NAS). Седьмая — монтирование каталога с флешки в каталог ФС роутера, восьмая — замена штатного /etc/profile на измененный (см. ниже). Десятая — подключение своп-файла, создание которого подробно рассмотрено ниже. Последняя — запуск transmission с указанным каталогом в качестве рабочего (в частности там хранится файл настроек).

Монтирование при отсутствии встроенной поддержки файловых систем

Если установленная прошивка не имеет в комплекте модулей поддержки файловых систем — можно поступить следующим образом — записать поблочно архив с нужными модулями при помощи dd на отдельный раздел флешки (достаточно раздела размером в 1 Мб) и прописать их распаковку и подгрузку при старте роутера, изменив соответствующим образом startup-скрипт (подробная инструкция на английском):

mkdir /var/lib/fs
cd /var/lib/fs
tar -zxvf /dev/scsi/host0/bus0/target0/lun0/part2
insmod jbd.ko
insmod mbcache.ko
insmod ext3.ko

После этого ext3 монтируется без проблем. Кстати поддержки ext4 я в dd-wrt не обнаружил (по крайней мере на их ftp модулей нет, разве что собирать модуль самостоятельно, чтобы получить поддержку ext4), обратная конвертация из ext4 в ext3 судя по всему невозможна — стоит учесть это заранее.

Проверяем результаты монтирования

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

root@DIR620:~# df -h
Filesystem Size Used Available Use% Mounted on
/dev/root 2.8M 2.8M 0 100% /
/dev/scsi/host0/bus0/target0/lun0/part1
1.8G 123.9M 1.6G 7% /jffs
/dev/scsi/host0/bus0/target0/lun0/part1
1.8G 123.9M 1.6G 7% /opt
/dev/scsi/host0/bus0/target0/lun0/part1
1.8G 123.9M 1.6G 7% /etc/profile
/dev/scsi/host1/bus0/target0/lun0/part1
293.4G 160.1G 118.4G 57% /mnt

Как видно из вывода команды — моя флешка для установки софта (1.8G) и USB-диск для закачки торрентов (293.4G) успешно примонтировались и используются системой. О том, зачем потребовалось монтировать /etc/profile с флешки, речь пойдёт дальше.

Включение SWAP на роутере с dd-wrt

Если установлена прошивка с поддержкой swap (см. Как прошить DIR-620 прошивкой dd-wrt), то нужно выделить отдельный раздел под него на внешнем диске или создать своп-файл, как поступил я (можно воспользоваться Linux-машиной, можно установить расширенную версию busybox на роутер):

dd if=/dev/zero of=/mnt/myswap.swp bs=1k count=16000
/opt/bin/busybox mkswap /mnt/myswap.swp
/opt/bin/busybox swapon /mnt/myswap.swp

где count=16000 — 16 тысяч блоков размером по одному килобайту, т.е. размер своп-файла составит 16 мегабайт. Советую сделать не меньше 32-х мегабайт, при большом количестве закачек в transmission легко используется по 20-25 Мб подкачки.
Если при попытке включения свопа выдаётся ошибка swapon: function not implemented — значит, ядро установленной прошивки не имеет поддержки swap.

Установка программ в dd-wrt

Для установки софта (optware) из репозиториев под dd-wrt применяются следующие команды:

  • ipkg-opt update — обновить список пакетов, доступных в репозитории;
  • ipkg-opt upgrade — обновить установленные пакеты;
  • ipkg-opt install — установить пакет;
  • ipkg-opt remove — удалить пакет;
  • ipkg list — показать список всех доступных для установки пакетов;
  • ipkg list | grep ‘название программы’ — найти программу по названию, если она естьв репозитории.

Настройка NFS для доступа к NAS

Из вариантов сетевого доступа к внешнему диску я выбрал доступ по NFS — samba медленней и сложней в настройке, большинство машин у меня дома — с Linux или Android, а кроме того — для Windows XP есть официальный NFS-клиент (точнее — клон mount), доступный на сайте Microsoft, а Vindows Vista и старше — поддерживают NFS изначально.
Настройка NFS на роутере производится следующим образом — устанавливаем пакеты portmap (для динамического выделения портов) и unfs3 (NFS-демон). В созданные после установки файлы /opt/etc/init.d/S56unfsd и /opt/etc/init.d/S55portmap добавляем строку LD_LIBRARY_PATH=/opt/lib:${LD_LIBRARY_PATH} — путь к дополнительным библиотекам на внешнем диске. Создаем файл настроек для NFS-демона /opt/etc/exports:

/mnt/точка_монтирования_внешнего_диска 192.168.0.1/255.255.255.0(rw,sync,no_subtree_check,no_root_squash)

Точку монтирования NAS-диска и маску подсети надо естественно изменить на свои. При перезагрузке роутера portmap и unfs будут стартовать автоматически.
Затем я на ноутбуке установил пакет nfs-client, после чего можно монтировать NAS:

mount -t nfs 192.168.0.1:/mnt /media/NAS

В каталог /mnt примонтирован на роутере внешний HDD.

Небольшие настройки для удобства работы в ash

Штатно в dd-wrt используется оболочка командной строки ash. Конечно можно установить из репозитория bash или любую другую и прописать ее в автозагрузку, но фактически возможностей ash более чем достаточно для роутера. Единственное реальное неудобство, которое возникло у меня при работе с ней — невозможность прописать свои алиасы в конфиге, поскольку при каждой загрузке роутера все системные файлы откатываются к исходному состоянию. Выход — монтировать поверх штатного конфига командной оболочки (/etc/profile) свой, расположенный на внешнем диске (например у меня — /opt/etc/profile) и дополненный нужными опциями, дописав в startup скрипте такую строку:

mount -o bind /opt/etc/profile /etc/profile

Мой profile устанавливает алиасы для вызова vim с моим vimrc, htop в качестве системного монитора, transmission с внешним каталогом хранения настроек и в итоге дополнен следующими командами:

alias vim='vim -u /opt/etc/vim/.vimrc'
alias top='htop'
alias transmission='/opt/bin/transmission-daemon -g /opt/etc/transmission'
alias halt='/opt/sbin/shutdown'
alias ll='ls -lh'
alias la='ls -lha

Полезно сделать shutdown-скрипт, копирующий содержимое секции shutdown (Administration — Commands — Shutdown) из веб-интрефейса, которое выполняется при перезагрузке роутера. Скрипт будет точно также выгружать определенные процессы и отмонтировать внешние диски для последующего безопасного выключения роутера. Мой скрипт выглядит так:

killall transmission-daemon
killall unfsd
sleep 1
/opt/bin/busybox swapoff /mnt/routerswap.swp
umount /dev/scsi/host1/bus0/target0/lun0/part1
umount /dev/scsi/host0/bus0/target0/lun0/part1

31 мысль о “D-Link DIR-620 и dd-wrt — подключение flash, установка программ, настройка NAS”

  1. Приветствую! А если версия стоит без свап? Как-то есть вариант добавить свап?
    Делаю так:
    /opt/bin/busybox dd if=/dev/zero of=/mnt/myswap.swp bs=1k count=16000
    Файл создается

    /opt/bin/busybox mkswap /mnt/myswap.swp
    Setting up swapspace version 1, size = 16379904 bytes

    /opt/bin/busybox swapon /mnt/myswap.swp
    swapon: /mnt/myswap.swp: Function not implemented

    Благодарю!

    1. Вариант по сути один — пересобрать ядро с включением поддержки подкачки. Либо самостоятельно, либо взять прошивку, где ядро уже с поддержкой. swapon как раз и ругается на отсутствие поддержки swap в ядре.

  2. Спасибо за инструкцию!

    Правда portmap нормально поставился только после того, как в startup добавил

    unset LD_PRELOAD
    unset LD_LIBRARY_PATH

    а nfs завелся лишь после того, как изменил в файле /opt/etc/init.d/S56unfsd

    /opt/sbin/unfsd -e /opt/etc/exports

    и в файле /opt/etc/exports

    192.168.1.0/255.255.255.0

    1. С путем для доп. библиотек мне помогает строка LD_LIBRARY_PATH=/opt/lib:${LD_LIBRARY_PATH} в конце S55portmap и S56unfsd, как в заметке написано. В S56unfsd у меня тоже добавлена /opt/sbin/unfsd -e /opt/etc/exports. В /opt/etc/exports, пример из которого я в заметке привожу, у меня прописан диапазаон адресов моей подсети. Соотв. если у вас роутер живет на 192.168.1.0, а не на 192.168.0.1, как у меня, то естественно нужно было заменить диапазон на правильный.

  3. Друзья! Понимаю абсурдность и глупость своего вопроса, но тем не менее — как установить portmap и unfs3? винт подключила, он монтируется, все вроде бы отлично, но без этих вот сервисов нихрена не работает. Я вообще в этом деле (общении с техникой) новичок, так что не злитесь)) Помогите, пожалуйста, добрым советом, что делать. Уже блин неделю бьюсь и все никак ничего не выйдет.

    1. Заходим по ssh на роутер, выполняем команды ipkg-opt install portmap и ipkg-opt install unfs3.
      Про установку программ под dd-wrt в этой заметке есть раздельчик кстати.

      1. Пишу, он отвечает ipkg-opt not found или что то типа того. как туда запилить то этот ipkg-opt?

        1. ipkg уже присутствует в прошивке (которую я использовал по крайней мере). Могу предположить, что если раздел /opt и/или /jffs у вас смонтированы на съемном носителе, — могли просто забыть его примонтировать.
          Ну и вот это можно почитать на всякий случай: [ссылка]

            1. На всякий случай уточню, что прикрутить поддержку NFS в WinXP или в Android тоже не самая тривиальная задача. Если с ними работать — стоит на Samba посмотреть.

  4. Простите за глупый вопрос, но
    «Создаем файл настроек для NFS-демона /opt/etc/exports:»
    как создавать файл?

    и еще:
    «/mnt/точка_монтирования_внешнего_диска »
    т.е. если у меня диск примонтирован как
    /dev/scsi/host1/bus0/target0/lun0/part1
    то после /mnt добавить эту строку, или как?

    1. Например — при помощи команды touch имя_файла. Или vim имя_файла и сохранить его при выходе. Или echo » > имя_файла. Можно и поискать по запросу «как создать файл в linux».

      Это значит, что если внешний диск у вас примонтирован в директорию /mnt — прописать так, а если в /mnt/ext_hdd или еще куда-то — прописать, куда именно. Например у меня внешний диск монтируется так: mount -t ext3 /dev/scsi/host1/bus0/target0/lun0/part1 /mnt и значит мне нужно прописать /mnt в данном случае.

  5. Подскажите, пожалуйста!
    Как запустить portmap и unfs3. Эти пакеты установлены, но при вызове ps, они не отображаются.

    1. Раздел заметки «Настройка NFS для доступа к NAS», указаны файлы: «В созданные после установки файлы /opt/etc/init.d/S56unfsd и /opt/etc/init.d/S55portmap добавляем строку…» — вот они и запускают утилиты, это скрипты-обертки для запуска. Можно запустить вручную, можно перезагрузить роутер — они автоматически запустятся при загрузке (подробней можно почитать про «демон init.d»). Цифры после буквы S в названии — порядок запуска, чем меньше цифра — тем раньше запустится в ходе загрузки соответствующий скрипт.

  6. Тогда я либо чего-то не понимаю, либо у меня руки не оттуда растут.
    К роутеру я присоединяюсь по 192.168.1.1
    При помощи unfs-3g примонтировал диск (на данный момент флешку на 16 Гб) в папку
    /mnt. Дальше действую, как написано в заметке в файл S56unfsd и S55portmap дописал LD_LIBRARY_PATH=/opt/lib:${LD_LIBRARY_PATH}
    Мой файл ecports выглядит так?
    /mnt 192.168.1.1/255.255.255.0 (rw,sync,no_subtree_check,no_root_squash)
    Дальше, из-за того, что у меня стоит Windows 7 Pro (в котором нету вшитого NFS-клиента), нашел NFS-клиент под название Neko Drive.
    Поставил, захожу, прописываю адрес сервера 192.168.1.1
    на что мне вылетает ошибка ONC/RPC portmap failure
    Ума не приложу, что я делаю неправильно. Весь инет обшарил по этому поводу.

    1. Сами библиотеки-то есть на внешнем диске? unfsd и portmap запущены? Может еще опции монтирования проверить — не знаю, как виндовый клиент на них реагирует, возможно что-то надо добавить/убрать. На сайте Microsoft был NFS-клиент родной, может его еще попробовать.

      1. А вот насчет этих библиотек можно подробнее?
        Откуда их брать и что это за библиотеки?

        PS: поставил клиент от мелкомягких, при вызове showmnt -e 192.168.1.1 выскакивает ошибка RPC: port mapper failure.

        1. Они ставятся автоматом при установке пакетов через ipkg, но стоит проверить — вдруг сбой какой был.
          По ошибке гугль выдает много разного — стоит поискать и почитать. Порты-то не закрыты, которые portmap пытается выделить?

          1. в папке /opt/lib есть библиотеки. Я просто вначале неправильно понял, подумал, что они должны быть на диске, который мы монтируем как /mnt.

            вызвал rpcinfo -p 192.168.1.1
            вывело:
            rpcinfo: RPC: Unable to receive; errno = no error string available
            rpcinfo: can’t connact portmapper.

            что делать с портами? как с ними воевать?

          2. Нашел ошибку.
            Попробовал запустить вручную
            sh /opt/etc/init.d/S55portmap
            на выходе:
            /opt/sbin/portmap: can’t handle reloc type 47
            т.е. portmap не запускается. Далее попробовал снести пакет и поставить его заново. В конце установки ошибка:
            /opt/sbin/portmap: can’t handle reloc type 47
            postinst script returned status 1
            ERROR: portmap.postinst returned 1

            Далее попробовал запустить пакет unfsd
            root@DD-WRT:~# sh /opt/etc/init.d/S56unfsd
            Cannot register service: RPC: Unable to receive; errno = Connection refused
            unable to register (NFS3_PROGRAM, NFS_V3, udp).

            Подскажите, пожалуйста, что можно сделать?

          3. Как говорится, кто ищет, тот всегда найдет.
            После длительного поиска я нашел решение проблемы. Всё что нужно, это прописать в консоли:
            unset LD_PRELOAD
            unset LD_LIBRARY_PATH

            и запустить пакеты на выполнение:
            sh /opt/etc/init.d/S56unfsd
            sh /opt/etc/init.d/S55portmap

            Теперь в одном из NFS клиентов есть возможность открыть шару, но монтировать как диск, почему-то не хочет.
            NekoDrive выкидывает ошибку Permission denied.
            NFS-клиент майкрософта пишет при вызове:
            showmnt -e 192.168.1.1
            /mnt , 192.168.1.1/255.255.255.0
            т.е. диск виден
            Но при вызове mount 192.168.1.1:\mnt x:
            выкидывает ошибку сети 1204

            1. Значит гугление по тексту ошибки как обычно дает результат 🙂
              С правами надо разбираться — или опции монтирования менять для unfsd (вместо no_root_squash для начала попробовать all_squash — виндовые клиенты вероятно с пользователями/группами работают не так, как линуксовые), или проверить, что IP клиента действительно попадает в разрешенный в exports диапазон (как например тут решилась схожая проблема). Проверить права на внешний диск не помешает — может он монтируется удаленно как rw, а локально на сервере права только на чтение например. Почитать man exports и пример в АрчВики. В exports кстати можно диапазон IP меньше указать, у меня так сейчас указан: /mnt 192.168.0.0/24.

          4. В интернете поискал, толком по этой ошибке ничего нету.
            Вписал в опции монтирования unfsd all_squash, никак не повлияло.
            В диапазон попадает т.к. у меня в exports указано 192.168.1.1, а клиенты начинаются с 192.168.1.100 и выше.

            Что делать дальше я пока не знаю.

            1. Пока самое полезное встретил тут (в частности — прописывание в hosts.allow нужных сервисов и опция no_root_squash). man exports читали по опциям экспорта директорий? На выходных поэкспериментирую в WinXP.

            2. Установил NekoDrive и Dokan под WinXP, всё отлично монтирует. Протокол 3 версии выставил и поддержку юникода при подключении, разблокировал NekoDrive в фаерволе и без проблем сетевой диск примонтировал. Access denied получал только когда для эксперимента изменил разрешенный диапазон адресов в exports и клиент перестал в него попадать. Поменял обратно на 192.168.0.0/24 — снова без проблем подключается.
              Подключение NFS в Windows при помощи клиента NekoDrive

          5. Да, я на выходных проделал почти то же самое. Диск монтируется. Но в Моём компьютере диск подписан как «Отключенное сетевое устройство» и помечен красным крестом, но файлы всё просматриваются. Частенько диск отваливается, Total Commander при проигрывании мультимедиа пишет «Соединение с x:»

            В добавок к этому мне не нравится скорость обмена. Если я через Total Commander, либо через обычный проводник перекидываю файлы на сетевой диск, то обмен идет приблизительно на скорости 1 МБайт/сек. Когда я запускаю медиа-файлы, то скорость значительно падает + обрывы (из-за того, что отваливается диск). Включаю музыку через Winamp, играет секунд 10-15, дальше обрыв приблизительно на 5-10 секунд, а бывает и дольше, потом звук продолжается. Насчет фильмов я вообще молчу.

            Вот сейчас не знаю и на «кого» думать. Либо USB-хаб не тянет, либо во флешке что-то не так, либо я с настройками что-то намудрил. Хотя, настройки вроде в порядке.

            1. Может и хаб, он активный? У меня обычный HDD подключен к роутеру, скорость копирования в Win была в принципе близка к таковой в Linux. Флешку с fat32 нет особого смысла использовать для постоянной записи/чтения — умрет быстро.

          6. Активный хаб, насколько я знаю, это тот, который еще отдельно подключается в электросеть? Тогда у меня не такой хаб. Он подключается только в USB выход роутера.

            Флешка отформатирована в NTFS.
            На данный момент я просто провожу эксперименты с флешкой. Т.к. у меня есть жесткий диск на 1 Тб, но он внутренний и расположен в стационарном компьютере; я подумывал насчет того, чтобы докупить к нему внешний карман и подключить к хабу (чтоб диск раздавался и на ноутбук и на стационар).
            Вот сейчас подумываю либо заменить хаб, либо купить такую штуку (точно не знаю название), подобие внешнего кармана, но подключается в порт Lan. (Но я пока не знаю, как настраивать это дело)
            Что скажете на этот счет?

            1. Да, именно такой — с дополнительным отдельным питанием.
              Салазки с LAN-портом по идее должны определиться без всяких проблем, я правда подобными никогда не пользовался — так что достоверно не знаю. Надо гуглить, как конкретные модели работают с конкретными ОС, или же от ОС тут вообще ничего не зависит. Однозначно они выйдут дороже хаба, скорость работы должна быть выше, а тонкости подключения — повторюсь — лучше предварительно по выбранной модели поискать.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *