[Frage] USBRoot mit FB3370

speedy734

Neuer User
Mitglied seit
19 Jul 2012
Beiträge
9
Punkte für Reaktionen
0
Punkte
0
Hat irgendjemand schon mal eine FB3370 mit USBRoot verwendet? Mir gelingt es einfach nicht vom USB Stick zu booten. USBRoot bleibt immer inaktiv, auch wenn ich es vorm Reboot aktiviert habe. Ein dmesg bringt bei mir unter anderem folgende Meldungen:

[ 2.190000] kernel_init: basic setup done
[ 2.190000] SQUASHFS error: Can't find a SQUASHFS superblock on mtdblock3
[ 2.200000] yaffs: dev is 32505859 name is "mtdblock3" ro
[ 2.200000] yaffs: passed flags ""
[ 2.210000] yaffs: yaffs: Attempting MTD mount of 31.3,"mtdblock3"
[ 2.210000] yaffs: auto selecting yaffs2
[ 2.220000] yaffs: yaffs_read_super: is_checkpointed 1
[ 2.220000] VFS: Mounted root (yaffs filesystem) readonly on device 31:3.
[ 2.230000] Freeing unused kernel memory: 184k freed
[ 2.260000] [uart_avm_set_termios] baudrate=115200, quot=136, fdv=419, reload=110, b=114889
[ 2.270000] Failed to execute /etc/init.d/rc.usbroot. Attempting defaults...
[ 2.280000] trying /sbin/init

Ich kann das noch nicht richtig interpretieren, aber es scheint mir, als ob der Kernel rc.usbroot nicht findet und dann init startet. rc.usbroot existiert aber im Image. Ich habe dann mal die Flash Partition des aktuell aktiven root Dateissystems gemounted (/dev/mtdblock3). Was ich da sehe verstehe ich nicht so recht. Dort gibt es ein Dateisystem im Flash, das wiederum eine Datei mit einem Squashfas Image (das eigentliche root Dateisystem) enthält. Das Dateisystem im Flash enthält natürlich keine rc.usbroot. Kann es sein, das der Kernel bei der 3370 erst in dieses Dateisystem booted und dann von dort aus erst das Squashfs Image läd? Wenn ja dann kann doch die Übergabe eines alternativen init an den Kernnel nicht funktionieren? Die Inittab im Flasch sieht folgendermaßen aus:

null::sysinit:/bin/mount -t squashfs /filesystem_core.squashfs /core -o loop
null::sysinit:/sbin/pivot_root /core/ /core/wrapper/
null::sysinit:/wrapper/sbin/flash_update
#
/dev/ttyS0::sysinit:/etc/init.d/rc.S

# Start an "askfirst" shell on ttyS0
/dev/ttyS0::askfirst:-/bin/sh

# Stuff to do before rebooting
/dev/ttyS0::shutdown:/bin/sh -c /var/post_install
 
Zuletzt bearbeitet:
Hi speedy.

Du hast das schon richtig interpretiert...

Um vom USB-Stick zu starten rufen wir das rc.usbroot Skript vor der rc.S auf. Da die 3370 das squashfs erst mountet ist das usbroot Skript nicht da wo es erwartet wird. Momentan funktioniert also usbroot nicht mit der 3370.

Gruß
Oliver
 
Hallo,

ist das eigentlich nur bei der 3370 so? Da ist dann also die einzige Möglichkeit was im Flash Dateisystem zu ändern. Ich trau mich im Moment noch nicht so recht da mal einzugreifen. Das Risiko eines Recovery Falls ist dann doch sehr hoch. Was passiert eigentlich bei einem Update (ich meine nur in Bezug auf das Dateissytem im Flash). Wird dieses Dateisystem neu angelegt (das Datum aller Dateien in diesem Dateisystem entpricht dem Datum des letzten Update)? Wo kommt die busybox und die µClibc her? Es scheint nicht die Busybox aus dem Squashfs zu sein. Ich nehme mal an der Grund für dieses Bootprinzip liegt irgendwie im Dual Boot System und/oder der Tatsache, das NAND Flash verwendet wird. Mir stellt sich jetzt die Frage, wenn ich das Risiko eines Recovery eingehe und im Dateisystem im Flash was ändern will, kann ich dann /wraper rw remounten (oder /dev/mtdblock3) und Dateien einfügen und ändern? Leider kenne ich mich mit Flash Speicher und dem Linux mtdblock Treiber nicht ausreichend aus, um beurteilen zu können, ob für eine solche Vorgehensweise, die Kombination mtd Block Device Treiber und yaffs Treiber ausreichen, um fehlerhafte Blöcke im NAND sicher zu behandeln.

Gruß Stefan
 
Zuletzt bearbeitet:
ich hab mal schnell was zusammengestellt, mit dem ich mit meiner 3370 usbroot nutzen kann. Dazu habe ich eine fwmod_custom erstellt, die das Core Image der 3370 anpasst. In das Image kommen einige Kernel Module und eine rc.usbroot. Die rc.usbroot bindet das USB Medium ein und ruft bei Erfolg dei Datei /sbin/preinit auf dem USB- Medium auf. Funktioniert bei mir solange sich das System im Wurzelverzeichnis des USB Mediums befindet. Is nur ei schneller Hach, aber vielleicht hat jemand Verwendung dafür.

###############################################################################
1.) fwmod_custom
###############################################################################

#!/bin/bash

# Custom firmware modifications

# Directories:
# ./firmware - untared firmware
# ./filesystem - unpacked filesystem squashfs
# ./kernel - unpacked kernel & hidden kernel squashfs

SBAS=./filesystem/lib/modules/2.6.32.41/kernel/drivers
DBAS=./filesystem_core/lib/modules/2.6.32.41/kernel/drivers

inst_mod() {
install -m 644 -D $SBAS/$1 \
./filesystem_core/lib/modules/$(basename $DBAS/$1 .ko).ko
}

all() {
dummy=0
# install usbcore.ko
inst_mod usb/core/usbcore.ko
# install usbstorage.ko
inst_mod usb/storage/usb-storage.ko
# install ifxusb_host.ko
inst_mod usb/musb/ifxusb_host.ko
# install scsi modules
inst_mod scsi/scsi_mod.ko
inst_mod scsi/sd_mod.ko
# init script
install -m 755 -D ../../eigene/rc.usbroot \
./filesystem_core/etc/init.d/rc.usbroot
# device nodes
mknod ./filesystem_core/dev/sda b 8 0
mknod ./filesystem_core/dev/sda1 b 8 1
mknod ./filesystem_core/dev/sda2 b 8 2
mknod ./filesystem_core/dev/sda3 b 8 3
mknod ./filesystem_core/dev/sda4 b 8 4
mknod ./filesystem_core/dev/sda5 b 8 5
mknod ./filesystem_core/dev/sda6 b 8 6
mknod ./filesystem_core/dev/sda7 b 8 7
mknod ./filesystem_core/dev/sda8 b 8 8
# needed directories
mkdir ./filesystem_core/mnt
}

clean() {
dummy=0
}

case "$1" in
""|all)
all
;;
clean)
clean
;;
*)
echo "Usage: $0 {all|clean}" 1>&2
exit 1
;;
esac

exit 0

###############################################################################
2.) rc.usbroot für core
###############################################################################

#!/bin/sh

# all other vars can always be initialized
USBROOT_ENV_VAR=kernel_args1
USBROOT_ENV_STRING=USBROOT # capital letters required!
MNTPOINT=/mnt

# binary path
export PATH=/bin/:/sbin

# filesystem to be used
get_fstype() {
# check if kernel modules are available
# or if filesystem support is already built-in and available
for i in ext2 ext3; do
if [ -f "/lib/modules/$(uname -r)/kernel/fs/$i/$i.ko" ]; then
eval $i=y
elif [ -n "$(grep $i /proc/filesystems)" ]; then
eval $i=y
else
eval $i=n
fi
done

# check fs type on media if fstyp is available
if [ -x /usr/bin/fstyp ]; then
mediafs=$(/usr/bin/fstyp $DEVICE)
fi

# result matrix (only handle some special cases, thread all other cases as ext2)
case "$ext2:$ext3:$mediafs" in
n:y:*)
FSTYPE="ext3" ;; # only ext3 available
y:y:*)
FSTYPE=${mediafs:-ext2} ;; # use fs type from media or ext2 as default
*)
FSTYPE="ext2" ;; # defaults to ext2
esac

# user can force a fs type if kernel module is available
if [ -n "$1" -a "$(eval echo \$$1)" == "y" ]; then
FSTYPE=$1
fi
}

# get environment variables
get_env_var() {
# Remove leading and trailing spaces from usbroot. Trailing invisible
# garbage can be part of the value if the user defines the variable via
# Putty directly at the Eva console prompt via copy & paste.
usbroot=$(sed -rn "s/^$USBROOT_ENV_VAR[[:space:]]+([^[:space:]]+).*/\1/p" /proc/sys/urlader/environment)
usbroot=${usbroot#$USBROOT_ENV_STRING=}
DEVICE=${usbroot%%:*}
USBPATH=${usbroot##*:}
fstype=${usbroot#*:}; fstype=${fstype%:*}
if [ "$fstype" == "$USBPATH" ]; then
fstype=""
fi
MNTOPTIONS=$(sed -rn "s/^$USBROOT_ENV_VAR[[:space:]]+[^[:space:]]+[[:space:]]+([^[:space:]]+).*/\1/p" /proc/sys/urlader/environment)
[ -n "$DEVICE" ] && get_fstype "$fstype"

# Check variables for plausibility
if [ "$1" == "check" ]; then
# Device and USB path must be defined
[ "$DEVICE" -a "$USBPATH" ] || return 1
# Missing colon in $usbroot -> wrong variable expansion
[ "$DEVICE" == "$USBPATH" ] && return 1
# Device must be "/dev/..."
[ "${DEVICE##/dev/*}" ] && return 1
# Defined partition must be visible
#cat /proc/partitions | grep -q "${DEVICE#/dev/}$" || return 1
fi

# Get HWRevision and HWRevision_BitFileCount from environment
item_count=0
for i in $(grep HWRevision /proc/sys/urlader/environment | tr '.' ' '); do
case $item_count in
1)
HWRevision=$i
;;
3)
HWRevision_BitFileCount=$i
if [ $HWRevision_BitFileCount -eq 0 ]; then
HWRevision_BitFileCount=""
fi
;;
esac
let item_count++
done
}

# mount usb device
mount_usbroot() {
if [ ! -d "$MNTPOINT" ]; then
echo "*** Mountpoint $MNTPOINT for USB device does not exist. Exiting. ***"
return 1
fi

# load required modules
insmod /lib/modules/usbcore.ko
insmod /lib/modules/ifxusb_host.ko
insmod /lib/modules/scsi_mod.ko
insmod /lib/modules/usb-storage.ko
insmod /lib/modules/sd_mod.ko

echo -n "Waiting for usb to come up "
sleep 15

LOOP=0
while ! dd if=$DEVICE of=/dev/null bs=1 count=1 2>/dev/null; do
echo -n "."
let LOOP=LOOP+1
if [ $LOOP -gt 10 ]; then
echo
echo 'storage: SCSI device not responding!'
# discard hotplug cache
hotplugging discard
# return with failure code
return 1
fi
sleep 2
done

echo "found"

# now mount the partition
mount $DEVICE $MNTPOINT \
${FSTYPE:+-t} $FSTYPE ${MNTOPTIONS:+-o} $MNTOPTIONS || return 1
# return with success
return 0
}

mount_proc() {
# Mount proc
mount -t proc proc /proc || return 1
return 0
}

cleanup_on_failure() {
# unmount proc and filesystems given via parameter
umount proc "$@"
return 0
}

start() {
if ! mount_proc; then
echo "*** Could not mount proc, exiting. ***"
return 1
fi

if ! get_env_var check; then
echo "*** Missing or invalid 'usbroot' configuration in bootloader environment, exiting. ***"
umount proc
return 1
fi

if grep -q "^$DEVICE / " /proc/mounts; then
echo "*** USB root already mounted, done. ***"
return 0
fi

echo "*** Mounting USB root ... ***"
if ! mount_usbroot; then
cleanup_on_failure
return 1
fi

# call init script on device
if [ -f "$MNTPOINT$USBPATH/sbin/preinit" ]; then
. "$MNTPOINT$USBPATH/sbin/preinit"
fi

# proc is not needed anymore
umount proc
}

start

# jump to init
exec /sbin/init

###############################################################################
3.) preinit auf der root
###############################################################################

#!/bin/sh

OLDROOT=/wrapper

if pivot_root "$MNTPOINT$USBPATH"/ "$MNTPOINT$USBPATH/$OLDROOT"/; then
cd /
fi
 
Hallo Zusammen,

ich habe ein paar Probleme bei dem o.g. Workarround, es will nicht wirklich funtionieren.

Mein Vorgehen:

1. freetz-devel_r9293 ausgecheckt.
2. fwmod_custom im freetz-devel_r9293 root verzeichniss ersetzt durch die o.g. Variante.
3. packages/target-mips_uClibc-0.9.32.1/usbroot-0.2/root/etc/init.d/rc.usbroot wie o.g. abgeändert.
4. make/usbroot/files/root/etc/init.d/rc.usbroot wie o.g. abgeändert.
5. make menuconfig ausgeführt
5.1. dropbear und usbroot ausgewählt.
6. make ausgeführt.
7. Image für den USB Stick erstellt ohne USBRoot und dann Inhalt von /build/modified/filesystem mit Rootrechten gepackt und auf den USB Stick gezogen und entpackt.
8. Core Image mit USBRoot in die Fritzbox mittels Freetz Webinterface eingespielt.
9. Reboot
10. USBRoot aktiviert, wobei mir schon auffiel, dass das die CGI Configseite von USBroot nicht im Menü auftaucht. Per cgi-bin/conf/usbroot auf die Website zugegriffen und aktiviert.

Folgende Fehlermeldung erhalten:

mount: mounting proc on /proc failed: Device or resource busy
init: must be run as PID 1
mount: mounting proc on /proc failed: Device or resource busy
init: must be run as PID 1
about.cgi avm backup conf exec.cgi exec.d extra file freetz.cgi index.cgi page.cgi passwd.cgi passwd_edit.sh passwd_save.sh service shell skin.cgi status status.cgi status.d support system.cgi update Could not mount proc, exiting. about.cgi avm backup conf exec.cgi exec.d extra file freetz.cgi index.cgi page.cgi passwd.cgi passwd_edit.sh passwd_save.sh service shell skin.cgi status status.cgi status.d support system.cgi update

Saving settings ... done.
Saving usbroot.cfg ... done.

mount: mounting proc on /proc failed: Device or resource busy
init: must be run as PID 1
mount: mounting proc on /proc failed: Device or resource busy
init: must be run as PID 1
about.cgi avm backup conf exec.cgi exec.d extra file freetz.cgi index.cgi page.cgi passwd.cgi passwd_edit.sh passwd_save.sh service shell skin.cgi status status.cgi status.d support system.cgi update Could not mount proc, exiting. about.cgi avm backup conf exec.cgi exec.d extra file freetz.cgi index.cgi page.cgi passwd.cgi passwd_edit.sh passwd_save.sh service shell skin.cgi status status.cgi status.d support system.cgi update

Writing 2330 bytes to /var/flash/freetz ... done.
mount: mounting proc on /proc failed: Device or resource busy
init: must be run as PID 1
mount: mounting proc on /proc failed: Device or resource busy
init: must be run as PID 1
Saving settings ...
*** Could not mount proc, exiting. ***
done.
Activating USB root ...
*** Could not mount proc, exiting. ***
done.

Dann per Telnet auf die Fritzbox gegangen und geschaut, was mount anzeigt:

rootfs on / type rootfs (rw)
/dev/root on /wrapper type yaffs (ro,relatime)
/dev/loop0 on / type squashfs (ro,relatime)
proc on /proc type proc (rw,relatime)
tmpfs on /var type tmpfs (rw,relatime)
dev on /dev type tmpfs (rw,nosuid,relatime)
sysfs on /sys type sysfs (rw,relatime)
devpts on /dev/pts type devpts (rw,relatime,mode=600)
/dev/mtdblock4 on /var/flash type yaffs2 (rw,sync,relatime)
/var/dev/nand on /var/media/ftp type yaffs2 (rw,sync,relatime)
usbfs on /proc/bus/usb type usbfs (rw,relatime)
/dev/sda1 on /var/media/ftp/uStor01 type ext2 (rw,noatime,nodiratime,errors=continue,user_xattr,acl)

Ich hoffe mit kann einer helfen?

Danke und Gruß,
Nico
 
Hallo Nico,

ich würde das was ich da oben gemacht habe micht als Workaround bezeichnen. Am CGI habe ich nichts verändert. Davon verstehe ich leider auch nichts. Hier mal kurz eine Erklärung was ich gemacht habe damit es bei mir funktioniert hat.
1.) Verzeichnis "eigene" im Buildverzeichnis angelegt -> dort hinein die oben angegebene rc.usbroot (ich habe nichts an der rc.usbroot unter package geändert !!!)
2.) fwmod_custom angelegt
3.) USB- Stick mit Dateisystem (in der Wurzel, keinesfalls in einem Unterverzeichnis) angelegt und dort die Datei preinit hin kopiert.
Dann das Image gebaut.
Sinn des Ganzen ist eigentlich alle Kernelmodule, die für das mounten des Sticks gebraucht werden, aus dem root image in das core image zu kopieren und im core image
eine rc-usbroot zu haben, die als init fungiert, alle kernelmodule läd und dann das medium mouted. Bei erfolg wird auf dem Medium die date preini ausgeführt.
- unter "/build/modified/filesystem_core/etc/init.d" sollte nach dem bau der Firmware die rc.usbroot existieren
- unter "/build/modified/filesystem_core/lib/modules" sollte nach dem bau der Firmware die notwendigen Kernelmodule existieren

Stefan
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.