1.硬盘的基础知识
分区的概念:
分区从实质上说就是对硬盘的一种格式化。当我们创建分区时,就已经设置好了硬盘的各项物理参数,指定了硬盘主引导记录(即 MasterBootRecord,一般简称为 MBR)和引导记录备份的存放位置。而对于文件系统以及其他操作系统管理硬盘所需要的信息则是通过以后的高级格式化,即 Format 命令来实现。面、磁道和扇区硬盘分区后,将会被划分为面(Side)、磁道(Track)和扇区(Sector)。需要注意的是,这些只是个虚拟的概念,并不是真正在硬盘上划轨道
MBR简介:
MBR(Main Boot Record 主引记录)位于整个硬盘的 0 磁道 0 柱面 1 扇区。不过,在总共 512 字节的主引导扇区中, MBR 只占用了其中的 446 个字节,另外的 64 个字节交给了DPT(Disk Partition Table 硬盘分区表),最后两个字节“55, AA”是分区的结束标志。这个整体构成了硬盘的主引导扇区。
分区的原理:
主引导记录由三部分组成:一部分是 446byte 的操作系统引导代码(MBR),还有一部分是 64byte 的主分区表(DPT)。
主分区表最多记录四个主分区的分区信息.每个分区占用 16byte.分区就是修改分区表,它不影响硬盘上的存
储的数据。最后的 2 字节是结束标志。
扩展技术:需要将一块硬盘分成更多的分区,超过 5 个以上的分区,可以将最多四个主分区中的一个分
区类型改为扩展分区,然后在扩展分区中再建逻辑分区。逻辑分区的分区信息保存在扩展分区之中,叫做扩
展分区表。理论上逻辑分区没有个数的限制。扩展分区不能被直接使用,必须将其划分为若干个逻辑分区。
逻辑分区的起始位置的信息都写在扩展分区表里面。逻辑分区的分区编号从 5 开始,如: /dev/hda5 是第一
块硬盘的第一个逻辑分区。
格式化原理:
分好区的硬盘分区上面什么数据也没有,操作系统也不能读写,为了让操作系统能够识别必须向分区中预写入一定格式的数据。这个过程就称之为格式化。在 Linux 中称为创建文件系统。没有分区的硬盘是不能格式化的,没有格式化的分区是不能直接被使用的。所以分区和格式化往往都是同时进行的。
现在我们已经大概知道了一个硬盘的结构,当我们新买来一块硬盘时,必须经过分区和格式化才能进行使用,下面用简图表示一下一个硬盘的结构:
superblock:记录此 filesystem 的整体信息,包括 inode/block 的总量、使用量、剩余量, 以及文件系统的格式与相关信息等。
inode:记录档案的属性,一个档案占用一个 inode,同时记录此档案的数据所在的 block 号码。
block:实际记录档案的内容,若档案太大时,会占用多个 block。
注意:
1.inode 与 block 都有编号,而每个档案都会占用一个 inode ,inode 内则有档案数据放置的block 号码,如果能找到档案的inode 就可以找到档案。
2.在inode记录一个文件需要128字节大小的内存
2.Linux的EXT2文件系统(inode)
为什么需要使用EXT2文件系统?
如果我的文件系统高达数百 GB 时, 那么将所有的 inode 与 block 通通放置在一起将是不理智的决定,因为 inode 不 block 癿数量太庞大,不容易管理。
因此 Ext2 文件系统在格式化的时候基本上是区分为多个区块群组 (block group) 的,每个区块群组都有独立的 inode/block/superblock 系统。
简图如下:
Superblock (超级区块):Superblock(大小为1024byte) 是记录整个 filesystem 相关信息的地方,它记录的信息有如下:
- block与inode的总量
- 未使用和已经使用的inode/block的数量
- block和inode的大小(inode 固定为128byte,block可选,1k,2k,4k)
- 记录最近文件系统创建时间,操作时间的详细信息
- 记录此文件系统书否被挂载,vaild bit数值为1表示未挂载,0表示挂载。
Filesystem Description (档案系统描述说明)
- 记录每个block group从开始到结束的block的号码,以及说明每个区段 (superblock,bitmap, inodemap, data block) 分别位于哪一个 block 号码之间。
block bitmap (区块对照表):
- 就像是一张表记录的是,使用和未使用的block,以便系统调用,如果一个档案删除,它所占的block的区对照表也会被清除,这样block就会空出来。
inode bitmap (inode 对照表):
- 记录使用和未使用的inode号码。
data block (资料区块) :
data block 是用来放置档案内容数据地方,在 Ext2 文件系统中所支持癿 block 大小有 1K, 2K 及 4K三种而已。在格式化时 block 的大小就固定了,且每个 block 都有编号,以方便 inode的记录。
需要解决的问题:单个档案存储数据大小的限制
按照这种逻辑方式,一个inode可以记录最大的文件就是为128k,但是实际情况却不是这样,在我们现在的系统中,有很多的文件都是大于128k的,如何解决这个问题呢?
为此我们的系统聪明的将 inode 记录 block 号码的区域定义为 12 个直接,一个间接, 一个双间接不一个三间接记录区。
在EXT2文件系统中,就把Inode区分如上图所示:
直接记录区:里面有12个直接指向block的对照,储存的是真正存储档案的block的编号,而存储一个block需要的字节数是4个字节,共占用这个Inode的12*8=48字节。可以记录的容量是:12*4kb=48k
间接记录区:一个间接记录区其实也就是4个字节的大小,他不是真正存放档案的地方,它存放的是真正数据存放的block,比如设置这个block是4kb大小的,那么
双间接记录区:一个block的大小仍然设置为4k,那么
三间接记录区:可以存放当个档案数据的最大容量是:1024*1024*1024*4=4T的大小
例子:
查看一个文件的inode编号:
使用命令:ls -i 文件名
查看档案处于哪些block之间:
使用命令:filefrag -v 文件名
查找系统目前挂载的装置:df
语法:df [选项] [目录或者文件]
选项:
选项 | 含义 |
-a | 列出所有的文件系统,包括系统特有的/proc |
-k | 以kByte的容量显示各文件系统 |
-m | 以Mbyte的容量显示各文件系统 |
-h | 以人类适合看的格式显示 |
-H | 以M=1000k取代M=1024k的进位方式 |
-T | 连同partition的filesystem名称也列出 |
-i | 不使用硬盘容量,而以inode的数量显示 |
使用命令:df
查看挂载点的详细信息:
使用命令: dumpe2fs [选项] 装置文件名
选项:
选项 | 含义 |
-b | 列出保留为坏轨的部分 |
-h | 仅列出superblock的数据 |
例子:
查看/dev/sda1装置的详细信息:
Superblock的内容:
block group的信息:
日志文件系统(Journaling filesystem)
该区块与门在记录写入或修订档案时的步骤
1. 预备:当系统要写入一个档案时,会先在日志记录区块中记录某个档案准备要写入的信息;
2. 实际写入:开始写入档案的权限与数据;开始更新 metadata 的数据;
3. 结束:完成数据与 metadata 的更新后,在日志记录区块当中完成该档案的记录。
功能是什么呢?
在这样的程序当中,万一数据的执行过程当中发生了问题,那么我们的系统只要去检查日志记录彔区块,就可以知道哪个档案发生了问题,针对该问题来做一致性的检查即可,而不必针对整块 filesystem 去检查, 这样就可以达到忚速修复 filesystem 的能力了.
注意:ext3文件系统相比ext2文件系统就多了一个日志文件系统的功能。
文件系统管理
1.查看文件夹大小
语法 :
du [选项] [档案或目录名称]
选项:
选项 | 含义 |
-a | 列出所有de 档案与目录容量,因为默认仅统计目录底下的档案量而已。 |
-h | 以人们较易读的容量格式 (G/M) 显示; |
-s | 列出总量而已,而不列出每个各别癿目录占用容量 |
-S | 不包括子目录下癿总计,与 -s 有点差别 |
-k | 以 KBytes 列出容量显示 |
-m | 以 MBytes 列出容量显示 |
2.实体链接与符号链接:ln
Symbolic Link (符号链接,亦即是快捷方式)
软链接,就是window系统的快捷方式
在命令行创建一个软连接的方式是,使用命令 ln:
语法:
ls [选项] 来源文件 目标文件
选项:
选项 | 含义 |
-s | 如果不加任何参数就进行连结,那就是 hard link(硬链接),至于 -s 就symbolic link(软链接) |
-f | 如果 目标文件 存在时,就主动的将目标文件直接移除后再建立 |
例子:
创建一个文件test,然后创建它的软链接test01
Hard Link (实体链接, 硬式连结或实际连结)
在前面的磁盘管理中,我们已经知道,每个档案会占用一个inode来记录,想要读取该档案,必项要经过目录记录的文件名来指向到正确的 inode 号码才能读取档案。
例子:复制一个services文件夹到 /mnt然后查看他的硬链接数
在 /mnt 下复制一个services文件,命名为,copy01
现在把 copy01删除,然后给services做一个硬链接:链接到copy02
小结:也就是说同一个文件有几个inode,也就是这个文件有几个名字。
注意事项,硬链接是不能夸分区使用的:
磁盘分区:
相关命令语法:
fdisk [选项] 装置名称
选项:
选项 | 含义 |
-l | 输出后面接的装置所有的 partition 内容。若仅有 fdisk -l 时,则系统将会把整个系统内能够搜索到的装置的 partition 均列出来 |
例子:
查看系统的硬盘以及分区信息:
如果系统有多块硬盘的话可以可以分开查看,比如现在有一块硬盘,设备名为: /dev/sda
使用命令: fdisk -l /dev/sda ,看到的结果和上边是一样的,因为只有一块硬盘。
对磁盘进行分区,分区之前先搞懂一个概念,当我们分区的时候不是对分区进行分区,而是对一块硬盘进行分区,比如说上面的硬盘只有一块,那就是 : /dev/sda 。
现在开始操作,对硬盘 /dev/sda 进行分区:
使用命令: fdisk /dev/sda
Command (m for help): m <== 输入 m 后,就会看到底下这些指令介绍
Command action
a toggle a bootable flag
b edit bsd disklabel
c toggle the dos compatibility flag
d delete a partition <==删除一个 partition(分区)
l list known partition types
m print this menu
n add a new partition <==新增一个 partition
o create a new empty DOS partition table
p print the partition table <==在屏幕上显示分割表
q quit without saving changes <==不储存离开 fdisk 程序
s create a new empty Sun disklabel
t change a partition's system id
u change display/entry units
v verify the partition table
w write table to disk and exit <==将刚刚得动作写入分割表
x extra functionality (experts only)
打印一下分区的个数,用参数p
创建一个新的分区,用参数:n ,询问创建一个是主分区还是扩展分区,通过前面的对磁盘的了解,知道主分区只能有4个主分区,如果分区的个数大于4个,那么就需要使用扩展分区,然后使用扩展分区,然后再扩展分区内新建逻辑分区(逻辑分区的盘符号默认从5开始(比如: /dev/sda5 .....)):
因为现在只有三个主分区,所以还是可以新建一个主分区的,直接使用参数,p ,再建立一个主分区,系统类型是Linux
改变分区的系统类型,使用参数: t
删除一个分区:使用参数 : d
新建一个扩展分区:先使用参数:n ,再使用参数 : e
现在磁盘划分如下所示,而扩展分区还可以继续划分分区,称为逻辑分区(编号从5开始):
创建逻辑分区:
保存并退出,使用命令:w,直接退出不保存更改:q。
现在我保存这个更改,使用参数:w
注意保存了之后,需要去更新分区表,只需去跟新修改的硬盘的分区表:
使用命令: partprobe + 设备名称,也就是 : partprobe /dev/sda
此时再去查看这个硬盘,可以发现多了一个扩展分区和逻辑分区了:
在磁盘管理的时候提到过,单单是划出一个分区是不能用的,但是想要这个分区,需要根据不同的文件系统格式化后才能在文件系统中使用这个分区(如EXT3文件系统,会有superblock ,blockgroup,inode对照表,date block等东西):
格式化分区(磁盘格式化):
语法:
mkfs [选项 文件系统格式] 装置文件名
选项:
选项 | 含义 |
-t | 可以接文件系统格式,例如 ext3, ext2, vfat 等(系统有支持才会生效) |
例子:
格式化:/dev/sda5分区,可以看到默认的block的大小是 1k=1024byte
注意:命令:mkfs -t ext3/dev/sda5 等同于 mkfs.ext3 /dev/sda
当然再格式化之前也是可以指明block的大小的,重新格式化一下:/dev/sda5分区
使用命令:mkfs -t ext3 -b 4096 /dev/sda5(mkfs.ext3 -b 4096 /dev/sda)
当我们格式化了以后理论就能使用这个分区来储存数据了,因为ext3文件管理系统已经可以管理这个分区了,但是,必须把分区挂载(mount)起来才能用:
挂载点的意义:
挂载点是目录,而这个目录是进去磁盘分区槽(其实是文件系统啦!)的入口。就比如一个房子的东西你全部建好了,但是没有一个地方可以进去,那岂不是建的再好都是没有意义了。
再者,在Linux的系统只有一个盘符可以使用(也就是斜杠 "/"),所以必须把分区挂载到这个盘符里面才可以使用分区。
挂载注意事项:
- 单一文件系统不应该被重复挂载在不同 的挂载点(目录)中;
- 单一目录不应该重复挂载多个文件系统;
- 要作为挂载点的目彔,理讳上应该都是空目录才行
挂载的命令:
语法:
mount [-t 文件系统] [-L Label 名] [-o 额外选项] [-n] 装置文件名 挂载点
选项参数:
选项参数 | 含义 |
-t | 与fsck相似,指定一个文件系统类型,但是Linux可以自动分析Superblock的内容,从而分辨出文件系统的类型,这个参数可以省略。 |
-a | 依照配置文件 /etc/fatab 的数据将所有为挂载的磁盘全部挂载上来 |
-l | 单纯输入mount 会显示目前的挂载信息,加上 -l 可增加列Lable名称 |
-n | 在默认情况下,系统会将实际挂载的情况实时写入 、/etc/mtab 中,但是某些情况下不会自动写入,比如单人维护模式,此时加上这个选项,就会写入了。 |
-L | 系统除了利用装置文件名(如:/dev/sda5)之外,还可以利用文件系统的Labe进行挂载。 |
-o | 此参数后面可以接一些挂载时额外加上的参数,比如说账号、密码、读取权限等。 |