[计算机软件及应用]10-Linux.doc
Linux-2.6.32.2内核在mini2440上的移植-根文件系统制作(1) 1根文件系统制作在构建文件系统时,建议遵循FHS(Filesystem Hierarchy Standard,文件系统层次标准),它定义了文件系统中目录、文件的分类存放原则,定义了系统运行需要的最小文件目录的集合,FHS文档可以到www.pathname.com/fhs/下载。【1】下载busybox 源代码可以从http:/www.busybox.net/downloads/,这里下载的是busybox-1.13.3.tar.bz2,友善官方也有提供直接复制过来即可:rootlocalhost linux-test# lsbusybox-1.13.3-mini2440.tgz linux-2.6.32.2 linux-2.6.39 yaffs2rootlocalhost linux-test# 【2】根文件系统目录说明嵌入式 Linux 中都需要构建根文件系统,构建根文件系统的规则在FHS(FilesystemHierarchy Standard)文档中,下面是根文件系统顶层目录。目录 内容bin 存放所有用户都可以使用的、基本的命令。sbin 存放的是基本的系统命令,它们用于启动系统、修复系统等。usr 里面存放的是共享、只读的程序和数据。proc 这是个空目录,常作为proc 文件系统的挂载点。dev 该目录存放设备文件和其它特殊文件。etc 存放系统配置文件,包括启动文件。lib 存放共享库和可加载块(即驱动程序),共享库用于启动系统、运行根文件系统中的可执行程序boot 引导加载程序使用的静态文件。home 用户主目录,包括供服务账号锁使用的主目录,如FTP。mnt 用于临时挂接某个文件系统的挂接点,通常是空目录。也可以在里面创建空的子目录。opt 给主机额外安装软件所摆放的目录。root root 用户的主目录tmp 存放临时文件,通常是空目录。var 存放可变的数据,如日志等。【3】创建系统目录。操作如下:在与linux内核相同的目录下创建一个目录,此目录名字可以自己指定,这里创建的目录名为myrootfs。rootlocalhost linux-test# mkdir myrootfsrootlocalhost linux-test# lsbusybox-1.18.4.tar.bz2 linux-2.6.32.2 linux-2.6.39 myrootfs yaffs2进入到/root/linux-test/myrootfs/rootfs 目录,新建一个建立根文件系统目录的脚本文件mkrootfs:rootlocalhost linux-test# cd myrootfsrootlocalhost myrootfs# gedit mkrootfs将下列内容复制其中:#!/bin/shecho "-Create rootfs directons start.-"mkdir rootfscd rootfsecho "-Create root,dev.-"mkdir bin boot dev etc home lib mnt proc root sbin sys tmp usr var wwwmkdir etc/init.d etc/rc.d etc/sysconfigmkdir usr/sbin usr/bin usr/lib usr/modulesecho "make node in dev/console dev/null"mknod -m 666 dev/console c 5 1mknod -m 666 dev/null c 1 3mkdir mnt/etc mnt/jffs2 mnt/yaffs mnt/data mnt/tempmkdir var/lib var/lock var/run var/tmpchmod 1777 tmpchmod 1777 var/tmpecho "-make direction done-"然后执行:wq保存退出。使用命令chmod a+x mkrootfs 改变文件的可执行权限:rootlocalhost myrootfs# chmod a+x mkrootfs运行./mkrootfs 脚本:rootlocalhost myrootfs# ./mkrootfs-Create rootfs directons start.-Create root,dev.-make node in dev/console dev/null-make direction done-rootlocalhost myrootfs# 这样就完成了根文件系统目录的创建。在上面脚本执行过程创建的两个设备文件console 和null非常重要,这两文件和控制台设备有关,在前面提到过的在内核挂载文件系统时出现的告警“Warning: unable to open an initial console”与之有关。【4】编译并安装内核模块首先就进入到内核顶级目录下,并确认内核顶层目录下的Makefile中的ARCH=arm,CROSS_COMPILE=arm-linux-,然后执行编译:rootlocalhost linux-test# cd linux-2.6.32.2rootlocalhost linux-2.6.32.2# make modules等到编译完成后,安装编译好的模块:rootlocalhost linux-2.6.32.2# make modules_install ARCH=arm INSTALL_MOD_PATH=/root/linux-test/myrootfs/rootfs等到模块安装完成后可以看到rootlocalhost linux-2.6.32.2# cd ./myrootfs/rootfsrootlocalhost rootfs# ls ./lib/modules2.6.32.2 2.6.32.2-FriendlyARMrootlocalhost rootfs# ls ./lib/modules/2.6.32.2build modules.dep modules.ofmap modules.symbolskernel modules.ieee1394map modules.order modules.usbmapmodules.alias modules.inputmap modules.pcimap sourcemodules.ccwmap modules.isapnpmap modules.seriomaprootlocalhost rootfs# ls ./lib/modules/2.6.32.2/kernelcrypto drivers fs lib net soundrootlocalhost rootfs# 上面的目录中有make modules_install安装的模块。【5】建立动态链接库这里的动态链接库直接用友善之臂的,可以从其官方光盘映像/linux目录下rootfs_qtopia_qt4-20110304.tar.gz,先解压友善之臂的根文件包:rootlocalhost myrootfs# cd ./rootlocalhost linux-test# lsbusybox-1.13.3-mini2440.tgz linux-2.6.39 rootfs_qtopia_qt4-20110304.tar.gzlinux-2.6.32.2 myrootfs yaffs2rootlocalhost linux-test# tar -zxf rootfs_qtopia_qt4-20110304.tar.gz -C ./rootlocalhost linux-test# lsbusybox-1.13.3-mini2440.tgz linux-2.6.39 rootfs_qtopia_qt4 yaffs2linux-2.6.32.2 myrootfs rootfs_qtopia_qt4-20110304.tar.gzrootlocalhost linux-test# 拷贝其lib 的内容到新建的根文件目录lib 内:rootlocalhost linux-test# cp -rfd ./rootfs_qtopia_qt4/lib/* ./myrootfs/rootfs/lib/rootlocalhost linux-test# 还有一种做法:对于"lib"目录:这个里面放的都是库文件,直接从交叉编译器的库文件目录中拷贝过来: #cp -f /usr/local/arm/4.4.3/arm-none-linux-gneabi/libc/armv4t/lib/*so* lib/ -a【5】交叉编译BosyboxBosybox 是一个遵循GPL v2 协议的开源项目,它在编写过程总对文件大小进行优化,并考虑了系统资源有限(比如内存等)的情况,使用Busybox 可以自动生成根文件系统所需的bin、sbin、usr 目录和linuxrc 文件。(1)解压busyboxrootlocalhost linux-test# lsbusybox-1.13.3-mini2440.tgz linux-2.6.39 rootfs_qtopia_qt4 yaffs2linux-2.6.32.2 myrootfs rootfs_qtopia_qt4-20110304.tar.gzrootlocalhost linux-test# tar -zxf busybox-1.13.3-mini2440.tgz rootlocalhost linux-test# lsbusybox-1.13.3 linux-2.6.39 rootfs_qtopia_qt4-20110304.tar.gzbusybox-1.13.3-mini2440.tgz myrootfs yaffs2linux-2.6.32.2 rootfs_qtopia_qt4rootlocalhost linux-test# (2)进入busybox的顶层目录,修改Makefilerootlocalhost linux-test# cd busybox-1.13.3rootlocalhost busybox-1.13.3# gedit Makefile在gedit打开的Makefile中,定位到164行附近,修改如下:# Note: Some architectures assign CROSS_COMPILE in their arch/*/MakefileCROSS_COMPILE ?= arm-linux-# bbox: we may have CONFIG_CROSS_COMPILER_PREFIX in .config,# and it has not been incl? yet. thus using an awkward syntax. .定位到189行附近,修改如下:ARCH ?= arm# Architecture as present in compile.hUTS_MACHINE := $(ARCH)然后保存。(3)配置busybox在busybox顶层目录下执行make menconfig 进行配置rootlocalhost busybox-1.13.3# make menconfig出现如下图配置菜单 下面只列出了要注意的地方,没有列出的默认即可。 <1>、Busybox Settings-> Build Options->* Build BusyBox as a static binary (no shared libs) Force NOMMU build * Build with Large File Support (for accessing files > 2 GB) (arm-linux-) Cross Compiler prefix /指定编译前缀,按回车就可进行修改 Installation Options -> * Don't use /usr /选中该项可以避免buysbox被安装到宿主机系统的/usr目录下,破坏宿主机系统。 Applets links (as soft-links) -> (/root/linux-test/myrootfs/rootfs) BusyBox installation prefix /这里需要指定busybox的安装路径,按回车即可输入。 Busybox Library Tuning ->* Support for /etc/networks * Command line editing (1024) Maximum length of input * vi-style line editing commands(15) History size * History saving * Tab completion * Username completion * Fancy shell prompts <2>Linux Module Utilities->(/lib/modules)Default directory containing modules(modules.dep)Default name of modules.dep下面是在busybox 中配置对dev 下设备类型的支持,dev 的创建有手动创建、使用devfs 文件系统创建和?v创建三种方法,而?v的一个简化版是busybox 自带的mdev ,适合于嵌入式的应用埸合。其具有使用简单的特点。它的作用,就是在系统启动和热插拔或动态加载驱动程序时,自动产生驱动程序所需的节点文件。在以busybox 为基础构建嵌入式linux 的根文件系统时,使用它是最优的选择。<3>Linux System Utilities ->*Support /etc/mdev.conf*Support command execution at device addition/removal<4>Init Utilities ->“Support reading an inittab file”应该选中,这样可以根据自己编写的inittab文件初始化;“Support running commands with a controlling-tty”应该选中,否则会提示非常困扰的“/bin/sh: can't access tty; job control turned off”的提示,尽管可以进入控制台命令行。(4)编译busybox编译busybox 到指定目录,在busybox-1.13.3的根目录下执行make CONFIG_PREFIX=/root/linux-test/myrootfs/rootfs install在rootfs 目录下会生成目录bin、sbin、usr 和文件linuxrc 的内容。rootlocalhost busybox-1.13.3# make CONFIG_PREFIX=/root/linux-test/myrootfs/rootfs install. .-You will probably need to make your busybox binarysetuid root to ensure all configured applets willwork properly.-rootlocalhost busybox-1.13.3# rootlocalhost busybox-1.13.3# ls ./myrootfs/rootfsbin dev home linuxrc proc sbin tmp varboot etc lib mnt root sys usr wwwrootlocalhost busybox-1.13.3# 【6】建立etc 目录下的配置文件(1) 建立/etc/group系统用户组配置文件,内容如下:root:*:0:daemon:*:1:bin:*:2:sys:*:3:adm:*:4:tty:*:5:disk:*:6:lp:*:7:lpmail:*:8:news:*:9:u p:*:10:proxy:*:13:kmem:*:15:dialout:*:20:fax:*:21:voice:*:22:cdrom:*:24:floppy:*:25:tape:*:26:s o:*:27:a io:*:29:ppp:x:99:500:x:500:plg501:x:501:fa(2)建立passwd系统密码文件,内容如下: root:0:0:root:/:/bin/shftp:14:50:FTP User:/var/ftp:bin:*:1:1:bin:/bin:daemon:*:2:2:daemon:/sbin:nobody:*:99:99:Nobody:/:sky:502:502:Linux User,:/home/sky:/bin/shrootlocalhost rootfs# ls ./etcgroup init.d passwd rc.d sysconfigrootlocalhost rootfs# (3) 在etc/sysconfig 目录下新建主机文件名HOSTNAME,内容为"mini2440"。rootlocalhost rootfs# cat >>./etc/sysconfig/HOSTNAMEmini2440rootlocalhost rootfs# 当录入完文件内容“mini2440”并回车后需要按下Ctrl+C组合键结束录入状态。此时该文件内容为:“mini2440",这句话就是我们在文件系统里面看到那个“root mini2440 /”。(4)新建etc/inittab 系统init进程配置文件,将下面内容复制并粘贴其中:#etc/inittab:sysinit:/etc/init.d/rcSconsole:askfirst:-/bin/sh:ctrlaltdel:/sbin/reboot:shutdown:/bin/umount -a r要记住赋予其可执行属性rootlocalhost rootfs# chmod a+x ./etc/inittab(5)新建etc/init.d/rcS系统启动加载项文件,将下面内容复制并粘贴其中:#!/bin/shPATH=/sbin:/bin:/usr/sbin:/usr/binrunlevel=S /运行的级别prevlevel=Numask 022 /文件夹的掩码export PATH runlevel prevlevelecho "-munt all-"mount -a /挂载/etc/fstab/文件指定的所有的文件系统echo /sbin/mdev>/proc/sys/kernel/hotplugmdev -secho "*"echo "*booting to mini2440 *"echo "Kernel version:linux-2.6.32.2"echo "the fans:singleboy"echo "Date:2011.5.30"echo "*"/bin/hostname -F /etc/sysconfig/HOSTNAME然后使用以下命令改变 rcS 的执行权限:Chmod +x rcSrootlocalhost rootfs# chmod +x ./etc/init.d/rcSrootlocalhost rootfs# (6)新建etc/fstab 系统挂载文件系统列表文件,将下面内容复制并粘贴其中:#device mount-point type option dump fsck orderproc /proc proc defaults 0 0none /tmp ramfs defaults 0 0sysfs /sys sysfs defaults 0 0mdev /dev ramfs defaults 0 0(7)新建etc/profile用户环境配置文件,将下面内容复制并粘贴其中:#Ash profile#vim:syntax=sh#No core file by defaults#ulimit -S -c 0>/dev/null 2>&1USER="id -un"LOGNAME=$USERPS1='uh W$'PATH=$PATHHOSTNAME='/bin/hostname'export USER LOGNAME PS1 PATH修改环境变量PS1(命令行提示符),可以使用vi编辑/etc/profile文件,在最后加上: export PS1='uh W$ ' 即可,其中u显示当前用户账号,h显示当前主机名,W显示当前路径,$显示'$'符号 W 代替 w 就可以实现绝对路径到相对路径的转换 下面简单说说环境下默认的特殊符号所代表的意义: d :代表日期,格式为weekday month date,例如:"Mon Aug 1" H :完整的主机名称。例如:我的机器名称为:fc4.linux,则这个名称就是fc4.linux h :仅取主机的第一个名字,如上例,则为fc4,.linux则被省略 t :显示时间为24小时格式,如:HH:MM:SS T :显示时间为12小时格式 A :显示时间为24小时格式:HH:MM u :当前用户的账号名称 v :BASH的版本信息 w :完整的工作目录名称。家目录会以 代替 W :利用basename取得工作目录名称,所以只会列出最后一个目录 # :下达的第几个命令 $ :提示字符,如果是root时,提示符为:# ,普通用户则为:$(8) 建立etc/mdev.conf (mdev设备配置文件)、 net.conf (网络配置文件件),mime.types: MIME(Multipurpose Internet Mail Extensions) 内容均为空。rootlocalhost rootfs# touch./etc/mdev.conf rootlocalhost rootfs# touch ./etc/net.confrootlocalhost rootfs# touch ./etc/mine.types(9)建立boa WEB服务器文件配置文件在etc/boa目录,并在boa目录中建立boa.conf文件,内容为空。rootlocalhost rootfs# mkdir ./etc/boarootlocalhost rootfs# touch ./etc/boa/boa.confrootlocalhost rootfs# (10)先建立etc/rc.d/init.d目录rootlocalhost rootfs# mkdir ./etc/rc.d/init.d然后建立etc/rc.d/init.d/httpd文件rootlocalhost rootfs# gedit ./etc/rc.d/init.d/httpdrootlocalhost rootfs# 将下面内容复制并粘贴:#!/bin/shbase=boa# See how we were called.case "$1" in start) /usr/sbin/$base ; stop) pid=/bin/pidof $base if -n "$pid" ; then kill -9 $pid fi ;esacexit 0(11)新建etc/resolv.conf,DNS配置文件,存放访问外网时需要DNS 的信息,内容如下:nameserver 61.144.56.100 (12)在/home/sky目录,与etc目录passwd文件中的sky相对应rootlocalhost rootfs# mkdir ./home/skyrootlocalhost rootfs# 3.2,根文件系统测试将制作的文件系统通过下面三种方法测试【1】将nfs文件系统作为根文件系统进行测试(1) 将制作好的根文件系统rootfs复制到/nfsboot目录下作为mini2440的根文件系统rootlocalhost myrootfs# cp -drf ./rootfs /nfsboot/rootlocalhost myrootfs# cd /nfsbootrootlocalhost nfsboot# 复制时需要加上drf参数,d表示文件的链接关系不变。r表示递归复制此目录下所有的子目录和文件。(2)确保rootfs目录可读写rootlocalhost nfsboot# ls -l总计 63216drwxr-xr-x 17 root root 4096 06-01 07:14rootfs-rwxrw-rw- 1 root root 58487616 2009-07-18 root_qtopia-128M.img-rw-r-r- 1 root root 2114212 05-27 11:45 uImagerootlocalhost nfsboot# 进入到内核目录下,执行:rootlocalhost myrootfs# cd ./linux-2.6.32.2rootlocalhost linux-2.6.32.2# gedit .config在打开的配置文件中在命令模式下:/CMD,会自动定位到340行,对照上面CONFIG_CMDLINE参数修改成如下:# Boot options#CONFIG_ZBOOT_ROM_TEXT=0CONFIG_ZBOOT_ROM_BSS=0CONFIG_CMDLINE="root=/dev/nfs rw nfsroot=192.168.1.111(虚拟机IP):/nfsboot/rootfs ip=192.168.1.230(开发板IP) console=ttySAC0 mem=64M"# CONFIG_XIP_KERNEL is not setCONFIG_KEXEC=yCONFIG_ATAGS_PROC=y在内核目录下命令终端中执行rootlocalhost linux-2.6.32.2# make men onfig在打开的配置菜单-> Boot options ->回车可以看到刚才的修改结果,如下图: 当然上图高亮的菜单选项上按回车也可以进行修改,但没有在vim编辑器中修改方便。(5)确保内核提供nfs boot支持在刚才的配置菜单中定位到 Device Drivers -> <*> Memory Technology Device (MTD) support -> <*> Caching block device access to MTD devices * Network device support -> * Ethernet (10 or 100Mbit) -> <*> DM9000 support File systems -> * Network File Systems -> - Network File Systems <*> NFS client support * NFS client support for NFS version 3 * NFS client support for the NFSv3 ACL protocol extension * NFS client support for NFS version 4 (EXPERIMENTAL) NFS client support for NFSv4.1 (DEVELOPER ONLY) * Root file system on NFS < > NFS server support 要确保上面蓝色高亮部分的选项被选上。(6)重新编译内核,将生成的zImage【2】将制作根文件系统编译进内核,并制作成initramfs文件系统 现在基于Linux的发行版通常采用initramfs代替initrd,架构更简单,应用也更灵活一些,不需要创建内存设备块,能根据文件的大小自动申请或释放内存。(1) 配置linux内核,支持initramfs在命令终端的linux-2.6.32.2内核目录下rootlocalhost # cd linux-test/linux-2.6.32.2然后执行rootlocalhost linux-2.6.32.2# make menconfigGeneral setup -> * Initial RAM filesystem and RAM disk (initramfs/initrd) suppor(/root/linux-test/myrootfs/rootfs) Initramfs source file(s)/填写你要制作成initramfs格式的根文件系统目录。原因很简单,我们使用的是initramfs,而不是ramdisk,所以不用配置ramdisk的驱动支持项Device Drivers->Block devices->RAM block device support 项。相应的之后的(4096)Default RAM disk size kbytes等相关默认配置选项就不会再出现了。另外initramfs技术和ramdisk技术的另一个重要的区别就是initramfs并不是在内存中模拟出一个磁盘,所以也就不在需要ramdisk中所需的ext2驱动支持。所以,File systems菜单下的ext2文件系统支持< > Second extended fs support选项就可以取消了。(2) 进入制作好的根文件系统rootfsrootlocalhost linux-2.6.32.2# cd ./myrootfs/rootfsrootlocalhost rootfs# 因为initramfs根文件系统启动时执行的第一个程序是init,而不是linuxrc,所以在此,我们制作的根文件系统需要添加一个init文件,相应的linuxrc文件就不再需要了。于是执行rootlocalhost rootfs# ln -s ./bin/busybox init这样就为busybox创建了一个软链接init,这个文件就是我们要创建的init文件。(3)修改内核的命令行参数rootlocalhost rootfs