Hallo,
ich habe endlich mal wieder etwas Zeit gefunden um meinem Problem auf die Spur zu kommen.
Dazu habe ich zunächst einmal ein neues Image mit den tagesaktuellen Patches aus dem svn erstellt.
Leider funktioniert das automatische mounten damit immer noch nicht
Also habe ich mich mal auf die Suche begeben und herausgefunden, das das mounten über das libmodmount.sh stattfindet.
Dabei ist mir aufgefallen, das die Meldungen im Log nicht unbedingt etwas damit zu tun haben was tatsächlich gerade passiert.
So wird z.B. in der Funktion do_mount_locked() innerhalb der while Schleife ausgegeben, "Mounting ..."
Tatsächlich wird aber lediglich das Verzeichnis uStor01 angelegt.
Das eigentliche mounten findet viel später in einer anderen Funktion statt.
Um dem Problem auf die Schliche zu kommen habe ich daher mal das libmodmount.sh etwas modifiziert.
Code:
# mount according to type of filesystem
# return code:
# true - all went well
# other - something went wrong
mount_fs() {
local dev_node=$1 # device node
local mnt_path=$2 # mount path
[ $# -ge 3 ] && local rw_mode=$3 || local rw_mode=rw # read/write mode
[ $# -ge 4 ] && local ftp_uid=$4 || local ftp_uid=0 # ftp user id
[ $# -ge 5 ] && local ftp_gid=$5 || local ftp_gid=0 # ftp group id
fs_type=`blkid $dev_node | sed -nr 's!.*TYPE="([^"]*).*!\1!p'` # fs type detection
log_freetz notice "fs:$fs_type path:$mnt_path dev:$mnt_dev"
case "$fs_type" in
vfat)
mount -t vfat -o $rw_mode,uid=$ftp_uid,gid=$ftp_gid,fmask=0000,dmask=0000 $dev_node $mnt_path
err_mo=$?
;;
ext2|ext3|ext4|reiserfs)
mount -t $fs_type $dev_node $mnt_path -o noatime,nodiratime,rw,async
err_mo=$?
;;
hfs|hfsplus)
mount -t $fs_type $dev_node $mnt_path
err_mo=$?
;;
ntfs)
local ntfs_bin="/bin/ntfs-3g"
[ -x "$ntfs_bin" ] && { $ntfs_bin $dev_node $mnt_path -o force ; err_mo=$? ; } || err_mo=111
;;
swap)
/etc/init.d/rc.swap autostart $dev_node
err_mo=$((17+$?))
;;
*)
fs_type="unknown" # set unknown file system type if detection failed
mount $dev_node $mnt_path
err_mo=$?
;;
esac
echo -n "$fs_type"
return $err_mo
}
# mount function
# used by /etc/hotplug/run_mount
# seperated from do_mount since fw 04.89
do_mount_locked() {
local mnt_failure=0
local rcftpd="/etc/init.d/rc.ftpd"
local tammnt="/var/tam/mount"
local mnt_rw=rw
[ $# -ge 2 ] && local mnt_dev=$2 || return 1
[ $# -ge 3 ] && local mnt_part_num=$3 || return 1
local mnt_blk_dev=${mnt_dev##/dev/}
local mnt_main_dev=$(echo $mnt_blk_dev | sed -e 's#\(.\{0,3\}\).*#\1#g')
local mnt_med_num=0
local mnt_name
local mnt_path
# local fs_type
mount | grep -q "$mnt_dev on /var/media/" && return 0 # device already mounted
while [ $mnt_med_num -le 9 ]; do # sda1...sda9
mnt_name=$(find_mnt_name $mnt_main_dev $mnt_med_num $mnt_part_num) # find name
mnt_path=$FTPDIR/$mnt_name
if [ ! -d $mnt_path ]; then
log_freetz notice "creating $mnt_path for device $mnt_dev"
mkdir -p $mnt_path
break
fi
let mnt_med_num++
done
chmod 755 $FTPDIR # chmod for ftp top directory
local old_umask=$(umask) # store actual mask
umask 0
log_freetz notice "Mounting device $mnt_dev ($mnt_rw,$FTPUID,$FTPGID) on $mnt_path"
# fs_type=$(mount_fs $mnt_dev $mnt_path $mnt_rw $FTPUID $FTPGID) # FREETZ mount
mount_fs $mnt_dev $mnt_path $mnt_rw $FTPUID $FTPGID # FREETZ mount
local err_fs_mount=$?
if [ $err_fs_mount -eq 0 ]; then
umask $old_umask
eventadd 140 "$mnt_name ($mnt_dev)"
log_freetz notice "Partition $mnt_name ($mnt_dev / $fs_type) mounted successfully"
if [ -x $rcftpd ]; then # start/enable ftpd
[ -x "$(which inetdctl)" ] && inetdctl enable ftpd || $rcftpd start
fi
/etc/init.d/rc.swap autostart $mnt_path # swap
In meinem Log finde ich jetzt folgendes:
Code:
[INFO] creating /var/media/ftp/uStor01 for device /dev/sda1
[INFO] Mounting device /dev/sda1 (rw,0,0) on /var/media/ftp/uStor01
[INFO] Partition uStor01 (/dev/sda1 / ) mounted successfully
Die Log Ausgaben zeigen, das sda1 als Device erkannt wird und dann zunächst das Verzeichnis uStor01 angelegt wird.
Das läßt sich auch über telnet so verifizieren.
Anschließend sollte laut log die Funktion mount_fs mit den richtigen Parametern aufgerufen werden.
Hier vermisse ich allerdings die log Ausgabe. Ist der Aufruf nun erfolgt, oder nicht?
Jedenfalls ist nach dem Funktionsaufruf die Variable fs_type leer, denn sonst hätte der Dateisystemtyp hinter "/dev/sda1 / " auftauchen müssen.
Ich erinnere mich, das in der originalen libmodmount.sh dort die ersten Zeichen der Ausgabe von mount aufgetaucht sind.
Leider bin ich nicht der bash Profi, so das ich erst einmal nicht weiter weiss.
Für mich sieht es so aus als ob einige Passagen aus dem Script nicht funktionsfähig sind.
So schien die Anweisung
völlig ins Nirwana zu laufen.
Im übrigen kann man den USB Stick beliebig oft abziehen und wieder neu einstecken.
Die Log Ausgaben bleiben gleich, ein mount erfolgt nicht.
Wenn ich jedoch über telnet ein
Code:
mount /dev/sda1 /var/media/ftp/uStor01
absetze, erfolgt das mounten ohne Probleme.
Ich hoffe die Experten hier können ein wenig Licht ins Dunkel bringen ....