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

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

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

 [email protected]:~$ 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.