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, 57345Allocating 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来说, 则不会有这个问题.
下一篇我们简单从代码上来看一看是怎么实现的.
- Linux Kernel - 探索Ram Disk 驱动(1) - 体验使用
- Linux Kernel - 探索Ram Disk 驱动(2) - 源码探索
- Linux initial RAM disk
- RAM Disk 使用经验zz
- ram disk
- Linux initial RAM disk (initrd) overview
- Linux initial RAM disk (initrd) overview
- Linux initial RAM disk(initrd)介绍
- Linux initial RAM disk (initrd) overview
- CREATE A RAM DISK IN LINUX
- VxWorks的block设备驱动--ram disk驱动
- U-boot 传递 RAM 和 Linux kernel 读取 RAM 参数
- 轻轻松松为你的Linux系统创建RAM Disk
- 制作RAM disk
- Initial RAM disk(initrd)
- initrd(Initial RAM Disk)
- CPU DISK RAM
- linux kernel网络驱动
- WKWebView使用遇到的坑,WKWebView返回向上移,代理报错,返回页面报错
- 用redis实现任务调度
- App内购通关:(一)非代码准备篇
- 关于fragment backstate的运用
- 接收微信服务器推送事件获取openID
- Linux Kernel - 探索Ram Disk 驱动(1) - 体验使用
- es6 javascript对象Object.values() , Object.entries()
- 流程控制语句:分支语句-switch
- 按照年-月-日输入日期计算该日期是该年第几天
- 颜语言(网络交往语言)
- hdoj-【1253 胜利大逃亡】
- 菜鸟电子面单,自定义区设置方法
- 文章标题
- App内购通关:(二)代码篇