当前位置: 首页 > 科技观察

移植Linux:如何制作rootfs?详细教程

时间:2023-03-21 15:55:07 科技观察

粉丝提问如何制作rootfs?安排!如果想直奔主题,直接跳到第四章。一、分析1、文件系统介绍理论上,如果一个嵌入式设备可以运行内核,不需要运行用户进程,那么它就不需要文件系统。系统。文件系统只是一个目录结构。由于linux运行系统的设备以文件的形式存在于系统中。通过对这些文件进行分类管理,并提供与内核交互的接口,形成一定的目录结构,即文件系统。文件系统是为用户反映系统的一种形式。为用户提供检测控制系统的接口。根文件系统,我觉得根文件系统是一种特殊的文件系统,那么根文件系统和普通文件系统有什么区别呢?由于根文件系统是内核启动时第一个挂起的文件系统,那么根文件系统必须包含Linux启动时必须的目录和关键文件;例如Linux启动时,需要在init目录下有相关文件。Linux在挂载一个分区的时候,肯定会找到/etc/fstab挂载文件等,根文件系统还包括很多应用程序bin目录等,任何包含这些启动Linux系统所必需的文件的文件都可以成为根文件系统。Linux支持多种文件系统,包括ext2、ext3、vfat、ntfs、iso9660、jffs、yaffs、romfs和nfs。为了管理各种文件系统,Linux引入了虚拟文件系统VFS(VirtualFileSystem)。为各种文件系统提供统一的操作接口和应用编程接口。Linux启动时,首先要挂载的是根文件系统;如果系统无法挂载指定设备的根文件系统,系统将报错并退出启动。以后可以自动或手动安装其他文件系统。因此,不同的文件系统可以同时存在于一个系统中。不同的文件系统类型具有不同的特性,因此根据存储设备的硬件特性和系统要求,它们有不同的应用场景。在嵌入式Linux应用中,主要的存储设备是RAM(DRAM、SDRAM)和ROM(常使用FLASH存储器)。常用的基于存储设备的文件系统类型包括:jffs2、yaffs、cramfs、romfs、ramdisk、ramfs/tmpfs等。2、基于FLASH的文件系统2.1Cramfs:压缩ROM文件系统?快速高效,其只读特性有助于保护文件系统免受损坏,提高系统的可靠性。由于以上特点,Cramfs在嵌入式系统中得到了广泛的应用。但它的只读属性也是它的一大缺陷,使得用户无法扩展它的内容。Cramfs镜像通常放在Flash中。2.2jffs2?Jffs2:JournallingFlashFileSystemv2(JournallingFlashFileSystemv2)?主要用于NOR闪存,基于MTD驱动层,特点:可读可写,支持数据压缩,基于哈希表的文件系统,并提供日志记录crash/power-off安全保护,提供“writebalance”支持等。?主要缺点是当文件系统满或接近满时,jffs2的运行速度会因为垃圾回收而大大减慢。jffs不适合做NAND闪存主要是因为NAND闪存的容量一般都比较大,导致jffs维护日志节点所占用的内存空间迅速增加。另外,jffs文件系统挂载时需要扫描整个FLASH内容。找出所有的日志节点并建立文件结构,对于大容量的NAND闪存来说会花费很多时间。2.3.yaffs:YetAnotherFlashFileSystem?yaffs/yaffs2是专门为使用NAND闪存的嵌入式系统设计的日志型文件系统。与jffs2相比,它减少了一些功能(例如不支持数据压缩),因此速度更快,挂载时间更短,内存占用更小。另外,它是一个跨平台的文件系统,除了Linux和eCos,还支持WinCE、pSOS和ThreadX等。yaffs/yaffs2有自己的NAND芯片驱动,并提供了直接访问文件的API系统为嵌入式系统。用户可以直接操作文件系统,而无需使用Linux中的MTD和VFS。当然,yaffs也可以与MTD驱动程序一起使用。?yaffs和yaffs2的主要区别是前者只支持smallpage(512Bytes)NANDflashmemory,而后者支持largepage(2KB)NANDflashmemory。同时,yaffs2在内存空间占用、垃圾回收速度、读写速度等方面都有了很大的提升。2.4.网络文件系统NFS(NetworkFileSystem)NFS是Sun开发和发展的一种通过网络在不同机器和不同操作系统之间共享文件的技术。在嵌入式Linux系统的开发调试阶段,利用该技术可以在主机上建立一个基于NFS的根文件系统,挂载到嵌入式设备上,修改根文件系统的内容非常方便。使用的工具:mkfs.cramfs、mkfs.jffs2、mkfs.yaffshttp://sourceforge.net/projects/cramfs/http://sourceforge.net/projects/jffs2os/http://sourceforge.net/projects/yaffs/2.根文件系统的组成一、根文件系统目录内容介绍bin:基本的可执行文件opt:添加的软件包boot:启动时需要的一些文件proc:内核的虚拟文件系统和进程信息dev:设备文件root:根用户目录etc:系统配置文件sbin:系统管理程序home:用户目录tmp:临时文件lib:库文件usr:应用程序mnt:文件系统挂载点var:存放系统日志或一些服务程序的临时文件2.嵌入式环境中需要移植的目录根文件系统中的每个顶级目录都有特定的用途和用途,但并不是所有的目录在嵌入式环境中都需要,我们只创建requiredones一些目录:/bin/sbin/etc/proc/tmp/var/dev/mntLinux根文件系统应该至少包括以下项目。基本文件系统结构,包括一些必要的目录如:/dev、/proc、/bin、/etc、/lib、/usr、/tmp等。基本程序运行所需的库函数,如glibc。基本系统配置文件,如rc.sysinit、inittab等脚本文件。必要的设备文件支持:/dev/hd*、/dev/tty*、/dev/fd0。sh、ls、cp、mv等基本应用。3.移植需要做的工作将全局配置文件放到/etc目录下。将设备文件信息放入/dev目录,设备名称可以作为符号链接定位到/dev或/dev子目录下的其他设备。操作系统内核位于/或/boot。如果操作系统内核不作为文件存在于文件系统中,则不使用它。存放库的目录是/lib。存放系统编译的可执行文件和命令的目录有/bin、/sbin、/usr。3、默认预设条件1)交叉编译工具需要预装交叉编译器。一口君安装的版本为:arm-none-linux-gnueabi-gcc。ubuntu中默认安装目录为:/home/peng/toolchain/gcc-4.6.4/2)tftpserver开发板需要使用tftpserver下载内核镜像和设备树。配置信息如下:peng@ubuntu:~$cat/etc/default/tftpd-hpa#/etc/default/tftpd-hpaTFTP_USERNAME="tftp"TFTP_DIRECTORY="/tftpboot"TFTP_ADDRESS="0.0.0.0:69"TFTP_OPTIONS="--secure"服务器根目录为**/tftpboot**3)nfs服务器内核启动后,需要通过nfs服务器挂载文件系统,nfs服务器设置如下:peng@ubuntu:~$cat/etc/exports#/etc/exports:theaccesscontrollistforfilesystemwhichmaybeexported#toNFSclients.Seeexports(5).##NFSv2andNFSv3的例子:#/srv/homeshostname1(rw,sync,no_subtree_check)hostname2(ro,sync,no_subtree_check)##NFSv4示例:#/srv/nfs4gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check)#/srv/nfs4/homesgss/krb5i(rw,sync,no_subtree_check)#/source/rootfs*(rw,sync,no_subtree_check)4.文件系统创建步骤1.源码下载我们选择的版本是busybox-1.22.1.tar.bz2下载路径是:http://busybox.net/downloads/2、解压源码$tarxvfbusybox-1.22.1.tar.bz23,进入源代码目录$cdbusybox-1.22。14、配置源码选择制作静态库,设置交互编译工具链前缀arm-none-linux-gnueabi。如果是其他toolchain,按照example填写即可$makemenuconfigBusyboxSettings--->BuildOptions--->[*]BuildBusyBoxasastaticbinary(nosharedlibs)[]ForceNOMMUbuild[]BuildwithLargeFileSupport(foraccessingfiles>2GB)(arm-none-linux-gnueabi-)CrossCompilerprefix()AdditionalCFLAGS5,编译$make6,安装busybox默认安装路径为源码目录下_install$makeinstall7,进入安装目录默认创建以下4个文件或文件夹$cd_install$lsbinlinuxrcsbinusr8,创建其他需要的目录$mkdirdevetcmntprocvartmpsysroot9,在我们安装的crosstoolchain中添加库需要的开发板上可以使用的库可以复制到_install目录下:$cp/home/linux/toolchain/gcc-4.6.4/arm-arm1176jzfssf-linux-gnueabi/lib/.-a修改文件权限,删除符号静态库和共享库中的表$chmod+wlib$chmod+wlib/*$rmlib/*.a$arm-none-linux-gnueabi-striplib/*删除不需要的库,确保所有库的大小不超过800万du-mhlib/10。添加系统启动文件。在etc下添加文件inittab,文件内容如下:#thisisrunfirstexceptwhenbootinginsingle-usermode.::sysinit:/etc/init.d/rcS#/bin/shinvocationsonselectedttys#startan"askfirst"shellontheconsole(whateverthatmaybe)::askfirst:-/bin/sh#stufftodowhenrestartingtheinitprocess::restart:/sbin/init#stufftodobeforerebooting::ctrlaltdel:/sbin/reboot在etc下添加文件fstab,文件内容如下:#devicemount-pointtypeoptionsdumpfsckorderproc/procprocdefaults00tmpfs/tmptmpfsdefaults00sysfs/syssysfsdefaults00tmpfs/devtmpfsdefaults00【注意】这里我们挂载proc、sysfs内核、proc和sssysfs三个文件系统默认是支持的,但是不支持tmpfs,我们需要保证内核有tmpfs支持。修改内核配置:$makemenuconfigFilesystems--->Pseudofilesystems--->[*]Virtualmemoryfilesystemsupport(formershmfs)[*]TmpfsPOSIXAccessControlLists重新编译内核在etc下创建init.d目录,并在init.d下创建rcS文件和rcS文件内容是:#!/bin/sh#Thisisthefirstscriptcalledbyinitprocess/bin/mount-amountsallfilesystemsmadebyfstabecho/sbin/mdev>/proc/sys/kernel/hotplug/sbin/mdev-saddsexecutableforrcSPermission:$chmod+xinit.d/rcS在etc下添加一个profile文件,文件内容为:#!/bin/shexportHOSTNAME=farsightexportUSER=rootexportHOME=rootexportPS1="[$USER@$HOSTNAME\W]\#"PATH=/bin:/sbin:/usr/bin:/usr/sbinLD_LIBRARY_PATH=/lib:/usr/lib:$LD_LIBRARY_PATHexportPATHLD_LIBRARY_PATHmknoddev/consolec51这个文件节点是必要且重要的:如果新建的文件系统大小超过8M,删除不需要的库文件,比如c++库等等。11、测试后的根文件系统可以在开发板启动后通过nfs挂载到ubuntu。1、删除原来的/source/rootfs$sudorm-rf/source/rootfs2。复制我们新的根文件系统到/source/rootfs目录下$sudomkdir/source/rootfs$sudocp_install/*/source/rootfs–a3。Setubootenvironmentvariables#setenvserverip192.168.9.120#setenvipaddr192.168.9.233#setenvbootcmdtftp41000000uImage\;tftp42000000exynos441;2\exynos4412bootm41000000–42000000#setenvbootargsroot=/dev/nfsnfsroot=192.168.9.120:/source/rootfsrwconsole=ttySAC2,115200init=/linuxrcip=192.168.9.233#saveenv重启开发板,查看是否可以正常挂载,功能是否正常ramdisk文件系统通过NFS测试后,即可创建ramdisk文件系统,如下:1.制作一个大小为8M的镜像文件$cd~ddif=/dev/zeroof=ramdiskbs=1kcount=8192(ramdsik为8M)如果:inputfileOf:outputfile2,将镜像文件格式化为ext2$mkfs.ext2-Framdisk3,创建initrd目录mount下为挂载点$sudomkdir/mnt/initrd4,将磁盘镜像文件挂载到/mnt/initrd注意这里的ramdisk不能存放在rootfs目录下$sudomount-text2ramdisk/mnt/initrd5,将测试的内容全部复制文件系统到/mnt/initrd目录$sudocp/source/rootfs/*/mnt/initrd–a如果复制遇到错误,需要再次删除不需要的库,如c++库6,卸载/mnt/initrd$sudoumount/mnt/initrd7,压缩ramdiskramdisk.gz$gzip--best-cramdisk>ramdisk.gz8,格式化成uboot可识别的格式,复制到/tftpboot$mkimage-n"ramdisk"-Aarm-Olinux-Tramdisk-Cgzip-dramdisk.gzramdisk.img$cpramdisk。img/tftpboot9,配置内核支持RAMDISK制作完initrd.img.gz后,需要配置内核支持RAMDISK作为启动文件系统--><*>RAMblockdevicesupport(16)DefaultnumberofRAMdisks(8192)DefaultRAMdisksize(kbytes)(修改为8M)Generalsetup--->[*]InitialRAMfilesystemandRAMdisk(initramfs/initrd)支持重新编译内核,复制到/tftpboot10,在U盘-BOOT命令行重新设置启动参数:#setenvbootcmdtftp41000000uImage\;tftp42000000exynos4412-fs4412.dtb\;tftp43000000ramdisk.img\;bootm410000004300000042000000#saveenv命令会重启开发板查看是否可以正常启动因为uboot不同各个开发板的设置需要厂家手动操作