2025年Linux文件系统——ramdisk根文件系统制作

Linux文件系统——ramdisk根文件系统制作ram disk 介绍 ram disk 顾名思义 内存磁盘 我们平常接触的一些存储介质 如 nor flash nand flash emmc ufs 以及机械硬盘固态硬盘等 都是用来存储数据的 同理内存也是可以当成磁盘来存储数据的 唯一不同的就是 ram 是掉电不保存的

大家好,我是讯享网,很高兴认识大家。

ram disk介绍

  ram disk顾名思义,内存磁盘。我们平常接触的一些存储介质,如:nor flash、nand flash、emmc、ufs、以及机械硬盘固态硬盘等,都是用来存储数据的,同理内存也是可以当成磁盘来存储数据的,唯一不同的就是ram是掉电不保存的,而前面提到的那些存储介质掉电都是保存数据的。
  我们都知道,在linux中,上面介绍的flash这些存储介质,都是需要有对应的驱动,注册成块设备。并向上层提供接口。如nor、nand等都抽象成mtdblock块设备。
  同理,linux中的ram disk意思就是拿出ram中的一部分大小,用对应的驱动注册层块设备,提供给上层调用。一般的ram disk注册成的块设备,在文件系统中设备节点提现为/dev/ramx。

ramdisk文件系统介绍

  介绍ramdisk文件系统前,先来看一下一般linux文件系统,这里以我的ubuntu16.04虚拟机为例:

root@ubuntu:~# mount ...... /dev/sda1 on / type ext4 (rw,relatime,errors=remount-ro,data=ordered) ...... 

讯享网
讯享网[root@linux:/root]# mount /dev/root on / type ext2 (rw,relatime,block_validity,barrier,user_xattr,acl,errors=remount-ro) ...... [root@linux:/root]# readlink /dev/root ram0 

ramdisk文件系统制作

一、配置内核支持ramdisk。

  执行make menuconfig,进入内核配置界面。

General setup ---> [*] Initial RAM filesystem and RAM disk (initramfs/initrd) support 

  这里的意思是配置内核初始化时,去寻找initramfs和initrd,initrd就是我们的ramdisk文件系统,至于initramfs,后面有机会再介绍。

讯享网Device Drivers ---> <*> RAM block device support (1) Default number of RAM disks (65536) Default RAM disk size (kbytes) 

  勾选第一项RAM block device support,才会出来第二项和第三项的选项。第一项的意思是内核支持ram disk块设备驱动。
  第二项是注册的块设备数量,内核默认是16,我这里就写了1,内核启动后会有/dev/ram0块设备节点,配置16则会有/dev/ram0~ram15。
  第三项的意思是ram disk占得最大内存,这里我写的是64M,一般来说可以写的再小点。实际在使用/dev/ramx设备时,并不是一下子就占系统64M内存,而是根据实际使用情况而分配的。

File systems ---> <*> Second extended fs support [*] Ext2 extended attributes [*] Ext2 POSIX Access Control Lists [*] Ext2 Security Labels 

二、根文件系统的制作

(1)建立目录

创建根文件系统一些基本目录

讯享网# mkdir ramdiskfs # cd ramdiskfs/ # mkdir mnt tmp var usr sys proc etc lib dev bin sbin root home # mkdir usr/lib lib/modules 

创建部分设备节点

# sudo mknod -m 666 console c 5 1 //创建控制台设备文件 # sudo mknod -m 666 null c 1 3 //创建一个空的设备文件 
讯享网ramdiskfs# cp ../busybox-1.31.1/examples/bootfloppy/etc/ etc/ -rf 

(2)busybox编译

# tar -xjf busybox-1.31.1.tar.bz2  # cd busybox-1.31.1/ 

  配置busybox,这里我们用默认配置就好,执行

讯享网# make menuconfig 

  配置如下项:


讯享网

Settings ---> (../ramdiskfs) Destination path for 'make install' (arm-linux-gnueabi-) Cross compiler prefix --- Build Options [*] Build static binary (no shared libs) 

分别为:
(1)设置安装目录,这里我的ramdisk和busybox-1.31.1同一目录下
(2)设置交叉编译工具链,前提是环境变量中有交叉编译工具路径才行。交叉编译工具链也可在Makefile中指定。
(3)设置静态编译(这里我们只做一个最简单的根文件系统,就不找动态库了,所有可执行文件静态编译)。

  编译busybox

讯享网# make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j8 //上面制定了编译工具链这里就可以直接make —j8, //我电脑是四核的所以-j8就行了,如果是8核就可以-j16加快编译速度,以此类推 # make install //安装编译完的可执行文件等 

  make install完成后,进到我们的ramdiskfs目录,可以看到根目录下linuxrc可执行文件,依次查看bin/ sbin/ usr/bin usr/sbin可以看到很多可执行命令。ls -l查看,可以看到所有可执行文件都是链接到bin/busybox上的。

(3)制作ramdisk根文件系统镜像、

  安装genext2fs工具

# apt-get install genext2fs 

  cd到要制作的ramdiskfs的上一级目录

讯享网# genext2fs -b 4096 -d ramdsikfs ramdisk (1) # gzip –v9 ./ramdisk (2) 

(4)配置启动参数加载ramdisk

方法一:配置内核启动参数command line
# make menuconfig Boot options ---> () Default kernel command string 

配置为console=ttyS0, root=/dev/ram0 rw init=/linuxrc initrd=0x 0x
最终在.config文件中体现为:COMFIG_CMDLINE=console=ttyS0, root=/dev/ram0 rw init=/linuxrc initrd=0x 0x
(2)uboot中配置bootargs
uboot下执行如下命令:
# setenv bootargs 'console=ttyS0, root=/dev/ram0 rw init=/linuxrc initrd=0x,0x'
# saveenv

  console=ttyS0,不同平台可能不一样,可能有ttyAMA、ttySAC等,根据具体情况写。
  root=/dev/ram0表示根目录挂载点为/dev/ram0块设备。init=/linuxrc表示init进程(1号进程)可执行文件为根目录下的linuxrc文件,在安装busybox时我们已经看到了根目录下的linuxrc文件。
initrd参数格式为:地址 长度,这里我的设备ram地址为0x起始,随便挑了个地址加载,只要是在内核ddr物理地址空间内。长度这里只要比ramdisk.gz压缩包大小大就可以了。

方法二:bootm加载ramdisk.gz

  uboot在执行bootm命令加载uImage时,会对uImage 64字节数据头进行解析,进行校验。bootm加载uImage打印如下:

讯享网 Booting kernel from Legacy Image at  ... Image Name: Linux-4.14.111 Image Type: ARM Linux Kernel Image (uncompressed) Data Size:  Bytes = 5.6 MiB Load Address:  Entry Point:  Verifying Checksum ... OK 

  其实当bootm命令跟两个地址参数时,第二个地址就是加载ramdisk的地址。
  和加载uIamge时一样,bootm记载ramdisk时,也需要判断ramdisk.gz的 64字节数据头。所以用这种方法向内核传递ramdisk时,ramdisk.gz需要通过mkimage命令给ramdisk.gz加上64字节头。
命令如下:
mkimage -A arm -O linux -C gzip -T ramdisk -d ramdisk.gz ramdisk_1.gz
-A 架构类型 arm
-O 系统类型 linux
-C 压缩类型 gzip
-T 类型 ramdisk
执行完成后生成ramdisk_1.gz压缩包。
bootm加载ramdisk.gz打印如下:

 Loading init Ramdisk from Legacy Image at  ... Image Name: Image Type: ARM Linux RAMDisk Image (gzip compressed) Data Size:  Bytes = 2.1 MiB Load Address: 00000000 Entry Point: 00000000 Verifying Checksum ... OK 

(5)测试ramdisk.gz

  这里我使用上述第二种方式bootm传递,uboot设置环境变量

讯享网bootargs=console=ttyS0, root=/dev/ram0 rw init=/linuxrc tftp 0x uImage;tftp 0x ramdisk_1.gz;tftp 0x demo.dtb; 

  最终启动效果如下

Processing /etc/profile... Done / # / # 

  注意看一下内核找ramdisk的打印:

讯享网[ 2.] RAMDISK: gzip image found at block 0 [ 2.] EXT4-fs (ram0): mounting ext2 file system using the ext4 subsystem [ 2.] EXT4-fs warning (device ram0): ext4_update_dynamic_rev:795: updating to rev 1 because of new feature flag, running e2fsck is recommended [ 3.000863] EXT4-fs (ram0): mounted filesystem without journal. Opts: (null) [ 3.008109] VFS: Mounted root (ext2 filesystem) on device 1:0. 

  至此,一个最简单的ramdisk文件系统制作完成。有空细讲一下具体进一步的/etc下配置,如何设置用户密码,磁盘挂载等。

小讯
上一篇 2025-02-18 12:38
下一篇 2025-02-17 15:06

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/73210.html