HPC.ru lite - Все форумы
Форум: КПК и смартфоны на Linux: Zaurus, планшеты Nokia, прочее
Тема: Вопрос по внутренностям cacko/sharp rom
[Ответить]
Е. Медведев [11.11.2004 11:00] Вопрос по внутренностям cacko/sharp rom:
Вознамерился я сочинить скриптик, который, видя на только что вставленной карточке файл типа .<имя>.cramfs (или squashfs) создавал бы директорию /mnt/<имя> и маунтил бы его туда. А при поступлении команды на выплевывание карточки размаунтил и убирал бы директорию.
Вопрос такой - куда лучше всего приткнуть его вызов в cacko/sharp based rom?
В usbstorage.agent? В sdcontrol? В еще какой-то скрипт который я не нашел? Планируется чтобы он работал как на sd так и на cf.
ВадимП [11.11.2004 12:09] :
Есть, как обычно, несколько вариантов.
Можно для этого добавить новую опцию.
Можно просто расширить сушествующую DO_MOUNT.
В последнем случае я думаю, что достаточно добавить команды для монтирования loopback-устройства в /etc/pcmcia/shared (в функции add_blkdev и rm_blkdev).
Е. Медведев [11.11.2004 13:50] :
ВадимП писал(а):
В последнем случае я думаю, что достаточно добавить команды для монтирования loopback-устройства в /etc/pcmcia/shared (в функции add_blkdev и rm_blkdev).
Попробовал, получилось как-то странно.
Скрипт для маунта искомого завелся как положено - при появлении устройства имиджи маунтятся куда сказано.
А вот обратный процесс происходит как-то неправильно, что-то его стопорит, а что именно - непонятно, не размаунтятся ни имиджи, ни сама карточка. fuser -m -k не помогает, и что самое интересное, на середине этих экспериментов кутопия упала...
Скрипты выглядят так:
mountcfs:
#!/bin/sh
OLDPWD=`pwd`
LOOPFSDIR="$1"
cd $LOOPFSDIR
LOOPS=`ls -1 .*.cramfs .*.squashfs`
for LOOP in $LOOPS; do
MNT=`echo $LOOP | awk -F . '{ print $2 }'`
if [ -d "/mnt/$MNT" ]; then
echo /mnt/$MNT exists
else
echo /mnt/$MNT doesn\'t exist, creating and mounting it
mkdir /mnt/$MNT
mount -o loop $LOOP /mnt/$MNT
fi
done
cd $OLDPWD
exit 0
umountcfs:
!/bin/sh
OLDPWD=`pwd`
LOOPFSDIR="$1"
cd $LOOPFSDIR
LOOPS=`ls -1 .*.cramfs .*.squashfs`
for LOOP in $LOOPS; do
MNT=`echo $LOOP | awk -F . '{ print $2 }'`
if [ -d "/mnt/$MNT" ]; then
echo /mnt/$MNT exists, unmounting and deleting the mount point
fuser -m -k /mnt/$MNT
umount /mnt/$MNT && rmdir /mnt/$MNT
else
echo $LOOP was not mounted.
fi
done
cd $OLDPWD
exit 0
Что я попытался сделать с /etc/pcmcia/shared:
В add_blkdev:
if is_true $DO_MOUNT ; then
O=${OPTS:+-o $OPTS} ; FS=${FSTYPE:+-t $FSTYPE}
mount $FATOPTS $FS $1 $MOUNTPT || mount $O $FS $1 $MOUNTPT || return 1
chkmntsh ${MOUNTPT}
mountcfs ${MOUNTPT}
fi
В rm_blkdev:
if mount | fgrep -q "$1 on" ; then
MOUNTPT=`mount | fgrep -q "$1 on" | awk '{ print $3 }'`
umountcfs ${MOUNTPT}
umount $1 || return 1
Что именно я сделал неправильно?
maslovsky [11.11.2004 15:18] :
CF карты маунтятся скриптом /etc/pcmcia/ide, SD карточки - /etc/sdcontrol, от этого и пляши...
ВадимП [11.11.2004 15:33] :
Е. Медведев писал(а):
MOUNTPT=`mount | fgrep -q "$1 on" | awk '{ print $3 }'`
Не могу сказать, что это единственная причина (лень проверять), но ключ "-q" означает "ничего не выводить на stdout, вернуть только код возврата"
Е. Медведев [11.11.2004 16:39] :
ВадимП писал(а):
Не могу сказать, что это единственная причина (лень проверять), но ключ "-q" означает "ничего не выводить на stdout, вернуть только код возврата"
Спасибо, и правда не единственная.
Вторая - это то что размаунтит карту при выплевывании через кутопию вовсе не rm_blkdev, как следовало бы ожидать. 
Если кому будет интересно - потом добью туда еще защиты от дурака типа меня, соберу все это в пакетик с инструкцией и выложу...
[Ответить]