linux 网络在线升级,linux在线升级
//=======================================
前提信息:
1.系統分區信息
SPI-Flash:
[0] 0x000000000000-0x000000020000 : "SPL,128KB"
[1] 0x000000020000-0x0000000e0000 : "U-Boot,768KB"
[2] 0x0000000e0000-0x000000100000 : "U-Boot Env,128KB"
[3] 0x000000100000-0x000000200000 : "Reseved,1024KB"
Nand-Flash:
[4] 0x000000000000-0x000000500000 : "Kernel,5MB"
[5] 0x000000500000-0x000004500000 : "Rootfs,64MB"
[6] 0x000004500000-0x000010000000 : "Data,187MB"
#cat /proc/partitions
major minor? #blocks? name
31??????? 0??????? 128 mtdblock0
31??????? 1??????? 768 mtdblock1
31??????? 2??????? 128 mtdblock2
31??????? 3?????? 1024 mtdblock3
31??????? 4?????? 5120 mtdblock4
31??????? 5????? 65536 mtdblock5
31??????? 6???? 191488 mtdblock6
# cat /proc/mtd
dev:??? size?? erasesize? name
mtd0: 00020000 00001000 "SPL,128KB"
mtd1: 000c0000 00001000 "U-Boot,768KB"
mtd2: 00020000 00001000 "U-Boot Env,128KB"
mtd3: 00100000 00001000 "Reseved,1024KB"
mtd4: 00500000 00020000 "Kernel,5MB"
mtd5: 04000000 00020000 "Rootfs,64MB"
mtd6: 0bb00000 00020000 "Data,187MB"
2.用到以下工具,均在根文件系統里有,需要拷出來
注意:以下文件一定是解壓到在SDRAM中或Data分區[需要掛載在/dev/mtdblock6]中執行,否則影響rootfs的升級。
$ ls
flash_erase? flash_eraseall? nanddump? nandwrite
//=======================================
1.制作升級包update.tar.gz,解壓里面應該有
|-- update.sh
|-- uImage
|--?ubi.img
`--?util/
|-- flash_erase
`-- nandwrite
2.升級Kernel
/tmp/updatefile/util/flash_erase /dev/mtd4 0 0
/tmp/updatefile/util/nandwrite -p /dev/mtd4 /tmp/updatefile/$NAME_KERNEL
說明:-p參數,表示如果要寫入的數據不是頁大小的整數倍,會自己加填充數據即,如需要,自動padding
3.升級rootfs
升級rootfs的話,盡量把其他非內核必須的進程都關閉掉,防止在升級過程中,還有進程或和程序去讀取nand flash上的rootfs
方法一:以下兩條命令,不能使用reboot命令[直接斷電或看門狗]
/tmp/updatefile/util/flash_erase /dev/mtd5 0 0
/tmp/updatefile/util/nandwrite -p /dev/mtd5/tmp/updatefile/$NAME_ROOTFS
方法二:失敗!!
/tmp/updatefile/util/ubidetach -p /dev/mtd5
/tmp/updatefile/util/flash_erase /dev/mtd5 0 0
/tmp/updatefile/util/ubiformat?/dev/mtd5?-f?/tmp/updatefile/$NAME_ROOTFS
另外,發現有個更加好用的命令:
mtd_debug
# mtd_debug
usage: mtd_debug info mtd_debug read mtd_debug write mtd_debug erase
=================MLO的升級=======================
root@am335x-evm:/tmp#mtd_debug info /dev/mtd0
mtd.type = MTD_NORFLASH
mtd.flags = MTD_CAP_NORFLASH
mtd.size =131072(128K)
mtd.erasesize = 4096 (4K)
mtd.writesize = 1
mtd.oobsize = 0
regions = 0
root@am335x-evm:/tmp#mtd_debug erase /dev/mtd0 0131072【擦除整個分區】
Erased 131072 bytes from address 0x00000000 in flash
root@am335x-evm:/tmp# du -sh /tmp/MLO.byteswap
100.0K? /tmp/MLO.byteswap
root@am335x-evm:/tmp##ls -l MLO.byteswap | awk '{print $5}'
101169
root@am335x-evm:/tmp#mtd_debug write /dev/mtd0 0101169/tmp/MLO.byteswap【寫入新內容,寫入大小等于實際文件大小,否則出錯!】Copied 101169 bytes from /tmp/MLO.byteswap to address 0x00000000 in flash
=================U-boot的升級=======================
root@am335x-evm:/tmp#mtd_debug info /dev/mtd1
mtd.type = MTD_NORFLASH
mtd.flags = MTD_CAP_NORFLASH
mtd.size =786432(768K)
mtd.erasesize = 4096 (4K)
mtd.writesize = 1
mtd.oobsize = 0
regions = 0
root@am335x-evm:/tmp#mtd_debug erase /dev/mtd1 0786432?【擦除整個分區】
Erased 786432 bytes from address 0x00000000 in flash
root@am335x-evm:/tmp# ls -l /tmp/u-boot.img
-rw-r--r--??? 1 root???? root???????482400Jun 26 12:01 /tmp/u-boot.img
root@am335x-evm:/tmp#mtd_debug write /dev/mtd1 0482400/tmp/u-boot.img? ?【寫入新內容,寫入大小等于實際文件大小,否則出錯!】
Copied 482400 bytes from /tmp/u-boot.img to address 0x00000000 in flash
root@am335x-evm:/tmp#
參考資料:
//-------------------------------------------------------------------------------------------------
對于yaffs2系統(僅參考):
./util/nandwrite -o /dev/mtd2 rootfs.4k.arm.yaffs2
因為此處的rootfs鏡像文件是yaffs2文件系統,包含了oob數據。所以此處加上參數-o,意思是寫入頁數據同時也寫入oob數據,而且,加
了-o 參數同時就不能再像之前的uboot和uImage一樣,加-p參數了,因為包含了oob數據的rootfs,本身就是頁大小的整數倍,不需要
padding。
不論實際使用的是4K+128 還是對于4K+218(內部處理為4K+192)的nand,此處都是使用4K+128的rootfs鏡像。
//-------------------------------------------------------------------------------------------------
在燒寫某個文件之后,如果希望查看當前寫入的數據,是否是我們所期望的,那么可以用nanddump工具,將對應部分的數據“打印”出來,比
如:
查看uboot的第一page的數據:
./nanddump -l 0x1000 -s 0x80000 -p /dev/mtd0
//-------------------------------------------------------------------------------------------------
把東西放到ramdisk中以避免影響
之前遇到很多人問這個問題了。那就是,如果在升級的時候,由于也會升級rootfs,但是本身升級過程中,所利用到的文件,如果是放在rootfs中,豈
不是會導致系統崩潰了?
答案是,不會。因為我之前介紹的方法中,是把升級所需的mtd工具,放到U盤的。而U盤是單獨mount系統中的。
不過,更加好的做法是,把此處升級所相關的,所有的文件,包括mtd工具,要升級的各個文件,甚至其他可能用到的reboot等工具,設置是這些工具
可能依賴的到庫文件等等,都全部拷貝到ramdisk中。這樣,通過運行ramdisk中的所有工具,訪問ramdisk中的要升級的文件,去升級系統,就不會對
升級rootfs而有啥負面影響,也不會由于升級rootfs而可能導致任何的系統崩潰了
$cat update.sh
#!/bin/bash
# =============================================================
# Author???? : QiuWeibo
# Date????????? : 2014.5.12
# Version???? : V1.0.0
# Comment???? : For update aPM.MCU
#????????? 1.Support Kernel update
#????????? 2.Support Rootfs update
#????????? 3.Support Monitor App update
#
# =============================================================
# Author???? : QiuWeibo
# Date????????? : 2014.6.9
# Version???? : V1.0.1
# Comment???? : Add MLO and uboot update
#????????? 1.Support MLO update
#????????? 2.Support uboot update
# =============================================================
echo "firmware update shell start..."
UPDATE_MLO="Y"
UPDATE_UBOOT="Y"
UPDATE_KERNEL="Y"
UPDATE_ROOTFS="Y"
CLEAR_UBOOT_ENV="Y"
MONITOR_APP="Y"
NAME_MLO="MLO.byteswap"
NAME_UBOOT="u-boot.img"
NAME_KERNEL="uImage"
NAME_ROOTFS="ubi.img"
NAME_MONITOR="Monitor"
echo "?? UPDATE_MLO=$UPDATE_MLO=$NAME_MLO"
echo " UPDATE_UBOOT=$UPDATE_UBOOT=$NAME_UBOOT"
echo "UPDATE_KERNEL=$UPDATE_KERNEL=$NAME_KERNEL"
echo "UPDATE_ROOTFS=$UPDATE_ROOTFS=$NAME_ROOTFS"
echo "CLEAR_UBOOT_ENV=$CLEAR_UBOOT_ENV"
echo "MONITOR_APP=$MONITOR_APP"
rm -rf /var/ftp/pub/*.tar.gz
echo "end rm -rf /var/ftp/pub/*.tar.gz "
cd /tmp/
# ============== handle for Monitor App Update start============
case "$MONITOR_APP" in
Y )
cp -f /tmp/updatefile/$NAME_MONITOR /mnt/userfs/Monitor
echo "update /mnt/userfs/Monitor success"
;;
* )
echo "Monitor App do not update"
;;
esac
rm -rf /tmp/updatefile/$NAME_MONITOR
echo "end rm -rf /tmp/updatefile/$NAME_MONITOR "
# ============== handle for Monitor App Update end============
# ============== handle for MLO update start============
case "$UPDATE_MLO" in
Y )
filesize=`ls -l /tmp/updatefile/$NAME_MLO | awk '{print $5}'`
if [[ $filesize -gt 1024 ]];then
mtd_debug erase /dev/mtd0 0 131072
mtd_debug write /dev/mtd0 0 $filesize /tmp/updatefile/$NAME_MLO
echo "mtd_debug write /dev/mtd0 0 $filesize /tmp/updatefile/$NAME_MLO"
else
echo "/tmp/updatefile/$NAME_MLO error! filesize= $filesize lt 1024!"
fi
;;
* )
echo "MLO do not update"
;;
esac
rm -rf /tmp/updatefile/$NAME_MLO
echo "end rm -rf /tmp/updatefile/$NAME_MLO "
# ============== handle for MLO update end============
# ============== handle for Uboot update start============
case "$UPDATE_UBOOT" in
Y )
filesize=`ls -l /tmp/updatefile/$NAME_UBOOT | awk '{print $5}'`
if [[ $filesize -gt 1024 ]];then
mtd_debug erase /dev/mtd1 0 786432
mtd_debug write /dev/mtd1 0 $filesize /tmp/updatefile/$NAME_UBOOT
echo "mtd_debug write /dev/mtd1 0 $filesize /tmp/updatefile/$NAME_UBOOT"
else
echo "/tmp/updatefile/$NAME_UBOOT filesize error! $filesize lt 1024"
fi
;;
* )
echo "u-boot do not update"
;;
esac
rm -rf /tmp/updatefile/$NAME_UBOOT
echo "end rm -rf /tmp/updatefile/$NAME_UBOOT "
# ============== handle for Uboot update end============
# ============== handle for clear u-boot env start============
case "$CLEAR_UBOOT_ENV" in
Y )
flash_erase /dev/mtd2 0 0
echo "end clear uboot env at eraseall /dev/mtd2"
;;
* )
echo "uboot env do not erase!"
;;
esac
# ============== handle for clear u-boot env end============
# ============== handle for kernel update start============
case "$UPDATE_KERNEL" in
Y )
flash_erase /dev/mtd4 0 0
nandwrite -p /dev/mtd4 /tmp/updatefile/$NAME_KERNEL
echo "end nandwrite /tmp/updatefile/$NAME_KERNEL /dev/mtd4"
;;
* )
echo "KERNEL do not update"
;;
esac
rm -rf /tmp/updatefile/$NAME_KERNEL
echo "end rm -rf /tmp/updatefile/$NAME_KERNEL "
# ============== handle for kernel update end============
# ============== handle for rootfs update start============
case "$UPDATE_ROOTFS" in
Y )
if [ -e "/tmp/updatefile/util/flash_erase" ] && [ -e "/tmp/updatefile/util/nandwrite" ];then
/tmp/updatefile/util/flash_erase /dev/mtd5 0 0
/tmp/updatefile/util/nandwrite -p /dev/mtd5 /tmp/updatefile/$NAME_ROOTFS
echo "end nandwrite /tmp/updatefile/$NAME_ROOTFS /dev/mtd5"
else
echo "/tmp/updatefile/util/flash_erase or nandwrite not exist! error"
fi
;;
* )
echo "rootfs do not update"
;;
esac
rm -rf /tmp/updatefile/
echo "end rm -rf /tmp/updatefile/ "
# ============== handle for rootfs update end============
rm -rf /tmp/rarlist.txt/
echo "end rm -rf /tmp/rarlist.txt/ "
rm -rf /tmp/update.sh/
echo "end rm -rf /tmp/update_firmware.sh/ "
echo "firmware update shell end"
總結
以上是生活随笔為你收集整理的linux 网络在线升级,linux在线升级的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 办美国签证多少钱啊?
- 下一篇: windows如何调用Linux的API