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

А все-таки маловато 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)”

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