文件

文件的结构和类型

文件在系统中其实就是一串二进制数,结尾有特殊的符号标识,而他的入口处由操作系统管理。

在linux系统中,文件的类型有目录文件,一般文件和特殊文件(如设备文件)等,这些文件在内容组织上各不相同,但是他们的基础构成还是上面说的。

查找文件

首先在linux中文件通过树形结构进行组织,在找到对应目录下的文件后就要打开文件了。linux目录中存放的i节点表,i节点中存放着一些文件的信息和文件的入口地址。

如图就是一些文件的属性,操作系统会根据自身需要选取某些属性。

这个图中就是i节点的结构,注意Point to Block data就是在磁盘中的位置

文件在磁盘中的储存

  • 第一种方法时每个文件在磁盘中有固定的位置,当然这种方法是不可行的,因为这样必须事先分配好大小,如果达到了事先分配的最大值后就无法继续增大。
  • 第二种方法是通过一个链表组织。这种方法中链表在磁盘的前几个字节,然后i节点指向入口地址。它的缺点是如果想访问后面的节点必须把前面节点都扫一遍,并且因为他在磁盘中占有了位置,所以现在磁盘中所能容纳的文件字节数减少了,需要重新考虑对齐的问题。
  • 第三种方法是在i节点中增加154个字节。它是12+1+1+1的结构。低12字节保存第0到11块的入口地址(如果一块大小矢1k的话,那么0-12k地址内容可以通过低12字节访问)。而第12个字节保存到下一个链表的指针,这个链表大小就是一页大小,也就是说保存着从12k开始到$12+ 1024(\frac{1024}{4})$位置的数据。同样第13字节有两个页表,那么它保存着 1024 1024/4 1024/4大小的数据。以此类推,第二个图展示了它的结构


文件系统

不同的操作系统中有不同的文件系统。

  • linux: minix, ext2, ext3, ext4, reiserFS, IBMJFS, xfxs
  • windows: FAT-16, FAT-32, FAT-12, exFat, NTFS

不同的文件系统不一定兼容,下面以ext2作为例子来说明文件系统的结构。

磁盘被分为若干块,它的大小可以是1024, 2048, 4096等等。磁盘块的大小是由操作系统决定的。

  • 超级块(superblock)是文件系统中的第一个块,其中存放着文件系统的一些信息如文件系统的根目录,挂载点,空闲块指针,空闲i节点指针。超级块坏了文件系统就坏了。

为了保证超级块坏的时候文件系统不至于崩溃,超级块一般由多个备份。

  • i节点和间接i节点表。这两个作用在上面说了
  • 数据块(data Block)真正存储数据的块

空数据块位置

每次操作系统想分配空间给一个文件时,首先要知道空的数据块在哪。

  • 一种办法是使用一个链表来维护空数据块,这种办法的问题是消耗太大
  • 另一种办法是使用位图法,因为块是有编号的,如果对应位置是1表示不是空的。

文件系统的创建和挂载

可以使用mkfs命令进行文件系统的创建

mkfs [-t type] [fs-options] <device> size

例: mkfs -t ext4 /dev/sda6

mount命令进行文件系统的挂载

此命令可以看这篇文章中目录部分

例: mount /dev/lv100 /home/patsie

注意:不同文件系统中i节点是不一样的,挂载时经历了一些转换过程,这时可以看到挂载进来的内容,但是该目录下原有内容被隐藏了,只有使用卸载命令umount才可以重新看到原有内容。

磁盘及卷组管理

有关磁盘基础结构请看

首先磁盘分区有两种,分别是MBR和GPT(也就是C盘D盘之类的)

  • MBR(Master Boot Record):
    • 位于第一个扇面
    • 支持4个主分区,加上扩展分区最多也就支持32个分区
    • 一个分区最大2T
  • GPT(GUID Partition table):
    • 理论支持无限多个分区(实际上操作系统会限制)
    • 最大支持18EB
    • 需要操作系统支持和主板支持EFI/UEFI

直接磁盘分区有很多问题

  1. 磁盘分区大小是固定的,很难改变(除非格式化)
  2. 受文件系统大小的限制(因为文件系统无法跨越设备,所以分区也不可以)
  3. 需要提前考虑大小

LVM(逻辑卷管理)就是为了克服这些问题而产生的。他将物理设备分为若干物理卷,然后使用逻辑卷进行管理和分区。

物理储存介质: 如磁盘等,在linux上是/dev/sda等设备文件
物理卷(PV): 相当于一个个磁盘分区,但是分区大小固定并且还有一些与LVM相关参数
卷组(VG): 多个物理卷组成的储存池,也就是说可以让文件系统跨设备
逻辑卷(LV): 从卷组中分出一些卷进行管理,可以在上面划分分区

一些linux命令

  • fdisk: 创建分区 例如 fdisk /dev/sda
  • pvcreate:创建物理卷
  • vgcreate: 创建卷组 例如: vgcreate vg0 /dev/sda6(sda6是一个物理卷)
  • vgextend: 扩展卷组 例如: vgextend vg0 /dev/sdb1
  • lvcreate: 创建逻辑卷 例如: lvcreate -L 10G -n lv0 /dev/vg0(名字是lv0,大小是10G)
  • mkfs: 创建文件系统,现在是在逻辑卷中创造
  • lvextend: 扩大逻辑卷
  • resize2fs: 扩大文件系统
  • umount: 卸载文件系统,为减小大小做准备。
  • lvreduce: 减小逻辑卷大小。首先要减小文件系统大小,使用resize2fs命令

这些命令基本按照顺序把文件系统创建和增删过程说了出来。

基本过程: 创建硬盘分区->创建物理卷->创建卷组->创建逻辑卷->创建文件系统

扩大物理卷->扩散卷组->扩大逻辑卷->扩大文件系统

减小文件系统->减小逻辑卷…