本文适配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
文章内容持续更新。