嵌入式应用程序移植过程

    技术2022-05-11  51

    1 构造目标板的根目录及文件系统 1.1 建立一个目标板的空根目录 我们将在这里构建构建根文件系统,创建基础目录结构. 存放交叉编译后生成的目标应用程序(BUSYBOX,TINYLOGIN),存放库文件等。     # mkdir rootfs     # cd rootfs     # pwd     /home/arm/dev_home/rootfs     1.2 在rootfs中建立Linux目录树     #mkdir bin dev etc home lib mnt proc sbin sys tmp root usr     #mkdir mnt/etc     #mkdir usr/bin usr/lib usr/sbin     #touch linuxrc     #tree     .     | --­bin     | --­dev     | --etc     | --home     | --­lib     | --­linuxrc /* 此文件为启动脚本,是一shell脚本文件。本文后面有专门介绍*/     | --­mnt     | ` --­etc     | --­proc     | --­sbin     | --­sys     | --­tmp     | --­root     ` --usr             | --bin             | --lib             ` --sbin 权限参照你的linux工作站即可,基础目录介绍参见本文参考资料(未尾)。 需要说明的一点就是etc目录存放配置文件,这个目录通常是需要修改的,所以在linuxrc脚本当中将etc目录 挂载为ramfs文件系统,然后将mnt/etc目录中的所有配置文件拷贝到etc目录当中,这在下一节的linuxrc脚本 文件当中会有体现。 1.3 创建linuxrc文件 1. 创建linuxrc,加入如下内容:     #vi linuxrc     !/bin/sh     echo "mount /etc as ramfs"     /bin/mount ­-n -­t ramfs ramfs /etc     /bin/cp ­-a /mnt/etc/* /etc     echo "recreate the /etc/mtab entries"       /bin/mount ­-f  -t cramfs ­-o remount,ro /dev/mtdblock/2 /     echo "­mount /dev/shm as tmpfs"     /bin/mount ­-n -t tmpfs tmpfs /dev/shm     echo "­mount /proc as proc"     /bin/mount ­-n -t proc none /proc     echo "­mount /sys as sysfs"     /bin/mount ­-n -­t sysfs none /sys     /bin/mount -n -t usbdevfs none /proc/bus/usb     /bin/mount -n -t yaffs /dev/mtdblock/3 /var     /bin/mount -n -t yaffs /dev/mtdblock/4 /home      exec /sbin/init 2. 修改权限     #chmod 775 linuxrc     #ls linuxrc ­-la     -rwxrwxr-x 1 root root 533 Jun 4 11:19 linuxrc 当编译内核时,指定命令行参数如下 Boot options ­-->Default kernel command string: 我的命令行参数如下 noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0,115200 其中的init指明kernel执行后要加载的第一个应用程序,缺省为/sbin/init,此处指定为/linuxrc 2 移植Busybox2.1 下载busybox 从http://www.busybox.net/downloads/busybox-1.1.3.tar.gz  下载busybox1.1.3到/tmp目录当中,并解压. 2.2 进入解压后的目录,配置Busybox     #make menuconfig     Busybox Settings ­-->             General Configuration ­-->                     [*] Support for devfs             Build Options ­-->                     [*] Build BusyBox as a static binary (no shared libs)                     /* 如果只安装busybox 将busybox编译设为静态连接 */                     [*] Do you want to build BusyBox with a Cross Compiler?                     (/usr/local/arm/3.3.2/bin/arm-linux-)Cross Compiler prefix                     /* 指定交叉编译工具路径*/           Installation options -->                    [*] Don't usr /usr                    /*之前没有选择这个选项,kernel始终都没有cramfs加载成功,不知道原因是什么?如果你知道的话请告诉我*/                    (/home/arm/dev_home/rootfs/) BusyBox Installation prefix     Init Utilities ­-->             [*] init             [*] Support reading an inittab file             /* 支持init读取/etc/inittab配置文件,一定要选上*/     Shells ­-->             Choose your default shell (ash) ­>             /* (X) ash 选中ash,这样生成的时候才会生成bin/sh文件             * 看看我们前头的linuxrc脚本的头一句:             * #!/bin/sh 是由bin/sh来解释执行的             */             [*] ash     Coreutils ­-->             [*] cp             [*] cat             [*] ls             [*] mkdir             [*] echo (basic SuSv3 version taking no options)             [*] env             [*] mv             [*] pwd             [*] rm             [*] touch     Editors ­-->             [*] vi     Linux System Utilities ­>             [*] mount             [*] umount             [*] Support loopback mounts             [*] Support for the old /etc/mtab file     Networking Utilities ­>             [*] inetd             /** 支持inetd超级服务器             * inetd的配置文件为/etc/inetd.conf文件,             * "在该部分的4: 相关配置文件的创建"一节会有说明             */ 2.3 编译并安装Busybox     #make TARGET_ARCH=arm all install *这里需要注意一点的是,只要install busybox,我们根文件系统下先前建好的linuxrc就会被覆盖为一同名二进 制文件。所以要事先备份我们自己的linuxrc,在安装完busybox后,将linuxrc复制回去就好。 3 移植TinyLogin3.1 下载 从http://tinylogin.busybox.net/downloads/tinylogin1.4.tar.bz2 下载tinylogin1.4到/tmp目录当中,并解压. 3.2 修改tinyLogin的Makefile     #vi Makefile 修改记录如下: 指明静态编译,不连接动态库     DOSTATIC = true 指明tinyLogin使用自己的算法来处理用户密码     USE_SYSTEM_PWD_GRP = false     USE_SYSTEM_SHADOW = false 3.3 编译并安装     #make CROSS=/usr/local/arm/3.3.2/bin/arm-linux- /     PREFIX=/home/arm/dev_home/rootfs all install PREFIX指明根文件路径 4 相关配置文件的创建 进入mnt/etc中, 这里是我们存放配置文件的路径 4.1 创建帐号及密码文件     #cp /etc/passwd .     #cp /etc/shadow .     #cp /etc/group . 这3个文件是从你工作站当中拷贝过来的,删除其中绝大部分不需要的用户,经过删减后的上述3个文件如下。 那么现在root的登陆密码和你工作站上的登陆口令一致了,这可能透露你工作站的信息     #cat passwd     root:x:0:0:root:/root:/bin/sh /* 改为/bin/sh */     bin:x:1:1:bin:/bin:/sbin/nologin     daemon:x:2:2:daemon:/sbin:/sbin/nologin     #cat shadow     root:$1$2LG20u89$UCEEUzBhElYpKMNZQPU.e1:13303:0:99999:7:::     bin:*:13283:0:99999:7:::     daemon:*:13283:0:99999:7:::     #cat group     root:x:0:root     bin:x:1:root,bin,daemon     daemon:x:2:root,bin,daemon 4.2 创建profile文件     #vi profile     # Set search library path     # 这条语句设置动态库的搜索路径,极其重要!!!     echo "Set search library path int /etc/profile"     export LD_LIBRARY_PATH=/lib:/usr/lib     # Set user path     echo "Set user path in /etc/profile"     PATH=/bin:/sbin:/usr/bin:/usr/sbin     export PATH 4.3创建fstab文件     # vi fstab     none /proc proc defaults 0 0     none /dev/pts devpts mode=0622 0 0     tmpfs /dev/shm tmpfs defaults 0 0 5 移植inetd5.1 inetd的选择及获取 Busybox1.1.3提供了inetd支持。如果读者使用的是较低版本的不提供inetd的Busybox,那么可以考虑使用netkit套件来提供网络服务。强烈建议使用高版本的Busybox。此节后半部分介绍如果编译布署netkit当中的inetd。 5.1.1 获取inetd Netkit套件可以从ftp://ftp.uk.linux.org/pub/linux/Networking/netkit/ 下载。 其中netkitbase0.17中包括inetd程序。下载netkitbase0.17到/tmp目录并解压。 5.2 编译inetd 5.2.1 修改configure 文件 开始配置netkitbase 之前需要先修改configure脚本以免它在主机上执行测试程序。     #vi configure 将每一行出现的.     /__conftest || exit 1; 修改成:     # ./__conftest || exit 1; 5.2.2 编译     #CC=/usr/local/arm/3.3.2/bin/arm-linux-gcc ./configure     #make 5.3 配置inetd 5.3.1 拷贝inetd 到根文件系统的usr/sbin 目录中     #cp inetd/inetd /home/arm/dev_home/rootfs/usr/sbin/ 拷贝inetd的配置文件inetd.conf到根文件系统的/mnt/etc目录中     #cp etc.sample/inetd.conf /home/arm/dev_home/rootfs/mnt/etc 5.3.2 根据需要,修改inetd.conf 配置文件 例如:支持telnetd的inetd.conf配置文件如下     # <service_name> <sock_type> <proto> <flags> <user> <server_path> <args>     telnet stream tcp nowait root /usr/sbin/telnetd 5.3.3 拷贝配置文件 etc.sample目录下有许多网络相关配置文件,其中有一些需要拷贝到根文件系统的etc目录当中,记录如下:     #cd etc.sample/     #cp host.conf /home/arm/dev_home/rootfs/mnt/etc/     #cp hosts /home/arm/dev_home/rootfs/mnt/etc/     #cp networks /home/arm/dev_home/rootfs/mnt/etc/     #cp protocols /home/arm/dev_home/rootfs/mnt/etc/     #cp resolv.conf /home/arm/dev_home/rootfs/mnt/etc/     #cp services /home/arm/dev_home/rootfs/mnt/etc/ 以上重要配置文件说明如下: host.conf:在系统中同时存在着DNS域名解析和/etc/hosts的主机表机制时,由文件/etc/host.conf来说明了解析器 的查询顺序 hosts:记录主机名到IP地址的映射 protocols:记录常用网络协议及端口别名关系,网络应用程序依赖于此文件 resolv.conf:指定DNS服务器 services:记录知名网络服务及端口,网络编程依赖于此文件 6 移植thttpd Web 服务器6.1 下载 从http://www.acme.com/software/thttpd/ 下载thttpd到/tmp目录当中,并解压. 6.2 编译thttpd     #CC=/usr/local/arm/3.3.2/bin/arm-linux-gcc ./configure ­--host=arm-linux     #vi Makefile     指定静态链接二进制文件     LDFLAGS = ­-static     #make 6.3 配置 6.3.1 拷贝thttpd 二进制可执行文件到根文件系统/usr/sbin/目录中     #cp thttpd /home/arm/dev_home/rootfs/usr/sbin/ 6.3.2 修改thttpd 配置文件     #vi contrib/redhat-rpm/thttpd.conf     # This section overrides defaults     dir=/etc/thttpd/html #指明WebServer存放网页的根目录路径     chroot     user=root #以root身份运行thttpd     logfile=/etc/thttpd/log/thttpd.log #日志文件路径     pidfile=/etc/thttpd/run/thttpd.pid #pid文件路径 拷贝thttpd.conf配置文件到根文件系统的mnt/etc/目录, 系统加载后,linuxrc脚本会自动将mnt/etc/下的所有文件拷贝到/etc目录中。     #cp contrib/redhat-rpm/thttpd.conf /home/arm/dev_home/rootfs/mnt/etc/ 6.3.3 转移到根文件系统目录,创建相应的文件     #cd /home/arm/dev_home/rootfs     #cd mnt/etc/ 创建thttpd目录     #mkdir thttpd     #cd thttpd thttpd目录下的目录结构     | --html     |    ` --index.html Web Server网页根目录下的默认HTML文件     | --log     |    ` --thttpd.log 创建一个空文件就可     ` ­--run             `--thttpd.pid 创建一个空文件就可 html目录下的index.html文件内容如下: <html> <head>         <title> Welcome to here^^ </title> </head> <body>         <marquee>                 <font color=red>                     Welcome to here^^!!!                 </font>         </marquee> </body> </html> 7 建立根目录文件系统包7.1 建立CRAMFS包 7.1.1 下载cramfs 工具 从http://prdownloads.sourceforge.net/cramfs/cramfs-1.1.tar.gz 下载源代码包.把下载包拷贝到dev_home/tools下.     #tar ­-xzvf cramfs1.1.tar.gz     #cd cramfs1.1     #make     #su root     #cp mkcramfs /usr/bin     #exit 注意:如果你的系统中已经安装了mkcramfs工具, 则在/usr/bin目录下是一个软link, 请先删除该文件之后, 再拷 贝该mkcramfs到/usr/bin下. 7.1.2 制作cramfs 包     #mkcramfs rootfs rootfs.cramfs 7.1.3 写cramfs 包到Nand Flash     #su root     #cp rootfs.cramfs /tftpboot/ 打开minicom, 进行ARM板的终端模式: 8 参考资料 1. <<BUILDING EMBEDDED LINUX SYSTEMS>> 中文名:<<构建嵌入式Linux系统>>

    最新回复(0)