当前位置: 首页 > news >正文

Ext系列文件系统知识点

目录

1>理解硬件

a.磁盘

b.物理结构

c.存储结构

d.逻辑结构

①理解过程

②真实过程

e.CHS&&LBA地址

2>文件系统概念

a.块

b.分区

c.inode

3>ext2文件系统

a.宏观认识

b.Block Group

c.块组内部构成

①超级块

②GDT

③块位图

④inode位图

⑤节点表

⑥Data Block

d.inode和datablock映射

e.目录与文件名

f.路径解析

g.路径缓存

h.挂载分区

i.总结

4>软硬链接

a.硬链接

b.软链接

c.区别

d.用途


1>理解硬件

a.磁盘

• 机械磁盘是计算机中唯⼀的⼀个机械设备

• 磁盘--- 外设

• 慢

• 容量⼤,价格便宜

服务器

机柜&&机房

另外,磁盘是通过磁头改变磁性材料在盘片上的磁化方向来表示二进制数据

b.物理结构

c.存储结构

扇区:是磁盘存储数据的基本单位,512字节,块设备

如何定位⼀个扇区呢?

• 可以先确定磁头要访问哪⼀个柱⾯(磁道)(cylinder)

• 接着定位磁头(header)

• 再定位⼀个扇区(sector)

CHS地址定位

⽂件 = 内容+属性 都是数据,⽆⾮就是占据哪⼏个扇区的问题!既然能定位⼀个扇区了,那肯定也可以定位多个扇区

• 扇区是从磁盘读出和写⼊信息的最⼩单位,通常⼤⼩为 512 字节

• 磁头(head)数:每个盘⽚⼀般有上下两⾯,分别对应1个磁头,共2个磁头

• 磁道(track)数:磁道是从盘⽚外圈往内圈编号0磁道,1磁道...,靠近主轴的同⼼圆⽤于停靠磁头,不存储数据

• 柱⾯(cylinder)数:磁道构成柱⾯,数量上等同于磁道个数

• 扇区(sector)数:每个磁道都被切分成很多扇形区域,每道的扇区数量相同

• 圆盘(platter)数:就是盘⽚的数量

• 磁盘容量 = 磁头数 × 磁道(柱⾯)数 × 每道扇区数 × 每扇区字节数

这里有一点需要注意的就是,传动臂上的磁头是共进退的

柱⾯(cylinder),磁头(head),扇区(sector),显然可以定位数据了,这就是数据定位(寻址)⽅式之⼀,CHS寻址⽅式

CHS寻址

        对早期的磁盘⾮常有效,知道⽤哪个磁头,读取哪个柱⾯上的第⼏扇区就可以读到数据了

        但是CHS模式⽀持的硬盘容量有限,因为系统⽤8bit来存储磁头地址,⽤10bit来存储柱⾯地址,⽤6bit来存储扇区地址,⽽⼀个扇区共有512Byte,这样使⽤CHS寻址⼀块硬盘最⼤容量为256 * 1024 * 63 * 512B = 8064 MB(1MB = 1048576B)(若按1MB=1000000B来算就是8.4GB)

d.逻辑结构

①理解过程

磁带上⾯可以存储数据,我们可以把磁带“拉直”,形成线性结构

那么磁盘本质上虽然是硬质的,但是逻辑上我们可以把磁盘想象成为卷在⼀起的磁带,那么磁盘的逻辑存储结构我们也可以类似于:

这样每⼀个扇区,就有了⼀个线性地址(其实就是数组下标),这种地址叫做LBA

②真实过程

柱⾯是⼀个逻辑上的概念,其实就是每⼀⾯上,相同半径的磁道逻辑上构成柱面(虽然磁盘物理上分了很多⾯,但是在我们看来,逻辑上磁盘整体是由 “柱⾯” 卷起来的 )

所以,磁盘的真实情况是:

磁道:某⼀盘⾯的某⼀个磁道展开

即一维数组

柱⾯:整个磁盘所有盘⾯的同⼀个磁道,即柱⾯展开

柱⾯上的每个磁道,扇区个数是⼀样的,即二维数组

整盘:

即整个磁盘就是一个三维数组

寻址⼀个扇区:先找到哪⼀个柱⾯(Cylinder) ,在确定柱⾯内哪⼀个磁道(其实就是磁头位置 Head),在确定扇区(Sector),就有了CHS

每⼀个扇区都有⼀个下标,我们叫做LBA(Logical Block Address)地址,其实就是线性地址

所以OS只需要使⽤LBA就可以了!LBA地址转成CHS地址,CHS如何转换成为LBA地址,谁做啊??磁盘⾃⼰来做!固件(硬件电路,伺服系统)

e.CHS&&LBA地址

CHS转成LBA:

• 磁头数*每磁道扇区数 = 单个柱⾯的扇区总数

• LBA = 柱⾯号C x 单个柱⾯的扇区总数 + 磁头号H x 每磁道扇区数 + 扇区号S - 1

• 即:LBA = 柱⾯号C x (磁头数 x 每磁道扇区数) + 磁头号H x 每磁道扇区数 + 扇区号S - 1

• 扇区号通常是从1开始的,⽽在LBA中,地址是从0开始的

• 柱⾯和磁道都是从0开始编号的

• 总柱⾯,磁道个数,扇区总数等信息,在磁盘内部会⾃动维护,上层开机的时候,会获取到这些参数

LBA转成CHS:

• 柱⾯号C = LBA // (磁头数*每磁道扇区数)【就是单个柱⾯的扇区总数】

• 磁头号H = (LBA % (磁头数*每磁道扇区数)) // 每磁道扇区数

• 扇区号S = (LBA % 每磁道扇区数) + 1

• "//": 表⽰除取整

所以在磁盘使⽤者看来,根本就不关⼼CHS地址,⽽是直接使⽤LBA地址,磁盘内部⾃⼰转换

从此往后磁盘就是⼀个 元素为扇区 的⼀维数组,数组的下标就是每⼀个扇区的LBA地址。OS使⽤磁盘,就可以⽤⼀个数字访问磁盘扇区了

2>文件系统概念

a.块

其实硬盘是典型的"块"设备,操作系统读取硬盘数据的时候,其实是不会⼀个个扇区地读取,这样效率太低,⽽是⼀次性连续读取多个扇区,即⼀次性读取⼀个"块"(block)

硬盘的每个分区是被划分为⼀个个的"块",⼀个"块"的⼤⼩是由格式化的时候确定的,并且不可以更改,最常⻅的是4KB,即连续⼋个扇区组成⼀个 "块"("块"是⽂件存取的最⼩单位

• 磁盘就是⼀个三维数组,我们把它看待成为⼀个"⼀维数组",数组下标就是LBA,每个元素都是扇区

• 每个扇区都有LBA,那么8个扇区⼀个块,每⼀个块的地址我们也能算出来。

• 知道LBA:块号 = LBA / 8

• 知道块号:LAB=块号 * 8 + n (n是块内第⼏个扇区)

b.分区

其实磁盘是可以被分成多个分区(partition)的,以Windows观点来看,你可能会有⼀块磁盘并且将它分区成C,D,E盘,而C,D,E就是分区(分区从实质上说就是对硬盘的⼀种格式化)

柱⾯是分区的最⼩单位,我们可以利⽤参考柱⾯号码的⽅式来进⾏分区,其本质就是设置每个区的起始柱⾯和结束柱⾯号码。 此时我们可以将硬盘上的柱⾯(分区)进⾏平铺,将其想象成⼀个⼤的平⾯

有一点需要注意的是,柱⾯⼤⼩⼀致,扇区个位⼀致,那么其实只要知道每个分区的起始和结束柱⾯号,知道每⼀个柱⾯多少个扇区,那么该分区多⼤,其实和解释LBA是多少也就清楚了

c.inode

文件 = 属性 + 内容,我们使用 ls -l 的时候就可以文件元数据(属性)

每⾏包含7列:

• 模式

• 硬链接数

• ⽂件所有者

• 组

• ⼤⼩

• 最后修改时间

• ⽂件名

ls -l读取存储在磁盘上的⽂件信息,然后显⽰出来

其实这个信息除了通过这种⽅式来读取,还有⼀个stat命令能够看到更多信息

既然⽂件数据都储存在"块"中,那就意味着我们还要找⼀个地⽅储存⽂件的元信息(属性信息),⽐如⽂件的创建者、⽂件的创建⽇期、⽂件的⼤⼩等等。这种储存⽂件元信息的区域就叫做 inode,中⽂译名为”索引节点”

每⼀个⽂件都有对应的inode,⾥⾯包含了与该⽂件有关的⼀些信息(下面我们将深入了解这个inode)

这里需要注意的是:

• Linux下⽂件的存储是属性和内容分离存储的

• Linux下,保存⽂件属性的集合叫做inode,⼀个⽂件,⼀个inode,inode内有⼀个唯⼀的标识符,叫做inode号

下面是一个文件的属性 inode 的源代码

 /** Structure of an inode on the disk*/struct ext2_inode {__le16 i_mode; /* File mode */__le16 i_uid; /* Low 16 bits of Owner Uid */__le32 i_size; /* Size in bytes */__le32 i_atime; /* Access time */__le32 i_ctime; /* Creation time */__le32 i_mtime; /* Modification time */__le32 i_dtime; /* Deletion Time */__le16 i_gid; /* Low 16 bits of Group Id */__le16 i_links_count; /* Links count */__le32 i_blocks; /* Blocks count */__le32 i_flags; /* File flags */union {struct {__le32 l_i_reserved1;} linux1;struct {__le32 h_i_translator;} hurd1;struct {__le32 m_i_reserved1;} masix1;} osd1; /* OS dependent 1 */__le32 i_block[EXT2_N_BLOCKS];/* Pointers to blocks */__le32 i_generation; /* File version (for NFS) */__le32 i_file_acl; /* File ACL */__le32 i_dir_acl; /* Directory ACL */__le32 i_faddr; /* Fragment address */union {struct {__u8 l_i_frag; /* Fragment number */__u8 l_i_fsize; /* Fragment size */__le16 i_pad1;__le16 l_i_uid_high; /* these 2 fields */__le16 l_i_gid_high; /* were reserved2[0] */__u32 l_i_reserved2;} linux2;struct {__u8 h_i_frag; /* Fragment number */__u8 h_i_fsize; /* Fragment size */__le16 h_i_mode_high;__le16 h_i_uid_high;__le16 h_i_gid_high;__le32 h_i_author;} hurd2;struct {__u8 m_i_frag; /* Fragment number */__u8 m_i_fsize; /* Fragment size */__u16 m_pad1;__u32 m_i_reserved2[2];} masix2;} osd2; /* OS dependent 2 */};​​/** Constants relative to the data blocks*/#define EXT2_NDIR_BLOCKS 12#define EXT2_IND_BLOCK EXT2_NDIR_BLOCKS#define EXT2_DIND_BLOCK (EXT2_IND_BLOCK + 1)#define EXT2_TIND_BLOCK (EXT2_DIND_BLOCK + 1)#define EXT2_N_BLOCKS (EXT2_TIND_BLOCK + 1)// EXT2_N_BLOCKS = 15

重点:

• ⽂件名属性并未纳⼊到inode数据结构内部

• inode的⼤⼩⼀般是128字节或者256,我们后⾯统⼀128字节

• 任何⽂件的内容⼤⼩可以不同,但是属性⼤⼩⼀定是相同的

这里有两个问题:

• 硬盘是典型的"块"设备,"块"⼜是硬盘的每个分区下的结构,但"块"是如何在分区上排布的,并且我们要怎么找到"块"呢?

• 还有就是上⾯提到的存储⽂件属性的inode,⼜是如何放置的呢?

3>ext2文件系统

a.宏观认识

我们想要在硬盘上储⽂件,必须先把硬盘格式化为某种格式的⽂件系统,才能存储⽂件。⽂件系统的⽬的就是组织和管理硬盘中的⽂件。在 Linux 系统中,最常⻅的是 ext2 系列的⽂件系统(其早期版本为 ext2,后来⼜发展出的 ext3 和 ext4,虽然对 ext2 进⾏了增强,但是其核⼼设计并没有发⽣变化)

ext2⽂件系统将整个分区划分成若⼲个同样⼤⼩的块组 (Block Group),如下图所⽰,只要能管理⼀个分区就能管理所有分区,也就能管理所有磁盘⽂件。

上图中启动块(Boot Block/Sector)的⼤⼩是确定的,为1KB,由PC标准规定,⽤来存储磁盘分区信息和启动信息,任何⽂件系统都不能修改启动块。所以启动块之后才是ext2⽂件系统的开始

b.Block Group

ext2⽂件系统会根据分区的⼤⼩划分为数个Block Group,⽽每个Block Group都有着相同的结构组成

c.块组内部构成

①超级块

Super Block

存放⽂件系统本⾝的结构信息,描述整个分区的⽂件系统信息。记录的信息主要有,bolck 和 inode的总量,未使⽤的block和inode的数量,⼀个block和inode的⼤⼩,最近⼀次挂载的时间,最近⼀次写⼊数据的时间,最近⼀次检验磁盘的时间等其他⽂件系统的相关信息(Super Block的信息被破坏,可以说整个⽂件系统结构就被破坏了)

 /** Structure of the super block*/struct ext2_super_block {// ...__le32 s_inodes_count; /* Inodes count */__le32 s_blocks_count; /* Blocks count */__le32 s_free_blocks_count; /* Free blocks count */__le32 s_free_inodes_count; /* Free inodes count */__le32 s_first_data_block; /* First Data Block */__le32 s_blocks_per_group; /* # Blocks per group */__le32 s_inodes_per_group; /* # Inodes per group */__le16 s_inode_size; /* size of inode structure *///...};

超级块在每个块组的开头都有⼀份拷⻉(第⼀个块组必须有,后⾯的块组可以没有)这是为了保证⽂件系统在磁盘部分扇区出现物理问题的情况下还能正常⼯作,就必须保证⽂件系统的super block信息在这种情况下也能正常访问。所以⼀个⽂件系统的super block会在多个block group中进⾏备份,这些super block区域的数据保持⼀致

②GDT

Group Descriptor Table

块组描述符表,描述块组属性信息,整个分区分成多个块组就对应有多少个块组描述符。每个块组描述符存储⼀个块组 的描述信息,如在这个块组中从哪⾥开始是inode Table,从哪⾥开始是Data Blocks,空闲的inode和数据块还有多少个等等(块组描述符在每个块组的开头都有⼀份拷⻉)

 // 磁盘级blockgroup的数据结构/** Structure of a blocks group descriptor*/struct ext2_group_desc{// ...__le32 bg_block_bitmap; /* Blocks bitmap block */__le32 bg_inode_bitmap; /* Inodes bitmap */__le32 bg_inode_table; /* Inodes table block*/__le16 bg_free_blocks_count; /* Free blocks count */__le16 bg_free_inodes_count; /* Free inodes count */// ...};

③块位图

Block Bitmap

Block Bitmap中记录着Data Block中哪个数据块已经被占⽤,哪个数据块没有被占⽤

④inode位图

Inode Bitmap

每个bit表⽰⼀个inode是否空闲可⽤

⑤节点表

Inode Table

• 存放⽂件属性 如 ⽂件⼤⼩,所有者,最近修改时间等

• 当前分组所有Inode属性的集合

inode编号以分区为单位,整体划分,不可跨分区

⑥Data Block

数据区:存放⽂件内容,也就是⼀个⼀个的Block,根据不同的⽂件类型有以下⼏种情况

• 对于普通⽂件,⽂件的数据存储在数据块中

• 对于⽬录,该⽬录下的所有⽂件名和⽬录名存储在所在⽬录的数据块中,除了⽂件名外,ls -l命令看到的其它信息保存在该⽂件的inode中

Block号按照分区划分,不可跨分区

d.inode和datablock映射

inode内部存在 __le32 i_block[EXT2_N_BLOCKS]; /* Pointers to blocks */ 就是⽤来进⾏inode和block映射的(这样 文件=属性+内容 就可以找到了)

结论:

• 分区之后的格式化操作,就是对分区进⾏分组,在每个分组中写⼊SB、GDT、Block Bitmap、Inode Bitmap等管理信息,这些管理信息统称: ⽂件系统

• 只要知道⽂件的inode号,就能在指定分区中确定是哪⼀个分组,进⽽在哪⼀个分组确定是哪⼀个inode

• 拿到inode⽂件属性和内容就全部都有了

下⾯我们通过touch⼀个新⽂件来看看如何⼯作

 [root@localhost linux]# touch abc[root@localhost linux]# ls -i abc263466 abc

创建⼀个新⽂件主要有以下4个操作:

• 存储属性

内核先找到⼀个空闲的i节点(这⾥是263466),内核把⽂件信息记录到其中

• 存储数据

该⽂件需要存储在三个磁盘块,内核找到了三个空闲块:300, 500, 800 将内核缓冲区的第⼀块数据复制到300,下⼀块复制到500,以此类推

• 记录分配情况

⽂件内容按顺序 300, 500, 800 存放,内核在inode上的磁盘分布区记录了上述块列表

• 添加⽂件名到⽬录

新的⽂件名abc,在 linux 中,如何在当前的⽬录中记录这个⽂件?内核会将⼊⼝(263466,abc)添加到⽬录⽂件。⽂件名和 inode 之间的对应关系将⽂件名和⽂件的内容及属性连接起来

e.目录与文件名

问题:

• 我们访问⽂件,都是⽤的⽂件名,也没⽤过inode号?

• ⽬录是⽂件吗?如何理解?

答案:

• ⽬录也是⽂件,但是磁盘上没有⽬录的概念,只有⽂件属性+⽂件内容的概念。

• ⽬录的属性不⽤多说,内容保存的是:⽂件名和Inode号的映射关系

• 所以,访问⽂件必须打开当前⽬录,根据⽂件名,获得对应的inode号,然后进⾏⽂件访问

• 所以,访问⽂件必须要知道当前⼯作⽬录,本质是必须能打开当前⼯作⽬录⽂件,查看⽬录⽂件的内容!

⽐如:要访问 readdir.c, 就必须打开 lesson14(当前⼯作⽬录),然后才能获取 readdir.c对应的inode进⽽对⽂件进⾏访问

f.路径解析

问题:

• 打开当前⼯作⽬录⽂件,查看当前⼯作⽬录⽂件的内容?当前⼯作⽬录不也是⽂件吗?我们访问当前⼯作⽬录不也是只知道当前⼯作⽬录的⽂件名吗?要访问它,不也得知道当前⼯作⽬录的inode吗?

答案:

• 所以也要打开当前⼯作⽬录的上级⽬录,但是好像又回到了这个问题

• 所以类似"递归",需要把路径中所有的⽬录全部解析,出⼝是"/"根⽬录

• ⽽实际上,任何⽂件,都有路径,访问⽬标⽂件,⽐如:/home/ltc/code/lesson14/readdir.c 都要从根⽬录开始,依次打开每⼀个⽬录,根据⽬录名,依次访问每个⽬录下指定的⽬录,直到访问到 readdir.c(这个过程叫做 Linux 路径解析

结论:

• 现在终于知道访问文件必须要有目录+文件名=路径的原因

• 根⽬录固定⽂件名,inode号,⽆需查找,系统开机之后就必须知道

可是路径谁提供的?

• 你访问⽂件,都是指令/⼯具访问,本质是进程访问,进程有CWD!进程提供路径

• 你open⽂件,提供了路径

可是最开始的路径从哪里来?

• 所以Linux为什么要有根⽬录, 根⽬录下为什么要有那么多缺省⽬录?

• 你为什么要有家⽬录,你⾃⼰可以新建⽬录?

• 上⾯所有⾏为:本质就是在磁盘⽂件系统中,新建⽬录⽂件,⽽你新建的任何⽂件,都在你或者系统指定的⽬录下新建,这不就是天然就有路径了咯!

• 系统+⽤⼾共同构建Linux路径结构

g.路径缓存

问题1:Linux磁盘中,存在真正的⽬录吗?

答案:不存在,只有⽂件,并且只保存⽂件属性+⽂件内容

问题2:访问任何⽂件,都要从/⽬录开始进⾏路径解析?

答案:原则上是,但是这样太慢,所以Linux会缓存历史路径结构

问题3:Linux⽬录的概念,怎么产⽣的?

答案:打开的⽂件是⽬录的话,由OS⾃⼰在内存中进⾏路径维护

Linux中,在内核中维护树状路径结构的内核结构体叫做: struct dentry

 struct dentry {atomic_t d_count;unsigned int d_flags; /* protected by d_lock */spinlock_t d_lock; /* per dentry lock */struct inode *d_inode; /* Where the name belongs to - NULL is negative *//** The next three fields are touched by __d_lookup. Place them here* so they all fit in a cache line.*/struct hlist_node d_hash; /* lookup hash list */struct dentry *d_parent; /* parent directory */struct qstr d_name;struct list_head d_lru; /* LRU list *//** d_child and d_rcu can share memory*/union {struct list_head d_child; /* child of parent list */struct rcu_head d_rcu;} d_u;struct list_head d_subdirs; /* our children */struct list_head d_alias; /* inode alias list */unsigned long d_time; /* used by d_revalidate */struct dentry_operations *d_op;struct super_block *d_sb; /* The root of the dentry tree */void *d_fsdata; /* fs-specific data */#ifdef CONFIG_PROFILINGstruct dcookie_struct *d_cookie; /* cookie, if any */#endifint d_mounted;unsigned char d_iname[DNAME_INLINE_LEN_MIN]; /* small names */};

注意:

• 每个⽂件其实都要有对应的 dentry 结构,包括普通⽂件,这样所有被打开的⽂件,就可以在内存中形成整个树形结构

• 整个树形节点也同时会⾪属于 LRU(Least Recently Used,最近最少使⽤)结构中,进⾏节点淘汰

• 整个树形节点也同时会⾪属于 Hash,⽅便快速查找

• 更重要的是,这个树形结构,整体构成了 Linux 的路径缓存结构,打开访问任何⽂件,都在先在这棵树下根据路径进⾏查找,找到就返回属性 inode 和内容,没找到就从磁盘加载路径,添加 dentry 结构,缓存新路径

h.挂载分区

我们已经能够根据inode号在指定分区找⽂件了,也已经能根据⽬录⽂件内容,找指定的inode了,在指定的分区内,我们可以任意操作

但存在一个问题就是,inode不是不能跨分区吗?Linux不是可以有多个分区吗?我怎么知道我在哪⼀个分区?

 $ dd if=/dev/zero of=./disk.img bs=1M count=5 #制作⼀个⼤的磁盘块,就当做⼀个分区$ mkfs.ext4 disk.img # 格式化写⼊⽂件系统$ mkdir /mnt/mydisk # 建⽴空⽬录$ df -h # 查看可以使⽤的分区Filesystem Size Used Avail Use% Mounted onudev 956M 0 956M 0% /devtmpfs 198M 724K 197M 1% /run/dev/vda1 50G 20G 28G 42% /tmpfs 986M 0 986M 0% /dev/shmtmpfs 5.0M 0 5.0M 0% /run/locktmpfs 986M 0 986M 0% /sys/fs/cgrouptmpfs 198M 0 198M 0% /run/user/0tmpfs 198M 0 198M 0% /run/user/1002$ sudo mount -t ext4 ./disk.img /mnt/mydisk/ # 将分区挂载到指定的⽬录$ df -hFilesystem Size Used Avail Use% Mounted onudev 956M 0 956M 0% /devtmpfs 198M 724K 197M 1% /run/dev/vda1 50G 20G 28G 42% /tmpfs 986M 0 986M 0% /dev/shmtmpfs 5.0M 0 5.0M 0% /run/locktmpfs 986M 0 986M 0% /sys/fs/cgrouptmpfs 198M 0 198M 0% /run/user/0tmpfs 198M 0 198M 0% /run/user/1002/dev/loop0 4.9M 24K 4.5M 1% /mnt/mydisk​$ sudo umount /mnt/mydisk # 卸载分区ltc@VM-8-12-centos:/mnt$ df -hFilesystem Size Used Avail Use% Mounted onudev 956M 0 956M 0% /devtmpfs 198M 724K 197M 1% /run/dev/vda1 50G 20G 28G 42% /tmpfs 986M 0 986M 0% /dev/shmtmpfs 5.0M 0 5.0M 0% /run/locktmpfs 986M 0 986M 0% /sys/fs/cgrouptmpfs 198M 0 198M 0% /run/user/0tmpfs 198M 0 198M 0% /run/user/1002

注意:/dev/loop0 在Linux系统中代表第⼀个循环设备(loop device)。循环设备,也被称为回环设备或者loopback设备,是⼀种伪设备(pseudo-device),它允许将⽂件作为块设备(block device)来使⽤。这种机制使得可以将⽂件(⽐如ISO镜像⽂件)挂载(mount)为⽂件系统,就像它们是物理硬盘分区或者外部存储设备⼀样

 ltc@VM-8-12-centos:/mnt$ ls /dev/loop* -lbrw-rw---- 1 root disk 7, 0 Oct 17 18:24 /dev/loop0brw-rw---- 1 root disk 7, 1 Jul 17 10:26 /dev/loop1brw-rw---- 1 root disk 7, 2 Jul 17 10:26 /dev/loop2brw-rw---- 1 root disk 7, 3 Jul 17 10:26 /dev/loop3brw-rw---- 1 root disk 7, 4 Jul 17 10:26 /dev/loop4brw-rw---- 1 root disk 7, 5 Jul 17 10:26 /dev/loop5brw-rw---- 1 root disk 7, 6 Jul 17 10:26 /dev/loop6brw-rw---- 1 root disk 7, 7 Jul 17 10:26 /dev/loop7crw-rw---- 1 root disk 10, 237 Jul 17 10:26 /dev/loop-control

结论:

• 分区写⼊⽂件系统,⽆法直接使⽤,需要和指定的⽬录关联,进⾏挂载才能使⽤

• 所以,可以根据访问⽬标⽂件的"路径前缀"准确判断我在哪⼀个分区

i.总结

下面是网上找的几张图

4>软硬链接

a.硬链接

• code 和 test 的链接状态完全相同,它们被称为指向⽂件的硬链接,并且内核记录了这个链接数,inode 1050491 的硬连接数为2

• 我们在删除⽂件时⼲了两件事情:① 在⽬录中将对应的记录删除 ② 将硬连接数-1,如果为0,则将对应的磁盘释放

还有一点需要注意的是

b.软链接

硬链接是通过 inode 引⽤另外⼀个⽂件,软链接是通过名字引⽤另外⼀个⽂件,但实际上,新的⽂件和被引⽤的⽂件的 inode 不同,应⽤常⻅上可以想象成⼀个快捷⽅式

软链接文件的内容就是保存目标文件的路径!

acm

• Access 最后访问时间

• Modify ⽂件内容最后修改时间

• Change 属性最后修改时间

c.区别

• 软链接是独⽴⽂件

• 硬链接只是⽂件名和⽬标⽂件 inode 的映射关系

d.用途

硬链接

• .和.. 就是硬链接

• ⽂件备份

软连接

• 类似快捷⽅式

本篇文章到这里就结束啦,希望这些内容对大家有所帮助!

下篇文章见,希望大家多多来支持一下!

感谢大家的三连支持!

http://www.xdnf.cn/news/1128025.html

相关文章:

  • Linux进程信号--1、信号产生
  • 时间复杂度和空间复杂度是衡量一个算法好坏的标准
  • A*算法详解
  • 9、线程理论1
  • eVTOL分布式电推进(DEP)适航审定探究
  • redisson tryLock
  • Spring MVC2
  • 尚庭公寓-----day1----@MapperScan爆红问题
  • 三十二、【核心功能改造】数据驱动:重构仪表盘与关键指标可视化
  • 【转】Rust: PhantomData,#may_dangle和Drop Check 真真假假
  • 【字节跳动】数据挖掘面试题0019:带货直播间推荐:现在有一个带货的直播间,怎么把它精准地推送给有需要的用户
  • 【C++】神奇的AVL树
  • WebView JSBridge 无响应问题排查实录 全流程定位桥接调用失效
  • 无人机故障响应模块运行与技术难点
  • Ubuntu24 辅助系统-屏幕键盘的back按键在网页文本框删除不正常的问题解决方法
  • RTL编程中常用的几种语言对比
  • 【C#地图显示教程:实现鼠标绘制图形操作】
  • 厂区车辆导航系统:基于 GPS+AI 动态路径规划的技术实现与实践
  • 春秋云镜 initial
  • 2025开放原子开源生态大会 | openKylin的技术跃迁和全球协作
  • 2025开放原子开源生态大会 | 开源欧拉的AI原生实践与全球协作
  • GaussDB 数据库架构师修炼(三) 集群管理概览
  • 李宏毅《生成式人工智能导论》 | 第11讲-第14讲:大型语言模型的可解释性、能力评估、安全性
  • React源码5 三大核心模块之一:render,renderRoot
  • docker-compose 配置启动2个MongoDB
  • 【Docker基础】Dockerfile构建与运行流程完全指南:从原理到实践优化
  • PostgreSQL 超详细安装与使用教程:从入门到实战
  • Axios 和Express 区别对比
  • 使用LNMP一键安装包安装PHP、Nginx、Redis、Swoole、OPcache
  • Linux系统调优和工具