• 忆捷M8高清播放器固件分析 - [技巧攻略]

    2010-12-26

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://gleisure.blogbus.com/logs/101717022.html

      这是一篇学习高清播放器固件及初识Linux的笔记。

      在忆捷官网下载到了M8固件“M8_Ver4.00_9LAN_0531(出厂固件)”,解压后有一个“install.img”文件。本人对Linux系统及文件不熟,网上一查猜测“install.img”是个“tar”格式的文件,可用RAR顺利解压(无法解压的可将扩展区“img”改为“tar”,后来发现还是在Linux系统下执行相关操作比较稳妥),解压后文件清单如下:

     文件名  说明(网上查询)
     arial.ttf  字体文件
     audio_firmware.install.bin  
     configuration.xml  刷写ROM的配置文件
     flash_erase  
     install_a  固件安装程序

     mkfs.jffs2

     
     mkyaffs2image  
     nandwrite  
     video_firmware.install.bin  
     [package2]  
      bluecore.audio  音濒内核
      vmlinux.develop.avhdd.mars.nand.bin  Linux内核,用lzma压缩的二进制文件
      squashfs1.img  根文件系统,类型为squashfs,一种压缩的只读文件系统。
      video_firmware.bin  视频内核
      usr.local.etc.tar.bz2  一些系统配置文件,其内容复制到/usr/local/etc下

      “configuration.xml”文件内容:

     

       写入“package2/squashfs1.img”没有设置节点,其可用空间为其本身大小,而“package2/usr.local.etc.tar.bz2”设置了60M(0x3C00000Bytes)空间。可用“free”或“cat /proc/meminfo”查看ROM的使用情况。

      网上下载“Windows版高清机固件解包工具”,这里只需使用其中的“squashfs-tools-win”。分解“squashfs1.img”(操作命令:unsquashfs squashfs1.img)

      至此,本人还不知道这是Linux系统,虽然解出来了,但是不知道该如何下手修改,于是上网搜索相关资料,“HDP fans”是一个学习高清播放器固件的好地方。起初我对论坛中一句“telnet登录播放器”也着实让我费了好大劲,“高手”一句话,对于完全不入门的人来讲,实在无法理解。

      播放器用网线接入网络,设定播放器“网络”,获取播放器IP。在Windows下,“开始”菜单“运行”“cmd”调用“命令行操作界面”,输入以下命令并回车:
    telnet 播放器IP
    就能连上播放器,提示“Venus login:”,输入登录名“root”,回车后便能顺利登录播放器,显示提示符“~#”。如输入命令“ls”就能看到播放器的清单了(如同DOS环境)。至此需要学习一些Linux的相关知识,我是看《鸟哥的私房菜 Linux基础学习篇(第二版)》(网上下载的PDF)。

    #解压
    #建立install目录
    mkdir install
    #解压install.img文件
    tar -xpvf install.img -C install/
    #将squashfs1.img移出来
    mv -f install/package2/squashfs1.img ./squashfs1.img
    #解压squashfs1.img
    unsquashfs squashfs1.img
    #将usr.local.etc.tar.bz2移出来
    mv install/package2/usr.local.etc.tar.bz2 ./usr.local.etc.tar.bz2
    #解压usr.local.etc.tar.bz2
    bzip2 -d usr.local.etc.tar.bz2
    #建立usr.local.etc目录
    mkdir usr.local.etc
    #解压生成的usr.local.etc.tar
    tar -xpvf usr.local.etc.tar -C usr.local.etc/

    #修改
    #进入squashfs-root目录
    cd squashfs-root
    #建立递归目录usr/local/etc/opt
    mkdir -p usr/local/etc/opt
    #建立连接
    ln -s usr/local/etc/opt opt
    #passwd更名为passwd_old
    mv usr/local/etc/passwd usr/local/etc/passwd_old
    #修改passwd_old并写入passwd,ftp登录无密码
    sed 's/root::0:0:root::\/bin\/sh/root::0:0:root:\/:\/bin\/sh/' usr/local/etc/passwd_old > usr/local/etc/passwd
    #删除passwd_old
    rm -f usr/local/etc/passwd_old
    #profile更名为profile_old
    mv usr/local/etc/profile usr/local/etc/profile_old
    #修改profile_old并写入profile
    sed 's/# No core/pathmunge \/opt\/sbin  \npathmunge \/opt\/bin  \n\n&/' usr/local/etc/profile_old > usr/local/etc/profile
    #删除profile_old
    rm -f usr/local/etc/profile_old
    #建立init.d目录(用于启动时一些需要的初使化)
    mkdir -p opt/etc/init.d
    #如果存在myinit.sh文件,则延迟40秒,以便一些程序加载
    echo -e "if [ -f /opt/etc/init.d/myinit.sh ]; then\n\tsleep 40\n\t/opt/etc/init.d/myinit.sh&\nfi">>etc/init.d/rcS1
    #进入etc目录
    cd ../usr.local.etc
    #passwd重命名passwd_old
    mv passwd passwd_old
    #修改后写入passwd,ftp登录无密码
    sed 's/root::0:0:root::\/bin\/sh/root::0:0:root:\/:\/bin\/sh/' passwd_old > passwd
    #删除passwd_old
    rm -f passwd_old
    #profile重命名profile_old
    mv profile profile_old
    #修改profile_old并写入profile
    sed 's/# No core/pathmunge \/opt\/sbin  \npathmunge \/opt\/bin  \n\n&/' profile_old > profile
    #删除profile_old
    rm -f profile_old

    #…… 增加一些需自定义的修改

    #打包
    #删除squashfs1.img
    rm -f squashfs1.img
    #打包squashfs-root
    mksquashfs squashfs-root squashfs1.img
    #移动squashfs1.img
    mv -f squashfs1.img install/package2/
    #打包usr.local.etc
    tar -cpvf usr.local.etc.tar usr.local.etc
    #再打包usr.local.etc.tar
    bzip2 -z usr.local.etc.tar
    #移动usr.local.etc.tar.bz2
    mv -f usr.local.etc.tar.bz2 install/package2/usr.local.etc.tar.bz2
    #进入install目录
    cd install
    #最终打包install
    tar -cpvf ../install_new.img *
    #返回
    cd ..

      将生成的install_new.img改名为install.img,并拷入U盘根目下进行刷机,之后便可安装相关程序了。

    #安装ipkg
    #telnet播放器
    cd /usr/local/etc
    mkdir opt
    mount -o remount,rw /
    mkdir -p /opt/tmp /opt/bin /opt/etc/init.d
    cd /opt/tmp
    wget http://www.kovari.priv.hu/download/ipkg-cl.tgz
    tar -xvf ipkg-cl.tgz
    mv /opt/tmp/ipkg-cl /opt/bin/.
    chmod +x /opt/bin/ipkg-cl
    cd ../tmp
    rm ipkg-cl.tgz
    wget http://ipkg.nslu2-linux.org/feeds/optware/oleg/cross/stable/uclibc-opt_0.9.28-13_mipsel.ipk
    ipkg-cl install uclibc-opt_0.9.28-13_mipsel.ipk
    wget http://ipkg.nslu2-linux.org/feeds/optware/oleg/cross/stable/ipkg-opt_0.99.163-10_mipsel.ipk
    ipkg-cl install ipkg-opt_0.99.163-10_mipsel.ipk
    /opt/bin/ipkg update

    #安装vsftpd
    if [ ! -d /opt/usr/share/empty ]; then
      mkdir -p /opt/usr/share/empty
    fi
    echo >/opt/usr/share/empty/tmp
    /opt/bin/ipkg install vsftpd
    #配置vsftpd
    mv /opt/etc/vsftpd.conf /opt/etc/vsftpd_bak.conf
    sed 's/listen=NO/listen=YES\nlisten_port=21\nbackground=YES\ncheck_shell=NO\nsession_support=NO\nlocal_root=\/tmp\/usbmounts\nsecure_chroot_dir=\/opt\/usr\/share\/empty/' /opt/etc/vsftpd_bak.conf > /opt/etc/vsftpd.conf
    #运行vsftpd
    /opt/sbin/vsftpd

    #如果上传写入失败,需要强制增加"w"权限,如下面对sdb1盘操作
    mount -o force,rw,nls=utf8,remount /tmp/usbmounts/sdb1


    收藏到:Del.icio.us