当前位置:K88软件开发文章中心网站服务器框架Shell → 文章内容

Shell 文件系统操作

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-23 14:39:37

$ mount --bind /path/to/needtomount_directory /path/to/mountpoint_directory这个非常有意思,比如可以把某个目录挂载到 ftp 服务的根目录下,而无须把内容复制过去,就可以把相应目录中的资源提供给别人共享。范例:卸载某个分区以上都只提到了挂载,那怎么卸载呢?用 umount 命令跟上挂载的源地址或者挂载点(设备,文件,远程目录等)就可以。例如:$ umount /path/to/mountpoint_directory或者$ umount /path/to/mount_source如果想管理大量的或者经常性的挂载服务,那么每次手动挂载是很糟糕的事情。这时就可利用 mount 的配置文件 /etc/fstab,把 mount 对应的参数写到 /etc/fstab 文件对应的列中即可实现批量挂载( mount -a )和卸载( umount -a )。 /etc/fstab 中各列分别为文件系统、挂载点、类型、相关选项。更多信息可参考 fstab 的帮助( man fstab )。参考资料:Linux 硬盘分区以及其挂载原理从文件 I/O 看 Linux 的虚拟文件系统源码分析:静态分析 C 程序函数调用关系图如何制作一个文件系统Linux 文件系统下有一些最基本的目录,不同的目录下存放着不同作用的各类文件。最基本的目录有 /etc,/lib,/dev,/bin 等,它们分别存放着系统配置文件,库文件,设备文件和可执行程序。这些目录一般情况下是必须的,在做嵌入式开发时,需要手动或者是用 busybox 等工具来创建这样一个基本的文件系统。这里仅制作一个非常简单的文件系统,并对该文件系统进行各种常规操作,以便加深对文件系统的理解。范例:用 dd 创建一个固定大小的文件还记得 dd 命令么?就用它来产生一个固定大小的文件,这个为 1M(1024\*1024 bytes) 的文件$ dd if=/dev/zero of=minifs bs=1024 count=1024查看文件类型,这里的 minifs 是一个充满 \\0 的文件,没有任何特定的数据结构$ file minifsminifs: data说明: /dev/zero 是一个非常特殊的设备,如果读取它,可以获取任意多个 \\0 。接着把该文件格式化为某个指定文件类型的文件系统。(是不是觉得不可思议,文件也可以格式化?是的,不光是设备可以,文件也可以以某种文件系统类型进行组织,但是需要注意的是,某些文件系统(如 ext3)要求被格式化的目标最少有 64M 的空间)。范例:用 mkfs 格式化文件$ mkfs.ext2 minifs查看此时的文件类型,这时文件 minifs 就以 ext2 文件系统的格式组织了$ file minifsminifs: Linux rev 1.0 ext2 filesystem data范例:挂载刚创建的文件系统因为该文件以文件系统的类型组织了,那么可以用 mount 命令挂载并使用它。请切换到 root 用户挂载它,并通过 -o loop 选项把它关联到一个特殊设备 /dev/loop$ sudo -s# mount minifs /mnt/ -o loop查看该文件系统信息,仅可以看到一个目录文件 lost+found$ ls /mnt/lost+found范例:对文件系统进行读、写、删除等操作在该文件系统下进行各种常规操作,包括读、写、删除等。(每次操作前先把 minifs 文件保存一份,以便比较,结合相关资料就可以深入地分析各种操作对文件系统的改变情况,从而深入理解文件系统作为一种组织数据的方式的实现原理等)$ cp minifs minifs.bak$ cd /mnt$ touch hello$ cd -$ cp minifs minifs-touch.bak$ od -x minifs.bak > orig.od$ od -x minifs-touch.bak > touch.od创建一个文件后,比较此时文件系统和之前文件系统的异同$ diff orig.od touch.oddiff orig.od touch.od61,63c61,64< 0060020 000c 0202 2e2e 0000 000b 0000 03e8 020a< 0060040 6f6c 7473 662b 756f 646e 0000 0000 0000< 0060060 0000 0000 0000 0000 0000 0000 0000 0000---> 0060020 000c 0202 2e2e 0000 000b 0000 0014 020a> 0060040 6f6c 7473 662b 756f 646e 0000 000c 0000> 0060060 03d4 0105 6568 6c6c 006f 0000 0000 0000> 0060100 0000 0000 0000 0000 0000 0000 0000 0000通过比较发现:添加文件,文件系统的相应位置发生了明显的变化$ echo "hello, world" > /mnt/hello执行 sync 命令,确保缓存中的数据已经写入磁盘(还记得本节图 1 的 buffer cache 吧,这里就是把 cache 中的数据写到磁盘中)$ sync$ cp minifs minifs-echo.bak$ od -x minifs-echo.bak > echo.od写入文件内容后,比较文件系统和之前的异同$ diff touch.od echo.od查看文件系统中的字符串$ strings minifslost+foundhellohello, world删除 hello 文件,查看文件系统变化$ rm /mnt/hello$ cp minifs minifs-rm.bak$ od -x minifs-rm.bak > rm.od$ diff echo.od rm.od通过查看文件系统的字符串发现:删除文件时并没有覆盖文件内容,所以从理论上说内容此时还是可恢复的$ strings minifslost+foundhellohello, world上面仅仅演示了一些分析文件系统的常用工具,并分析了几个常规的操作,如果想非常深入地理解文件系统的实现原理,请熟悉使用上述工具并阅读相关资料。参考资料:Build a mini filesystem in linux from scratchBuild a mini filesystem in linux with BusyBoxext2 文件系统如何开发自己的文件系统随着 fuse 的出现,在用户空间开发文件系统成为可能,如果想开发自己的文件系统,那么推荐阅读:使用 fuse 开发自己的文件系统。后记2007 年 12 月 22 日,收集了很多资料,写了整体的框架2007 年 12 月 28 日下午,完成初稿,考虑到时间关系,很多细节也没有进一步分析,另外有些部分可能存在理解上的问题,欢迎批评指正2007 年 12 月 28 日晚,修改部分资料,并正式公开该篇文档29 号,添加设备驱动和硬件设备一小节

上一页  [1] [2] [3] [4] 


Shell 文件系统操作