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] :
Попробовал, получилось как-то странно.

Скрипт для маунта искомого завелся как положено - при появлении устройства имиджи маунтятся куда сказано.
А вот обратный процесс происходит как-то неправильно, что-то его стопорит, а что именно - непонятно, не размаунтятся ни имиджи, ни сама карточка. 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] :
Не могу сказать, что это единственная причина (лень проверять), но ключ "-q" означает "ничего не выводить на stdout, вернуть только код возврата"
Е. Медведев [11.11.2004 16:39] :
Спасибо, и правда не единственная.
Вторая - это то что размаунтит карту при выплевывании через кутопию вовсе не rm_blkdev, как следовало бы ожидать.

Если кому будет интересно - потом добью туда еще защиты от дурака типа меня, соберу все это в пакетик с инструкцией и выложу...
[Ответить]