在上一章当中主要介绍了一些磁盘的结构以及讲述了硬盘的工作原理,然后我们也简单的介绍了fdisk的命令,那么我们在这一章当中继续介绍fdisk命令的使用。

一、fdisk命令

  在上一章讲过,该命令是管理磁盘的分区,无论是创建与销毁,在生产环境中使用该命令是极其危险的,所以要谨慎而行。

1、查看磁盘的分区信息:    fdisk -l [-u] [device...]:列出指定磁盘设备上的分区情况;    2、管理分区    fdisk device        fdisk提供了一个交互式接口来管理分区,它有许多子命令,分别用于不同的管理功能;所有的操作均在内存中完成,没有直接同步到磁盘;直接使用w命令保存至磁盘上;        常用命令:        n:创建新分区;        d:删除已有分区;        t:修改已有分区;        l:查看所有已知ID;        w:保存并退出;        q:不保存并退出;        m:查看帮助信息;        p:显示现有分区信息;

  我们现在查看一下该系统下的磁盘空闲空间。

# fdisk -l /dev/sdaDisk /dev/sda: 128.8 GB, 128849018880 bytes, 251658240 sectorsUnits = sectors of 1 * 512 = 512 bytesSector size (logical/physical): 512 bytes / 512 bytesI/O size (minimum/optimal): 512 bytes / 512 bytesDisk label type: dosDisk identifier: 0x000e681d   Device Boot      Start         End      Blocks   Id  System/dev/sda1   *        2048      821247      409600   83  Linux/dev/sda2          821248   126650367    62914560   83  Linux/dev/sda3       126650368   168593407    20971520   83  Linux/dev/sda4       168593408   251658239    41532416    5  Extended/dev/sda5       168595456   170692607     1048576   82  Linux swap / Solaris

  我们看到,要想创建新的分区,只能从扩展分区中开始创建逻辑分区,我们现在开始划分一个分区。

# fdisk /dev/sdaWelcome to fdisk (util-linux 2.23.2).Changes will remain in memory only, until you decide to write them.Be careful before using the write command.Command (m for help):

  那么以上大致的提示为,你的操作都会保留在内存中,直至你决定写入该磁盘,做这种操作时请三思。我们可以按m键可以帮助我们查看fdisk的功能子命令的描述以及用法等。那么常用的命令就在上面显示着,所以在这里不多做描述,现在我们按n键新建一个分区。

Command (m for help): nAll primary partitions are in useAdding logical partition 6First sector (170694656-251658239, default 170694656):

  由于一开始已经划分了主分区,所以并没有让我们指定主分磁盘号,而是自动创建逻辑分区磁盘号6,我们直接默认就可以,如果指定的话,会有不连续的空间。

First sector (170694656-251658239, default 170694656): Using default value 170694656Last sector, +sectors or +size{K,M,G} (170694656-251658239, default 251658239):

  在这里我们可以指定空间大小,一种可以按照扇区来分,不过扇区分配比较不方便;另一种按照大小来分,我们来按照大小来分2G空间。

Last sector, +sectors or +size{K,M,G} (170694656-251658239, default 251658239): +2GPartition 6 of type Linux and of size 2 GiB is set

  分配完成之后,我们可以按p键来进行查看。

Command (m for help): pDisk /dev/sda: 128.8 GB, 128849018880 bytes, 251658240 sectorsUnits = sectors of 1 * 512 = 512 bytesSector size (logical/physical): 512 bytes / 512 bytesI/O size (minimum/optimal): 512 bytes / 512 bytesDisk label type: dosDisk identifier: 0x000e681d   Device Boot      Start         End      Blocks   Id  System/dev/sda1   *        2048      821247      409600   83  Linux/dev/sda2          821248   126650367    62914560   83  Linux/dev/sda3       126650368   168593407    20971520   83  Linux/dev/sda4       168593408   251658239    41532416    5  Extended/dev/sda5       168595456   170692607     1048576   82  Linux swap / Solaris/dev/sda6       170694656   174888959     2097152   83  Linux

  之后我们按w键来进行保存并退出,不过会有一个提示:

Command (m for help): wThe partition table has been altered!Calling ioctl() to re-read partition table.WARNING: Re-reading the partition table failed with error 16: Device or resource busy.The kernel still uses the old table. The new table will be used atthe next reboot or after you run partprobe(8) or kpartx(8)Syncing disks.

  我们查看一下/dev/sda6是否存在。

# fdisk -l /dev/sdaDisk /dev/sda: 128.8 GB, 128849018880 bytes, 251658240 sectorsUnits = sectors of 1 * 512 = 512 bytesSector size (logical/physical): 512 bytes / 512 bytesI/O size (minimum/optimal): 512 bytes / 512 bytesDisk label type: dosDisk identifier: 0x000e681d   Device Boot      Start         End      Blocks   Id  System/dev/sda1   *        2048      821247      409600   83  Linux/dev/sda2          821248   126650367    62914560   83  Linux/dev/sda3       126650368   168593407    20971520   83  Linux/dev/sda4       168593408   251658239    41532416    5  Extended/dev/sda5       168595456   170692607     1048576   82  Linux swap / Solaris/dev/sda6       170694656   174888959     2097152   83  Linux

  从该命令中可以看出,确实是存在的,但只是这个命令当中存在,并不代表该分区就存在,硬件的管理都要靠的是内核,我们查看一下/proc/partitions

# cat /proc/partitionsmajor minor  #blocks  name 8        0  125829120  sda 8        1    409600  sda1 8        2   62914560 sda2 8        3   20971520 sda3  8        4         1 sda4 8        5    1048576 sda5 11        0    8491008 sr0

  这个文件保存着的内核所识别到的所有分区,由于没有保存sda6的分区,所以没有被内核没有进行识别。需要注意的是:在已有分区并且挂载其中某个分区磁盘设备上创建新分区,内核可能在创建完成之后无法直接识别;此时我们可以强制内核重新识别该分区,具体操作总结如下:

   查看:# cat /proc/partitions   通知内核强制重读磁盘分区列表:    CentOS 5:partprobe [device]    CentOS 6, 7:partx, kpartx        partx -a [device]        kpartx -af [device]       分区创建工具:parted, sfdisk;

  需要注意的是,如果一次通知内核不成的话,多试几次就可以。

   # partx -a /dev/sda   partx: /dev/sda: error adding partitions 1-5   # partx -a /dev/sda   partx: /dev/sda: error adding partitions 1-6

  查看/proc/partitions文件,只有出现sda6的分区才能开始进行以后的相关操作。

   # cat /proc/partitions    major minor  #blocks  name   8        0    125829120 sda   8        1     409600 sda1   8        2   62914560 sda2   8        3   20971520 sda3   8        4          1 sda4   8        5    1048576 sda5   8        6    2097152 sda6   11        0    8491008 sr0

二、创建文件系统

  以上我们划分完分区之后,还不能直接使用,必须给该分区创建文件系统才能够可以使用,这使用的是格式化操作,那么格式化通常分为两种,一种是低级格式化,这个是由厂商来做,分区之前进行,用来划分磁道的一种手段;另一种为高级格式化,是由用户来进行操作,将磁盘分区之后对该分区来创建文件系统的一种手段。

  那么所谓高级格式化或者说创建文件系统的过程就是在这一段空间里,切割出来一部分空间作为元数据区域,而之后的空间划分为数据区域。元数据中主要存放的是文件的大小、权限等,但是并不包含文件名,因为该文件名是目录中存放。每一个文件属性的元数据存储几乎是一样的,所以说用来存储元数据固定的空间,就叫做索引节点号。

   元数据区,数据区;     元数据区:        文件元数据:inode(index node)            大小、权限、属主属组、时间戳、数据块指针(但不存放名称,名称在目录中存放)

  而在数据区域中,我们要划分很多的块来进行存储数据,文件的大小可以基于该空间中分配的块来进行存储,它是最小分配单元,只能属于一个文件。

   总结:   在一块磁盘中,分为元数据区域和数据区域,数据区域要划分成为数据块(Data Block),元数据区域存储的是inode,inode要不断的从里面数据指针标明一个文件来标识占据了那些磁盘块。

2.1 特殊文件

  特殊文件一般指的是符号链接文件和设备文件,特殊的不同之处在哪里?链接文件特殊在于inode中本来是指向的为磁盘块,但并没有指向该磁盘块,而是指向的是另一个文件的访问路径,而设备文件的特殊之处在于inode存放的数据指针的空间当中,存储的是主设备号和次设备号。

   符号链接文件:存储数据指针的空间当中存储的是真是文件的访问路径;   设备文件:存储数据指针的空间当中存储的是设备号(major, minor);

  以上这些特殊文件,其实并没有占据数据空间中的数据块,因此作为特殊归类。

三、文件系统

  我们的磁盘块和inode也是要使用索引的,因为这样的话不用全盘扫描磁盘块是否用到,我们可以设立一个索引区域,专门存放这个磁盘块的索引,每一个都是对位索引,例如:第一个磁盘块就占据着这个区域里的第一位的空间,所以说我们可以用0标识该对应的磁盘块是空闲中,用1标识该磁盘块已经使用中。我们称之为位图索引(bitmap index)。以后就可以直接扫描位图索引中的标识位即可。

bitmap index:位图索引(在存储空间中建立一个存储区域,专门存放一个索引区域,由二进制存储与块之对应,0表示空闲,1表示占用)

  但是,即使如此,管理起来仍有不便的地方,现在的文件系统并不是直接划分成元数据和数据区域,而是在这个基础上,内部里又划分了二级结构,首先拿到磁盘空间之后,该空间就被划分成了一个又一个独立的逻辑单位,其主要作用就是存放磁盘块,把磁盘块进行分组,称之为块组,每一个独立的磁盘块组都可以拥有一个元数据区域,如果该磁盘块组不够用,我们可以使用其它组的块空间进行使用,因为这毕竟是逻辑划分。彼此之间进行协调,充分利用,但是也要进行管理,要有一个统一性,所以需要有一个空间来进行标明该空间内有多少个块组,占据了多大的空间等,都要进行一系列的统计,而这个对于磁盘分区来讲,称之为超级块。

  超级块记录了每个块组从那个块组开始到那个块组结束,共有多少个块组,如果超级块受到损坏,则整个的逻辑结构就会崩塌,所以至关重要,要进行备份冗余。超级块会放到某一个块组当中进行存放。
那么我们总结一下:其实元数据和数据也是一样的,我们要将整个的磁盘空间划分许多的块,这里的块中来区分谁是元数据谁是数据,块组也是一样的道理,有些块用来存储元数据,有些用来存储数据,只不过在众多的块之中,有些块是超级块;不过,除了超级块之外,还有一个为块组描述符,只是用来管理该块组,而超级块是用来管理所有块组。块组描述符记录着从那个块开始到那个块结束,同时,它也得向其他组描述,在它的空间中有多少inode,也有多少个数据块(Data block),每一个inode记录着那些已用,那些未用,还要有位图索引,而位图索引其实是单块组实现的,每一个inode都有inode编号,无论是文件还是目录都有该编号。
  刚才之前也说过,文件名并不是在元数据区域存放,而是在目录上存放,而目录也是一个文件,假如找/var/log/message文件的路径映射为:先去找到根的inode,通过数据指针指向自己的磁盘块,该磁盘块放置的是该目录的目录或文件名和对应inode之间的关系,通过该磁盘块找到了var目录的名字以及与之对应的inode,之后根据inode编号去查inode元数据表,找到了var相关的inode所指向的磁盘块,这个磁盘块也是放置的目录和文件名与之对应的inode,之后我们就找到了log这个名字,也找到了inode编号,然后去指向log数据块,这里的数据块也存储了目录或文件名和与之对应inode,找到message这个名字于inode号进行查找,之后就找到了message文件所属的数据块。

example.jpg

  不过这样也是一件很麻烦的事情,所以可以将元数据和数据进行一个缓存放置在内存中,加快其访问速度。

  那么有了以上这简单的概念之后,我们来描述一下Linux所支持的文件系统。Linux的文件系统有很多种,不同的文件系统意味着无论是划分元数据还是查找的方式等,各自结构也是不同的,每一种文件系统的管理方式也是不同的,例如EXT4和xfs文件系统的访问接口是不一样的,所以为了统一接口,引用了VFS机制,简单来说,当两个层次有衔接时,加上一个中间层,向上提供统一而又简洁的接口。

   VFS:Virtual File System    Linux文件系统:ext2(无日志功能), ext3, ext4, xfs, reiserfs, btfs    光盘:iso9660    网络文件系统:nfs, cifs    集群文件系统:gfs2, ocfs2    内核级分布式文件系统:ceph    Windows的文件系统:vfat, ntfs    伪文件系统:proc, sysfs, tmpfs, hugepagefs    Unix的文件系统:UFS, FFS, JFS    交换文件系统:swap    用户空间的交换式文件系统:mogilefs, moosefs, glusterfs

  那么如何管理文件系统,其实管理无非就是创建、删除等操作,而创建文件系统其实就是格式化某一个磁盘去创建该文件系统。

   文件系统管理工具:     创建文件系统的管理工具:        mkfs            mkfs.ext2, mkfs,ext3, mkfs.ext4, mkfs.xfs, mkfs.vfat, ...        检测及修复文件系统的工具:            fsck                fsck.ext2, fsck.ext3, ...        查看其属性的工具:            dumpe2fs, tune2fs        调整文件系统的特性:            tune2fs

3.1 日志

  文件系统可大致分类两类,一种是无日志系统,还有一个是有日志的系统,在磁盘空间中找出一段空间作为日志区。例如,创建一个文件并不是在元数据区和数据区创建,而是在日志空间中创建,如果成功在放到元数据区域和数据区域,如果失败则就在日志系统中进行查看该日志文件,不用进行全盘扫描该空间所产生的问题。

不过也有它的劣势,那就是性能的问题,现在日志空间中写一次才能写到该空间中,好在现在的日志系统也是精心设计,这种性能的损伤也是可以忽略不计,它的优势是大于劣势的。

3.2 链接文件

  链接文件其实分为两种,它是一个访问同文件实现不同的路径而已。共分为两类:

   链接文件:访问同一个文件的不同路径;     硬链接:指向同一个inode的多个文件路径;        特性:            (1) 目录不支持硬连接;            (2) 硬链接不能跨文件系统;            (3) 创建硬链接会增加inode引用计数;                    创建:            ln src link_file                 符号链接:指向一个文件路径中的另一个文件路径;        特性:            (1) 符号链接与原文件是两个各自独立的文件,各有自己的inode;对原文件创建符号链接不会增加引用技术;            (2) 支持对目录创建符号链接,可以跨文件系统;            (3) 删除符号链接文件不影响原文件;但删除原文件,符号指定的路径即不存在,此时会变成无效链接;                        注意:符号链接文件的大小是其指向该文件的路径的字符串的字节数;                    创建:            ln -s src link_file                        -v:verbose