唉,本来想这阵子把muduo网络库剖析完。但是最近受了伤,去医院耽搁了。结果就是。。。muduo还没整完。今天先完成一下之前欠的债。

Linux的文件体系

磁盘

为什么要讲磁盘呢?因为磁盘是文件的家,是它存储的位置。熟悉磁盘对我们了解linxu的文件系统大有裨(bi,四声)益。

现代计算机大部分文件存储功能都是由机械硬盘来提供的,当然还有SSD和闪存(其逻辑继承自机械硬盘)。

磁盘是如何存储文件的

机械硬盘能够实现信息存储的功能基于:磁性存储介质能够被磁化,且磁化后会长久保留被磁化的状态。 这种被磁化状态的状态可以被读取出来,同时这种磁化状态还能够不断被修改,磁化正好有两个方向,所以可以表示0和1.


于是,硬盘就是把这种磁性存储介质做成的一个个盘片。每一个盘片上都分布着数量巨大的磁性存储单位。由于数量巨多,所以就必须要有一套规则来规划信息如何存取:

1.一个硬盘有多张盘片叠成,不同盘片有编号
2.每张盘片上的存储颗粒成环形一圈圈地排布,每一圈称为磁道,有编号
3.每条磁道上都有一圈存储颗粒,每512*8(512字节,0.5KB)个存储颗粒作为一个扇区,扇区是硬盘上
  存储的最小物理单位
4.N个扇区可以组成簇,N取决于不同的文件系统或是文件系统的配置,簇是此文件系统中的最小存储单位
5.所有盘面上的同一磁道构成一个圆柱,称为柱面,柱面是系统分区的最小单位


磁头读取文件的时候,首先就是分区读写。由inode编号找到对应的磁道和扇区,然后一个柱面一个柱面的读取。

磁盘分区

磁盘为什么要分区?
笨!当然是分区后方便找啊!

磁盘的分区主要分为基本分区扩充分区。这两个数目之和不能大于4个,而且基本分区可以马上被时候但是不能再分区,扩充分区则需要二次分区。

嗯哼?懵逼了吧。

这么想就好了,基本分区就是你电脑里面的C盘,是硬盘的启动分区,是独立的。你对C盘分区一下试试。而什么D、E、F盘则是逻辑分区,是扩充分区 分区 之后的形成的。

话说,你们盘里的***啥时候借我看一看。


在linux中,每一个硬件设备都映射到一个系统的文件,对于硬盘、光驱等 IDE 或 SCSI 设备也不例外。Linux把各种 IDE 设备分配了一个由 hd 前缀组成的文件;而对于各种 SCSI 设备,则分配了一个由 sd 前缀组成的文件。

Linux 规定了主分区(或者扩展分区)占用 1 至 16 号码中的前 4 个号码。以第一个 IDE 硬盘为例说明,主分区(或者扩展分区)占用了 hda1、hda2、hda3、hda4,而逻辑分区占用了 hda5 到 hda16 等 12 个号码。

因此,Linux 下面每一个硬盘总共最多有 16 个分区。

文件

linux以文件的形式对计算机中的数据和硬件资源进行管理。这也是linxu中“一切皆文件”哲学的体现。在linux中,种类繁多的文件被其使用目录树进行管理,所谓目录树就是以根目录/为主,向下呈分支状的一种文件结构。

文件类型

1.普通文件(-)
	a.从Linux的角度来说,类似mp4、pdf、html这样应用层面上的文件类型都属于普通文件
	b.Linux用户可以根据访问权限对普通文件进行查看、更改和删除
2.目录文件(d,directory file)
	a.目录文件对于用惯Windows的用户来说不太容易理解,目录也是文件的一种
	b.目录文件包含了各自目录下的文件名和指向这些文件的指针,打开目录事实上就是打开目录文
	件,只要有访问权限,你就可以随意访问这些目录下的文件(普通文件的执行权限就是目录文件
	的访问权限),但是只有内核的进程能够修改它们
	c.虽然不能修改,但是我们能够通过vim去查看目录文件的内容
3.符号链接(l,symbolic link)
	这种类型的文件类似Windows中的快捷方式,是指向另一个文件的间接指针,也就是我们常说的软链接
4.块设备文件(b,block)和字符设备文件(c,char)
	a.这些文件一般隐藏在/dev目录下,在进行设备读取和外设交互时会被使用到
	b.比如磁盘光驱就是块设备文件,串口设备则属于字符设备文件
	c.系统中的所有设备要么是块设备文件,要么是字符设备文件,无一例外
5.FIFO(p,pipe)
	管道文件主要用于进程间通讯。比如使用mkfifo命令可以创建一个FIFO文件,启用一个进程A从
	FIFO文件里读数据,启动进程B往FIFO里写数据,先进先出,随写随读。
6.套接字(s,socket)
	a.用于进程间的网络通信,也可以用于本机之间的非网络通信
	b.这些文件一般隐藏在/var/run目录下,证明着相关进程的存在

注意:linux文件是没有扩展名的。 一个文件是否可以被执行是根据它的文件属性来看的。在linux中通过 ls -l查看当前目录下文件的详细的属性。

文件存储结构

磁盘中的文件主要分为3部分:

1) 超级块

文件系统中第一个块被称为超级块。这个块存放文件系统本身的结构信息。 比如,超级块记录了每个区域的大小,超级块也存放未被使用的磁盘块的信息。

2) I-切点表

超级块的下一个部分就是i-节点表。每个i-节点就是一个对应一个文件/目录的结构,这个结构它包含了一个文件的长度、创建及修改时间、权限、所属关系、磁盘中的位置等信息。 一个文件系统维护了一个索引节点的数组,每个文件或目录都与索引节点数组中的唯一一个元素对应。系统给每个索引节点分配了一个号码,也就是该节点在数组中的索引号,称为索引节点号

3) 数据区

文件系统的第3个部分是数据区。文件的内容保存在这个区域。 磁盘上所有块的大小都一样。如果文件包含了超过一个块的内容,则文件内容会存放在多个磁盘块中。一个较大的文件很容易分布上千个独产的磁盘块中。

文件存储结构:

其中目录项包含 文件名+inode节点,这张图片展示了inode结构的详细信息。

软链接和硬链接

还记得我们刚刚介绍过的链接文件吗?

硬连接

直接指向同一个inode的不同路径彼此之间称为硬链接
是给文件一个副本,同时建立两者之间的连接关系。修改其中一个,与其连接的文件同时被修改。如果删除其中任意一个其余的文件将不受影响。

软连接:也叫符号连接,他只是对源文件在新的位置建立一个“快捷(借用一下wondows常用词)”,指向另一个路径(是一个字符串),最终访问文件的权限是以哪个文件权限为准,所以,当源文件删除时,符号连接的文件将成为无源之水->仅仅剩下个文件名了,当然删除这个连接,也不会影响到源文件,但对连接文件的使用、引用都是直接调用源文件的。

文件操作命令

切换当前用户工作目录

cd (选项)(参数)

cd					切换到登录用户主目录
cd ~				切换到用户主目录
cd 路径				切换到指定路径
cd -				返回进入此目录之前所在的目录
cd ..				返回上级目录
cd ../..			返回上两级目录
cd!$				把上个命令的参数作为cd参数用 				

显示用户当前工作目录

pwd (选项)

pwd -P					显示实际路径,而非连接路径

显示目标列表

ls (选项)(参数)

ls				显示当前目录下文件
ls -a			显示所有档案及目录
ls -A			显示除隐藏文件以外所有文件列表
ls -C			多列显示输出结果(默认选项)
ls -l			所有输出信息用单列个数输出
ls -F			在每个输出项后追加文件的类型标识符,“*”表示具有执行权限的普通文件,“/”表示目录,“@”表示符号链接,“|”表示命令管道FIFO,“=”表示sockets套接字。当文件为普通文件时,不输出任何标识符;
ls -b			将文件中的不可输出的字符以反斜线加字符编码的方式输出
ls -d			仅显示目录名,不显示内容列表
ls -m			用“,”将分隔每个内容
ls -s			显示文件和目录的大小,以区块为单位
ls -t			用文件和目录的更改时间排序
ls -R			递归处理,目录下所以文件以及子目录一并处理

移动文件目录命令(可改名)

mv (选项)(参数)

一般需要两个参数 ,source(源文件或源目录),target(目标文件或目标目录)

mv -b  源文件 目标文件				当文件存在时,覆盖前为其创建一个备份
mv -f  源文件 目标文件				若目标文件或目录与现有的文件或目录重复,则直接覆盖现有的文件或目录;
mv -i  源文件 目标文件				交互式操作,覆盖前先行询问用户
mv -u 源文件 目标文件				当源文件比目标文件新或者目标文件不存在时,才执行移动操作。

创建目录命令

mkdir (选项)(参数)

如果你没有加其他的路径名,那么默认是在当前目录下创建目录。

mkdir -Z 				设置安全上下文
mkdir -p				若所要建立目录的上层目录目前尚未建立,则会一并建立上层目录

删除已建立的目录

rmdir (参数)

rmdir只能删除空文件夹,如果删除非空的文件夹可以用rm -rf 参数 这个命令

显示&创建&合并文件

cat有三种功能:

1.一次显示整个文件。$ cat filename
2.从键盘创建一个文件。$ cat > filename只能创建新文件,不能编辑已有文件.
3.将几个文件合并为一个文件: $cat file1 file2 file

cat -n  	由 1 开始对所有输出的行数编号
cat -b  	和 -n 相似,只不过对于空白行不编号
cat -s 		当遇到有连续两行以上的空白行,就代换为一行的空白行

rm (选项)(参数)

rm -f    	忽略不存在的文件,从不给出提示。
rm -i 		进行交互式删除
rm -r/R   	指示rm将参数中列出的全部目录和子目录均递归地删除。
rm -v 		详细显示进行的步骤

rm –r 目录名:这个操作可以连同这个目录下面的子目录都删除,功能上和rmdir相似。
rm –f 文件名(目录名):这个操作可以进行强制删除。

显示目录命令(树状)

tree (选项)(参数)

基本用不到这个,看看就好了。

复制命令

cp (选项)(参数)

cp命令用来将一个或多个源文件或者目录复制到指定的目的文件或目录。

-a:此参数的效果和同时指定"-dpR"参数相同;
-d:当复制符号连接时,把目标文件或目录也建立为符号连接,并指向与源文件或目录连接的原始文件或目录;
-f:强行复制文件或目录,不论目标文件或目录是否已存在;
-i:覆盖既有文件之前先询问用户;
-l:对源文件建立硬连接,而非复制文件;
-p:保留源文件或目录的属性;
-R/r:递归处理,将指定目录下的所有文件与子目录一并处理;
-s:对源文件建立符号连接,而非复制文件;
-u:使用这项参数后只会在源文件的更改时间较目标文件更新时或是名称相互对应的目标文件并不存在时,才复制文件;
-S:在备份文件时,用指定的后缀“SUFFIX”代替文件的默认后缀;
-b:覆盖已存在的文件目标前将目标文件备份;
-v:详细显示命令执行的操作。

参考文献

[1] susmote.Linux常用命令详解-目录文件操作命令.Linux社区.2018.4.10
[2] 灵魂自由的忙人.Linux系统的文件系统详解.CSDN.2016.5.08
[3] 赛艇队长.Linux文件系统详解.博客园.2017.12.09
[4] lyj97.Linux文件系统.CSDN.2019.3.25