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

caocao1年前教程196

在线wifi跑包 金刚包跑包 cap跑包 hccapx ewsa在线 就来 曹操wifi

各位好 又见面了 我是曹操 今天给大家带来一篇新的教程

希望各位细心学习 低调用网

http://sourceforge.net/projects/cramfs/
http://sourceforge.net/projects/jffs2os/
http://sourceforge.net/projects/yaffs/

粉丝问题 如何制作rootfs? 安排! 想直奔主题的,直接跳到第四章。

一、分析

  1. 文件系统简介

理论上说一个嵌入式设备如果内核能够运行起来,且不需要运行用户进程的话,是不需要文件系统的,文件系统简单的说就是一种目录结构,由于linux操作系统的设备在系统中是以文件的形式存在,将这些文件进行分类管理以及提供和内核交互的接口,就形成一定的目录结构也就是文件系统,文件系统是为用户反映系统的一种形式,为用户提供一个检测控制系统的接口。

根文件系统,我认为根文件系统就是一种特殊的文件系统,那么根文件系统和普通的文件系统有什么区别呢?由于根文件系统是内核启动时挂载的第一个文件系统,那么根文件系统就要包括Linux启动时所必须的目录和关键性的文件,例如Linux启动时都需要有init目录下的相关文件,在Linux挂载分区时Linux一定会找/etc/fstab这个挂载文件等,根文件系统中还包括了许多的应用程序bin目录等,任何包括这些Linux系统启动所必须的文件都可以成为根文件系统。

Linux支持多种文件系统,包括ext2、ext3、vfat、ntfs、iso9660、jffs、yaffs、romfs和nfs等,为了对各类文件系统进行统一管理,Linux引入了虚拟文件系统VFS(Virtual File System),为各类文件系统提供一个统一的操作界面和应用编程接口。

Linux启动时,第一个必须挂载的是根文件系统;若系统不能从指定设备上挂载根文件系统,则系统会出错而退出启动。之后可以自动或手动挂载其他的文件系统。因此,一个系统中可以同时存在不同的文件系统。不同的文件系统类型有不同的特点,因而根据存储设备的硬件特性、系统需求等有不同的应用场合。在嵌入式Linux应用中,主要的存储设备为RAM(DRAM, SDRAM)和ROM(常采用FLASH存储器),常用的基于存储设备的文件系统类型包括:jffs2, yaffs, cramfs, romfs, ramdisk, ramfs/tmpfs等。

  1. 基于FLASH的文件系统

2.1 Cramfs:Compressed ROM File System

  • 它的速度快,效率高,其只读的特点有利于保护文件系统免受破坏,提高了系统的可靠性。由于以上特性,Cramfs在嵌入式系统中应用广泛。但是它的只读属性同时又是它的一大缺陷,使得用户无法对其内容对进扩充。Cramfs映像通常是放在Flash中。

2.2 jffs2

  • Jffs2: 日志闪存文件系统版本2 (Journalling Flash FileSystem v2)
  • 主要用于NOR型闪存,基于MTD驱动层,特点是:可读写的、支持数据压缩的、基于哈希表的日志型文件系统,并提供了崩溃/掉电安全保护,提供“写平衡”支持等。
  • 缺点主要是当文件系统已满或接近满时,因为垃圾收集的关系而使jffs2的运行速度大大放慢。jffs不适合用于NAND闪存主要是因为NAND闪存的容量一般较大,这样导致jffs为维护日志节点所占用的内存空间迅速增大,另外,jffs文件系统在挂载时需要扫描整个FLASH的内容,以找出所有的日志节点,建立文件结构,对于大容量的NAND闪存会耗费大量时间。

2.3.yaffs:Yet Another Flash File System

  • yaffs/yaffs2是专为嵌入式系统使用NAND型闪存而设计的一种日志型文件系统。与jffs2相比,它减少了一些功能(例如不支持数据压缩),所以速度更快,挂载时间很短,对内存的占用较小。另外,它还是跨平台的文件系统,除了Linux和eCos,还支持WinCE, pSOS和ThreadX等。yaffs/yaffs2自带NAND芯片的驱动,并且为嵌入式系统提供了直接访问文件系统的API,用户可以不使用Linux中的MTD与VFS,直接对文件系统操作。当然,yaffs也可与MTD驱动程序配合使用。
  • yaffs与yaffs2的主要区别在于,前者仅支持小页(512 Bytes) NAND闪存,后者则可支持大页(2KB) NAND闪存。同时,yaffs2在内存空间占用、垃圾回收速度、读/写速度等方面均有大幅提升。

2.4. 网络文件系统NFS (Network File System)

NFS是由Sun开发并发展起来的一项在不同机器、不同操作系统之间通过网络共享文件的技术。

在嵌入式Linux系统的开发调试阶段,可以利用该技术在主机上建立基于NFS的根文件系统,挂载到嵌入式设备,可以很方便地修改根文件系统的内容。

所采用的工具:mkfs.cramfs,mkfs.jffs2,mkfs.yaffs

 /bin /sbin  /etc /proc  /tmp  /var /dev  /mnt

二、根文件系统的组成

  1. 根文件系统目录内容简介
  2. 嵌入式环境需要移植的目录

根文件系统中的每一个顶级目录都有特定的用途和目的,但并不是所有的目录在嵌入式环境下都需要,我们只创建需要的一些目录:

/home/peng/toolchain/gcc-4.6.4/

Linux的根文件系统至少应包括以下几项内容。

  • 基本的文件系统结构,包含一些必需的目录比如:/dev,/proc,/bin,/etc,/lib,/usr,/tmp等。基本程序运行所需的库函数,如glibc。
  • 基本的系统配置文件,比如rc.sysinit,inittab等脚本文件。
  • 必要的设备文件支持:/dev/hd,/dev/tty,/dev/fd0。
  • 基本的应用程序,如sh,ls,cp,mv等。
  1. 移植需要做的工作
  • 把全局配置文件放入/etc目录下。
  • 将设备文件信息放入/dev目录下,设备名可以作为符号链接定位在/dev中或/dev子目录中的其他设备存在。
  • 操作系统核心定位在/或/boot,若操作系统核心不是作为文件系统的一个文件存在,不应用它。
  • 库存放的目录是/lib。
  • 存放系统编译后的可执行文件、命令的目录是/bin,/sbin,/usr。

三、默认预置条件

1)交叉编译工具

需要预先安装好交叉编译器,一般安装版本是:arm-none-linux-gnueabi-gcc,默认在ubuntu中安装目录是:

peng@ubuntu:~nbsp;cat /etc/default/tftpd-hpa 
# /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/tftpboot"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure"

2)tftp服务器

开发板下载内核镜像和设备树需要借助tftp服务器,配置信息如下:

服务器根目录是/tftpboot

3)nfs服务器

内核启动后挂载文件系统需要通过nfs服务器,nfs服务器设置如下:

http://busybox.net/downloads/

四、文件系统制作步骤

1、源码下载

我们选择的版本是busybox-1.22.1.tar.bz2下载路径为:

2、解压源码

3、进入源码目录

4、配置源码

选择制作静态库,并设置交互编译工具链的前缀arm-none-linux-gnueabi- 如果是其他工具链,按照例子填写即可。

nbsp;make
nbsp;make  install 
nbsp;cd  _install
nbsp;ls
bin  linuxrc  sbin  usr
nbsp;mkdir  dev  etc  mnt  proc  var  tmp  sys  root 
nbsp;cp  /home/linux/toolchain/gcc-4.6.4/arm-arm1176jzfssf-linux-gnueabi/lib/  .  -a

5、编译

6、安装

busybox默认安装路径为源码目录下的_install

7、进入安装目录下

默认创建以下4个文件或者文件夹

8、创建其他需要的目录

9、添加库

我们安装的交叉工具链中有我们所需要的可以在开发板上使用的库,将其拷贝到_install目录下即可:

$chmod  +w  lib
$chmod  +w  lib/*
nbsp;rm  lib/*.a
nbsp;arm-none-linux-gnueabi-strip  lib/*
nbsp;du  -mh   lib/
#this is run first except when booting in single-user mode.
::sysinit:/etc/init.d/rcS
# /bin/sh invocations on selected ttys
# start an "askfirst" shell on the console (whatever that may be)
::askfirst:-/bin/sh
# stuff to do when restarting the init process
::restart:/sbin/init
# stuff to do before rebooting
::ctrlaltdel:/sbin/reboot
#device     mount-point   type      options         dump     fsck order
proc      /proc         proc      defaults       0       0
tmpfs  /tmp         tmpfs     defaults          0           0
sysfs      /sys          sysfs     defaults         0           0
tmpfs   /dev         tmpfs     defaults          0           0

修改文件权限并删除静态库和共享库文件中的符号表 删除不需要的库,确保所有库大小不超过8M

10、添加系统启动文件

在etc下添加文件inittab,文件内容如下:

在etc下添加文件fstab,文件内容如下:

nbsp;make menuconfig
File systems --->
  Pseudo filesystems ---> 
   [*] Virtual memory file system support (former shm fs)
   [*] Tmpfs POSIX Access Control Lists
#!/bin/sh
# This is the first script called by init process
/bin/mount  -a  挂载fstab制定的所有文件系统
echo  /sbin/mdev  >  /proc/sys/kernel/hotplug
/sbin/mdev  -s

【注意】这里我们挂载的文件系统有三个proc、sysfs和tmpfs。在内核中proc和sysfs默认都支持,而tmpfs是没有支持的,我们需要确保内核有tmpfs的支持。

修改内核配置:

重新编译内核

在etc下创建init.d目录,并在init.d下创建rcS文件,rcS文件内容为:

nbsp;chmod   +x  init.d/rcS
#!/bin/sh
export HOSTNAME=farsight
export USER=root
export HOME=root
export PS1="[$USER@$HOSTNAME \W]\# "
PATH=/bin:/sbin:/usr/bin:/usr/sbin
LD_LIBRARY_PATH=/lib:/usr/lib:$LD_LIBRARY_PATH
export PATH  LD_LIBRARY_PATH
mknod dev/console c  5  1    该文件节点是必须的
nbsp;sudo  rm  -rf  /source/rootfs 

为rcS添加可执行权限:

在etc下添加profile文件,文件内容为:

重要:新制作的文件系统尺寸若超出8M,删除不需要的库文件,比如c++库等。

  1. 测试

制作完毕的根文件系统可以让开发板启动后通过nfs挂载到ubuntu中,删除原先的/source/rootfs

$sudo  mkdir  /source/rootfs
nbsp;sudo  cp  _install/*   /source/rootfs   –a
# setenv serverip 192.168.9.120
# setenv ipaddr 192.168.9.233
# setenv bootcmd tftp 41000000 uImage\;tftp 42000000 exynos4412-fs4412.dtb\;bootm 41000000  –  42000000
#setenv bootargs root=/dev/nfs nfsroot=192.168.9.120:/source/rootfs rw console=ttySAC2,115200  init=/linuxrc  ip=192.168.9.233
# saveenv
 nbsp;cd  ~
nbsp;dd  if=/dev/zero  of=ramdisk  bs=1k  count=8192 (ramdsik为8M)
 If: input file
 Of: output file

将我们新建的根文件系统拷贝到/source/rootfs目录下

设置uboot环境变量

重新启动开发板,查看是否能够正常挂载,功能是否正常

五、制作ramdisk文件系统

通过NFS测试以后,就可以制作ramdisk文件系统了,具体如下:

1、制作一个大小为8M的镜像文件

nbsp;mkfs.ext2  -F  ramdisk
nbsp;sudo  mkdir  /mnt/initrd
nbsp;sudo  mount  -t  ext2   ramdisk  /mnt/initrd

2、格式化这个镜像文件为ext2

3、在mount下面创建initrd目录作为挂载点

4、将这个磁盘镜像文件挂载到/mnt/initrd下

注意这里的ramdisk不能存放在rootfs目录中

nbsp;sudo  cp  /source/rootfs/*   /mnt/initrd  –a
nbsp;sudo  umount  /mnt/initrd
nbsp;gzip  --best  -c  ramdisk  >  ramdisk.gz

5、将测试好的文件系统里的内容全部拷贝到 /mnt/initrd目录下面

如果拷贝遇到错误,需要再次删除不需要的库,比如c++库

6、卸载/mnt/initrd

7、压缩ramdisk为ramdisk.gz

nbsp;mkimage -n "ramdisk" -A arm -O linux -T ramdisk -C gzip  -d ramdisk.gz  ramdisk.img
nbsp;cp  ramdisk.img  /tftpboot
make menuconfig
File systems  --->
  <*> Second extended fs support
Device Drivers
  SCSI device support  --->
   <*> SCSI disk support
  Block devices  --->
   <*>RAM  block  device  support   
   (16)Default number of RAM disks  
   (8192) Default RAM disk size (kbytes)   (修改为8M) 
General setup  --->
  [*] Initial RAM filesystem and RAM disk (initramfs/initrd) support
# setenv bootcmd tftp 41000000 uImage\;tftp 42000000 exynos4412-fs4412.dtb\;tftp 43000000  ramdisk.img\;bootm 41000000 43000000 42000000
# saveenv

8、格式化为uboot识别的格式并拷贝到/tftpboot下

9、配置内核支持RAMDISK

制作完 initrd.img.gz后,需要配置内核支持RAMDISK作为启动文件系统

重新编译内核,复制到/tftpboot

10、在U-BOOT命令行重新设置启动参数:

相关文章

unetbootin(启动盘安装器)下载地址

unetbootin(启动盘安装器)下载地址

在线wifi跑包 金刚包跑包 cap跑包 hccapx ewsa在线 就来 曹操wifi 各位好 又见面了 我是曹操 今天给大家带来一篇新的教程 希望各位细心学习 低调用网 unetbootin使用...

2020年了还有人不会下载msdn的系统?那你还不赶紧点进来看!msdn使用教程

2020年了还有人不会下载msdn的系统?那你还不赶紧点进来看!msdn使用教程

在线wifi跑包 金刚包跑包 cap跑包 hccapx ewsa在线 就来 曹操wifi 各位好 又见面了 我是曹操 今天给大家带来一篇新的教程 希望各位细心学习 低调用网 嗨,朋友们!你们知道吗?...

KALI LINUX 安装中文输入法

KALI LINUX 安装中文输入法

在线wifi跑包 金刚包跑包 cap跑包 hccapx ewsa在线 就来 曹操wifi 各位好 又见面了 我是曹操 今天给大家带来一篇新的教程 希望各位细心学习 低调用网 回答1:在 Kali L...

syslinux制作u盘linux linux怎么做u盘启动

syslinux制作u盘linux linux怎么做u盘启动

在线wifi跑包 金刚包跑包 cap跑包 hccapx ewsa在线 就来 曹操wifi 各位好 又见面了 我是曹操 今天给大家带来一篇新的教程 希望各位细心学习 低调用网 Linux系统写入U盘方...