Хочу еще поделится скриптами, написанными мной в процессе познания маленькой коробочки от асуса со встроенным монстром с именем линукс, которые могут пригодится ее пользователям с прошивкой от Олега.
Скрипт, представленный ниже монтирует все присоединенные к устройству внешние накопители. Уникальность скрипта в том, что он распознает созданную на накопителе метку и монтирует в точку файловой системы, указанную в ней. Также найдя соответствующую метку он может смонитровать файловую систему в точку /opt. В отличии от прошивки скрипт всё монтирует в /mnt.
Code:
#!/bin/sh
#
# amount
#
# written for wl500g with Oleg's firmware
# by Mam(O)n
#
# Название точки по умолчанию для монтирования
DEFPNT="media"
# Название файла-метки на накопителе. Должен содержать имя точки монтирования
VLABEL=".mountpoint"
# Метка-файл для монтирования /opt. Должен лежать на накопителе в папке /opt.
VOPT=".mountopt"
# Опции для монтирования разделов с меткой
OPTS="rw"
# Опции для монтирования разделов без метки
KOPTS="rw"
# Скрипт инициализации всяких там демонов из /opt. (четатипа autorun)
INIT="/opt/etc/init.d/rc.unslung"
MNT=/mnt
TMP=/tmp
DSC=/dev/discs
TMPMNT=$TMP/tmpmnt
CAT=cat; EXPR=expr; LOGGER=logger; LS=ls; GREP=grep; MOUNT=mount; UMOUNT=umount; MKDIR=mkdir; RMDIR=rmdir
while [ -n "$1" ]; do
case $1 in
--exrc)
exrc=true ;;
esac
shift
done
ump="`$MOUNT | grep '/tmp/harddisk/' | awk '{print $3}'`"
ump1="`$MOUNT | grep '/tmp/harddisk ' | awk '{print $3}'`"
if [ -n "$ump1" ]; then ump="$ump $ump1"; fi
if [ -n "$ump" ]; then
echo "Unmount firmware mounted points"
for pnt in $ump; do
echo " - $pnt"
$UMOUNT $pnt && $LOGGER "$pnt unmounted"
done
fi
tst=`$MOUNT | $GREP "$MNT "`
if [ -z "$tst" ]; then
echo "Prepare /mnt mountpoint"
if [ ! -d "$TMP$MNT" ]; then $MKDIR -p $TMP$MNT; fi
$MOUNT -obind,rw,noatime,async $TMP$MNT $MNT;
fi
for dsk in `$LS $DSC/`; do
for prt in `$LS $DSC/$dsk/`; do
if [ $prt != "disc" ]; then
echo "Probe $DSC/$dsk/$prt"
if [ -z "`$MOUNT | $GREP $DSC/$dsk/$prt`" ]; then
# echo " - not mounted; trying to mount"
if [ ! -d "$TMPMNT" ]; then $MKDIR -p $TMPMNT; fi
if $MOUNT -oasync,ro $DSC/$dsk/$prt $TMPMNT 2> /dev/null; then
pnt=$DEFPNT
if [ -e "$TMPMNT/$VLABEL" ]; then
vlm=`$CAT $TMPMNT/$VLABEL`
vlm=`expr "$vlm" : '\([a-zA-Z0-9]\{0,13\}\)'`
if [ -n "$vlm" ]; then echo " - has a valid label"; pnt=$vlm; OPTS=$KOPTS; fi
fi
$UMOUNT $TMPMNT
if [ "`$MOUNT | $GREP $MNT/$pnt`" ]; then
echo " - mountpoint is already mounted by other; trying to select other"
iter=0
while [ -n "$iter" ]; do
iter=`$EXPR $iter + 1`
if [ $iter -gt 100 ]; then echo " - somthing wrong; exiting"; exit 1; fi
if [ -z "`$MOUNT | $GREP $MNT/$pnt.$iter`" ]; then
pnt="${pnt}.${iter}"
iter=""
fi
done
fi
if [ ! -d "$MNT/$pnt" ]; then $MKDIR -p $MNT/$pnt; fi
if $MOUNT -oasync,noatime,$OPTS $DSC/$dsk/$prt $MNT/$pnt 2> /dev/null; then
echo " - mounted at $MNT/$pnt"
$LOGGER "mounted $DSC/$dsk/$prt at $MNT/$pnt"
if [ -z "`$MOUNT | $GREP ' /opt '`" -a -e $MNT/$pnt/opt/$VOPT ]; then
if $MOUNT -obind,rw,async,noatime $MNT/$pnt/opt /opt 2> /dev/null; then
echo " - /opt mounted"
$LOGGER "mounted $MNT/$pnt/opt at /opt"
if [ "$exrc" = "true" -a -e "$INIT" ]; then
echo " - executing $INIT"
$LOGGER "executing $INIT"
$INIT "$MNT/$pnt" > /dev/null
fi
fi
fi
else
echo " - can't mount at $MNT/$pnt"
$LOGGER "mount error $DSC/$dsk/$prt at $MNT/$pnt"
fi
else
echo " - cannot be mount; skipped"
fi
$RMDIR $TMPMNT
else
echo " - already mounted at "`$MOUNT | $GREP $DSC/$dsk/$prt | awk '{print $3}' `
fi
fi
done
done
Как это работает.
1. Скрипт размонтирует все, что было ранее смонтировано прошивкой в /tmp/harddisk
2. Подготавливается точка монтирования /mnt
3. Перебирает все диски и разделы в /dev/discs
4. Перебирает каждый раздел накопителя и если он еще не смонтирован то делается попытка его смонтировать, и если это происходит удачно, то проверяется файл-метка на диске, и если она существует, то происходит монтирование в точку, указанную в метке, иначе монтируется в точку по-умолчанию. Если в целевой точке монтирования было уже чтото смонтировано, то делается попытка смонитровать в точку с суфиксом.
5. Если на носителе присутствует папка opt и в ней есть метка, то она монтируется в точку /opt, если конечно там ничего уже не смонтировано.
6. Если при запуске скрипта указан ключ --exrc, то делается попытка запустить скрипт инициализации (при новом монтировании /opt)