《[计算机软件及应用]10-Linux.doc》由会员分享,可在线阅读,更多相关《[计算机软件及应用]10-Linux.doc(31页珍藏版)》请在三一文库上搜索。
1、Linux-2.6.32.2内核在mini2440上的移植-根文件系统制作(1)1根文件系统制作在构建文件系统时,建议遵循FHS(Filesystem Hierarchy Standard,文件系统层次标准),它定义了文件系统中目录、文件的分类存放原则,定义了系统运行需要的最小文件目录的集合,FHS文档可以到 源代码可以从http:/ linux-test# lsbusybox-1.13.3-mini2440.tgz linux-2.6.32.2 linux-2.6.39 yaffs2rootlocalhost linux-test# 【2】根文件系统目录说明嵌入式 Linux 中都需要构建根
2、文件系统,构建根文件系统的规则在FHS(FilesystemHierarchy Standard)文档中,下面是根文件系统顶层目录。目录 内容bin 存放所有用户都可以使用的、基本的命令。sbin 存放的是基本的系统命令,它们用于启动系统、修复系统等。usr 里面存放的是共享、只读的程序和数据。proc 这是个空目录,常作为proc 文件系统的挂载点。dev 该目录存放设备文件和其它特殊文件。etc 存放系统配置文件,包括启动文件。lib 存放共享库和可加载块(即驱动程序),共享库用于启动系统、运行根文件系统中的可执行程序boot 引导加载程序使用的静态文件。home 用户主目录,包括供服务账
3、号锁使用的主目录,如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
4、linux-2.6.39myrootfs 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 m
5、nt 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/nullmknod -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/t
6、mpchmod 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
7、-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.2rootloc
8、alhost 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-FriendlyARMrootlocal
9、host 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/kernelcrypt
10、o 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.t
11、ar.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 的内容到新建的根
12、文件目录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 协议的开源项目,它在编写过程总对文件大小进行
13、优化,并考虑了系统资源有限(比如内存等)的情况,使用Busybox 可以自动生成根文件系统所需的bin、sbin、usr 目录和linuxrc 文件。(1)解压busyboxrootlocalhost linux-test# lsbusybox-1.13.3-mini2440.tgzlinux-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.tgzro
14、otlocalhost 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 Makef
15、ile在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
16、 as present in compile.hUTS_MACHINE := $(ARCH)然后保存。(3)配置busybox在busybox顶层目录下执行make menconfig 进行配置rootlocalhost busybox-1.13.3# make menconfig出现如下图配置菜单下面只列出了要注意的地方,没有列出的默认即可。、Busybox Settings- Build Options-* Build BusyBox as a static binary (no shared libs) Force NOMMU build* Build with Large File S
17、upport (for accessing files 2 GB) (arm-linux-) Cross Compiler prefix/指定编译前缀,按回车就可进行修改 Installation Options -* Dont use /usr/选中该项可以避免buysbox被安装到宿主机系统的/usr目录下,破坏宿主机系统。 Applets links (as soft-links) -(/root/linux-test/myrootfs/rootfs) BusyBox installation prefix /这里需要指定busybox的安装路径,按回车即可输入。 Busybox Lib
18、rary 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 promptsLinux Module Utilities-(/lib/modules)Default directory containing modules(modules.de
19、p)Default name of modules.dep下面是在busybox 中配置对dev 下设备类型的支持,dev 的创建有手动创建、使用devfs 文件系统创建和?v创建三种方法,而?v的一个简化版是busybox 自带的mdev ,适合于嵌入式的应用埸合。其具有使用简单的特点。它的作用,就是在系统启动和热插拔或动态加载驱动程序时,自动产生驱动程序所需的节点文件。在以busybox 为基础构建嵌入式linux 的根文件系统时,使用它是最优的选择。Linux System Utilities -*Support /etc/mdev.conf*Support command execut
20、ion at device addition/removalInit Utilities -“Support reading an inittab file”应该选中,这样可以根据自己编写的inittab文件初始化;“Support running commands with a controlling-tty”应该选中,否则会提示非常困扰的“/bin/sh: cant access tty; job control turned off”的提示,尽管可以进入控制台命令行。(4)编译busybox编译busybox 到指定目录,在busybox-1.13.3的根目录下执行make CONFIG
21、_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.-r
22、ootlocalhost 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:lpma
23、il:*: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:
24、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组合
25、键结束录入状态。此时该文件内容为:“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系统启动加载项文
26、件,将下面内容复制并粘贴其中:#!/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.2echo
27、 the fans:singleboyecho Date:2011.5.30echo */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 procdefaults0 0
28、none /tmp ramfsdefaults0 0sysfs /syssysfs defaults0 0mdev /devramfs defaults0 0(7)新建etc/profile用户环境配置文件,将下面内容复制并粘贴其中:#Ash profile#vim:syntax=sh#No core file by defaults#ulimit -S -c 0/dev/null 2&1USER=id -unLOGNAME=$USERPS1=uh W$PATH=$PATHHOSTNAME=/bin/hostnameexport USER LOGNAME PS1 PATH修改环境变量PS1(命
29、令行提示符),可以使用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 :显示
30、时间为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# touc
31、h./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目录rootlocalh
32、ost 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)
33、新建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 -
34、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 r
35、oot 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/nf
36、s 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
37、)确保内核提供nfs boot支持在刚才的配置菜单中定位到 Device Drivers - Memory Technology Device (MTD) support - Caching block device access to MTD devices * Network device support - * Ethernet (10 or 100Mbit) - DM9000 supportFile systems - * Network File Systems - - Network File Systems NFS client support* NFS client suppo
38、rt 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文件系统现在基
39、于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(/r
40、oot/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并不是在内存中模
41、拟出一个磁盘,所以也就不在需要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