Temat: /root na zewnetrznym flashu w asusie 500
ver 1.1
Miejsca w ruterku zawsze za malo. Podlaczmy wiec pamiec flash poprzez USB i przeniesmy na nia root-a.
We flashu wewnetrznym trzymajmy tylko to to co niezbedne:
- system (white russion 0.9)
- moduly potrzebne odpaleniu usb
- aplikacje konieczne do formatowania dysku
- jakis kompresor do robienia backupu i odtwarzania dysku
- ftp demon aby plik backupu mozna bylo kopiowac po sieci
- no i ntp coby logowac kiedy byly wykonywane backupy
Jesli mamy swiezo zainstalowany system to nie musimy robic firstboot, w przeciwnym wypadku najlepij wyczyscic caly /jffs tym sposobem.
> firstboot
Polecenie to zainicjuje na partycje /jffs flasha wewnetrznego usuwajac wszystko to , co do tej pory dodatkowo zainstalowalismy i skonfigurowalismy.
Znajdziemy sie w sytuacji identycznej jak tuz po instalacji systemu. Tak wiec po reboocie logujemy sie telnetem, zmieniamy haslo:
passwd
i ponownie logujemy sie juz za pomoca ssh.
Do podzialu flasha bedziemy potrzebowac fdisk oraz formatery.
cp /rom/etc/ipkg.conf /etc/ipkg.conf
echo "src rc5-backports http://downloads.openwrt.org/backports/rc5" >> /etc/ipkg.conf
ipkg updatei dalej
#instalujemy obsluge usb:
ipkg install kmod-usb-core #usbcore
ipkg install kmod-usb-uhci #uhci
ipkg install kmod-usb2 #ehci-hcd
ipkg install kmod-usb-storage #usb-storage
#instalujemy system plikow uzywany przez windows w memorystickach:
ipkg install kmod-vfat #vfat
#instalujemy system plikow linuxa:
ipkg install kmod-ext2 #ext2
ipkg install kmod-ext3 #ext3
#instalujemy programy do obslugi flasha:
ipkg install fdisk
ipkg install e2fsprogs
#instalujemy ftp i zegarek
ipkg install vsftpd
ipkg install ntpclient
rebootaby ftp uruchamial sie po starcie systemu
ln -s /etc/init.d/vsftpd /etc/init.d/S90vsftpd
ln -s /proc/mounts /etc/mtabJesli flash byl sformatowany pod windows odmontowujemy go:
umount /mnt/disc0_1i dalej wszystkie kolejne partycje jesli sa.
Flasha dzielimy na partycje jakie sa nam potrzebne:
fdisk /dev/scsi/host0/bus0/target0/lun0/disca nastepnie partycje formatujemy:
mke2fs -j /dev/scsi/host0/bus0/target0/lun0/part1
# i od razu druga
mke2fs -j /dev/scsi/host0/bus0/target0/lun0/part2Kopiowanie na zewnetrzny flash:
mount -t ext3 /dev/scsi/host0/bus0/target0/lun0/part1 /mnt
mkdir /tmp/root
mount -o bind /rom /tmp/root
cp /tmp/root/* /mnt -a
umount /tmp/root
umount /mntPodmiana pliku init:
rm /sbin/initi sam ten plik w internalu
#!/bin/sh
# /sbin/init in internal flash
boot_dev="/dev/scsi/host0/bus0/target0/lun0/part1"
sec_dev="/dev/scsi/host0/bus0/target0/lun0/part2"
# load all needed modules
#for module in usbcore uhci scsi_mod sd_mod usb-storage ehci-hcd jbd ext3 # - use this line for better transfer over USB
for module in usbcore uhci scsi_mod sd_mod usb-storage jbd ext3 # - or use this line if you see problems with previous line
do
insmod $module
done
# if disk is slow let him init
sleep 4s
mount "$boot_dev" /mnt
# if all ok (usb exists and last run external has seen lan), do the pivot root
if [ -x /mnt/sbin/init -a ! -e /mnt/sbin/donotrunexternal ]
then
mount -o move /proc /mnt/proc && \
pivot_root /mnt /mnt/mnt && {
mount -o move /mnt/dev /dev
mount -o move /mnt/tmp /tmp
mount -o move /mnt/jffs2 /jffs2 2>&-
mount -o move /mnt/sys /sys 2>&-
}
mount $sec_dev /mnt/disc0_2
else # if something wrong, clean changes
umount /mnt
fi
# run the real init on the end (from USB hopefully)
exec /bin/busybox initPlik ten trzeba zrobic wykonywalnym
chmod 755 /sbin/inithttp://wiki.openwrt.org/UsbStorageHowto … 9fc64dc92b
Po rebbocie system odpala sie z externala. Wyglada to tak:
df
Filesystem 1k-blocks Used Available Use% Mounted on
/dev/root 1024 1024 0 100% /mnt/rom
none 15256 32 15224 0% /tmp
/dev/mtdblock/4 2240 1112 1128 50% /mnt/jffs
/jffs 1024 1024 0 100% /mnt
/dev/scsi/host0/bus0/target0/lun0/part1 232641 12198 208431 6% /mnt/mnt/disc0_1
/dev/scsi/host0/bus0/target0/lun0/part1 232641 12198 208431 6% /
/mnt/dev/scsi/host0/bus0/target0/lun0/part2 723588 31736 655096 5% /mnt/disc0_2Mozna powiedziec , ze wszystko jest w przadku jesli /jffs jest zamontowana na /mnt a nie na / .
Warto powtorzyc instalacje wszyskich do tej pory zainstalowanych pakietow i dodatkowo nowe:
ipkg install kmod-usb-core
ipkg install kmod-usb-uhci
#ipkg install kmod-usb2 - nie instalowac bo powoduje niestabilnosc systemu! dlaczego?
ipkg install kmod-usb-storage
ipkg install kmod-vfat
#ipkg install kmod-ext2 - nie powinien byc potrzebny
ipkg install kmod-ext3
ipkg install fdisk
ipkg install e2fsprogs
ipkg install vsftpd
ipkg install ntpclient
no i nowe:
ipkg install http://ftp.berlios.de/pub/xwrt/webif_latest_stable.ipk
ipkg install http://ftp.berlios.de/pub/xwrt/webif_latest_stable.ipk #www
ipkg install ez-ipupdate.list #dyndns client
ipkg install samba #samba
ln -s /etc/init.d/samba /etc/init.d/S90sambaPonizszy skrypt po wystartowaniu systemu z externala sprawdza czy dzalaja porty LAN - czyli czy z ssh bedzie sie mozna dostac do rutera. Jesli nie , to jest ustawiana flaga, ktora spowoduje przy nastepnym reboocie ,ze system wystartuje z internala. Aby startowal z externala trzeba ja skasowac:
rm /mnt/disc0_1/sbin/donotrunexternalalbo stworzyc sobie takie 2 helperki:
#!/bin/sh
# /sbin/bootexternal.sh (place it in internal flash)
rm /mnt/disc0_1/sbin/donotrunexternal
reboot#!/bin/sh
# /sbin/bootinternal.sh (place it in external flash)
touch /sbin/donotrunexternal
rebootW skrypcie nalezy wstawic adresy ip sprzetu w swoim lanie, ktory chodzi nonstop aby bylo co pingowac. (Zakladam ze podobnie jak ja, wiekszosc wstawi sobie flasha do wnetrza rutera i w przypadku uwalu interfejsow LAN bedzie musiala albo zdac sie na ten skrypt, albo rozkrecac obudowe i wyciagac memory sticka.) Jesli memory stick bedzie wetkniety do usb na zewnatrz obudowy, to mozna to pominac. Wyjecie memorystika z usb i zbootowanie routera spowoduje podniesienie sie go na systemie z internal flasha , ktory napeno nie bedzie uszkodzony.
Skrypt uruchamia sie wraz z systemem. Nastepuje pingowanie zdefiniowanych adresow ip. Jesli choc jeden odpowie to znaczy ze porty LAN dzialaja i wrazie czego mozna sie do rutera dostac za pomoca ssh. Jesli nie ma odpwiedzi, tworzony jest semafor , ktory spowoduje , ze przy nastepnym reboocie system odpali sie z internala. Skrypt zawiesza dzialanie na 1000 sekund, po czym znow pinguje adresy. Jesli jest ok to kasuje semafor i konczy dzialanie. Pozwala to zabezpieczyc sie przez wlaczeniem rutera bez podlaczonego kabla ethernet i dolaczenia go potem. JEsli jednak wlaczymy ruter bez kabla i nie podlaczymy go do sieci przed wylaczeniem rutera, to przy nastepnym wlaczeniu rutera odpali sie z wewnetrznego flasha. Aby powrocic do externala nalezy w takim przypadku wykonac pod ssh:
bootexternal.sh/etc/init.d/S49islanifok w externalu
#!/bin/sh
# Run it in external flash. If router will not be able ping one from list , it can be possible LAN if does not work - set flag for boot from internal
CHECKLATER="CHECKLATER"
PROBLEMFLAG="/sbin/donotrunexternal"
OKTOFIND="0% packet"
ADDRTOTEST1="192.168.0.23"
ADDRTOTEST2="192.168.0.33"
ADDRTOTEST3="192.168.0.22"
ADDRTOTEST4="checkip.dyndns.org"
ADDRTOTEST5="www.google.com"
AllIsOk()
{
[ -e $PROBLEMFLAG ] && rm -f $PROBLEMFLAG
exit 0
}
NoPing()
{
[ ! -e $PROBLEMFLAG ] && echo "no ping to LAN" > $PROBLEMFLAG
/etc/init.d/S49islanifok CHECKLATER &
exit 0
}
[ "$1" = "$CHECKLATER" ] && sleep 1000
ISOK=`ping -c 1 $ADDRTOTEST1 | grep "$OKTOFIND"`
[ "$ISOK" != "" ] && AllIsOk
ISOK=`ping -c 1 $ADDRTOTEST2 | grep "$OKTOFIND"`
[ "$ISOK" != "" ] && AllIsOk
ISOK=`ping -c 1 $ADDRTOTEST3 | grep "$OKTOFIND"`
[ "$ISOK" != "" ] && AllIsOk
ISOK=`ping -c 1 $ADDRTOTEST4 | grep "$OKTOFIND"`
[ "$ISOK" != "" ] && AllIsOk
ISOK=`ping -c 1 $ADDRTOTEST5 | grep "$OKTOFIND"`
[ "$ISOK" != "" ] && AllIsOk
NoPing
exit 0chmod 755 /etc/init.d/S49islanifokPonizszy skrypt ma za zadanie zautomatyzowac robienie i odtwarzanie backupu externala. Zalozenie ze external jest na /mnt/disc0_1 a miejsce na przechowywanie backupow na /mnt/disc0_2 .
/sbin/backup.sh do internala
#!/bin/sh
# /sbin/backup.sh - script for backup/restore internal and external flash
# prepared for call it only from internal flash
# be sure /dev/scsi/host0/bus0/target0/lun0/part1 is your external flash
STARTTIME=`date "+%d.%m.%Y %H:%M"`
echo "backup.sh $1 $2 $3 starts at $STARTTIME"
case $1 in
backup)
[ ! -e /mnt/disc0_2/asus_backup ] && mkdir /mnt/disc0_2/asus_backup
case $2 in
#internal)
# [ ! -e /mnt/disc0_2/asus_backup/internal ] && mkdir /mnt/disc0_2/asus_backup/internal
# [ -e /mnt/disc0_2/asus_backup/internal/wrt-backup-internal.trx ] && mv -f /mnt/disc0_2/asus_backup/internal/wrt-backup-internal.trx /mnt/disc0_2/asus_backup/internal/wrt-backup-internal.trx.old
# [ -e /mnt/disc0_2/asus_backup/internal/wrt-backup-nvram.bin ] && mv -f /mnt/disc0_2/asus_backup/internal/wrt-backup-nvram.bin /mnt/disc0_2/asus_backup/internal/wrt-backup-nvram.bin.old
# [ -e /mnt/disc0_2/asus_backup/internal/nvram-list ] && mv -f /mnt/disc0_2/asus_backup/internal/nvram-list /mnt/disc0_2/asus_backup/internal/nvram-list.old
#
# dd if=/dev/mtdblock/1 > /mnt/disc0_2/asus_backup/internal/wrt-backup-internal.trx
# dd if=/dev/mtdblock/3 > /mnt/disc0_2/asus_backup/internal/wrt-backup-nvram.bin
# nvram show > /mnt/disc0_2/asus_backup/internal/nvram-list
#;;
external)
[ ! -e /mnt/disc0_2/asus_backup/external ] && mkdir /mnt/disc0_2/asus_backup/external
if [ "$3" = "" ]
then
EXTERNALNAME="external"
else
EXTERNALNAME="$3"
fi
[ -e /mnt/disc0_2/asus_backup/external/$EXTERNALNAME.tar.gz ] && mv -f /mnt/disc0_2/asus_backup/external/$EXTERNALNAME.tar.gz /mnt/disc0_2/asus_backup/external/$EXTERNALNAME.tar.gz.old
[ ! -e /tmp/root ] && mkdir /tmp/root
mount -o bind /mnt/disc0_1 /tmp/root
cd /tmp/root
tar -c -f - . | gzip - > /mnt/disc0_2/asus_backup/external/$EXTERNALNAME.tar.gz
cd /
umount /tmp/root
;;
esac
;;
restore)
case $2 in
#internal)
# [ -e /mnt/disc0_2/asus_backup/internal/wrt-backup-internal.trx ] && mtd -r write /mnt/disc0_2/asus_backup/internal/wrt-backup-internal.trx linux
#;;
external)
# Be shure if disc0_1 is your disc with external firmware ! Call this only if router is booted from internal flash !
if [ -e /mnt/disc0_2/asus_backup/external/external.tar.gz ] # only if is something to use
then
[ "$3" != "" ] && /sbin/backup.sh backup external emergency # create backup of external
umount /mnt
umount /mnt/disc0_1 # prepare external
mke2fs -j /dev/scsi/host0/bus0/target0/lun0/part1 # clean all on external
mount /dev/scsi/host0/bus0/target0/lun0/part1 /mnt/disc0_1 # mount external
cd /mnt/disc0_1
gzip -cd /mnt/disc0_2/asus_backup/external/external.tar.gz | tar -x -f - -C /mnt/disc0_1 # fill external using stored data
cd /
fi
;;
extinitial)
# Be shure if disc0_1 is your disc with external firmware ! Call this only if router is booted from internal flash !
[ "$3" != "" ] && /sbin/backup.sh backup external emergency # create backup of external
umount /mnt/disc0_1 # prepare external
mke2fs -j /dev/scsi/host0/bus0/target0/lun0/part1 # clean all on external
mount -t ext3 /dev/scsi/host0/bus0/target0/lun0/part1 /mnt # mount external
[ ! -e /tmp/root ] && mkdir /tmp/root
mount -o bind /rom /tmp/root
cp /tmp/root/* /mnt -a
umount /tmp/root
umount /mnt
mount /dev/scsi/host0/bus0/target0/lun0/part1 /mnt/disc0_1
;;
esac
;;
*)
#echo "baskup.sh [backup|restore] [internal|external||extinitial] [||emergency]- script for create firmware file for program internal or external (/mnt/disc0_1) flash and store on /mnt/disc0_2 for use only if firmware from internal flash is run"
echo "baskup.sh [backup|restore] [external||extinitial] [|emergency]- script for create firmware file for program external (/mnt/disc0_1) flash and store on /mnt/disc0_2 for use only if firmware from internal flash is run"
;;
esac
ENDTIME=`date "+%d.%m.%Y %H:%M"`
echo "The script was called $STARTTIME with params: 1:$1, 2:$2, 3:$3 and ended $ENDTIME" >> /mnt/disc0_2/asus_backup/backup.log
echo "backup.sh $1 $2 $3 ends at $STARTTIME"
exit 0chmod 755 /sbin/backup.shMala podpowiedz dla uzytkownikow windows. Przytoczone skrypty kopiujemy CTRL+C i wklejamy do UltraEdita CTRL+V, menu->Edit->Hex Edit, CTRL + Home, CTRL + r, Find what: 0d, Replace with: 20, Replace All, CTRL + s i zapisujemy skrypt wpelni kompatybilny z linuxem.