linux查缺补漏之磁盘和文件系统


linux磁盘与文件系统

格式化

因为每一种文件系统设置所设定的文件属性/权限并不相同,为了存放这些数据,就需要将分隔槽格式化,比如在linux上面文件系统里面就有inode, block, superBlock,这些就是为文件系统而存在的,所以在格式化的时候,就需要在磁盘里面加上标签,标号神马的!

文件系统

在没有LVM磁盘阵列技术之前,一个分隔槽就代表了一个文件系统,现在而是将可以被挂在的数据成为文件系统而不是一个分隔槽

三个文件系统里面的基本数据

superBlock:记录一个fileSystem的inode/block总量,使用量,剩余量,一级文件系统格式和相关信息 inode:用来存放文件的相关权限信息,同时记录真正数据所在的block号码 block:实际记录文档内容的地方
因为在linux上面ext3/4这种特殊的存储形式,不容易产生碎片,所以linux上面一般不需要碎片整理

区块群组

block区块是记录档案的实际内容的,所以在规划好以后,就不能再改变了,如果一个block区块过于庞大的话,就会造成数据读取的不高效
所以linux文件系统就采用了区块群组的方式,每一个区块群组都有自己独立的inode,block,superBlock

data block
- 每一个区块群组的block大小和数量在第一次格式化时就已经确定了,除非重新格式化
- 每一个block只能放置一个档案!

inode table

inode如同data block一样,一旦格式化,就无法在改变数量了。
还有下面的几个特性:

每一个inode的大小固定为128B 每一个档案都只占用一个inode而已 因此每一个文件系统可以创建的文件数量与inode数量有关 在读取一个文件的数据时,首先inode权限校验用户权限再决定读不读去block信息

有些时候因为文件的数据过多,需要记录多个多个block信息,inode却只有128B,那么inode里面就有12个直接,一个间接,一个双间接 , 一个三间接,这样就可以利用block数据来记录block号码了!

区块群组
每一个文件系统的block数目在格式化的时候就已经确定了,但是有些时候因为文件系统过于庞大,就将一个文件系统里面的block分为一个一个的组,就是区块群租,就比如Group1 , Group2
inode,superBlock, inode bitmap , block bitmap这些都是特殊的block,将block特殊化以后就用来存储一些特殊的数据,所以一般文件的数据内容都是放在block里面的!
用dumpe2fs可以看到:

Group 0: (Blocks 0-32767) [ITABLE_ZEROED]
Checksum 0xec2c, unused inodes 0
主 superblock at 0, Group descriptors at 1-1
保留的GDT块位于 2-406
Block bitmap at 407 (+407), Inode bitmap at 423 (+423)
Inode表位于 439-948 (+439)
22643 free blocks, 0 free inodes, 1138 directories
可用块数: 9881, 10126-32767
可用inode数:

这里面的inode , spuerBlock等等内容都是放于block块里面的

目录与inode, block之间的关系
一个目录与一个inode关联和至少一个block关联

inode里面保存权限信息以及分配的block块号 分配的block里面则保存文件名字以及文件名字对应的inode(因为通过inode就可以找找文件了)
inode number filename
123 file1
456 file2
789 file3

block里面就是按照这样的形式保存目录下文件的信息

目录的大小为啥都是一个固定的倍数

因为目录下inode占用128B,而block占用4k,所以基本都是4096的倍数!

挂载
挂载点一定是目录,该目录是进入文件系统地入口,因为并不是所有的文件系统都可以使用,必须要在挂在以后才可以使用!

/文件系统的inode标号

ls -i -d /  /.  /..

我们得到结果:

2 drwxr-xr-x 23 root root 4096 4月 12 21:43 //
2 drwxr-xr-x 23 root root 4096 4月 12 21:43 /./
2 drwxr-xr-x 23 root root 4096 4月 12 21:43 /../

linux VFS(linux virtual file system)

因为linux可以挂在多重类型的file system,各种文件系统之间有较大差别,我么通过virtual file system 来将底层的各种类型的文件系统抽象成无差别的,具体的识别区分工作就交给VFS来完成

df(列出磁盘整体使用量)

df -akmThHi
- -a列出所有的文件系统
- -k 以kb形式表现
- -m 以mb的形式表现
- -h human可读的形式展现出来
- -H human可读的形式展现出来,只是将1000作为之间的缩放比例
- -T 就着列出文件系统的了类型
- -i 列出inode的使用情况

df 命令是通过读取一个文件系统的里面的superBlock来获取的,速度非常的快速,所以df命令后面接上的必须是一个文件系统,一个没有被文件系统挂在的目录是不可以的!

du评估文件系统的磁盘使用量

du -asShkm dirName
- -a 所有的文件条目
- -s 列出总和
- -S列出除了当前目录,不包括子目录
- -h human可以读的
- -k kb show
- -m -mb show

注意:直接du的话是只列出当前目录下面的目录大小,该目录下的文件并不列出,所以列出的容量和当前./容量是不相同的,加上-a选项就可以啦

硬链接(实体连接)

硬链接可以说是只是在目录对应的block下面增加一个条目,里面保存了文件名字和文件对应的inode号码:

filename inodeNumber
filename1 indoeNumberA
filename2 inodeNumberA

其中filename1好filename2都是对应同一个inodeNumber,所以file1和file2都是只占用一个文件的空间大小的,实际上保存的东西只是文件名字和inode,所以在新建一个硬链接的时候一般不增加内存大小,除非对应的目录的block满了需要申请一块新的内存。
主要存在一个名字指向inode,那么这个inode指向的资源就不会被释放,意思就是只要存在一个硬链接,那么文件就是一直存在

硬链接的限制

不能跨越文件系统:因为硬链接的基础是inode,而每一个文件系统的inode都是彼此独立的,所以不能跨越文件系统 不能硬链接目录:因为硬链接的时候需要同时链接目录下面的所有文件,为了降低这个操作的复杂度,于是不允许目录的实体连接

符号链接(软链接)

软链接就好比是一个快捷方式。创建软链接就像是新建一个文件,将被链接的完全路径写入到文件里面,一旦对软链接操作的时候,那么就会读取对应的被链接文件的名字,再开始操作!一旦软链接链接的文件被删除,软链接虽然还存在,但是已经失效了
软链接是需要占用inode和block的,因为是一个新的文件,而不是简单的在目录里面添加条项

格式化

在我们用fdisk穿件一个新的分割槽以后,如果我们要使用这个分隔槽,那么就需要格式化这个分割槽

格式化命令
- mkfs -t fileSystemType device
- mke2fs [-b size][-i size][-L ][-cj]

文件系统的检查与修复

在系统断电等等情况下,都有可能造成文件系统的损坏,那么我们就要对文件系统进行修复,现在的指令一般有fsck和badblocks

fsck注意事项

fsck只有在系统发生重大事故的时候才会使用,而且在文件系统挂载的时候切记不可进行fsck检查,否则将会损坏文件系统!!!!要检查的文件系统一定要在umount以后才可fsck
命令如:fsck -C -f -t ext4 /dev/sdb1这里的-C选项就是用来显示当前检查的进度

lost+found文件夹

在一个文件系统里面一般会有一个叫做lost+found的文件夹,这个文件夹一般都是在fsck以后存放有问题数据的地方的,当你 fsck以后,这个文件见就会自动消失

单人维护模式

一般在单人维护模式下面,根文件系统的权限为只读的,这个时候我们需要将根文件系统挂在为可读写的mount -o remount,ew,auto /

mount命令

-a选项:将/etc/fatab全部没有挂在的东西挂在上来
-l选项:显现在已经挂在的文件系统有哪些,-l会显式对的Label
-t选项:指定要挂载文件系统的类型
-n选项:在挂载时候不写入到文件/etc/mtab里面去,比如在单人模式下面就特别有用
-o选项:这里选项是很强大的:

arg1 arg2 descibe
ro rw 控制文件系统读写
async sync 采用同步写入还是异步写入的机制
auto noauto 允许这文件系统以mount -a的形式挂载
dev nodev 是否允许在这个文件系统上建立装置档案
suid nosuid 是否允许在这个文件系统上面含有suid/sgid的文件
exec noexe 是否允许在文件系统下面有可执行文件
default   默认标配
remount   重新挂载文件系统

mount –bind
将某个目录挂在到某个目录下面就可以使用
mkdir /tmp/tempHome
mount --bind /home /tmp/tempHome
这两个目录有相同的inode,有点类似于硬链接

文件系统还可以通过相应的label来挂载
我们在格式化文件系统的时候可以指定一个label,比如命令:mke2fs -b -i -j -L “qeesung_label”

相关内容