全国旗舰校区

不同学习城市 同样授课品质

北京

深圳

上海

广州

郑州

大连

武汉

成都

西安

杭州

青岛

重庆

长沙

哈尔滨

南京

太原

沈阳

合肥

贵阳

济南

下一个校区
就在你家门口
+
当前位置:首页  >  技术干货

制作Ramdisk文件系统

发布时间:2022-12-28 11:51:09
发布人:wjy

  制作根文件系统需要有如下目录:/dev、/bin、/usr、/sbin、/lib、/etc、/proc 和/sys。下面分别简单介绍各个目录中存放的文件。

  (1)/dev 目录下存放的是设备文件,用于访问系统资源或设备,如串口、U 盘、硬盘、系统内存等。在 Linux 中所有的设备都被抽象成了文件,用户访问设备就像访问普通文件一样。在/dev 目录下,每个文件可用 mknod 建立。/dev 目录下主要的设备文件包括以下几个。

制作 Ramdisk 文件系统216

  (2)/bin、/usr/bin、/usr/sbin、/sbin 存放的是二进制可执行文件,这部分内容通常通过编译 busybox 获得。

  (3)/lib 用于存放动态链接库。

  (4)/etc 是用来存放初始化脚本和其他配置文件的。启动脚本位于/etc/rc.d/init.d 中,系统最先运行的服务是那些放在/etc/rc.d 目录下的文件,运行级别在文件/etc/inittab 中指定。

  (5)/proc 是用来挂载存放系统信息虚拟文件的系统,不保存在系统硬盘中,是内存映射。它包含一些和系统相关的信息,如 CPU 的信息。

  (6)/sys 该目录下安装了 2.6 内核中新出现的 sysfs 文件系统,sysfs 集成了 3 种文件系统的信息:针对进程信息的 proc 文件系统、针对设备的 devfs 文件系统及针对伪终端的devpts 文件系统。sysfs 是内核设备树的一个直观反映。当一个内核对象被创建时,会在内核对象子系统中创建对应的文件和目录。

  下面将详细介绍 Ramdisk 的制作过程。

  1.建立根文件目录

  前面提到过根文件目录主要包括/dev、/bin、/usr、/sbin、/lib、/etc、/proc、/sys、/var

  和/tmp。下面给出建立根文件目录的命令:

  #cd /usr/local

  #mkdir rootfs

  #cd rootfs

  #mkdir bin dev etc lib proc sbin tmp usr var sys

  #chmod 777 tmp

  #mkdir usr/bin usr/lib usr/sbin

  #mkdir var/lib var/lock var/log var/run var/tmp

  #chmod 777 var/tmp

  2.编译Busybox

  编译 Busybox 可以得到绝大多数目录和工具,可以简化设计和开发时间。在下载和使 用 busybox 时,注意要使用稳定版本(stable)。例如,Busybox 1.21.1 是稳定版本,而 Busybox 1.21.0 是非稳定版本,建议读者在初学时使用稳定版本。编译 Busybox 前必须对需要的工具进行配置,通过图形界面选择工具,选择的原则是 尽量选择必要的工具。下面是解压和进入配置界面命令:

  #tar jxvf busybox-1.21.1.tar.bz2

  #cd busybox-1.21.1

  #make menuconfig

  (1)进入配置界面后,依次选择 Busybox Settings-->Build Options--->,在该窗口中设置将 Busybox 编译成静态库,选择交叉编译器,

制作 Ramdisk 文件系统1367

  (2)配置安装选项,依次选择 Busybox Settings-->Installation Options--->,进入 Installation Options 窗口后设置 busybox 的安装目录为/usr/local/rootfs,即前面创建的根文件 目录,

制作 Ramdisk 文件系统1508

  (3)配置关于档案工具选项(Archival Utilities),该窗口中有常用的压缩(bzip2)、 解压(bunzip2)和安装软件包工具(rpm)等。可以选择常用的工具,也可以按照默认的 选择进行配置,

制作 Ramdisk 文件系统1620

  (4)配置核心工具选项(Coreutils),该窗口中包括打印日历(cal)、修改权限(chmod)、 复制(cp)、移动文件(mv)等,可以选择常用的工具,也可以按照默认的选择进行配置,

制作 Ramdisk 文件系统1722

  (5)配置控制台工具(Console Utilities),该窗口中的工具在实际中用的比较少,常用的有清除控制台(clear)、重置(reset)控制台等,可以根据需要选择

制作 Ramdisk 文件系统1815

  (6)Debian Utilities 和 Mail Utilities,这两项工具在嵌入式系统中基本没有用到,可以不用配置这两个选项。

  (7)配置 Editors 时,可以只选 VI 和 diff 工具。

  (8)必须配置初始化工具(Init Utilities),并且在该窗口中一定要选择 Support reading an inittab file,支持 init 读取/etc/inittab 配置文件,

制作 Ramdisk 文件系统2030

  (9)必须配置网络工具(Networking Utilities),要与开发板进行通信,或者上传文件 到开发板上时,需要通过网络进行传输。因此,需要设置 IP 工具(ifconfig)、文件传输 工具(FTP)等,可以不用支持 IPv6、ARP 等工具

制作 Ramdisk 文件系统2163

  (10)必须配置 Shell 工具,选择命令 Shell 进入 Shell 窗口,选择 ash,

制作 Ramdisk 文件系统2218

  (11)保存配置,选择 Save Configuration to an Alternate File,退出配置窗口后执行下 面的命令进行编译安装busybox 到/usr/local/rootfs 目录下

  #make install

  3.将交叉编译器库复制到 rootfs/lib下

  (1)将交叉编译器目录下库文件复制到 rootfs/lib 中时,注意查看所复制的目录下是否 有 libm、libpthread 等常用库。进入/usr/local/arm/4.4.3/arm-none-linux-gnueabi/libc/lib 下, 查看目录下的库文件,是否存在需要的库文件。

  #cd /usr/local/arm/4.4.3/arm-none-linux-gnueabi/libc/lib

  #ls

  ld-2.9.so libmudflap.a libresolv-2.9.so

  ld-linux.so.3 libmudflap.la libresolv.so.2

  libanl-2.9.so libmudflap.so librt-2.9.so

  libanl.so.1 libmudflap.so.0 librt.so.1

  libBrokenLocale-2.9.so libmudflap.so.0.0.0 libSegFault.so

  libBrokenLocale.so.1 libmudflapth.a libssp.a

  libc-2.9.so libmudflapth.la libssp.la

  libcrypt-2.9.so libmudflapth.so libssp_nonshared.a

  libcrypt.so.1 libmudflapth.so.0 libssp_nonshared.la

  libc.so.6 libmudflapth.so.0.0.0 libssp.so

  libdl-2.9.so libnsl-2.9.so libssp.so.0

  libdl.so.2 libnsl.so.1 libssp.so.0.0.0

  libgcc_s.so libnss_compat-2.9.so libstdc++.a

  libgcc_s.so.1 libnss_compat.so.2 libstdc++.la

  libgomp.a libnss_dns-2.9.so libstdc++_pic.a

  libgomp.la libnss_dns.so.2 libstdc++.so

  libgomp.so libnss_files-2.9.so libstdc++.so.6

  libgomp.so.1 libnss_files.so.2 libstdc++.so.6.0.13

  libgomp.so.1.0.0 libnss_hesiod-2.9.so libsupc++.a

  libgomp.spec libnss_hesiod.so.2 libsupc++.la

  libiberty.a libnss_nis-2.9.so libthread_db-1.0.so

  libid3tag.so libnss_nisplus-2.9.so libthread_db.so.1

  libid3tag.so.0 libnss_nisplus.so.2 libts-0.0.so.0

  libid3tag.so.0.3.0 libnss_nis.so.2 libts-0.0.so.0.1.1

  libjpeg.so libpcprofile.so libts.so

  libjpeg.so.62 libpng12.so libutil-2.9.so

  libjpeg.so.62.0.0 libpng12.so.0 libutil.so.1

  libm-2.9.so libpng12.so.0.35.0 libuuid.so

  libmad.so libpng.so libuuid.so.1

  libmad.so.0 libpng.so.3 libuuid.so.1.2

  libmad.so.0.2.1 libpng.so.3.35.0 libz.a

  libmemusage.so libpthread-2.9.so

  libm.so.6 libpthread.so.0

  (2)执行库文件的复制过程。复制完成后进入/usr/local/rootfs/lib 查看是否复制了需要的库文件。

  #cd /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/lib

  #for file in libc libcrypt libdl libm libpthread libresolv libutil

  >do

  >cp $file-*.so /usr/local/rootfs/lib

  >cp -d $file.so.[*0-9] /usr/local/rootfs/lib

  >done

  #cp -d ld*.so* /usr/local/rootfs/lib

  #cd /usr/local/rootfs/lib

  #ls

  ld-2.9.so libcrypt.so.1 libm-2.9.so libresolv-2.9.so

  ld-linux.so.3 libc.so.6 libm.so.6 libresolv.so.2

  libc-2.9.so libdl-2.9.so libpthread-2.9.so libutil-2.9.so

  libcrypt-2.9.so libdl.so.2 libpthread.so.0 libutil.so.1

  4.建立所需设备文件

  需要的设备文件结点包括控制台 console、内存 mem 等。建立各个设备结点的参数包括设备类型、主设备号和次设备号。建立结点命令如下:

  # cd /usr/local/rootfs/dev

  # mknod console c 5 1

  # mknod full c 1 7

  # mknod kmem c 1 2

  # mknod mem c 1 1

  # mknod null c 1 3

  # mknod port c 1 4

  # mknod random c 1 8

  # mknod urandom c 1 9

  # mknod zero c 1 5

  # for i in `seq 0 7`; do mknod loop$i b 7 $i; done

  # for i in `seq 0 9`; do mknod ram$i b 1 $i; done

  # ln -s ram1 ram

  # mknod tty c 5 0

  # for i in `seq 0 9`; do mknod tty$i c 4 $i; done

  # for i in `seq 0 9`; do mknod vcs$i b 7 $i; done

  # ln -s vcs0 vcs

  # for i in `seq 0 9`; do mknod vcsa$i b 7 $i; done

  # ln -s vcsa0 vcsa

  注意:符号` `并非键盘上的单引号,而是键盘左上方的波浪号对应的键。建立完成后可以查看在/usr/local/rootfs/dev 目录下建立的设备结点有:

  console loop3 null ram3 ram9 tty3 tty9 vcs3 vcs9 vcsa4 zero

  full loop4 port ram4 random tty4 urandom vcs4 vcsa vcsa5

  kmem loop5 ram ram5 tty tty5 vcs vcs5 vcsa0 vcsa6

  loop0 loop6 ram0 ram6 tty0 tty6 vcs0 vcs6 vcsa1 vcsa7

  loop1 loop7 ram1 ram7 tty1 tty7 vcs1 vcs7 vcsa2 vcsa8

  loop2 mem ram2 ram8 tty2 tty8 vcs2 vcs8 vcsa3 vcsa9

  5.建立文件系统映像文件

  准备目标系统启动所需要的文件 rcS、inittab 和 fstab。这 3 个文件是制作文件系统最

  重要的文件。下面给出各个文件的内容。

  (1)/etc/init.d/rcS:挂载/etc/fstab 指定的文件系统。

  #! /bin/sh

  /bin/mount –a

  (2)/etc/inittab:init 进程的配置文件。

  ::sysinit:/etc/init.d/rcS

  ::askfirst:-/bin/bash

  ::restart:/sbin/init

  ::ctrlaltdel:/sbin/reboot

  ::shutdown:/bin/umount –a –r

  (3)/etc/fstab:指定需要挂载的文件系统。

  proc /proc proc defaults 0 0

  tmpfs /tmp tmpfs defaults 0 0

  sysfs /sys sysfs defaults 0 0

  tmpfs /dev tmpfs defaults 0 0

  var /dev tmpfs defaults 0 0

  6.建立文件系统映像文件

  建立根文件系统挂载点:

  # mkdir /mnt/ramdisk

  建立大小为 8192 的根文件系统:

  # mke2fs -vm0 /dev/ram 8192

  细节中打印的细节信息中包括块的个数、块的大小、结点个数等信息。

  mke2fs 1.39 (29-May-2006) Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) 2048 inodes, 2048 blocks 0 blocks (0.00%) reserved for the super user First data block=0 1 block group 32768 blocks per group, 32768 fragments per group 2048 inodes per group Writing inode tables: done Writing superblocks and filesystem accounting information: done This filesystem will be automatically checked every 30 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override.

  挂载根文件系统:

  # mount -t ext2 /dev/ram /mnt/ramdisk

  对文件系统进行操作,将制作的文件系统复制到挂载点:

  # cp -af /usr/local/rootfs/* /mnt/ramdisk

  退出/mnt/ramdisk 目录才能进行卸载:

  # cd /

  卸载文件:

  # umount /mnt/ramdisk

  文件系统生成:

  # dd if=/dev/ram of=ramdisk bs=1k count=8192

  制作文件系统映像:

  # gzip -v9 ramdisk

  生成的映像文件为 ramdisk,压缩后为 ramdisk.gz。

  7.内核中支持RAM文件系统的初始化

  在编译内核时,在 General setup 窗口中选择[*] Initial RAM filesystem and RAM disk

  (initramfs/initrd) support ,同时在 Initramfs source 中传递初始化参数:

  initrd=0x21100000,8000000 root=/dev/ram rw init=linuxrc console=ttyS0, 115200, mem=32M

制作 Ramdisk 文件系统7424

  本文摘自《linux系统移植(第2版)》,文章仅供于学习交流。

相关文章

黑石服务器是什么?

黑石服务器是什么?

2023-10-14
Rx和Tx是什么?

Rx和Tx是什么?

2023-10-14
重大应急管理(MME)是什么?

重大应急管理(MME)是什么?

2023-10-14
直播系统使用什么语言编写的?

直播系统使用什么语言编写的?

2023-10-14

最新文章

常见网络安全面试题:Windows常用的命令有哪些?

常见网络安全面试题:Windows常用的命令有哪些?

2023-10-09
常见网络安全面试题:根据设备告警如何展开排查?

常见网络安全面试题:根据设备告警如何展开排查?

2023-10-09
常见网络安全面试题:mysql加固呢?(数据库加固)

常见网络安全面试题:mysql加固呢?(数据库加固)

2023-10-09
常见网络安全面试题:windows和linux加固?(操作系统加固)

常见网络安全面试题:windows和linux加固?(操作系统加固)

2023-10-09
在线咨询 免费试学 教程领取