索引结点
1.文件系统概念:
①文件与目录的定义
文件系统 、文件、目录 、子目录、文件名、路径名、当前工作目录
②文件结构
文件的成分——索引节点 + 数据节点
③文件命名:
▲尽量简捷有效
▲不要用斜线(/)和空字符(ASCII字符\0)
▲避免空格、制表符或其他控制字符。
▲习惯上允许使用下线符(_)和句点(.)来区别文件的类型 ,但是应避免使用以下有特殊含义的字符:
; | < > ˋ ″ ′ $ ! % & * ? \ ( ) [ ]
▲同类文件应使用同样的后缀或扩展名
▲Linux系统区分文件名的大小写,如letter和Letter不是一个文件
▲以圆点(.)开头的文件名是隐含文件
③目录文件:
43516731 . ⽂件.的innode number是43516731
(innode number在2.Linux的文件系统特性有解释)
43384921 … ⽂件…的innode number是43384921
43516732 passwd.png ⽂件passwd.png的innode number是43516732
每个目录的第一项都表示目录本身,并以 “ . ” 作为该目录本身的文件名,通过cd . ,可以到达本目录,而第二项的名字都是 “ … ” ,表示该目录的父目录。
假如当前目录为/home/zxy/Documents,执行 cd … ,就会进入/home/zxy目录。
2.Linux的文件系统特性:
linux操作系统的文件数据除了文件实际内容外, 通常含有非常多的属性,例如 Linux 操作系统的文件权限(rwx)与文件属性(拥有者、群组、时间参数等。
文件系统通常会将这两部份的数据(实际内容和其他属性)分别存放在不同的区块,权限与属性放置到inode 中,至于实际数据则放置到 **data block (data node)**区块中。 若文件太大可能会占用多个数据块。
每个文件都会占用一个 inode ,inode 内则有文件数据放置的 block 号码。 因此如果能够找到文件的 inode 的话,那么就会知道这个文件的 block 号码, 也就能够读出该文件的实际数据了。
3.索引式文件系统(indexed allocation)
1.每一个文件都会和唯一的一个innode(索引节点)相对应。innode会对应一到多个data block(数据节点),存储的是多个data block的指针,通过指针并行的获取几个data block内的内容。data block存放的内容就是文件内的真实数据了。
2.FAT文件系统数据是链式的获取多个data block的内容
目录树
目录成分:索引节点和至少一块数据块。
inode 记录该目录的相关权限与属性,并可记录分配给目录的那块 block 号码; 而 block 则是记录在这个目录下的文件名与该文件名占用的 inode 号码数据。下图是block内容。
问题:
一、怎么找到m1.c这个文件?
1.根目录的innode number是2(规定),获取根目录的data block(也就是文件名和结点号表格),从表格中获取/usr目录的innode number,获取/usr innode数据。
2.通过/usr的innode,获取/usr的data block(也就是文件名和结点号表格),从表格中获取/mengqc目录的innode number,获取/mengqc innode数据。
3.通过/mengqc 的innode,获取/mengqc 的data block(也就是文件名和结点号表格),从表格中获取/mub1目录的innode number,获取/mub1 innode数据。
4.通过/mub1的innode,获取/mub1 的data block(也就是文件名和结点号表格),获取m1.c的innode number,获取m1.c的innode。
5.通过m1.c的innode,获取其指向数据的data block指针,获取m1.c内的数据,即文件内容。
二、为什么把某个新分区挂载到某个目录后,该目录原本的文件会消失?
该问题预设场景:/home/zxy/Documents原挂载分区为/dev/sda6,后挂载新分区/dev/sdb2,原文件消失。
/home/zxy/Documents 挂载新分区前:
/home/zxy/Documents 挂载新分区后:
形象化解释:
原本before文件存放在名字叫/dev/sda6的盒子里,后来这个盒子从目录树上取下来了(解挂载),随之被一个空盒子/dev/sdb2替代了,那么现在再次进入/zxy/Documents后,就是相当于进入/dev/sdb2这个空盒子了,因此原本的before看起来消失了。
但其实before还存在,只是因为/dev/sda6这个盒子没挂到树上,所以无法访问,重新挂载这个盒子即可看到盒子里的内容,如before等。
解决办法:
正常登录以后,所看到的各个目录,文件都是内核在加载时候构造在内存中的VFS目录树,而不是直接看到硬盘上的实际目录树。当你挂载某个设备到一个VFS挂载点上时(比如/home),系统就把VFS中的这个挂载点/home指向你最后所挂载的那个设备上。那么你现在访问该挂载点时,就会看到你最后挂载在此处的设备。而之前所挂载的设备依然在那里,只不过挂载点/home已经不再指向之前的设备。所以之前的数据是被隐藏了,但并没有删除,若umount挂载后,数据又重新回来了。
(1)先将硬盘挂载到一个新建的空目录作为中转目录。
(2)将硬盘先挂载到跳板目录上。
(3)将原要挂载的目录中所有文件复制过来。
(4)删除原目录下的所有文件。
(5)将硬盘挂载到原要挂载的目录。