树莓派开始,玩转Linux26:仓库大管家

在前面的章节中,我们已经用到了Linux的文件系统。通过文件系统,可以找到文件、新建文件、删除文件、读写文件。这些高层抽象的用户操作,完全可以满足日常需求。但对于Linux程序员和资深用户来说,只有知道了外部存储器的组织方式,才能深入Linux系统编程。

1.外部存储设备:

文件系统的终极目标是把大量数据有组织地放入外部存储设备中,比如树莓派的SD卡上。以SD卡作为外部存储器的计算机并不常见。在非树莓派的PC上,更常见的外部存储器是磁盘。外部存储设备的容量一般也比内存大。它们还可以持久地保存数据,储存的数据不会随着断电而消失。外部存储器的读写速度要比内存慢。道理很简单,如果外部存储器读写速度比内存还快,那么人们会直接选用外部存储器来作为主存储器。

传统的机械式磁盘在进行随机读写时,效率会比连续读写更低。机械式磁盘由多个盘片和磁头组成,每个盘片上有多个可以存储数据的磁道。如果读写的区域不连续,磁盘需要改变磁头位置来切换磁道。在进行随机读写时,数据存活的区域可能散布于不同的磁道,因此磁道切换会让读写效率大为降低。因为SD卡没有类似的机械结构,所以随机读写和连续读写的速度差距不像磁盘那么大。

再来看外部存储器中的数据组织方式。Linux通过文件系统来管理外部存储器。文件系统有很多种分类。在Linux下常见的有ext2fs、ext3fs和ext4fs。Windows系统采用的是FAT文件系统。NTFS是常用于网络存储器的文件系统。每种文件系统都有自己的一套数据管理策略,自然也会各有优缺点。但无论是哪种文件系统,都至少应该有三方面的功能。

(1)通过名字和层级来组织文件,比如文件名和路径。
(2)提供操作文件的接口,比如查找、新建、删除、读取和写入文件。
(3)提供权限功能,比如文件保护和文件共享。

同一个外部存储器可以划分成一个或多个分区(Partition),每个分区可以用一种文件系统格式来管理。以树莓派为例,在SD卡上烧录Raspbian镜像后,SD卡的存储空间就会划分成两个分区。一个空间是启动分区,采用了FAT32形式的文件系统,启动分区主要用于开机启动,空间较小。剩下的空间是主分区,采用了ext4fs形式的文件系统。

2.外部存储器的挂载:

SD卡上的两个分区采用了两种文件系统。但最终在运行的Raspbian上,只会看到一个以根目录/为起点的文件系统。也就是说,两个物理分区以某种形式合并到了Linux的文件树上。我们把这个过程称为挂载(Mounting),即让文件树上的某个目录和存储器的物理分区对应起来。这个目录称为挂载点(Mounting Point)。从挂载点开始向下的子文件树,实际上就对应了挂载的物理分区。

Linux系统的挂载信息都保存在文件/etc/fstab中。查看树莓派中该文件的记录:

可以看到,树莓派SD卡的主分区挂载在根目录/上,而启动分区挂载在根目录下的/boot上。这两棵文件树有重叠的从属关系,以根目录/为起点的文件树,包括了以/boot为起点的文件树。这种情况下,Linux以子文件树优先,把启动分区挂载在/boot上。主分区的挂载点是根目录/,但不再包括/boot子文件树。因此,/boot下的数据都会存放于启动分区,其他的数据存放于主分区。

一个外部存储器必须经过挂载,才能加入操作系统的文件树。也只有加入文件树后,应用程序才能通过文件系统来访问外部存储器中的数据。在树莓派中插入一个U盘,用fdisk命令可以找到这个U盘。


它会自动挂载到/media下的一个目录上,例如/media/MyUsbDrive。因此,我们往/media/MyUsbDrive存入的文件,实际上都会存入U盘。如果对系统自动分配的挂载点不满意,那么可以卸载U盘,再挂载到一个自定义的挂载点。首先,卸载U盘,假如USB设备位于/dev/sda1,那么卸载U盘的命令就是:


然后,设置设备的默认挂载点,默认挂载点的配置文件在/etc/fstab上。使用nano工具来编辑这个文件:

这个文件里的每一行都是一个设备的挂载设置,例如下面这一行:

这里有6个参数,含义如下。
(1)设备名称。一般是/dev/xxx。
(2)挂载点。对于USB设备默认是/media/xxx。
(3)文件系统格式。例如ext4。
(4)设备参数。例如defaults、noatime。
(5)一个不再使用的参数,通常设置为0。
(6)磁盘检测设置。1为根文件系统,2为永久挂载磁盘,0为可插拔的移动设备。

挂载完成后,可以用df命令来查询文件系统的挂载情况:

存储器开始部分的块会有一个总的分区表(Partition Table),记录着存储器的基本信息,比如块(Block)的大小、存储器的编号和可用空间。块是存储器的读写单元。即使一个文件小于一个块,它还是会占据这个块的完整空间。此外,分区表中还逐项记录每个分区的信息,包括分区的起始位置和大小。随后的存储空间划分成分区。不同的分区可以采用不同的文件系统。

3.ext文件系统:

根据文件系统类型的不同,分区有不同的存储格式。先来看树莓派ext4格式的主分区。ext4全称是第四代拓展文件系统(Fourth ExtendedFile System)。从ext到ext4的文件系统,都是专门为Linux内核开发的。相对于第一代的ext来说,ext4增加了许多高级特征。但这四代操作系统的共同特色是围绕inode来组织文件。笔者也将围绕inode来展示ext系列的文件系统,并有意忽略一些高级特征。对于一个ext分区来说,内容可以分为如图所示的几个部分。装有操作系统的ext分区的第一个块是引导块(Boot Block)。引导块中有引导加载程序(Boot Loader),帮助计算机在开机时加载Linux内核。引导加载程序储存有内核的相关信息,比如内核名称和内核所在位置。但在树莓派中,FAT32的启动分区负责开机启动。树莓派的引导加载程序也在启动分区。因此,树莓派上的ext主分区并没有引导块。


每个ext分区会有一个超级块(Super Block)。超级块中记录着文件组织的信息,包括文件系统的类型、inode的数目、块的总数和空闲数量等。超级块对于文件系统来说至关重要。如果超级块损坏,则会导致整个分区的文件系统损坏。

超级块后面跟着inode表和数据块(Data Block)部分。一个inode表中有多个inode。所谓的inode,是描述文件存储信息的数据结构。文件有一个对应的inode。每个inode有一个唯一的整数编号(InodeNumber)。在Linux下,可以使用命令来查询文件的inode编号。


一个文件除了自身的数据之外,还会有附属信息。附属信息包括文件大小、拥有人、拥有组、修改日期等。这些附属信息就存在inode中。因此,inode对于文件管理和文件安全都很重要。

除了这些附属信息,inode还存有文件包含的所有数据块的位置信息。这些位置信息被称为指向数据块的指针。在Linux系统中,一个大文件可以分成几个数据块存储,就好像是分散在各地的龙珠。为了顺利地集齐龙珠,我们需要地图的指引。当Linux想要打开一个文件时,必须先找到文件对应的inode,然后根据inode这张地图的指引将所有的数据块收集起来,才能拼凑出一个完整的文件。在Linux中,我们通过解析路径,根据沿途的目录文件来找到某个文件。目录文件的每个条目对应了一个子文件的文件名,以及该文件的inode编号。以/var/test.txt文件的存储为例,假设其存储结构如图所示。当我们输入代码$cat/var/test.txt时,Linux将在根目录文件中找到/var这个目录文件的inode编号10747905,然后根据inode中指针指向的数据块合成出/var目录文件。随后,Linux重复上述过程,根据/var中text.txt文件的inode编号10749034,找到text.txt的数据。

当写入一个文件时,Linux会分配一个空白inode给该文件,将其inode编号记入该文件所属的目录,然后选取空白的数据块,让inode指针指向这些数据块,并向内存中放入数据。

/var/test.txt相关文件存储

4.FAT文件系统:

再来看FAT32格式的树莓派启动区。正如上面提到的,这个启动区有一个引导块,用于在开机时加载Linux内核。引导块之后是文件分配表(FAT,File Allocation Table)。文件分配表的组织形式和inode不同,但起到了和inode类似的作用。

FAT32是FAT文件系统家族的一员。FAT文件系统其实就是以"文件分配表"的英文简写来命名的,由此可见文件分配表对于FAT文件系统的重要性。文件分配表按照顺序对应了所有的数据块。在文件分配表的一条记录中,说明了同一个文件中下一个数据块的位置。比如,文件分配表的第2条记录中记录了5,这就说明了2号数据块的下一个数据块是5号数据块。当一个数据块是文件的最后一个数据块时,它就不再有下一个数据块了。它在文件分配表中的记录,也会填写成固定的0xffff。只要知道了一个文件的起点数据块位置,就能根据文件分配表找到该文件的所有数据块。

此外,FAT文件系统还有一个区域专门记录FAT根目录信息。其他的子目录则以文件的形式保持。目录中的每条记录对应了一个文件,除了文件名和文件属性,还记录了文件的起始数据块的位置。从根目录出发,我们可以通过记录中起始数据块的位置,配合文件分配表来组装根目录下的子目录和文件。依此类推,我们可以找到整个FAT文件系统的文件。

由此可见,ext的组织形式着眼于文件,因此以inode为主要的中间层。而FAT的组织形式着眼于数据块,所以以文件分配表为主要的中间层。FAT的文件分配表的记录总数和数据块总数相同,可能会很占空间。此外,FAT必须按照顺序一个一个找数据块,没法像ext那样从inode中获得一张完整的地图。因此,当文件在存储器上比较零散时,FAT没法像ext一样优化读写路径,但由于Windows系统的成功,FAT文件系统的应用依然非常广泛。

树莓派开始,玩转Linux26:仓库大管家相关推荐

  1. 大航海仓库小管家更新为1.10

    更新内容: 1.增加对台服的支持; 2.增加"别名",用户可对每个角色添加一个别名,便于区别和记忆: 3.增加"备注",用户可对每一项物品添加一个备注说明: 4 ...

  2. 新鲜出炉《大航海仓库小管家》

    首先,祝大家新年愉快! 根据大家的建议与要求,编制了一款小工具用于管理大航海游戏中的仓库号上的物资,刚写好就发上来了,说明还没来得及写,因为比较简单,相信大家在使用中不会有困难的. 在使用中发现有什么 ...

  3. java基础巩固-宇宙第一AiYWM:为了维持生计,Spring全家桶_Part1-2(学学Spring源码呗【两大神器:大管家与个性化产物】、【XmlBeanFactory争风吃醋】)~整起

    PART1:构建环境的大体步骤 首先呢,肯定是得把源码的运行环境准备好,咱们才能一步一步学呀.但是我自己呢,参考了很多文章和书,最后成功我觉得每个文章都有用,所以如果大家想看完整步骤,可以Google ...

  4. VSCode自定义代码片段13——Vue的状态大管家

    Vue的状态大管家 {// V'Vuex// 13 如何自定义用户代码片段:VSCode =>左下角设置 =>用户代码片段 =>新建全局代码片段文件... =>自定义片段名称 ...

  5. 计算机的大管家教学反思,第二课 计算机的“大管家”.doc

    第二课 计算机的"大管家" 课题第二课 计算机的大管家-windows操作系统第 1 课时整理人: 教 学 目 标知识与技能:了解操作系统,认识windows xp操作系统的桌面组 ...

  6. 关于前端大管家 package.json,你知道多少?

    今天来看看前端的大管家package.json文件相关的配置,充分了解这些配置有助于我们提高开发的效率,规范我们的项目.文章内容较多,建议先收藏在学习! 在每个前端项目中,都有package.json ...

  7. OpenYurt 入门 - 在树莓派上玩转 OpenYurt

    作者 | 唐炳昌 来源|阿里巴巴云原生公众号 随着边缘计算的快速发展,越来越多的数据需要到网络的边缘侧进行存储.处理和分析,边缘的设备和应用呈爆发式增长.如何高效的管理边缘侧的资源和应用是业界面临的一 ...

  8. OpenYurt入门-在树莓派上玩转OpenYurt

    简介:随着边缘计算的快速发展,越来越多的数据需要到网络的边缘侧进行存储.处理和分析,边缘的设备和应用呈爆发式增长.如何高效的管理边缘侧的资源和应用是业界面临的一个主要问题.当前,采用云原生的方法,将云 ...

  9. 华为荣耀畅玩7c计算机在那,华为荣耀畅玩7C内存多大

    华为荣耀畅玩7C内存多大这是很多朋友咨询的问题,华为荣耀畅玩7C凭借高颜值,双摄,人脸识别受到广泛关注,但是也有很多朋友更关心内存多大的问题,下面就来详细介绍一下华为荣耀畅玩7C内存多大. 华为荣耀畅 ...

最新文章

  1. RecyclerView的基本使用
  2. MOSS Content Types 概述
  3. 拥有此神技,脚本调试从此与 echo、set、test 说分手
  4. 遭央视曝光的“AI算命”,背后竟然隐藏了一个价值千亿的市场!?
  5. rap韵脚大全(包含各种诗词歌曲的韵脚等)
  6. python实现微信自动回复
  7. 图解GC(垃圾回收)复制算法加强版(1)Cheney的复制算法
  8. 《Python 3网络爬虫开发实战 》崔庆才著 第三章笔记
  9. 手机卡服务器密码忘记了怎么修改密码,wifi密码忘记了怎么办找回密码 手机怎么修改自家wifi密码...
  10. 戴森空气净化器php00使用,戴森空气净化器好用吗?有什么使用技巧?
  11. 国内外数据安全治理框架介绍与分析
  12. frontpage 2003动态html效果,用好FrontPage2003的九大功能
  13. 安安爱弹琴(Appinventor练习)
  14. AE计算机考试CA,AECA简介
  15. java 韦根34卡号转26卡号
  16. 【ARM-Linux开发】linux下代码调试
  17. hive中round、floor、ceil区别及用法
  18. 最长回文字符串——马拉车(Manacher)算法
  19. DataV基础版如何制作单独省份地图?
  20. java事务不生效场景_事务的隔离级别、事务不生效的场景

热门文章

  1. IOC(控制反转)和DI(依赖注入)
  2. script 标签中的defer 和 async 属性
  3. linux命令竖是什么,linux 管道命令 竖线 ‘ | ’
  4. 访问学者在美国访学生活有哪些常识?
  5. 使用py脚本登录东北大学IP控制网关
  6. python 拆分(几G)的tsv文件为较小的csv文件
  7. 【办公】PPT/WORD的一些常用技巧(不间断更新)
  8. 跨域CrossOrigin
  9. 23丨MySQL:数据库级监控及常用计数器解析(下)
  10. Android手写笔应用的实现,android手写笔思路