制作ramdisk文件系统

本文适配fs4412开发板,使用的内核为linux4.9.9。
在前面我们使用busybox1.28.1做好了根文件系统,并通过nfs挂载成功。
现在我们制作ramdisk文件系统,啥叫ramdisk呢?ramdisk是将一部分固定大小的内存当做分区来使用(例如8M),他并不是一个实际的文件系统,他是一种将实际的文件系统放在内存的机制,并且可以作为根文件系统来使用。将一些经常被访问不会被更改的文件系统(如只读的文件系统)通过ramdisk放在内存中可以提高系统的性能。

下面我们看看如何制作ramdisk文件系统。
1.制作一个8M大小的镜像文件
执行:

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

执行结果如下:

linux@ubuntu:~/fs4412/ramdisk$ dd if=/dev/zero of=ramdisk bs=1k count=8192 
8192+0 records in
8192+0 records out
8388608 bytes (8.4 MB) copied, 0.0799669 s, 105 MB/s
linux@ubuntu:~/fs4412/ramdisk$ ls
ramdisk

说明:
dd :命令作用是用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换。
if选项:是输入的文件这里是一个设备文件/dev/zero(用它来做特定大小的空白文件)
of选项:是输出文件是在当前目录下生成randisk文件
bs:读写块的大小,这里是1k
count多少个块(这样理解,相当于格式化磁盘的时候,选择格式化的块的大小,和有多少个块)
2. 格式化这个镜像文件为ext2文件系统
执行:

mkfs.ext2 -F ramdisk

执行结果如下:

linux@ubuntu:~/fs4412/ramdisk$ mkfs.ext2 -F ramdisk 
mke2fs 1.42 (29-Nov-2011)
Discarding device blocks: done                            
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
2048 inodes, 8192 blocks
409 blocks (4.99%) reserved for the super user
First data block=1
Maximum filesystem blocks=8388608
1 block group
8192 blocks per group, 8192 fragments per group
2048 inodes per group

Allocating group tables: done                            
Writing inode tables: done                            
Writing superblocks and filesystem accounting information: done


查看文件类型:

linux@ubuntu:~/fs4412/ramdisk$ file ramdisk 
ramdisk: Linux rev 1.0 ext2 filesystem data, UUID=e7e345e2-7eed-4837-b3cb-6e2986f97109

3.在/mnt下创建initrd目录作为ramdisk的挂载点

 mkdir /mnt/initrd/

4.将ramdisk镜像文件挂载到这个挂载点上

sudo mount -t ext2 -o loop ramdisk /mnt/initrd/

其中. -o loop:用来把一个文件当成硬盘分区挂接上系统

注:ramdisk不能放在rootfs下
5.拷贝前面制作好的根文件系统到挂载点

sudo cp /source/rootfs/* /mnt/initrd/ -a
linux@ubuntu:/mnt/initrd$ ls
a.out  bin  dev  etc  home  lib  linuxrc  lost+found  mnt  n  proc  root  sbin  sys  test1  tmp  usr  var

可以看到挂载点有了我们的根文件系统目录结构。
6.卸载initrd

sudo umount /mnt/initrd/

7.压缩ramdisk

 gzip --best -c ramdisk > ramdisk.gz

8.将 ramdisk.gz格式化为uboot可以识别的格式
使用mkimage工具
执行:

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

执行结果为:

linux@ubuntu:~/fs4412/ramdisk$ mkimage -n "ramdisk" -A arm -O linux -T ramdisk -C gzip -d ramdisk.gz ramdisk.img
Image Name:   ramdisk
Created:      Mon Mar  5 22:31:35 2018
Image Type:   ARM Linux RAMDisk Image (gzip compressed)
Data Size:    2912257 Bytes = 2844.00 kB = 2.78 MB
Load Address: 00000000
Entry Point:  00000000
linux@ubuntu:~/fs4412/ramdisk$ ls
ramdisk  ramdisk.gz  ramdisk.img

于是就制作好了,uboot可以识别的ramdisk.img格式
说明:
mkimage的参数格式

-n "ramdisk" ----------->image的名字,可以任意
-A arm     -----------> ARM架构
-O linux    -----------> 操作系统是linux
-T ramdisk   -----------> 类型是ramdisk
-C gzip      ----------->压缩类型为gzip
-d ramdisk.gz  ----------->无头信息的image文件名
ramdisk.img     ----------->加了头信息的image文件名

mkimage实际上是在原来的文件基础上加上了64字节的头部用于uboot的识别。

linux@ubuntu:~/fs4412/ramdisk$ ls -l
total 11636
-rw-rw-r-- 1 linux linux 8388608  3月  5 22:26 ramdisk
-rw-rw-r-- 1 linux linux 2912257  3月  5 22:28 ramdisk.gz
-rw-rw-r-- 1 linux linux 2912321  3月  5 22:31 ramdisk.img
对比上面的大小。

(注:mkimage --help可以查看命令的帮助信息,mkimage -l uImage可以查看头信息制作uImage比较有用)

linux@ubuntu:~/fs4412/ramdisk$ mkimage -l ramdisk.img 
Image Name:   ramdisk
Created:      Mon Mar  5 22:52:57 2018
Image Type:   ARM Linux RAMDisk Image (gzip compressed)
Data Size:    2912257 Bytes = 2844.00 kB = 2.78 MB
Load Address: 00000000
Entry Point:  00000000

9.拷贝ramdisk.img到/tftp目录

cp ramdisk.img /tftpboot

10.配置内核支持ramdisk
进入linux4.9

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

这些配置默认是选中的,如果没有选中编译内核拷贝到/tftp下。

11.配置uboot的命令行参数并重启开发板

setenv bootcmd tftp 41000000 uImage\;tftp 42000000 exynos4412-liebao.dtb\;tftp 43000000 ramkdisk.img\;bootm 41000000 43000000 42000000
saveenv

启动开发板查看能看到进入根文件系统

[root@liebao:/]#
[root@liebao:/]#ls
a.out       etc         linuxrc     n           sbin        tmp
bin         home        lost+found  proc        sys         usr
dev         lib         mnt         root        test1       var

注:有关linux4.9.9内核的移植见《移植最新的linux4.9.9内核(适配fs4412平台)》:
http://blog.csdn.net/liebao_han/article/details/79436819
文章内容持续更新。

你可能感兴趣的:(linux系统移植)