Linux Kernel - 探索Ram Disk 驱动(1) - 体验使用

来源:互联网 发布:excel 数据对比 编辑:程序博客网 时间:2024/04/29 19:25

写在开头

我不是专业的内核玩家, 对于内核也是平时有兴趣了看一看, 这里写下来的东西主要为了把学习之路上的风景记录一二, 当然了, 如果能够给你带来帮助, 那就算是意外收获了.


代码版本

linux-4.8.4, 前不久从官网www.kernel.org刚下载的版本, 感觉内核发展好快, 目前大部分服务器用的是还是2.6的版本. 要跟上时代还是从新版的代码来看吧, 倒也不是说越新越好, 只是基于两点:

  • 新的版本会修复很多bug
  • 新的版本更能反映以后的方向

Ram Disk 简介

简单直白, 直接翻译就是内存中的 ‘磁’ 盘. 对内核来说, 磁盘的抽象概念是一个存储介质, 即可以存在传统硬盘的磁片上, 也可以存在与SSD中的flash上, 也可以存在内存中, 只要它能提供一般磁盘的接口功能即可. 在内核中, 与磁盘对应的设备是block类型, 即按照固定块大小读取数据的设备.

如何在Linux上面玩呢?

第一步: 加载模块

内核中与Ram Disk对应的驱动模块名称叫brd(Ram backed block device driver). 设置Ram Disk大小(123456K)并加载:

modprobe brd rd_size=123456

由于在我的电脑上brd模块是内置的, 无法演示动态设置大小, 如果需要设置只能通过启动参数来达到, 太麻烦了, 就用默认的参数玩吧. 模块加载后, 就可以在/dev目录下发现创建好了很多ram*的设备:

lqp@lqp-ThinkPad-T540p:~$ ls /dev/ram*
/dev/ram0 /dev/ram10 /dev/ram12 /dev/ram14 /dev/ram2 /dev/ram4 /dev/ram6 /dev/ram8
/dev/ram1 /dev/ram11 /dev/ram13 /dev/ram15 /dev/ram3 /dev/ram5 /dev/ram7 /dev/ram9

第二步: 初始化文件系统

由于第一步只是创建了设备, 类似于刚买了一个新的硬盘, 要使用这个硬盘, 必须对其分区和格式化. 关于分区和设备, 其实理解起来还是有点绕的.在抽象层面上, 分区和设备只是包含了一块存储介质的设备, 而分区可以理解为设备中的设备, 往设备中写, 就是往设备对应的存储区域存储一段数据. 举个例子:

lqp@lqp-ThinkPad-T540p:~$ ls /dev/sd*
/dev/sda /dev/sda1 /dev/sda2 /dev/sda5 /dev/sda6 /dev/sdb /dev/sdb1 /dev/sdb2

我的电脑中有两块磁盘, 拿第一块sda为例, /dev/sda代表的是整个设备, 读写它可以访问整个磁盘区域, 包括分区表和其他所有分区的区域. /dev/sda1访问的是设备中的第一个分区, 其对应区域是整个设备中的一段连续区域(由起始块号和长度描述), 访问这个设备, 只能访问这个区域对应的数据块. /dev/sda2则访问位于sda1后面的一块区域. 理论上来说, 我们要访问这个硬盘中的某一块数据, 即可以通过整个设备的文件(sda)来访问, 也可以从该块数据对应的分区来访问. 不过由于磁盘的数据一般是通过文件系统层来组织的, 通常我们都是通过文件路径直接访问文件数据, 不然通过块号来读取数据就太原始了, 必须自己来记住每一块数据对应的内容是什么.

再回到上面的ram0-ram9这些设备, 这相当于独立的设备, 为了简单起见, 我们直接在上面创建文件系统(格式化):

lqp@lqp-ThinkPad-T540p:~$ sudo mkfs.ext4 /dev/ram0
mke2fs 1.42.12 (29-Aug-2014)
Discarding device blocks: done
Creating filesystem with 65536 1k blocks and 16384 inodes
Filesystem UUID: e5bd0811-34f9-40e7-a1d4-7ca4f11279ed
Superblock backups stored on blocks:
8193, 24577, 40961, 57345

Allocating group tables: done
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done

我的系统上默认的Ram Disk大小是65536K, 也就是64M.

第三步: 挂载和使用

lqp@lqp-ThinkPad-T540p:~/mnt$ sudo mount /dev/ram0 ramdisk
lqp@lqp-ThinkPad-T540p:~/mnt$ sudo chown lqp:lqp ramdisk/
lqp@lqp-ThinkPad-T540p:~/mnt$ echo ‘This is a memory file’ >> ramdisk/aaa.txt
lqp@lqp-ThinkPad-T540p:~/mnt$ cat ramdisk/aaa.txt
This is a memory file

然后就可以当普通目录一样使用了, 只是文件的内容是存在内存中, 相比普通磁盘文件来说, 读写速度都会更快.


Ram Disk和tmpfs的区别

Ram Disk完全模拟的是硬盘设备, 它是不知道文件系统格式的, 我们看到, 在使用之前, 我们在上面创建了ext文件系统; 而tmpfs本身就是建立在内存中的文件系统.

按功能归类上来说, 他们属于不同层面的东西, 一个是块设备, 一个是文件系统. 只不过tmpfs这个文件系统正好将内容存在内存中. 此外, 由于ext文件系统层面会对文件内容做cache, 因此, 一块数据可能除了在Ram Disk中占一份内容, 同时也在page cache中有一个副本. 而对于tmpfs来说, 则不会有这个问题.

下一篇我们简单从代码上来看一看是怎么实现的.

0 0