8.Linux磁盘与文件系统管理

Linux磁盘与文件系统管理

认识EXT2文件系统

Linux最传统的磁盘文件系统使用的是EXT2,而文件系统是创建在硬盘上面的,因此先了解一下硬盘的物理组成。

硬盘组成与分区

整块磁盘的组成有:

  • 圆形的盘片(主要记录数据部分)
  • 机械手臂与机械手臂上的磁头(可读写盘片上的数据)
  • 主轴马达,可以转动盘片,让机械手臂的磁头在磁盘上读写数据
  • 扇区,最小的物理存储单位,每个扇区512bytes
  • 将扇区组成一个圆就是柱面,柱面是分区的最小单位
  • 第一个扇区最重要,里面有主引导记录MBR及分区表。MBR占有446bytes,分区表占有64bytes。
  • /dev/sd[a-p][1-15]:为SCSI,SATA,USB,Flash等接口的磁盘文件名。

分区:
分区表最多只能记录四条分区的记录,其中包括主分区、扩展分区,其中扩展分区可再分出逻辑分区。

  • 主分区与扩展分区最多可以有四个(硬盘的限制)
  • 扩展分区最多只能有一个(操作系统的限制)
  • 逻辑分区是由扩展分区持续分出来的分区
  • 扩展分区无法被格式化

super block:记录此文件系统的整体信息,包括inode/block的总量、使用量、剩余量,以及文件系统的格式与相关信息等。
inode:记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的block号码;
block:实际记录文件的内容,一个block仅记录一个文件,若文件太大时,会占用多个block。

Ext2为索引式文件系统。
碎片整理:写入的block太过于离散,此时文件读取的性能将会变得很差,这个时候可以通过碎片整理将同一个文件所属的block汇合在一起,这样数据读取会比较容易。

Linux的Ext2文件系统(inode)

文件系统已开始就将inode与block规划好了,除非重新进行格式化,否则inode与block固定后就不再变动。Ext2文件系统在格式化的时候基本上是区分多个块组的,每个块组都有独立的inode/block/superblock系统。在整体的规划中,文件系统最前面有一个启动扇区,这个启动扇区可以安装引导装载程序。这个设计十分重要,因为如此一来我们就能够将不同的引导装载程序安装到个别的文件系统最前端,而不用覆盖整块硬盘唯一的MBR,这样才能制作出多重引导的环境。

下图为Ext2文件系统示意图

1.data block

在Ext2文件系统中所支持的block大小有1kb,2kb,4kb三种。不同block大小支持的最大单一文件限制大小不同,最大文件系统总容量也不同。在格式化时block大小就固定了,而且每个block都有编号。
所以在进行系统格式化的时候,需要对文件系统容量进行预估。

2.inodetable
inode用于记录文件属性以及该文件放在哪一个block中,记录的文件数据至少有以下:
- 该文件的访问模式(r/w/x);
- 该文件的所有者和组(owner/group);
- 该文件的大小;
- 该文件创建或状态改变的时间(ctime);
- 最近一次读取的是时间(atime);
- 最近修改的时间(mtime);
- 定义文件特性的标志(flag),如SetUID等;
- 该文件真正内容的指向(pointer);
- 每个inode大小均固定为128bytes;
- 每个文件都仅会占用一个inode;
- 因此文件系统能够创建的文件数量与inode数量有关;
- 系统读取文件时需要先找到inode,并分析inode所记录的权限与用户是否符合,若符合才能够开始实际读取block的内容。

3.superblock超级块
superblock是记录整个文件系统相关信息的地方,没有superblock就没有文件系统。它记录的信息主要有:
- block,inode总量
- 未使用/已使用的block,inode数量
- block,inode大小(block大小为1k,2k,4k。inode为128bytes)
- 文件系统的挂载时间、最近一次写入数据的时间、最后一次检验磁盘fsck的时间等文件系统的相关信息;
- 一个validbit数值,若此文件系统已被挂载,则valid bit为0。若未被挂载为1.

与目录树的关系

目录
Ext2会分配一个inode与至少一块block给该目录。其中,inode记录该目录的相关权限与属性,并可记录分配到的那块block号码;而block则是记录在这个目录下的文件名与该文件名占用的inode号码数据。

文件
新建文件时,ext2会分配一个inode与相对于该文件大小的block数量给该文件。inode记录文件权限,block记录文件内容,如果文件过大,可使用间接指向。

Ext3在Ext2的基础上增加了日志功能,记录了修改文件的操作。当系统发生故障造成数据完整性不一致时可通过查看日志对相关文件进行修复,而不用去检查整个文件系统。

Linux文件系统的操作

磁盘和内存的同步上,Linux使用异步处理。

当系统加载一个文件到内存后,如果该文件没有被改动过,则在内存区段的文件数据会被设置为clean,但如果内存中的文件被更改过了,此时内存中的数据会被设置为dirty。此时所有操作都还在内存中执行,并没有写入磁盘。系统会不定时地将内存中设置为dirty的数据写回磁盘,以保持磁盘与内存数据一致性。也可以利用 sync命令来手动强迫写入磁盘。正常关机的情况下,系统会自动调用sync将数据写入磁盘。

挂载点的意义

将文件系统与目录树结合的操作称为挂载。
挂载点一定是目录,该目录是进入该文件系统的入口。

Linux内核通过Virtual Filesystem Switch虚拟文件系统VFS的内核功能区读取文件系统,用户并不需要知道每个分区上头的文件系统是什么。

文件系统的简单操作

磁盘与目录的容量:df,du

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

df [-ahikHTm] [目录或文件名]
参数:
-a :列出所有的文件系统,包括系统特有的/proc等文件系统
-k :以KB的容量显示各文件系统
-m :以MB的容量显示各文件系统
-h :以人们较易阅读的格式,如GB、MB、KB自行显示
-i : 不用硬盘容量,而用inode数量来显示。

系统里面其实还有很多特殊的文件系统存在,这些特殊的文件系统几乎都是在内存当中,例如/proc这个挂载点,因此,这些特殊的文件系统都不会占据硬盘空间。
/proc的东西都是Linux系统所需要加载的系统数据,而且是挂载在内存当中,所以不占用硬盘数据。
/dev/shm/目录是利用内存虚拟出来的磁盘空间。所以存在其中的数据访问速度特别快,但新建的东西在下次开机时就消失了,因为是在内存中。

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

du [-ahskm] [文件或目录名称]
参数:
-a 列出所有文件于目录容量,默认为KB
-s 列出总量而已,不列出每个目录占用的容量

du于df不同的是,它会直接到文件系统内查找所有的文件数据,所以执行该命令需要花费一定时间。

连接文件:ln

Linux下的连接文件有两种:
1.像windows中的快捷方式一样,让你快速连接到目标文件(或目录),称为软连接或符号连接。
2.通过系统的inode连接来产生新文件名,而不是产生新文件,这种称为硬连接。

硬连接(或称实际连接)
只是在某个目录下新建一条文件名连接到某inode号码的关联记录而已。这样的最大好处是安全,如果将任何一个文件名删除,其实inode和block都还是存在的,可以通过另一个文件名来读取到正确的文件数据。此外,无论使用哪个文件名来编辑,最终结果都会写入到相同的inode于block中,因此均能进行数据的修改。

一般来说,使用hard link设置连接文件时,磁盘的空间与inode的数目都不会改变。只是在某个目录下的bock中多写入一个关联数据而已,既不会增加inode也不会耗用block数量。

硬连接不能跨文件系统,不能连接到目录

symbolic link符号连接(即快捷方式)
符号连接就是在创建一个独立的文件,会占用inode与block。而这个文件会让数据的读取指向它连接的那个文件的文件名。当源文件被删除时,符号连接的文件会打不开。

ln [-sf] 源文件 目标文件
参数:
-s 如果不加任何参数就进行连接,那就是hard link,至于-s就是symbolic link
-f 如果目标文件存在时,就主动将目标文件直接删除后在创建。

创建硬连接时,ls -l源文件连接数会加1.软连接不会变。
新建目录时,默认的连接数量是2,而上层目录的连接数会增加1.因为一个空目录中至少存在.与..这两个目录,比如我们创建一个新目录/tmp/testing,基本上会有三个东西:/tmp/testing、/tmp/testing/.、/tmo/testing/..。而其中/tmp/testing与/tmp/testing/.是一样的,都代表该目录,而/tmp/testing/..代表/tmp这个目录,所以新建目录连接数为2.

磁盘的分区、格式化、检验与挂载

当我们想要在系统上新增一块硬盘时,需要完成以下步骤:
1)对磁盘进行分区,以新建可用的分区;
2)对该分五进行格式化,以创建系统可用的文件系统;
3)若想要仔细一点,则可对刚才新建好的文件系统进行校验;
4)在Linux系统上,需要创建挂载点(即目录),并将它挂载上来。

磁盘分区 fdisk

fdisk [-l] 设备名称
参数:
-l 输出后面接的设备所有的分区内容。若仅有fdisk -l时,则系统将会把整个系统内能够找到的设备的分区均列出来。

磁盘格式化 mkfs

分区完成后要进行文件系统的格式化,格式化的命令就是mkfs(make file system).这个命令其实是个综合命令,它会去调用正确的文件系统格式化工具软件。

mkfs [-t 文件系统格式] 设备文件名
参数:
-t : 可以接系统文件格式,例如:ext2、ext3、vfat等系统支持的格式。

可以通过 mkfs [tab][tab]查看系统支持的格式

root@c-virtual-machine:/tmp# mkfs
mkfs          mkfs.cramfs   mkfs.ext3     mkfs.ext4dev  mkfs.minix    mkfs.ntfs     
mkfs.bfs      mkfs.ext2     mkfs.ext4     mkfs.fat      mkfs.msdos    mkfs.vfat  

mke2fs
mke2fs [-b block大小] [-i block大小] [-L 卷标] [-cj] 设备
参数:
-b : 可以设置每个block的大小,目前支持1024,2048,4096bytes三种。
-i : 多少容量给予一个inode
-c : 检查磁盘错误,仅下打一次 -c 时,会进行快速读取测试;如果下达两次 -c -c的话,会测试读写。
-L : 后面接卷标名称(label)
-j : 本来mke2fs时EXT2,加上-j后,会主动加上journal而成为EXT3.

磁盘检验:fsck,badblocks

当文件系统发生错乱时,可以使用fsck。这是用来检查与修正文件系统错误的命令。注意:通常只有身为root且你的文件系统有问题的时候才使用这个命令,否则在正常状况下使用此命令,可能会造成对系统的危害。通常使用这个命令的场合都是在系统出现极大的问题,导致你在Linux开机的时候得进入单用户模式下进行维护的行为时,才必须使用此命令。

另外,fsck在扫描硬盘时,可能会造成部分文件系统的损坏,所以执行fsck时,被检查的分区务必不可挂载到系统上,即是需要在卸载的状态。

Ext2/Ext3文件系统的最顶层(就是在挂载点那个目录下面)或存在一个lost+found的目录。该目录就是当你使用fsck检查文件系统后,若出现问题时,有问题的数据会被放置到这个目录中。所以理论上这个目录不应该有任何数据,若系统自动产生数据在里面,那就得注意文件系统了。

badblocks 用来检查硬盘或软盘扇区有没有坏轨的命令。其实这个命令可以通过“mke2fs -c 设备文件名”在格式化的时候处理磁盘表明的读取测试。
badblocks -[svw] 设备名称
参数:
-s : 在屏幕上列出进度
-v :可以在屏幕上看到进度
-w :使用写入的方式来测试,建议不要使用此参数,尤其是待检查的设备已有文件时。
fsck [-t 文件系统] [-ACay] 设备名称

磁盘挂载与卸载

  • 单一文件系统不应该被重复挂载在不同的挂载点(目录)中;
  • 单一目录不应该重复挂载多个文件系统;
  • 作为挂载点的目录理论上应该都是空目录才是。

如果要用来挂载的目录里并不是空的,那么挂载了文件系统以后,原目录下的东西就会暂时消失。例如,假设你的/home原本与根目录/在同一个文件系统中,下面本来就有/home/test和/home/vbird两个目录,然后你想要添加新的硬盘,并且直接挂载在/home下,那么当你挂载上新的分区以后,/home显示的是新分区的数据,至于原来的test和vbird这两个目录会被暂时隐藏,等到新分区被卸载掉后,/home原本的内容会再次显示出来。

挂载命令:mount
mount 设备文件名 挂载点
例如: mount /dev/hdc6 /mnt/hdc6

磁盘参数修改

linux下面所有的设备都以文件来代表,但是文件如何代表设备呢?就是通过文件的major(主设备代码)与minor(此设备代码)数值来替代。
mknod 设备文件名 [bcp] [Major] [Minor]
参数:
设备种类 :
b : 设置设备名称成为一个外部存储设备文件,例如硬盘等;
c : 设置设备名称成为一个外部输入设备文件,例如鼠标/键盘等;
p : 设置设备名称成为一个FIFO文件。
Major:主设备代码
Minor:次设备代码

e2label
进行磁盘挂载时,会使用label name来进行。这样的优点和缺点如下:
优点:不论磁盘文件名怎么变,不论你将硬盘插在哪个IDE/SATA接口,由于系统是通过Label,所以磁盘插在哪个接口都不会有影响。
缺点:如果插了两块硬盘,刚好两块硬盘label有重复,系统无法判断哪个磁盘分区才是正确的。

e2label 设备名称 新的label名称

tune2fs [-jlL] 设备代号
参数:
-l : 类似dumpe2fs -h 的功能,将super block内的数据读出来;
-j : 将ext2系统转换为ext3系统
-L : 类似e2label 的功能,可以修改文件系统的Label

hdparm
对于IDE接口的硬盘,该命令可以用来设置一些参数。但如果是SATA接口的,最多用来测试性能。
hdparm [-icdmXTt]
参数:
-i : 将内核检测到的硬盘参数显示出来
-t : 测试硬盘的实际访问性能

root@c-virtual-machine:/# hdparm -t /dev/sda

/dev/sda:
 Timing buffered disk reads: 188 MB in  3.00 seconds =  62.59 MB/sec

设置开机挂载

手动mount不是很人性化,我们需要系统“自动”在开机时进行挂载。

开机挂载/etc/fstab 及/etc/mtab

在/etc/fstab修改即可开机自动挂载,但是需要注意以下几点:
1.根目录/是必须挂载的,而且一定要优先于其他mount point被挂载进来。
2.其他挂载点必须为已新建的目录,可任意指定,但一定要遵守必需的系统目录架构原则;
3.所有挂载点在同一时间之内,只能挂载一次;
4.所有分区在同一时间内,只能挂载一次;
5.如若进行卸载,你必须先讲工作目录移到挂载点(及其子目录)之外。

利用设备名称来挂载分区时,是被固定似的,所以硬盘不可以随意插在任意的插槽,而使用Label name来挂载,没有插槽限制,但需要随时冲突Label name,尤其是新增硬盘时。

特殊设备loop挂载(镜像文件不刻录就挂载使用)

  • 挂载光盘/DVD镜像文件
    mount -o loop 镜像文件 挂载目录
  • 新建大文件以制作loop设备文件
    如果分区时,只分出了一个根目录,假设已经没有额外空间进行分区,但是根目录的空间很大,因此可以制作一个大文件将其格式化并挂载。
    1.创建大型文件
    dd if =/dev/zero of=/home/loopdev bs=1M count=512
    2.格式化
    mkfs -t ext3 /home/loopdev
    3.挂载
    mount -o loop /home/loopdev /media/cdrom/

内存交换空间(swap)的构建

安装Linux的时候必须有两个分区,一个是根目录,一个是swap。swap的功能就是在应付物理内存不足的情况下所造成的内存扩展记录。
构建swap的方法
1.设置一个swap分区
2.创建一个虚拟内存文件

使用物理分区构建swap

步骤如下
1.分区:先用fdisk在磁盘中分出一个分区给系统作为swap。
2.格式化:利用新建swap格式的“mkswap 设备文件名”就能够格式化该分区成为swap格式。
3.使用:最后将该swap设备启动,方法为“swapon 设备文件名”。
4.查看:最终通过free命令来查看内存使用状况。

使用文件构建swap

1.利用dd来新增一个128MB的文件在/tmp下面;
2.使用mkswap将/tmp/swap这个文件格式化为swap的文件格式;
3.使用swapon来将/tmp/swap启动;
4.使用swapoff关掉swap file。

磁盘空间的浪费问题

前面提到一个block只能存放一个文件,因此太多小文件将会浪费非常多的磁盘空间。

可以使用parted命令来完成分区。

总结

8.Linux磁盘与文件系统管理_第1张图片

你可能感兴趣的:(linux)