千家信息网

linux下如何制作rootfs

发表于:2024-11-11 作者:千家信息网编辑
千家信息网最后更新 2024年11月11日,本篇内容介绍了"linux下如何制作rootfs"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、分
千家信息网最后更新 2024年11月11日linux下如何制作rootfs

本篇内容介绍了"linux下如何制作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等。

2. 基于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

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

二、根文件系统的组成

1. 根文件系统目录内容简介

  • bin :基本的可执行文件

  • opt :添加的软件包

  • boot :启动时需要的一些文件

  • proc :内核及进程信息的虚拟文件系统

  • dev : 设备文件

  • root:root用户目录

  • etc: 系统配置文件

  • sbin:系统管理的程序

  • home : 用户目录

  • tmp : 临时文件

  • lib : 库文件

  • usr : 应用程序

  • mnt : 挂载文件系统的挂载点

  • var : 存放系统日志或一些服务程序的临时文件

2. 嵌入式环境需要移植的目录

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

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

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

  1. 鸿蒙官方战略合作共建--HarmonyOS技术社区

  2. 基本的文件系统结构,包含一些必需的目录比如:/dev,/proc,/bin,/etc,/lib,/usr,/tmp等。

  3. 基本程序运行所需的库函数,如glibc。

  4. 基本的系统配置文件,比如rc.sysinit,inittab等脚本文件。

  5. 必要的设备文件支持:/dev/hd*,/dev/tty*,/dev/fd0。

  6. 基本的应用程序,如sh,ls,cp,mv等。

3. 移植需要做的工作

把全局配置文件放入/etc目录下。

将设备文件信息放入/dev目录下,设备名可以作为符号链接定位在/dev中或/dev子目录中的其他设备存在。

操作系统核心定位在/或/boot,若操作系统核心不是作为文件系统的一个文件存在,不应用它。

库存放的目录是/lib。

存放系统编译后的可执行文件、命令的目录是/bin,/sbin,/usr。

三、 默认预置条件

1) 交叉编译工具

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

/home/peng/toolchain/gcc-4.6.4/

2) tftp服务器

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

peng@ubuntu:~$ 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"

服务器根目录是**/tftpboot**

3) nfs服务器

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

peng@ubuntu:~$ cat /etc/exports  # /etc/exports: the access control list for filesystems which may be exported #  to NFS clients.  See exports(5). # # Example for NFSv2 and NFSv3: # /srv/homes       hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check) # # Example for NFSv4: # /srv/nfs4        gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check) # /srv/nfs4/homes  gss/krb5i(rw,sync,no_subtree_check) # /source/rootfs *(rw,sync,no_subtree_check)

四、文件系统制作步骤

1、 源码下载

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

http://busybox.net/downloads/

2、 解压源码

$ tar  xvf  busybox-1.22.1.tar.bz2

3、 进入源码目录

$ cd  busybox-1.22.1

4、 配置源码

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

$ make menuconfig 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-none-linux-gnueabi-) Cross Compiler prefix    () Additional CFLAGS

5、 编译

$ make

6、 安装

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

$ make  install

7、 进入安装目录下

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

$ cd  _install $ ls bin  linuxrc  sbin  usr

8、 创建其他需要的目录

$ mkdir  dev  etc  mnt  proc  var  tmp  sys  root

9、 添加库

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

$ cp  /home/linux/toolchain/gcc-4.6.4/arm-arm1176jzfssf-linux-gnueabi/lib/  .  -a

修改文件权限并删除静态库和共享库文件中的符号表

$chmod  +w  lib $chmod  +w  lib/* $ rm  lib/*.a $ arm-none-linux-gnueabi-strip  lib/*

删除不需要的库,确保所有库大小不超过8M

$ du  -mh   lib/

10、 添加系统启动文件

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

#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

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

#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

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

修改内核配置:

$ make menuconfig File systems --->   Pseudo filesystems --->     [*] Virtual memory file system support (former shm fs)    [*] Tmpfs POSIX Access Control Lists

重新编译内核

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

#!/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

为rcS添加可执行权限:

$ chmod   +x  init.d/rcS

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

#!/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    该文件节点是必须的

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

11. 测试

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

1.删除原先的/source/rootfs

$ sudo  rm  -rf  /source/rootfs

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

$sudo  mkdir  /source/rootfs $ sudo  cp  _install/*   /source/rootfs   –a

3.设置uboot环境变量

# 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

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


五、制作ramdisk文件系统

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

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

$ cd  ~  dd  if=/dev/zero  of=ramdisk  bs=1k  count=8192 (ramdsik为8M) If: input file Of: output file

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

$ mkfs.ext2  -F  ramdisk

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

$ sudo  mkdir  /mnt/initrd

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

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

$ sudo  mount  -t  ext2   ramdisk  /mnt/initrd

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

$ sudo  cp  /source/rootfs/*   /mnt/initrd  –a

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

6、卸载/mnt/initrd

$ sudo  umount  /mnt/initrd

7、压缩ramdisk为ramdisk.gz

$ gzip  --best  -c  ramdisk  >  ramdisk.gz

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

$ mkimage -n "ramdisk" -A arm -O linux -T ramdisk -C gzip  -d ramdisk.gz  ramdisk.img $ cp  ramdisk.img  /tftpboot

9、配置内核支持RAMDISK

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

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

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

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

# setenv bootcmd tftp 41000000 uImage\;tftp 42000000 exynos4412-fs4412.dtb\;tftp 43000000  ramdisk.img\;bootm 41000000 43000000 42000000 # saveenv

重新启动开发板查看能否正常启动

【注意】 因为各个开发板命令会有所差异,uboot命令的设置要厂家出厂的手册操作。

"linux下如何制作rootfs"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

文件 系统 目录 内核 设备 支持 内容 制作 嵌入式 闪存 应用 开发 配置 用户 程序 服务 编译 不同 日志 服务器 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 指定位置创建数据库的sql语句 百度软件开发工程师面试 畅捷通商贸宝数据库启动不了 怎么使用服务器账号 湖南最新网络安全消息 多个数据库文件如何导单表 数据库如何撤销一次操作 查询数据库所有函数 兴业数金数据库面试题 乡开展网络安全宣传周活动 做软件开发容易吗 实体服务器如何绑定域名 网络安全教育课程的心得 苹果怎么挂vnp服务器地址 公司承担软件开发项目优势 华为信息和网络技术学院 n75服务器繁忙 海康服务器网页不显示怎么办 漳平专业软件开发公司排名 各国成立的网络安全机构部门 新乡软件开发工资标准 如何解除网络安全密码 给大学生网络安全的建议 英语二网络安全专业考研 普安联盟软件开发公司 pes2018数据库 软件开发服务外包 等离子体数值模拟软件开发 胖子吐槽暗黑3登不上服务器 性能测试与网络安全好找工作不
0