Linux学习笔记(六)

来源:互联网 发布:竞翔通良伟软件天宇杯 编辑:程序博客网 时间:2024/05/30 23:17

Linux磁盘与文件系统管理  

认识EXT2文件系统

由于磁盘物理组成和分区在前面已经提到了,在这就不在赘述,我们来看文件系统。

文件系统

告诉系统分区所在的起始与结束柱面后,就要将分区格式化为操作系统能够识别的文件系统。不同的操作系统能够识别的文件系统并不相同。在默认的情况下,windows 操作系统是不会认识 Linux 的 Ext2 的。

文件系统是如何运作的呢?这与操作系统的档案数据有关。较新的操作系统的档案数据除了档案实际内容外, 通常还有非常多的属性,例如 Linux 操作系统的档案权限(rwx)与文件属性(持有者、群组、时间参数等)。 文件系统通常会将这两部分的数据分别存放在不同的区块,权限与属性放置到 inode 中,至于实际数据则放置到 data block 区块中。 另外,还有一个超级区块 (superblock) 会记录整个文件系统的整体信息,包括 inode 与 block 的总量、使用量、剩余量等。 每个 inode 与 block 都有编号,至于这三个数据的意义可以简略说明如下: 

·  superblock:记录此 filesystem 的整体信息,包括inode/block 的总量、使用量、剩余量, 以及文件系统的格式与相关信息等; 

·  inode:记录档案的属性,一个档案占用一个inode,同时记录此档案的数据所在的 block 号码; 

·  block:实际记录档案的内容,若档案太大时,会占用多个 block 。 

由于每个 inode 与 block 都有编号,而每个档案都会占用一个 inode inode 内则有档案数据放置的 block 号码。 因此,我们可以知道的是,如果能够找到档案的inode 的话,那么自然就会知道这个档案所放置数据的 block 号码, 当然也就能够读出该档案的实际数据了。这是个比较有效率的作法,因为如此一来我们的磁盘就能够在短时间内读出全部的数据, 读写的效能比较好。

我们将 inode 与 block 区块用图解来说明一下,如下图所示,文件系统先格式化出 inode 与 block 的区块,假如某一个档案的属性与权限数据是放置到 inode 4 (下图较小方格内),而这个 inode 记录了档案数据的实际放置点为 2, 7, 13, 15 这四个 block 号码,此时我们的操作系统就能够据此来排列磁盘的阅读顺序,可以一口气将四个 block 内容读出来! 那么数据的读取就如同下图中的箭头所指定的模样了。 

LinuxEXT2文件系统

如果我的文件系统高达数百GB时, 那么将所有的 inode 和 block 通通放置在一起将是非常不明智的决定,因为 inode 与 block 的数量太庞大,不容易管理。所以 Ext2 文件系统在格式化的时候基本上是区分为多个区块群组 (block group) 的,每个区块群组都有独立的 inode/block/superblock 系统。感觉上就好像我们在当兵时,一个营里面有分成数个连,每个连有自己的联系系统, 但最终都向营部汇报连上最正确的信息一般!这样分成一群群的比较好管理啦!整个来说,Ext2 格式化后有点像底下这样:

在整体的规划当中,文件系统最前面有一个启动扇区(boot sector),这个启动扇区可以安装开机管理程序, 这是个非常重要的设计,因为如此一来我们就能够将不同的开机管理程序安装到个别的文件系统最前端,而不用覆盖整颗硬盘唯一的 MBR, 这样也就能够制作出多重引导的环境啊!至于每一个区块群组(block group)的六个主要内容说明如后:

data block (资料区块

data block 是用来放置档案内容数据地方,在 Ext2 文件系统中所支持的 block 大小有 1K, 2K 及 4K 三种而已。在格式化时 block 的大小就固定了,且每个 block 都有编号,以方便 inode 的记录。不过要注意的是,由于 block 大小的差异,会导致该文件系统能够支持的最大磁盘容量与最大单一档案容量并不相同。 因为 block 大小而产生的 Ext2 文件系统限制如下:

除此之外 Ext2 文件系统的 block 还有基本限制如下: 

·  原则上,block 的大小与数量在格式化完就不能够再改变了(除非重新格式化); 

·  每个 block 内最多只能够放置一个档案的数据; 

·  承上,如果档案大于 block 的大小,则一个档案会占用多个 block 数量; 

·  承上,若档案小于 block ,则该 block 的剩余容量就不能够再被使用了(磁盘空间会浪费)

 

inode table (inode 表格

再来认识一下 inode 这个玩意儿吧!如前所述 inode 的内容在记录档案的属性以及该档案实际数据是放置在哪几号 block 内! 基本上,inode 记录的档案数据至少有底下这些:

.该档案的存取模式(read/write/excute); 

·  该档案得拥有者与群组(owner/group); 

·  该档案的容量; 

·  该档案建立或状态改变的时间(ctime); 

·  最近一次的读取时间(atime); 

·  最近修改得时间(mtime); 

·  定义档案特性的旗标(flag),如 SetUID...; 

·  该档案真正内容的指向 (pointer); 

inode的数量与大小也是在格式化时就已经固定了,除此之外 inode 还有些什么特色呢? 

·  每个 inode 大小均固定为 128 bytes; 

·  每个档案都仅会占用一个 inode 而已; 

·  承上,因此文件系统能够建立的档案数量与 inode 的数量有关; 

·  系统读取档案时需要先找到 inode,并分析 inode 所记录的权限与用户是否符合,若符合才能够开始实际读取 block 的内容。 

 

Superblock (超级区块

Superblock 是记录整个 filesystem 相关信息的地方, 没有 Superblock ,就没有这个 filesystem 了。他记录的信息主要有: 

·  block 与 inode 的总量; 

·  未使用与已使用的 inode / block 数量; 

·  block 与 inode 的大小 (block 为 1, 2, 4Kinode 为 128 bytes); 

·  filesystem 的挂载时间、最近一次写入数据的时间、最近一次检验磁盘 (fsck) 的时间等文件系统的相关信息; 

·  一个 valid bit 数值,若此文件系统已被挂载,则 valid bit 为 ,若未被挂载,则 valid bit 为 

 

Filesystem Description (文件系统描述说明

这个区段可以描述每个 block group 的开始与结束的 block 号码,以及说明每个区段 (superblock, bitmap, inodemap, data block) 分别介于哪一个 block 号码之间。这部分也能够用 dumpe2fs 来观察。

 

block bitmap (区块对照表

如果你想要新增档案时总会用到 block 吧!那你要使用那个 block 来记录呢?当然是选择『空的 block 』来记录新档案的数据啰。 那你怎么知道那个 block 是空的?这就得要透过 block bitmap 的辅助了。从 block bitmap 当中可以知道哪些 block 是空的,因此我们的系统就能够很快速的找到可使用的空间来处置档案啰。同样的,如果你删除某些档案时,那么那些档案原本占用的 block 号码就得要释放出来, 此时在 block bitmpap 当中相对应到该 block 号码的标志就得要修改成为『未使用中』啰!这就是 bitmap 的功能。  

 

inode bitmap (inode 对照表

这个其实与 block bitmap 是类似的功能,只是 block bitmap 记录的是使用与未使用的block 号码, 至于 inode bitmap 则是记录使用与未使用的 inode 号码啰! 

了解了文件系统的概念之后,再来当然是观察这个文件系统啰!刚刚谈到的各部分数据都与 block 号码有关! 每个区段与 superblock 的信息都可以使用 dumpe2fs 这个指令来查询的!查询的方法与实际的观察如下: 

[root@www ~]# dumpe2fs [-bh] 装置文件名 

选项与参数: 

-b :列出保留为坏轨的部分(一般用不到吧!?

-h :仅列出 superblock 得数据,不会列出其他得区段内容! 

 

范例:找出我的根目录磁盘文件名,并观察文件系统的相关信息

[root@www ~]# df   <==这个指令可以叫出目前挂载的装置 

Filesystem    1K-blocks      Used Available Use% Mounted on

/dev/hdc2       9920624   3822848   5585708  41% /        <==就是这个

/dev/hdc3       4956316    141376   4559108   4% /home 

/dev/hdc1        101086     11126     84741  12% /boot 

tmpfs            371332         0    371332   0% /dev/shm 

[root@www ~]# dumpe2fs /dev/hdc2 

 

目录

当我们在 Linux 下的 ext2 文件系统建立一个目录时, ext2 会分配一个 inode 与至少一块 block 给该目录。其中,inode 记录该目录的相关权限与属性,并可记录分配到的那块 block 号码; 而 block 则是记录在这个目录下的文件名与该文件名占用的 inode 号码数据。也就是说目录所占用的 block 内容在记录如下的信息:  

如果想要实际观察 root 家目录内的档案所占用的 inode 号码时,可以使用 ls -i 这个选项来处理。

 

文件:

Ext2会给该文件分配至少一个inode与想对于该文件大小的块数量。

Inode本身并不记录文件名,而是记录文件的相关属性,文件名记录在目录所属的块区域。

下面给出一个读取/etc/passwd文件的流程:

1的 inode

透过挂载点的信息找到 /dev/hdc2 的 inode 号码为 的根目录 inode,且 inode 规范的权限让我们可以读取该 block 的内容(有 与 x) 

2的 block

经过上个步骤取得 block 的号码,并找到该内容有 etc/ 目录的 inode 号码 (1912545)

3etc/ 的 inode

读取 1912545 号 inode 得知 vbird 具有 与 的权限,因此可以读取 etc/ 的 block 内容;

4etc/ 的 block

经过上个步骤取得 block 号码,并找到该内容有 passwd 档案的 inode 号码 (1914888)

5passwd 的 inode

读取 1914888 号 inode 得知 vbird 具有 的权限,因此可以读取 passwd 的 block 内容;

6passwd 的 block

最后将该 block 内容的数据读出来。

 

上面谈到仅是读取而已,那么如果是新建一个档案或目录时,我们的 Ext2 是如何处理的呢? 这个时候就得要 block bitmap 及 inode bitmap 的帮忙了!假如我们想要新增一个档案,此时文件系统的行为是: 

1.  先确定用户对于欲新增档案的目录是否具有 与 的权限,若有的话就能新增; 

2.  根据 inode bitmap 找到没有使用的 inode 号码,并将新档案的权限/属性写入; 

3.  根据 block bitmap 找到没有使用中的 block 号码,并将实际的数据写入 block 中,并更新 inode 的 block 指向数据; 

4.  将刚刚写入的 inode 与 block 数据同步更新 inode bitmap 与 block bitmap,并更新 superblock 的内容。 

 

日志式文件系统 (Journaling filesystem) 

为了避免在文件读取或写入过程中文件系统不一致得情况发生,在filesystem 当中规划出一个区块,该区块专门在记录写入或修订档案时的步骤,也就是说: 

1.  预备:当系统要写入一个档案时,会先在日志记录区块中记录档案准备要写入的信息; 

2.  实际写入:开始写入档案的权限与数据;开始更新 metadata 的数据; 

3.  结束:完成数据与 metadata 的更新后,在日志记录区块当中完成该档案的记录。 

在这样的程序当中,万一数据的记录过程当中发生了问题,那么我们的系统只要去检查日志记录区块,就可以知道那个档案发生了问题,针对该问题来做一致性的检查即可,而不必针对整块 filesystem 去检查, 这样就可以达到快速修复 filesystem 的能力了!这就是日志式档案最基础的功能啰~

dumpe2fs 输出讯息,可以发现 superblock 里面有底下这样的信息:

看到了吧!透过 inode 8 号记录 journal 区块的 block 指向,而且具有 128MB 的容量在处理日志呢! 

为了让Linux加快整个系统的访问速度,Linux采用的是异步处理方式

    异步处理:当系统读取某个文件,则该文件所在的块数据会加载到内存中,所以该磁盘块就会放在主存储器的缓冲区中。若这些块的数据被改变时,刚开始只有主储存 器中的块数据会被改变,而在缓冲区中的块数据会被标记为,整个时候,磁盘实体块尚未被修正,所以,这些脏数据必须回写到磁盘中,以维持磁盘实体块上 的数据与主存储器中的块数据的一致性。

 

挂载点的意义 (mount point): 

每个 filesystem 都有独立的 inode / block / superblock 等信息,这个文件系统要能够链接到目录树才能被我们使用。 将文件系统与目录树结合的动作我们称为『挂载』。 关于挂载的一些特性重点是:挂载点一定是目录,该目录为进入该文件系统的入口。 因此并不是你有任何文件系统都能使用,必项要『挂载』到目录树的某个目录后,才能够使用该文件系统的。 举例来说,我的系统有两个挂载点,分别是 /, /boot (系统上对应的装置文件名为 /dev/sda2, /dev/sda1)。 

那如果观察这两个目录的inode 号码时,我们可以发现如下的情况:

看到了吧!由于 filesystem 最顶层的目录之 inode 一般为 号,因此可以发现 /, /boot, 为二个不同得 filesystem 啰! (因为每一行的文件属性并不相同,且两个目录的挂载点也均不相同。)  

Linux支持的其他文件系统

查看当前Linux已经启用的文件系统查看:cat /proc/filesystems里面的内容

想知道Linux支持的文件系统:ls –l /lib/modules/$(uname -r)/kernel/fs

 

磁盘与目录的容量:

df:列出文件系统的整体磁盘使用量;

du:评估文件系统的磁盘使用量(常用在推估目录所占容量)

1 df

[root@www ~]# df [-ahikHTm] [目录或文件名]

选项与参数:

-a  :列出所有的档案系统,包括系统特有的 /proc 等档案系统;

-k  :以 KBytes 的容量显示各档案系统;

-m  :以 MBytes 的容量显示各档案系统;

-h  :以人们较易阅读的 GBytes, MBytes, KBytes 等格式自行显示;

-H  :以 M=1000K 取代 M=1024K 的进位方式;

-T  :连同该 partition 的 filesystem 名称 (例如 ext3) 也列出;

-i  :不用硬盘容量,而以 inode 的数量来显示

范例一:将系统内所有的 filesystem 列出来!

[root@www ~]# df

Filesystem      1K-blocks      Used Available Use% Mounted on

/dev/hdc2         9920624   3823112   5585444  41% /

/dev/hdc3         4956316    141376   4559108   4% /home

/dev/hdc1          101086     11126     84741  12% /boot

tmpfs              371332         0    371332   0% /dev/shm

在 Linux 底下如果 df 没有加任何选项,那么预设会将系统内所有的

# (不含特殊内存内的档案系统与 swap) 都以 1 Kbytes 的容量来列出来!

至于那个 /dev/shm 是与内存有关的挂载,先不要理他!

范例二:将容量结果以易读的容量格式显示出来

[root@www ~]# df -h

Filesystem            Size  Used Avail Use% Mounted on

/dev/hdc2             9.5G  3.7G  5.4G  41% /

/dev/hdc3             4.8G  139M  4.4G   4% /home

/dev/hdc1              99M   11M   83M  12% /boot

tmpfs                 363M     0  363M   0% /dev/shm

不同于范例一,这里会以 G/M 等容量格式显示出来,比较容易看啦!

范例三:将系统内的所有特殊档案格式及名称都列出来

[root@www ~]# df -aT

Filesystem    Type 1K-blocks    Used Available Use% Mounted on

/dev/hdc2     ext3   9920624 3823112   5585444  41% /

proc          proc         0       0         0   -  /proc

sysfs        sysfs         0       0         0   -  /sys

devpts      devpts         0       0         0   -  /dev/pts

/dev/hdc3     ext3   4956316  141376   4559108   4% /home

/dev/hdc1     ext3    101086   11126     84741  12% /boot

tmpfs        tmpfs    371332       0    371332   0% /dev/shm

none   binfmt_misc         0       0         0   -  /proc/sys/fs/binfmt_misc

sunrpc  rpc_pipefs         0       0         0   -  /var/lib/nfs/rpc_pipefs

系统里面其实还有很多特殊的档案系统存在的。那些比较特殊的档案系统几乎

都是在内存当中,例如 /proc 这个挂载点。因此,这些特殊的档案系统

都不会占据硬盘空间喔! ^_^

范例四:将 /etc 底下的可用的磁盘容量以易读的容量格式显示

[root@www ~]# df -h /etc

Filesystem            Size  Used Avail Use% Mounted on

/dev/hdc2             9.5G  3.7G  5.4G  41% /

这个范例比较有趣一点啦,在 df 后面加上目录或者是档案时, df

会自动的分析该目录或档案所在的 partition ,并将该 partition 的容量显示出来,

所以,您就可以知道某个目录底下还有多少容量可以使用了! ^_^

范例五:将目前各个 partition 当中可用的 inode 数量列出

[root@www ~]# df -ih

Filesystem            Inodes   IUsed   IFree IUse% Mounted on

/dev/hdc2               2.5M    147K    2.3M    6% /

/dev/hdc3               1.3M      46    1.3M    1% /home

/dev/hdc1                26K      34     26K    1% /boot

tmpfs                    91K       1     91K    1% /dev/shm

这个范例则主要列出可用的 inode 剩余量与总容量。分析一下与范例一的关系,

你可以清楚的发现到,通常 inode 的数量剩余都比 block 还要多呢

 

先来说明一下范例一所输出的结果讯息为:

Filesystem:代表该档案系统是在哪个 partition ,所以列出装置名称;

1k-blocks:说明底下的数字单位是 1KB 呦!可利用 -h 或 -m 来改变容量;

Used:顾名思义,就是使用掉的硬盘空间啦!

Available:也就是剩下的磁盘空间大小;

Use%:就是磁盘的使用率,如果使用率高达 90% 以上时, 最好需要注意一下了,免得容量不足造成系统问题喔!(例如最容易被灌爆的 /var/spool/mail 这个放置邮件的磁盘)

Mounted on:就是磁盘挂载的目录所在啦!(挂载点啦!)

由 于 df 主要读取的数据几乎都是针对一整个档案系统,因此读取的范围主要是在 Superblock 内的信息, 所以这个指令显示结果的速度非常的快速!在显示的结果中你需要特别留意的是那个根目录的剩余容量! 因为我们所有的数据都是由根目录衍生出来的,因此当根目录的剩余容量剩下 时,那你的 Linux 可能就问题很大了。

需要注意的是,如果使用 -a 这个参数时,系统会出现 /proc 这个挂载点,但是里面的东西都是 ,不要紧张! /proc 的东西都是 Linux 系统所需要加载的系统数据,而且是挂载在『内存当中』的, 所以当然没有占任何的硬盘空间啰!

 

2 du

[root@www ~]# du [-ahskm] 档案或目录名称

选项与参数:

-a  :列出所有的档案与目录容量,因为预设仅统计目录底下的档案量而已。

-h  :以人们较易读的容量格式 (G/M) 显示;

-s  :列出总量而已,而不列出每个各别的目录占用容量;

-S  :不包括子目录下的总计,与 -s 有点差别。

-k  :以 KBytes 列出容量显示;

-m  :以 MBytes 列出容量显示;

范例一:列出目前目录下的所有档案容量

[root@www ~]# du

8       ./test4     <==每个目录都会列出来

8       ./test2

....中间省略....

12      ./.gconfd   <==包括隐藏文件的目录

220     .           <==这个目录(.)所占用的总量

直接输入 du 没有加任何选项时,则 du 会分析『目前所在目录』

的档案与目录所占用的硬盘空间。但是,实际显示时,仅会显示目录容量(不含档案)

因此 目录有很多档案没有被列出来,所以全部的目录相加不会等于 的容量喔!

此外,输出的数值数据为 1K 大小的容量单位。

范例二:同范例一,但是将档案的容量也列出来

[root@www ~]# du -a

12      ./install.log.syslog   <==有档案的列表了

8       ./.bash_logout

8       ./test4

8       ./test2

....中间省略....

12      ./.gconfd

220     .

范例三:检查根目录底下每个目录所占用的容量

[root@www ~]# du -sm /*

7       /bin

6       /boot

.....中间省略....

0       /proc

.....中间省略....

1       /tmp

3859    /usr     <==系统初期最大就是他了啦!

77      /var

这是个很常被使用的功能~利用万用字符 来代表每个目录,

如果想要检查某个目录下,那个次目录占用最大的容量,可以用这个方法找出来

值得注意的是,如果刚刚安装好 Linux 时,那么整个系统容量最大的应该是 /usr

而 /proc 虽然有列出容量,但是那个容量是在内存中,不占硬盘空间。

与 df 不一样的是,du 这个指令其实会直接到档案系统内去搜寻所有的档案数据, 所以上述第三个范例指令的运作会执行一小段时间!此外,在预设的情况下,容量的输出是以 KB 来设计的, 如果你想要知道目录占了多少 MB ,那么就使用 -m 这个参数即可啰!而, 如果你只想要知道该目录占了多少容量的话,使用 -s 就可以啦!

原创粉丝点击