磁盘分区完毕后需要进行格式化,操作系统才能使用这个分区。 不同操作系统能够使用的文件系统是不同的,例如:Windows98以前使用FAT/FAT16文件系统,Windows2000以后使用NTFS文件系统,Linux使用Ext2文件系统。在分区完成之后,要使得操作系统能够识别文件系统,就需要进行格式化,把分区格式化成某一个操作系统能够识别的文件系统。 一般来说,一个分区中装一个文件系统,但是现在技术发展了,一个分区可以装多个文件系统,也能将多个分区合并成一个文件系统。一个文件系统可以挂载到操作系统上。
一个文件由许多的属性和文件本身的数据组成,文件系统会把同一个文件的两种数据分别存放在inode和block中。此外,整个文件系统还有个super block,用于记录整个文件系统的整体信息。
要访问一个文件时,首先找到这个文件的inode,根据inode中的权限查看当前用户是否有权力读取这个文件;然后查看inode中block的位置,最后找到block,读出数据。这种文件系统就叫做索引式文件系统,所以Linux的ext2文件系统就是索引式文件系统。 PS:U盘(闪存)一般使用FAT文件系统,而FAT文件系统并没有inode,每个block中记录着本文件下一个block的位置。所以FAT文件系统无法通过inode一次性将这个文件所有的block号码读取出来,而只能一个个地读取block后才能知道下一个block的位置。所以如果同一个文件的block分散地太开,那么读取一个文件的时间就会很长,所以就有所谓的“碎片整理“,就是将同一个文件的block们尽量放到一起去。但Linux的ext2文件系统由于是索引式的,因此不太需要碎片整理。
block大小 | 1KB | 2KB | 4KB |
---|---|---|---|
最大单一文件容量 | 16GB | 256GB | 2T |
一个block只能存放一个文件的数据,如果文件太大,则使用多个block存放,如果一个block放不满,则剩下的就空着。
当我们在Linux的ext2下创建一个目录时,文件系统会给我们分配一个inode和一个block。 其中,inode记录该目录的相关权限与属性,并记录该block的号码。 而block中记录的是这个目录的名字、这个目录下所有的文件名、以及这些文件所占用的inode号码。
//通过增加-i参数,可以查看文件所占用的inode号码
//PS:最前面的数字就是inode号码
ls -li
total 24
606624 drwx------+ 8 chaibozhou staff 272 4 28 08:31 Desktop
606608 drwx------+ 15 chaibozhou staff 510 4 26 20:14 Documents
606610 drwx------+ 60 chaibozhou staff 2040 4 29 20:37 Downloads
606612 drwx------@ 52 chaibozhou staff 1768 4 30 12:38 Library
当我们创建一个文件时,文件系统会分配一个inode和相对于文件大小的一些block。例如一个block为4KB,我们创建了一个100KB的文件,那么需要分配一个inode和25个block;但Linux的ext2文件系统只有12个直接索引,所以还需要一个间接索引的block来存放该文件block的号码。
假设读取/etc/passwd这个文件:
当一个文件很大,需要很多的block,而这些block又存放的比较离散,这时磁盘读写性能就很低了。 如果由于文件系统的空闲block较为离散,即使是存一些小文件,仍然需要磁头大量的移动,这时候就考虑将所有数据拷出来,然后格式化整个文件系统,再将数据拷回去。 如果文件系统太大,一个文件的block存放的位置很远,那么磁头要移动大量的位置来读取一个文件,此时效率就低了;也就是说,文件系统的大小不是越大越好的。
要处理一个文件,必须要把它全部放到内存中;那么当处理一个很大的文件的时候,如果频繁地要求操作系统将文件保存到外存,那么我们系统会出现卡顿,等待文件写入外存。为了避免写入外存时候的等待,我们就引入了异步处理方式。 一个文件在内存中,如果没有对他进行修改,那么它的状态是clean,系统不会把它写入外存;若我们对文件进行了修改,那么它的状态就变成了dirty,此时我们继续对文件进行操作,只不过系统会在后台不定时地将dirty状态的文件写入外存;也就是说,我们的操作和文件写入外存是并行的,去除了我们的等待时间。
每个文件系统都有独立的inode、block、super block等信息,每个文件系统都必须连接到系统的目录树上才能够被使用。我们将文件系统连接到目录树上的动作叫做挂载,就好像果子挂到树上去。 PS:挂载点一定得是目录,这个目录是进入这个文件系统的入口。 举例来说:假设有三个挂载点/、/boot、/home,他们对应的设备文件分别是:/dev/hdc2,/dev/hdc1,/dev/hdc3,那么查看这三个目录的inode号码可以发现:
2 drwxr-xr-x 23 root wheel 3122 3 22 22:18 /
2 drwxr-xr-x 4 root wheel 1422 3 24 22:18 /boot
2 drwxr-xr-x 6 root wheel 122 3 25 22:18 /home
他们的inode号码都是2,说明他们都是文件系统的根目录,但是它们的其他数据都是不一样的,说明他们不是同一个文件,所以他们三个人来自三个不同的文件系统。 如果inode号码一致,并且其他属性都相同,则可以判断他们是同一个文件,就像/,/.,/..
df [option] 目录/文件
-a:列出所有的文件系统
-k:以KB为单位显示文件系统
-m:以MB为单位显示文件系统
-h:以人们较易阅读的单位显示文件系统
-H:以1M=1000K代替1M=1024K
-T:连同该分区的文件系统的类型一并显示,如ext3……
-i:用inode个数代替硬盘容量
df//不添加参数,显示所有的文件系统,以1KB为单位
Filesystem 512-blocks Used Available Capacity iused ifree %iused Mounted on
/dev/disk1 974389248 108237816 865639432 12% 13593725 108204929 11% /
devfs 363 363 0 100% 628 0 100% /dev
map -hosts 0 0 0 100% 0 0 100% /net
map auto_home 0 0 0 100% 0 0 100% /home
du [option] 文件/目录
-a:列出所有的目录和文件的容量,要是不写这个参数默认只是列出文件的容量而已。
-n:以人们较为容易的格式显示容量
-s:列出目标目录的总容量,而不列出个别的目录容量
-S:列出目录总容量,但不包括子目录
-k:容量以KB显示
-m:容量以MB显示
//PS:若这个命令不带任何参数则列出当前目录的容量,单位是1KB。
//表示chai是一个符号连接文件,它指向/home/shixv,而硬连接是不会有->这个符号的。
/chai->/home/shixv
//将目标文件指向原文件
ln [option] 原文件 目标文件
-s:不加参数就是硬连接,加了s就是符号连接
-f:force模式,如果目标文件存在,直接把它覆盖
//权限后面的数字就代表连接到这个inode上的连接文件个数
drwxr-xr-x 31 root wheel 1122 3 21 22:18 .
drwxr-xr-x 31 root wheel 1122 3 21 22:18 ..