如何理解mount
mount有两重含义:
- 代表一种动作,另外一个是
- linux中有个命令就叫mount.
下面一起来看一下,从我发现的一个问题出发:
我在系统的启动脚本中想添加一些能让weston正常启动所依赖的资源,比如一个叫做X11/xkb的目录,
然后发现,在启动weston之前总是无法成功的执行 mkdir -p /system/usr/share/X11/xkb,看到log才知道问题出在:
mkdir的时候,报错 readonly file system.
也就是说这个文件系统是只读的,我写mkdir写入新的目录是不被允许的。我的解决方案是:
执行 mount -o rw -o remount /system,然后再去mkdir -p /system/usr/share/X11/xkb 就可以了
(更详细的用法:https://www.runoob.com/linux/linux-comm-mount.html)
我们以mount命令为切入点来了解一些上面的做法:
首先执行mount, 我们可以看到以下信息:
rootfs on / type rootfs (ro, seclable) devtmpfs on /dev type devtmpfs (rw, ...) sysfs on /sys type sysfs /dev/block/mmcblk0p13 on /system type ext4 (ro, seclabel) /dev/block/mmcblk0p22 on /data type ext4 (ro, seclabel) /dev/block/mmcblk0p23 on /blackbox type ext4 (ro, seclabel) /sys/kernel/debug on /sys/kernel/debug/ debugfs ....
可以看到mount 是把设备device 和 目录directory 关联了起来,这个过程就是挂载。
linux下一切皆是文件,区别就是不同的目录下挂载的文件系统的类型可能是不同的;
比如说/ 是根文件系统的挂载点,/sys 是 sysfs的挂载点;
再比如说,/blackbox 就是普通的ext4 文件系统,它对应一个块设备/dev/block/mmcblk0p23,它的挂载点是/blackbox
如果没有挂载的操作,我们是没有办法访问到块设备的内容的。
这里可能有点绕,挂载一个存储设备比较好理解,挂载一个新的文件系统是怎么个回事?
我们不妨思考这样一个问题,一个存储设备的文件系统到底是什么,为什么需要文件系统?
一个是为了分层考虑,二个是文件系统可以看作文件的写入方和读取双方的协议,写入方按照一定的规则
写入数据,读取方按照同样的规则读出数据,这样就完成了数据的存与取。这也是为什么一个U盘或者存储卡
从硬件上看只是一个存储设备,但是其中的数据组织形式却是根据不同的文件系统有不同的形式,因此要能正确读取这些文件
需要操作系统支持对应的文件格式才可以。简言之,文件系统只是一种数据存储的协议,无需依赖硬件。这样就是可以比较好的
理解sysfs, devfs, tempfs了,这些文件系统就是在内存中,被相应的驱动有效的组织起来,然后挂载到特定的目录上,linux 通过
VFS接口去操作对应目录下的文件,然后VFS会调到特定的fs的read, write 接口,完成“文件”的读写操作,这个文件可以是一个
存储设备中文本文件,也可以是一个驱动的设备文件。
搞懂这一点,文件系统就不难理解了。当然,如果你问我ext4 和 根文件系统有什么区别,怎么做一个文件系统,这就是另外一个话题了。