linux的文件系统

文件系统

磁盘的物理组成:
首先看看硬盘的物理组成,就硬盘的物理元件来说,硬碟其实是由许许多多的圆形硬碟盘所组成的, 依据硬碟盘能够容纳的资料量,而有所谓的单碟 (一块硬碟里面只有一个硬碟盘) 或者是多碟 (一块硬碟里面含有多个硬碟盘)的硬碟。在这里我们以单一个硬碟盘来说明。

首先,硬碟里面一定会有所谓的磁头 ( Head ) 在进行该硬碟盘上面的读写动作,而磁头是固定在机械手臂上面的,机械手臂上有多个磁头可以进行读取的动作。 而当磁头固定不动 (假设机械手臂不动) ,硬碟盘转一圈所画出来的圆就是所谓的磁轨( Track );而如同我们前面刚刚提到的,一块硬碟里面可能具有多个硬碟盘, 所有硬碟盘上面相同半径的那一个磁轨就组成了所谓的磁柱( Cylinder )。

两个硬碟盘上面的同一个磁轨就是一个磁柱啦! 这个磁柱也是磁碟分割( partition )时的最小单位了;
另外,由圆心向外划直线,则可将磁轨再细分为一个一个的磁区( Sector ),这个磁区就是硬碟盘上面的

最小储存物理量了! 通常一个 sector 的大小约为 512 Bytes 。以上就是整个硬碟的基本元件。

在计算整个硬碟的储存量时,简单的计算公式就是∶Cylinder x Head x Sector x 512 Bytes。另外,硬碟在读取时,主要是『硬碟盘会转动, 利用机械手臂将磁头移动到正确的资料位置(单方向的前后移动),然后将资料依序读出。』

磁盘分割
接著下来介绍的就是硬碟的分割( Partition )棉! 为什么要进行硬碟分割啊?!因为我们必须要告诉作业系统∶『 我这块硬碟可以存取的区域是由 A 磁柱到 B 磁柱』,如此一来, 作业系统才能够控制硬碟磁头去 A-B 范围内的磁柱存取资料;如果没有告诉作业系统这个资讯, 那么作业系统就无法利用我们的硬碟来进行资料的存取了, 因为作业系统将无法知道他要去哪里读取资料啊!这就是磁碟分割( Partition )的重点了∶ 也就是记录每一个分割区( Partition )的起始与结束磁柱!

这个分割区的起始与结束磁柱的资料放在哪里呢?!那就是我们在 Linux 安装与多重开机技巧 那个章节提到的 主要开机磁区( Master Boot Recorder, MBR )棉!事实上, MBR 就是在一块硬碟的第零轨上面,

这也是电脑开机之后要去利用该硬碟时, 必须要读取的第一个区域!

文件系统
在告知系统我的 partition 所在的起始与结束磁柱之后,再来则是需要将 partition 格式化为『我的作业系统认识的文件系统( Filesystem )』棉!因为每个作业系统认识的 filesystem 并不相同!例如

Windows 作业系统在预设状态下就无法认识 Linux 的文件系统。

不论是哪一种 filesystem ,资料总是需要储存的吧!既然硬碟是用来储存资料的,想当然尔, 资料就必须写入硬碟啦!刚刚我们提到硬碟的最小储存单位是 sector ,不过资料所储存的最小单位并不是 sector 喔,因为用 sector 来储存太没有效率了。怎么说呢?因为一个 sector 只有 512 Bytes ,而磁头是一个一个 sector 的读取,也就是说,如果我的文件有 10 MBytes ,那么为了读这个文件, 我的磁头必须要进行读取 (I/O) 20480 次!

为了克服这个效率上的困扰,所以就有逻辑区块( Block )的产生了! 逻辑区块是在 partition 进行 filesystem 的格式化时, 所指定的『最小储存单位』,这个最小储存单位当然是架构在 sector 的大小上面( 因为 sector 为硬碟的最小物理储存单位啊! ),所以啦, Block 的大小为 sector 的 2 的次方倍数。此时,磁头一次可以读取一个 block ,如果假设我们在格式化的时候,指定 Block 为 4 KBytes (

亦即由连续的八个 sector 所构成一个 block ),那么同样一个 10 MBytes 的文件, 磁头要读取的次数则大幅降为 2560 次,这个时候可就大大的增加文件的读取效能啦!

Superblock∶如同前面说的,当我们在进行磁碟分割( partition )时,每个磁碟分割槽( partition )就是一个文件系统( filesystem ), 而每个文件系统开始的位置的那个 block 就称为 superblock ,superblock 的作用是储存像是文件系统的大小、空的和填满的区块,以及他各自的总数和其他诸如此类的资讯等等, 这也就是说,当您要使用这一个磁碟分割槽( 或者说是文件系统 )来进行资料存取的时候,第一个要经过的就是 superblock 这个区块了,所以棉, superblock 坏了,您的这个磁碟槽大概也就回天
乏术了!

Linux的EXT2文件系统:
文件有很多属性,如创建时间,所属群组,创建者等,还有文件内容。
ext2 规划出 inode 与 Block 来分别储存文件的属性( 放在 inode 当中 )与文件的内容( 放置在 Block area 当中 )。当我们要将一个 partition 格式化( format )为 ext2 时,就必须要指定 inode 与 Block 的大小才行,也就是说,当 partition 被格式化为 ext2 的文件系统时,他一定会有 inode table 与 block area 这两个区域。

Block 是记录『文件内容资料』的区域,至于 inode 则是记录『该文件的相关属性,以及文件内容放置在哪一个 Block 之内』的资讯。 简单的说, inode 除了记录文件的属性外,同时还必须要具有指向( pointer )的功能,亦即指向文件内容放置的区块之中,好让作业系统可以正确的去取得文件的内容啊!
inode记录中保存的信息:
该文件的拥有者与群组(owner/group);
该文件的存取模式(read/write/excute);
该文件的类型(type);
该文件建立或状态改变的时间(ctime)、最近一次的读取时间(atime)、最近修改的时间(mtime);
该文件的容量;
定义文件特性的旗标(flag),如 SetUID...;
该文件真正内容的指向 (pointer);

目录∶
当我们在 Linux 下的 ext2 文件系统建立一个目录时, ext2 会分配一个 inode 与至少一块 Block 给该

目录。其中,inode 记录该目录的相关属性,并指向分配到的那块 Block ;而 Block 则是记录在这个目

录下的相关连的文件(或目录)的关连性!


文件∶
当我们在 Linux 下的 ext2 建立一个一般文件时, ext2 会分配至少一个 inode 与相对于该文件大小的 Block 数量给该文件。例如∶假设我的一个 Block 为 4 Kbytes ,而我要建立一个 100 KBytes 的文件,那么 linux 将分配一个 inode 与 25 个 Block 来储存该文件!

inode 本身并不纪录档名,而是记录文件的相关属性,至于档名则是记录在目录所属的 block 区域! 那么文件与目录的关系又是如何呢?就如同上面的目录提到的,文件的相关连结会记录在目录的 block 资料

区域, 所以当我们要读取一个文件的内容时,我们的 Linux 会先由根目录 / 取得该文件的上层目录所在 inode , 再由该目录所记录的文件关连性 (在该目录所属的 block 区域) 取得该文件的 inode , 最后在经由 inode 内提供的 block 指向,而取得最终的文件内容。
例如:
ls -lia /
total 104
     2 drwxr-xr-x  22 root root  4096 2010-12-11 03:30 .
     2 drwxr-xr-x  22 root root  4096 2010-12-11 03:30 ..
392449 drwxr-xr-x   2 root root  4096 2010-12-11 03:31 bin
654081 drwxr-xr-x   3 root root  4096 2010-12-11 03:36 boot
 10700 drwxr-xr-x   2 root root  4096 2010-12-11 03:08 cdrom
     4 drwxr-xr-x  17 root root  3920 2011-06-26 18:45 dev
130817 drwxr-xr-x 131 root root 12288 2011-06-26 18:47 etc
# 注意看一下,在上面的 . 与 .. 都是连结到 inode 号码为 2 的那个 inode ,
# 也就是说, / 与其上层目录 .. 都是指向同一个 inode number 啊!两者是相同的。
# 而在根目录所记载的档案关连性 (在 block 内) 得到 /etc 的 inode number 
# 为 130817 那个 inode number 喔!

要想知道linux支持哪些文件系统,可使用ls -l /lib/modules/`uname -r`/kernel/fs
进行查看。
查看系统当前已启用的文件系统使用cat /proc/filesystems。

磁盘与目录容量
有什么方法可以查看目前的磁碟最大容许容量、已经使用掉的容量、 目前所在目录的已使用容量?还有还有,怎么知道目前目录底下使用掉的硬碟容量呢? 以及如何查询目前的 inodes 数目?

df [-ahikHTm] [目录或档名]
参数∶
-a  ∶列出所有的档案系统,包括系统特有的 /proc 等档案系统;
-k  ∶以 KBytes 的容量显示各档案系统;
-m  ∶以 MBytes 的容量显示各档案系统;
-h  ∶以人们较易阅读的 GBytes, MBytes, KBytes 等格式自行显示;
-H  ∶以 M=1000K 取代 M=1024K 的进位方式;
-T  ∶连同该 partition 的 filesystem 名称 (例如 ext3) 也列出;
-i  ∶不用硬碟容量,而以 inode 的数量来显示


范例一∶将系统内所有的 partition 列出来!用df命令
执行结果:
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/sda1             14784996   2667912  11366032  20% /
none                    248640       204    248436   1% /dev
none                    254244       188    254056   1% /dev/shm
none                    254244       100    254144   1% /var/run
none                    254244         0    254244   0% /var/lock

df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda1              15G  2.6G   11G  20% /
none                  243M  204K  243M   1% /dev
none                  249M  188K  249M   1% /dev/shm
none                  249M  100K  249M   1% /var/run
none                  249M     0  249M   0% /var/lock


du [-ahskm] 档案或目录名称
参数∶
-a  ∶列出所有的档案与目录容量,因为预设仅统计目录底下的档案量而已。
-h  ∶以人们较易读的容量格式 (G/M) 显示;
-s  ∶列出总量而已,而不列出每个各别的目录占用容量;
-k  ∶以 KBytes 列出容量显示;
-m  ∶以 MBytes 列出容量显示;


链接文件。
什么是连结档呢?其实连结档有点类似 Windows 底下的『捷径』!也就是很多的连结档案( link file )其实都指向同一个来源档案( source file )!。链接文件分为软连接和硬链接。Hard Link 只是在某个目录下新增一个该档案的关连资料而已!

举个例子来说,假设我的 /root/crontab 为一个 hard link 的档案,他连结到 /etc/crontab 这个档案,也就是说,其实 /root/crontab 与 /etc/crontab 是同一个档案,只是有两个目录( /etc 与 /root )记录了 crontab 这个档案的关连资料罢了!也就是说,我由 /etc 这个目录所记录的关连资料可知道crontab 的 inode 放置在 A 处,而由 /root 这个目录下的关连资料, crontab 同样也指到 A 处的

inode !所以棉, crontab 这个档案的 inode 与 block 都没有改变, 有的只是有两个目录记录了关连资料。

那这样有什么好处呢?最大的好处就是『安全!』如同上面提到的 /root/crontab 与 /etc/crontab 中,

不管哪一个档案被删除了,其实仅是移除一笔目录底下的档案关连性资料,并没有更动到原本档案的 inode 与 block 资料呢!而且,不论由那个目录连结到正确的 crontab 的 inode 与 block , 都可以正确无误的进行资料的修改喔!由于 hard link 是在同一个 partition 上面进行资料关连的建立,所以 hard link 是有限制的∶ 不能跨 Filesystem; 不能 link 目录。

一般来说,使用 hard link 设定连结档时,磁碟的空间与 inode 的数目都不会改变! 由上面的说明来看,我们可以知道, hard link 只是在某个目录下的 block 多写入一个关连资料,所以当然不会用掉 inode 与磁碟空间棉!

Symbolic link 就是在建立一个独立的档案, 而这个档案会让资料的读取指向他 link 的那个档案内容!由于只是利用档案来做为指向的动作, 所以,当来源档被删除之后,symbolic link 的档案会『开不了』。由 Symbolic link 所建立的档案为一个独立的新的档案,所以会占用掉 inode 与 block 喔!

[root@linux ~]# ln [-sf] 来源档 目标档
参数∶
-s  ∶如果 ln 不加任何参数就进行连结,那就是hard link,至于 -s 就是symbolic link
-f  ∶如果 目标档 存在时,就主动的将目标档直接移除后再建立!
范例∶
范例一∶将 /etc/passwd 复制到 /tmp 底下,并且观察 inode 与 block
[root@linux ~]# cd /tmp
[root@linux tmp]# cp -a /etc/passwd .
[root@linux tmp]# du -sb ; df -i .
26948   . <== 先注意一下,这里的容量是多少!
Filesystem            Inodes   IUsed   IFree IUse% Mounted on
/dev/hda1            1537088  144016 1393072   10% /
# 利用 du 与 df 来检查一下目前的参数~那个 du -sb
# 是计算整个 /tmp 底下有多少 bytes 的容量啦!

范例二∶将 /tmp/passwd 制作 hard link 成为 passwd-hd 档案
[root@linux tmp]# ln passwd passwd-hd
[root@linux tmp]# du -sb ; df -i .
26948   .
Filesystem            Inodes   IUsed   IFree IUse% Mounted on
/dev/hda1            1537088  144016 1393072   10% /
# 仔细看,即使多了一个档案在 /tmp 底下,整个 inode 与 block 的容量并没有改变!
[root@linux tmp]# ls -il passwd*
1242760 -rw-r--r--  2 root root 1746 Jun 29 01:03 passwd
1242760 -rw-r--r--  2 root root 1746 Jun 29 01:03 passwd-hd
# 原来是指向同一个 inode 啊!这是个重点啊!另外,那个第二栏的连结数也会增加!

范例三∶将 /tmp/passwd 建立一个符号连结
[root@linux tmp]# ln -s passwd passwd-so
[root@linux tmp]# ls -li passwd*
1242760 -rw-r--r--  2 root root 1746 Jun 29 01:03 passwd
1242760 -rw-r--r--  2 root root 1746 Jun 29 01:03 passwd-hd
1242806 lrwxrwxrwx  1 root root    6 Jul 23 20:02 passwd-so -> passwd
# 仔细看喔,这个 passwd-so 指向的 inode number 不同了!这是一个新的档案~
# 这个档案的内容是指向 passwd 的,你可以看到这个档案的大小,是 6bytes ,
# 怎么来的?因为 passwd 共有六个字元啊!哈哈!没错~这个连结档的内容只是填写
# 连结的目标档案档名而已!所以,你的连结档档名 (有时候含路径) 有多长,档案就多大!
[root@linux tmp]# du -sb ; df -i .
26954   .
Filesystem            Inodes   IUsed   IFree IUse% Mounted on
/dev/hda1            1537088  144017 1393071   10% /
# 呼呼!整个容量与 inode 使用数都改变棉~确实如此啊!

范例四∶删除原始档案 passwd ,其他两个档案是否能够开启?
[root@linux tmp]# rm passwd
[root@linux tmp]# cat passwd-hd
......正常显示完毕!
[root@linux tmp]# cat passwd-so
cat: passwd-so: No such file or directory
# 怕了吧?!竟然无法正常的开启这个档案呢~

你可能感兴趣的:(linux,windows,F#,资讯)