Подключение внешнего накопителя к D-Link DIR-825 под управлением openWRT (USB Flash) 49


А все-таки маловато 4 Мб Flash, даже для Embedded. Но у есть -порт, а в хозяйстве есть не очень нужная флешка на 512 Мб.

Итак, установим модуля для поддержки USB:

root@:~$ opkg install kmod-usb-core kmod-usb-ohci kmod-usb-storage \
kmod-usb-uhci kmod-usb2 kmod-scsi-core

Подгрузим их в ядро:

[email protected]:~$ insmod usbcore
[email protected]:~$ insmod uhci-hcd
[email protected]:~$ insmod usb-storage
[email protected]:~$ insmod ohci-hcd
[email protected]:~$ insmod scsi_mod

После этого флешка опозналась как «/dev/sda». Отформатировать можно и на другой машине, а можно и тут. В качестве файловой системы я выбрал ext3. Установим соответствующие утилиты и модуль ядра:

[email protected]:~$ opkg install e2fsprogs cfdisk fdisk kmod-fs-ext3
[email protected]:~$ insmod ext3

Отформатируем флешку и подключим как «/opt»

mke2fs -j /dev/sda1
mkdir /opt
mount -t ext3 /dev/sda1 /opt

Добавим флешку в качестве точки установки пакетов:

echo dest usb /opt >> /etc/opkg.conf

Установим на флешку полуношного командора:

opkg -dest usb install mc

Для полного счастья кое-чего не хватает… нужно дописывать в PATH «/opt», или воспользоваться скриптом из старой вики openwrt:

#!/bin/sh
COMMAND=$1
PACKAGE=$2
setdest () {
for i in `grep dest /etc/opkg.conf | cut -d ' ' -f 3`; do
if [ -f $i/usr/lib/opkg/info/$PACKAGE.list ]; then
DEST=$i
fi
done
if [ "x$DEST" = "x" ]; then
echo "Can not locate $PACKAGE."
echo "Check /etc/opkg.conf for correct dest listings";
echo "Check name of requested package: $PACKAGE"
exit 1
fi
}
addlinks () {
setdest;
cat $DEST/usr/lib/opkg/info/$PACKAGE.list | while read LINE; do
SRC=$LINE
DST=`echo $SRC | sed "s|$DEST||"`
DSTNAME=`basename $DST`
DSTDIR=`echo $DST | sed "s|$DSTNAME\$||"`
test -f "$SRC"
if [ $? = 0 ]; then
test -e "$DST"
if [ $? = 1 ]; then
mkdir -p $DSTDIR
ln -sf $SRC $DST
else
echo "Not linking $SRC to $DST"
echo "$DST Already exists"
fi
else
test -d "$SRC"
if [ $? = 0 ]; then
test -e $DST
if [ $? = 1 ]; then
mkdir -p $DST
else
echo "directory already exists"
fi
else
echo "Source directory $SRC does not exist"
fi
fi
done
}
removelinks () {
setdest;
cat $DEST/usr/lib/opkg/info/$PACKAGE.list | while read LINE; do
SRC=$LINE
DST=`echo $LINE | sed "s|$DEST||"`
DSTNAME=`basename $DST`
DSTDIR=`echo $DST | sed "s|$DSTNAME\$||"`
test -f $DST
if [ $? = 0 ]; then
rm -f $DST
test -d $DSTDIR && rmdir $DSTDIR 2>/dev/null
else
test -d $DST
if [ $? = 0 ]; then
rmdir $DST
else
echo "$DST does not exist"
fi
fi
done
}
mountdest () {
test -d $PACKAGE
if [ $? = 1 ]; then
echo "Mount point does not exist"
exit 1
fi
for i in $PACKAGE/usr/lib/opkg/info/*.list; do
$0 add `basename $i .list`
done
}
umountdest () {
test -d $PACKAGE
if [ $? = 1 ]; then
echo "Mount point does not exist"
exit 1
fi
for i in $PACKAGE/usr/lib/opkg/info/*.list; do
$0 remove `basename $i .list`
done
}
case "$COMMAND" in
add)
addlinks
;;
remove)
removelinks
;;
mount)
mountdest
;;
umount)
umountdest
;;
*)
echo "Usage: $0  "
echo "       Commands: add, remove, mount, umount"
echo "       Targets: , "
echo "Example:  $0 add kismet-server"
echo "Example:  $0 remove kismet-server"
echo "Example:  $0 mount /mnt/usb"
echo "Example:  $0 umount /mnt/usb"
exit 1
;;
esac
exit 0

Сохраним его, например, как «/bin/opkg-link» и сделаем исполняемым:

chmod a+x /bin/opkg-link

Этот скрипт создает симлинки для разных точек установки. Запустим его для недавно установленного MC:

opkg-link add mc

Для всего софта на флешке:

opkg-link mount /opt

А теперь сделаем так, чтобы флешка монтировалась при загрузке системы, для этого добавим скрипт «/etc/init.d/usb_storage», примерно такого содержания:

#!/bin/sh
/bin/mount -t ext3 /dev/sda1 /opt

Разрешим его выполнять при загрузке:

chmod +x /etc/init.d/usb_storage
ln -s /etc/init.d/usb_storage /etc/rc.d/S99usb_storage 

Можно конечно и грузится с внешнего накопителя, но флешка эта совсем не новая и доверия к ней нет 🙂 Как-нибудь попробую вынести систему на USB-HDD.


49 мыслей про “Подключение внешнего накопителя к D-Link DIR-825 под управлением openWRT (USB Flash)

  • DJ-X

    Программы ставил как здесь описано, а остальное как на сайте openwrt.

    http://wiki.openwrt.org/doc/recipes/install.packages.on.usb-stick
    opkg install mc -d usb
    Всё что будет в USB в /etc/ нужно линковать к /etc/
    ln -s $USB/etc/mc /etc/mc

    Это я сам скомпоновал /etc/profile нужно это добавить в /etc/profile.

    export LD_LIBRARY_PATH=’/mnt/usb/lib:/mnt/usb/usr/lib:/lib:/usr/lib’
    export PATH=’/bin:/sbin:/usr/bin:/usr/sbin:/mnt/usb/usr/bin:/mnt/usb/usr/sbin’
    export USB=’/mnt/usb’
    Закоментировать эту строку
    #export PATH=/bin:/sbin:/usr/bin:/usr/sbin

    Установил kmod-fs-ext4 форматировал mkfs.ext4 /dev/sda1
    Настроил путь для монтирования

    config mount
    option target /mnt/usb
    option device /dev/sda1
    option fstype ext4
    option options rw,sync
    option enabled 1
    option enabled_fsck 0

    и запустил команды

    /etc/init.d/fstab start
    /etc/init.d/fstab enable

    opkg-link не запускал — у меня сним проблемы.

  • Дмитрий

    Здравствуйте! Подскажите пожалуйста, какой командой можно посмотреть видит флешку устройство с OpenWRT или нет?
    Спасибо.

    • Rascal От автора

      Флешка должна появиться как блочное устройство:

      ls -l /dev/sd*

      покажет список блочных устройств

  • OpenwrtUser

    Добавлю,
    opkg-link add mc
    не создал нужных симлинков для mc в /usr/lib, попытка запуска заканчивалась ошибкой:
    mc: can’t load library ‘libncurses.so.5’
    Но всё исправилось этим:
    opkg-link mount /точка_монтирования

  • OpenwrtUser

    Какая должна получиться скорость записи на флэш с дир-825?
    Проверял командой
    time sh -c ‘dd if=/dev/zero of=/mnt/flash/testfile bs=4k count=4000 && sync’
    На ext4 получил около 5.5 МБ/с скорость записи, что крайне мало для такого роутера. Чтение 19 МБ/с. Может быть, надо отформатировать или смонтировать ext4 без журналирования, но как это правильно сделать?

    • Rascal От автора

      А ваша флешка умеет писать быстрее? По статистике как раз, средняя скорость чтения 15 Мб/сек, записи 8-9 Мб/сек + избыточность журнала

      • OpenwrtUser

        Флэшка может работать быстрее. Но т.к. CPU роутера при записи загружен на 100%, то скорость в него и упирается.
        Если отформатировать её командой mke2fs /dev/sda1 без опции -j, которая вроде бы означает журналирование, это заставит её работать быстрее?
        Я мог бы проверить, но хочу быть точно уверенным, чтобы многочисленными тестами не сокращать жизнь флэшки.

      • Rascal От автора

        Да заставит, на сколько можно оценить только практически

        • OpenwrtUser

          К сожалению, при форматировании командой
          mke2fs /dev/sda1
          не получилось повысить скорость записи, те же 5 МБ/с. На файлах большего размера скорость выше. Загрузка CPU не изменилась, 100%.
          Запись без && sync даёт 9-10 МБ/с на небольших файлах, при этом память используется как буфер, но хотелось бы повысить чистую скорость записи…
          Без опции -j есть небольшой плюс, стала доступна практически вся флэшка, до этого 2% (35 МБ от 2 ГБ) куда-то было зарезервировано, наверное для журналирования.

  • OpenwrtUser

    4 мб — не опечатка? У дир-825 8 мб флэш.
    Спасибо за статью, пригодится.

    • Rascal От автора

      Не опечатка. Доступно 4 Мб после установки дефолтной конфигурации.

      • OpenwrtUser

        Но если так, то на моём дир-825 после установки openwrt r27015 доступно было всего 2.8 МБ. Ставил squashfs версию, возможно она требует больше места.

  • Rascal От автора

    боюсь что это выходит далеко за рамки текущей записи. Можете прислать мне лог компиляции на почту, это будет правильнее.

    • Enzain

      Сейчас еще попробую на 32битной скомпилить, если тоже не получится — тогда уже будем смотреть.

    • Enzain

      вернемся к вопросу об скомпиленых образах ….
      Нет у вас случайно образа скомпиленного уже с модулем «block-extroot»?

    • Rascal От автора

      Неn, обхожусь встроенной памятью + NFS.

      • Enzain

        весьма печально …
        А нельзя сделать?:)

        ПС: вообще не могу в меню настройки найти этот модуль … 🙁

      • Rascal От автора

        Зачем что-то искать в меню если есть конфиг? И кто вам сказал что это модуль? 😉

         [email protected]:~/openwrt-trunk$ grep -i extroot .config # CONFIG_PACKAGE_block-extroot is not set 
        • Enzain

          Ну мне это не открывает глаза на мою проблему…
          Я с линуксом знаком весьма таки на ВЫ …. основная моя ось это Вин … и только из-за роутера вникать во все — по моепму не очень уместно … хотя конечно если добрые люди не найдутся — то придется 🙂

        • Enzain

          А на тему кто сказал что модуль — ну люди в интернете говорят что в менюконфиг его где то найти можно… но я как то не нашел 🙂

        • Enzain

          Кстати из офф документации:
          block-extroot ❗ since OpenWrt 10.03.1-rc4 ‘Backfire’ it is possible to simply install this package with opkg. Before that this was not possible, you had to build your own firmware and include the package in it.

          У меня конечно не очень хорошо все с инглишем, но не написано ли тут что в последней версии этот модуль можно просто установить, при том что в ранних версиях нужно было компилировать ядро с этим модулем?

          • Enzain

            Такс… по инструкции с сайта как то не очень получается….
            видимо что-то я не так делаю …

          • Enzain

            Filesystem Size Used Available Use% Mounted on
            /dev/root 1.5M 1.5M 0 100% /rom
            tmpfs 30.3M 1.4M 28.9M 5% /tmp
            tmpfs 512.0K 0 512.0K 0% /dev
            /dev/sda1 1.8G 43.7M 1.7G 2% /overlay
            mini_fo:/overlay 1.5M 1.5M 0 100% /

            вот как то так без вшивания модуля в прошивку ….
            это правильно или я чего то не понимаю?)

          • Rascal От автора

            Праздравляю, тем не менее:

            block-extroot since OpenWrt 10.03.1-rc4 ‘Backfire’ it is possible to simply install this package with opkg. Before that this was not possible, you had to build your own firmware and include the package in it.

            Слова модуль (module) здесь нет, только пакет (package). А если посмотреть его содержимое, то это просто набор скриптов:

            [email protected]:~$ opkg files block-extroot
            Package block-extroot (0.0.1-2) is installed on root and has the 
            following files:
            /lib/preinit/00_extroot.conf
            /lib/functions/extmount.sh
            /lib/preinit/55_determine_extroot_sysupgrade
            /lib/preinit/60_pivot_usb_root
            /lib/preinit/50_determine_usb_root
            
          • Enzain

            Ок, это пакет, но тем не менее не нашел я его в менюконфиг когда пытался собрать прошивку из исходников…
            В итоге обошлись и так, что в общем то замечательно я так думаю …

  • Rascal От автора

    можно (скомпилировав поддержку юсб-стораджа и файловой системы статикой), но где вы видели ядро с 8 гигами модулей?

    • Enzain

      Флешку на 2гиговую поменял.
      А так вообще — не видел, но не видел не значит что не может быть …
      А поставить посмотреть хочется много чего …. 🙂

    • Enzain

      У вас, нигде случайно такого образа не заволялось?…

      ПС: почему то у меня из транка — компиляция не идет .. настройки запустить могу, но когда начинаю компилить вываливает ошибку….

      Линукс: Федора 14

  • Rascal От автора

    Сразу не получится, ядро и модули все равно придется грузить со встроенной памяти. А вот корневую файловую систему можно вынести на usb-устройство.

    • Enzain

      т.е. место для модулей нельзя раздуть скажем до 8 ГБ за счет флешки?….
      Или я чего не понял?…

      ПС: вчера только взял девайс, перешил, поколупался, пока не все доходит корректно до меня… )

  • Enzain

    Так так так …
    Мне вот должны подогнать скоро 825 длинк, и к нему флешку новехонькую на 8гб, специально для поколупаться с опенврт…
    Как поставить опенврт на флешку сразу?:)

  • Rascal От автора

    Можно непосредственно openWRT поставить на usb-накопитель.

  • Axle

    Скрипт работает ровно до 1-й перезагрузки, потом роутер тупо не грузится.

    • Rascal От автора

      Что-нибудь из системных приложений или модулей ядра на внешний сторадж не ставили?

        • Rascal От автора

          Такие вещи не стоит ставить подобным образом:

           [email protected]:~$ opkg files pptp Package pptp (1.7.1-3) is installed on root and has the following files: /lib/network/pptp.sh /usr/sbin/pptp /etc/ppp/options.pptp [email protected]:~$ opkg files kmod-gre Package kmod-gre (2.6.32.27-1) is installed on root and has the following files: /lib/modules/2.6.32.27/ip_gre.ko 

          Способ инсталляции указанный в этой записи подходит только для утилит типа mc, top и прочего не запускаемого при старте системы.

          • Axle

            Т.е. вообще никак нельзя ставить? Мне вот надо по идее openl2tp, а к нему еще 2 библиотеки и мод ядра необходимо установить — и это все не влазит в основную память.
            Насколько я понимаю монтирование флешки слишком поздно идет, и его никак раньше не сделать?

  • jam

    подключил HDD, поставил самбу, но при запуске скрипта выдает ошибку:

    [email protected]:~# opkg-link add smbpasswd
    -ash: opkg-link: not found

    как быть?

    • Rascal От автора

      А что показывает which opkg-link?

      И если посмотреть на содержание скрипта, второй аргумент это имя пакета, а не конретного бинарника, например в случае самбы:

      [email protected]:~$ opkg-link add samba-server
      
      • Axle

        Тоже самое,
        -ash: opkg-link: not found
        даже просто запуская opkg-link.
        which говорит /bin/opkg-link

        • Rascal От автора

          Если цитата дословная, убедитесь в корректном содержимом файла.

          • Axle

            Спасибо 🙂 убедился, что забыл начисто о преобразовании в текстовых файлах знака переноса при копировании из Windows в Unix и обратно. 🙂

  • Дмитрий

    Извините за глупый вопрос, а что дальше делать то?)

    • Rascal От автора

      Радоваться жизни, есть здоровую пищу, соблюдать правила дорожного движения и больше времени уделять девушке.

      • Дмитрий

        Вот как смогу на роутере сделать вэб-сервер + файл-сервер + торрент-клиент, сразу займусь за все остальное =)

  • avin

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

  • Mr.Hunt

    суть в том, что флешка уже была с разделом ext3, но суть такая что я даже форматировал sda, он форматируется вроде как но туда не заходит. Вообще всё в /dev розового цвета.

  • Mr.Hunt

    Не получилось мне сделать. флешка в /dev/sda видна, но дикс sda1 не создаётся 🙁 Если возможно помогите в этом вопросе, я в линуксе не силён.

    • Rascal От автора

      sda1 это раздел, если флешка не использовалась, можно его создать через fdisk или отформатировать весь диск, без разделов

Комментарии закрыты