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

树莓派开始,玩转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文件系统的应用依然非常广泛。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值