А все-таки маловато 4 Мб Flash, даже для Embedded. Но у DIR-825 есть USB-порт, а в хозяйстве есть не очень нужная флешка на 512 Мб.
Итак, установим модуля для поддержки USB:
root@openwrt:~$ opkg install kmod-usb-core kmod-usb-ohci kmod-usb-storage \
kmod-usb-uhci kmod-usb2 kmod-scsi-core
Подгрузим их в ядро:
root@openwrt:~$ insmod usbcore
root@openwrt:~$ insmod uhci-hcd
root@openwrt:~$ insmod usb-storage
root@openwrt:~$ insmod ohci-hcd
root@openwrt:~$ insmod scsi_mod
После этого флешка опозналась как «/dev/sda». Отформатировать можно и на другой машине, а можно и тут. В качестве файловой системы я выбрал ext3. Установим соответствующие утилиты и модуль ядра:
root@openwrt:~$ opkg install e2fsprogs cfdisk fdisk kmod-fs-ext3
root@openwrt:~$ 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)”
Программы ставил как здесь описано, а остальное как на сайте 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 или нет?
Спасибо.
Флешка должна появиться как блочное устройство:
покажет список блочных устройств
Добавлю,
opkg-link add mc
не создал нужных симлинков для mc в /usr/lib, попытка запуска заканчивалась ошибкой:
mc: can’t load library ‘libncurses.so.5’
Но всё исправилось этим:
opkg-link mount /точка_монтирования
Какая должна получиться скорость записи на флэш с дир-825?
Проверял командой
time sh -c ‘dd if=/dev/zero of=/mnt/flash/testfile bs=4k count=4000 && sync’
На ext4 получил около 5.5 МБ/с скорость записи, что крайне мало для такого роутера. Чтение 19 МБ/с. Может быть, надо отформатировать или смонтировать ext4 без журналирования, но как это правильно сделать?
А ваша флешка умеет писать быстрее? По статистике как раз, средняя скорость чтения 15 Мб/сек, записи 8-9 Мб/сек + избыточность журнала
Флэшка может работать быстрее. Но т.к. CPU роутера при записи загружен на 100%, то скорость в него и упирается.
Если отформатировать её командой mke2fs /dev/sda1 без опции -j, которая вроде бы означает журналирование, это заставит её работать быстрее?
Я мог бы проверить, но хочу быть точно уверенным, чтобы многочисленными тестами не сокращать жизнь флэшки.
Да заставит, на сколько можно оценить только практически
К сожалению, при форматировании командой
mke2fs /dev/sda1
не получилось повысить скорость записи, те же 5 МБ/с. На файлах большего размера скорость выше. Загрузка CPU не изменилась, 100%.
Запись без && sync даёт 9-10 МБ/с на небольших файлах, при этом память используется как буфер, но хотелось бы повысить чистую скорость записи…
Без опции -j есть небольшой плюс, стала доступна практически вся флэшка, до этого 2% (35 МБ от 2 ГБ) куда-то было зарезервировано, наверное для журналирования.
4 мб — не опечатка? У дир-825 8 мб флэш.
Спасибо за статью, пригодится.
Не опечатка. Доступно 4 Мб после установки дефолтной конфигурации.
Но если так, то на моём дир-825 после установки openwrt r27015 доступно было всего 2.8 МБ. Ставил squashfs версию, возможно она требует больше места.
боюсь что это выходит далеко за рамки текущей записи. Можете прислать мне лог компиляции на почту, это будет правильнее.
Сейчас еще попробую на 32битной скомпилить, если тоже не получится — тогда уже будем смотреть.
вернемся к вопросу об скомпиленых образах ….
Нет у вас случайно образа скомпиленного уже с модулем «block-extroot»?
Неn, обхожусь встроенной памятью + NFS.
весьма печально …
А нельзя сделать?:)
ПС: вообще не могу в меню настройки найти этот модуль … :(
Зачем что-то искать в меню если есть конфиг? И кто вам сказал что это модуль? ;)
Ну мне это не открывает глаза на мою проблему…
Я с линуксом знаком весьма таки на ВЫ …. основная моя ось это Вин … и только из-за роутера вникать во все — по моепму не очень уместно … хотя конечно если добрые люди не найдутся — то придется :)
А на тему кто сказал что модуль — ну люди в интернете говорят что в менюконфиг его где то найти можно… но я как то не нашел :)
Кстати из офф документации:
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.
У меня конечно не очень хорошо все с инглишем, но не написано ли тут что в последней версии этот модуль можно просто установить, при том что в ранних версиях нужно было компилировать ядро с этим модулем?
Такс… по инструкции с сайта как то не очень получается….
видимо что-то я не так делаю …
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% /
вот как то так без вшивания модуля в прошивку ….
это правильно или я чего то не понимаю?)
Праздравляю, тем не менее:
Слова модуль (module) здесь нет, только пакет (package). А если посмотреть его содержимое, то это просто набор скриптов:
Ок, это пакет, но тем не менее не нашел я его в менюконфиг когда пытался собрать прошивку из исходников…
В итоге обошлись и так, что в общем то замечательно я так думаю …
можно (скомпилировав поддержку юсб-стораджа и файловой системы статикой), но где вы видели ядро с 8 гигами модулей?
Флешку на 2гиговую поменял.
А так вообще — не видел, но не видел не значит что не может быть …
А поставить посмотреть хочется много чего …. :)
У вас, нигде случайно такого образа не заволялось?…
ПС: почему то у меня из транка — компиляция не идет .. настройки запустить могу, но когда начинаю компилить вываливает ошибку….
Линукс: Федора 14
Сразу не получится, ядро и модули все равно придется грузить со встроенной памяти. А вот корневую файловую систему можно вынести на usb-устройство.
т.е. место для модулей нельзя раздуть скажем до 8 ГБ за счет флешки?….
Или я чего не понял?…
ПС: вчера только взял девайс, перешил, поколупался, пока не все доходит корректно до меня… )
Так так так …
Мне вот должны подогнать скоро 825 длинк, и к нему флешку новехонькую на 8гб, специально для поколупаться с опенврт…
Как поставить опенврт на флешку сразу?:)
Можно непосредственно openWRT поставить на usb-накопитель.
Скрипт работает ровно до 1-й перезагрузки, потом роутер тупо не грузится.
Что-нибудь из системных приложений или модулей ядра на внешний сторадж не ставили?
pptp — оно системное приложение?
Такие вещи не стоит ставить подобным образом:
Способ инсталляции указанный в этой записи подходит только для утилит типа mc, top и прочего не запускаемого при старте системы.
Т.е. вообще никак нельзя ставить? Мне вот надо по идее openl2tp, а к нему еще 2 библиотеки и мод ядра необходимо установить — и это все не влазит в основную память.
Насколько я понимаю монтирование флешки слишком поздно идет, и его никак раньше не сделать?
подключил HDD, поставил самбу, но при запуске скрипта выдает ошибку:
root@OpenWrt:~# opkg-link add smbpasswd
-ash: opkg-link: not found
как быть?
А что показывает which opkg-link?
И если посмотреть на содержание скрипта, второй аргумент это имя пакета, а не конретного бинарника, например в случае самбы:
Тоже самое,
-ash: opkg-link: not found
даже просто запуская opkg-link.
which говорит /bin/opkg-link
Если цитата дословная, убедитесь в корректном содержимом файла.
Спасибо :) убедился, что забыл начисто о преобразовании в текстовых файлах знака переноса при копировании из Windows в Unix и обратно. :)
Извините за глупый вопрос, а что дальше делать то?)
Радоваться жизни, есть здоровую пищу, соблюдать правила дорожного движения и больше времени уделять девушке.
Вот как смогу на роутере сделать вэб-сервер + файл-сервер + торрент-клиент, сразу займусь за все остальное =)
отличная статья! спасибо больше, отлично подошло в моем случае. правдо разделы я создавал на компе акронисом
суть в том, что флешка уже была с разделом ext3, но суть такая что я даже форматировал sda, он форматируется вроде как но туда не заходит. Вообще всё в /dev розового цвета.
Не получилось мне сделать. флешка в /dev/sda видна, но дикс sda1 не создаётся :-( Если возможно помогите в этом вопросе, я в линуксе не силён.
sda1 это раздел, если флешка не использовалась, можно его создать через fdisk или отформатировать весь диск, без разделов