树莓派开始,玩转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文件系统的应用依然非常广泛。
树莓派开始,玩转Linux26:仓库大管家相关推荐
- 大航海仓库小管家更新为1.10
更新内容: 1.增加对台服的支持; 2.增加"别名",用户可对每个角色添加一个别名,便于区别和记忆: 3.增加"备注",用户可对每一项物品添加一个备注说明: 4 ...
- 新鲜出炉《大航海仓库小管家》
首先,祝大家新年愉快! 根据大家的建议与要求,编制了一款小工具用于管理大航海游戏中的仓库号上的物资,刚写好就发上来了,说明还没来得及写,因为比较简单,相信大家在使用中不会有困难的. 在使用中发现有什么 ...
- java基础巩固-宇宙第一AiYWM:为了维持生计,Spring全家桶_Part1-2(学学Spring源码呗【两大神器:大管家与个性化产物】、【XmlBeanFactory争风吃醋】)~整起
PART1:构建环境的大体步骤 首先呢,肯定是得把源码的运行环境准备好,咱们才能一步一步学呀.但是我自己呢,参考了很多文章和书,最后成功我觉得每个文章都有用,所以如果大家想看完整步骤,可以Google ...
- VSCode自定义代码片段13——Vue的状态大管家
Vue的状态大管家 {// V'Vuex// 13 如何自定义用户代码片段:VSCode =>左下角设置 =>用户代码片段 =>新建全局代码片段文件... =>自定义片段名称 ...
- 计算机的大管家教学反思,第二课 计算机的“大管家”.doc
第二课 计算机的"大管家" 课题第二课 计算机的大管家-windows操作系统第 1 课时整理人: 教 学 目 标知识与技能:了解操作系统,认识windows xp操作系统的桌面组 ...
- 关于前端大管家 package.json,你知道多少?
今天来看看前端的大管家package.json文件相关的配置,充分了解这些配置有助于我们提高开发的效率,规范我们的项目.文章内容较多,建议先收藏在学习! 在每个前端项目中,都有package.json ...
- OpenYurt 入门 - 在树莓派上玩转 OpenYurt
作者 | 唐炳昌 来源|阿里巴巴云原生公众号 随着边缘计算的快速发展,越来越多的数据需要到网络的边缘侧进行存储.处理和分析,边缘的设备和应用呈爆发式增长.如何高效的管理边缘侧的资源和应用是业界面临的一 ...
- OpenYurt入门-在树莓派上玩转OpenYurt
简介:随着边缘计算的快速发展,越来越多的数据需要到网络的边缘侧进行存储.处理和分析,边缘的设备和应用呈爆发式增长.如何高效的管理边缘侧的资源和应用是业界面临的一个主要问题.当前,采用云原生的方法,将云 ...
- 华为荣耀畅玩7c计算机在那,华为荣耀畅玩7C内存多大
华为荣耀畅玩7C内存多大这是很多朋友咨询的问题,华为荣耀畅玩7C凭借高颜值,双摄,人脸识别受到广泛关注,但是也有很多朋友更关心内存多大的问题,下面就来详细介绍一下华为荣耀畅玩7C内存多大. 华为荣耀畅 ...
最新文章
- RecyclerView的基本使用
- MOSS Content Types 概述
- 拥有此神技,脚本调试从此与 echo、set、test 说分手
- 遭央视曝光的“AI算命”,背后竟然隐藏了一个价值千亿的市场!?
- rap韵脚大全(包含各种诗词歌曲的韵脚等)
- python实现微信自动回复
- 图解GC(垃圾回收)复制算法加强版(1)Cheney的复制算法
- 《Python 3网络爬虫开发实战 》崔庆才著 第三章笔记
- 手机卡服务器密码忘记了怎么修改密码,wifi密码忘记了怎么办找回密码 手机怎么修改自家wifi密码...
- 戴森空气净化器php00使用,戴森空气净化器好用吗?有什么使用技巧?
- 国内外数据安全治理框架介绍与分析
- frontpage 2003动态html效果,用好FrontPage2003的九大功能
- 安安爱弹琴(Appinventor练习)
- AE计算机考试CA,AECA简介
- java 韦根34卡号转26卡号
- 【ARM-Linux开发】linux下代码调试
- hive中round、floor、ceil区别及用法
- 最长回文字符串——马拉车(Manacher)算法
- DataV基础版如何制作单独省份地图?
- java事务不生效场景_事务的隔离级别、事务不生效的场景