Linux磁盘及文件系统的管理


        我们计算机当中的核心部件并不包括磁盘,磁盘对我们的计算机来说属于外部I/O设备,我们目前主流的硬盘是机械式硬盘,我们的CPU以及内存设备属于电子设备,而我们的硬盘属于机械设备,所以说在发展速度上,CPU和内存要比硬盘快很多,我们通常所说的磁盘格式化分为两种,一种叫做低级格式化,低级格式化是硬盘厂商在出厂前就已经做好的,低级的格式化的目的是为了划分好磁盘上的磁道等物理边界,而当我们将磁盘拿到自己手里之后都会对磁盘进行分区(partition),我们对磁盘进行分区的目的是在各个分区中创建独立的文件系统,而我们的对整个磁盘的分区信息则保存在MBR(Master Boot Record)主引导记录中:

·MBR

    MBR叫做主引导记录,大小为512个字节,它是独立于磁盘之外的,位于整个磁盘盘面的第0盘面,第0磁道,第0扇区,也称为Main Boot Record,MBR和操作系统无关,它是独立于操作系统之外独立存在的,MBR被分成了三段:

    (1)bootloader->引导加载器

        是一段代码,占据空间为446个字节,用来引导你硬盘上的操作系统进行启动

    (2)分区表

        用来记录整个磁盘上分区信息的部分,占据大小为64个字节,每16个字节标识一个分区,所以一共可以标识4个分区,所以我们的硬盘上最多只能划分4个主分区,其余的全都是扩展分区,我们的扩展分区中有一个分区表,这个分区表中存的是一个指针,这个指针指向的是我们的磁盘中另外一个更大的空间,而我们在这个更大的空间中所创建的分区称为逻辑分区,但是主分区加扩展分区的数量加起来不能超过4个分区

    (3)Magic Number->魔数

        占据空间为2字节,用来标记我们的MBR是否有效

·磁盘分区

    我们在磁盘上的分区是按照磁盘柱面进行划分的,存储数据也是按照磁盘柱面来进行的,我们现在大多数的磁盘都存在磁盘的读写延迟,所谓读写延迟,就是指如果我们硬盘的机械手臂在某一时刻处于磁盘的内磁道处,这时我们给了计算机一条指令,让它访问处于我们磁盘上外磁道区域的数据,那么这时候我们硬盘的机械手臂就会向外磁道方向移动,但是我们的磁盘是在不停的转动的,当我们的机械手臂移动到外磁道时,可能我们当初所要访问数据的位置已经随着磁盘的转动改变了位置,那么这时我们的机械手臂只有等待它再次转动回来才能进行数据的访问,在这之间产生的时间差就叫做我们的磁盘读写延迟,衡量一个磁盘好坏的重要指标就是它的平均循道时间,也就是说,硬盘盘片的转速越快,一般而言性能就越好,而且我们的磁道越靠外部,它的读写性能就越高,这是因为,磁道越靠外部,机械手臂所能够扫描到的磁盘区域就越大

·我们的计算机的核心部件包括五大部件

·Metadata叫做元数据

·文件系统

    我们要在我们的磁盘分区上实现文件数据的快速存取,那么就需要在我们的磁盘分区上有一个叫做文件系统的东西了,文件系统是一个软件,并不是直接存在于分区上的,但是文件系统中的数据是存在于磁盘分区上的,文件系统只是我们系统上管理文件数据的一个软件,我们Linux系统上支持的一个叫做ext2类型的文件系统把我们的磁盘分区划分成了两个部分:

    (1)元数据存储区

       我们的元数据存储区中记录着我们数据存储区中的数据的inode->index node(索引节点),每一个inode都有一个全局唯一的编号,就和我们用户的id号是一样的,一定得是唯一的,不能和其他inode编号一样,inode里面的内容都包括:

    ->inode号码对应的block在哪里

    ->对应文件的权限

    ->对应文件的属主属组

    ->对应文件的时间戳

    ->对应文件的大小

    ->对应文件所存储的block等等

    就是没有保存文件名,文件名保存在目录文件的inode所对应的block中,目录也是一种文件,我们Linux系统中的目录是从/目录开始的,/目录可以自引用,它可以找到自己,我们目录文件里面保存的文件名信息叫做目录条目或目录项(dentry)

     我们inode查找block的机制是这样的,假如说我们现在要访问/var/log/messages这个文件,首先,系统会自动找到我们的/目录文件,因为/目录文件是自引用的,它可以自己找到自己,接着系统会根据/目录的文件在inode table中的inode找到它所对应的block,在这个block中找到var目录文件和它的inode映射,然后在inode table里面找到该inode,再根据该inode找到它所对应的block,再在该block中找到log目录和它所对应的inode映射,然后再在inode table中找到该inode,再根据此inode找到它所对应的block,在该block中找到messages文件和它所对应的inode映射,最后再在inode table中找到该inode,最后根据该inode找到它所对应的block,从而访问到块里面的数据,从而实现访问到/var/log/messages文件

        元数据存储区被分为以下几个部分:

        ->superblock(超级块):描述我们的磁盘分区被分为了多少个块组,也叫做全局描述信息

            (1)超级块中保存着整个分区的全局信息,包括有:

            (2)块组(block group)

            (3)每一个块组中包含有多少块

            (4)块大小

            (5)空闲磁盘块,已用磁盘块,空闲inode,已用inode

        ->GDT(Group Description Table,块组描述表)

            里面保存着当前块组的块组名,还保存着每一个块组是从第几个块开始到第几个块组结束的,也非常重要,也需要有有多个备份。

        ->inode bitmap(索引节点位图)

            每一个inode在索引节点位图里面都有一个位,位为1表示inode已经被使用过了,位为0表示inode没有被使用过,所以系统在查找空闲inode的时候,直接去扫描索引节点位图就可以了,这是一种可以快速查找空闲inode的机制

        ->block bitmap(块位图)

            每一个block在块位图里面都有一个位,位为1表示block已经被使用过了,位为0表示block没有被使用过,所以系统在查找空闲block的时候,直接去扫描块位图就可以了,这是一种可以快速查找空闲block的机制

        ->inode table(索引节点表)

           存储着该分区里面所有的inode和它里面所保存的信息

   (2)数据存储区

        数据存储区又可以被分为一个一个的磁盘存储块(block)

    block size(块大小):

    块大小在不同的操作系统上是不一样的,在不同的CPU平台上也是不一样的(在Linux系统上块的大小通常是2^n数量级的大小),常见的块大小有三种,分别是1k,2k,4k,我们的磁盘块之所以这样分类的原因是我们的内存是以页框为单位来存储数据的,而页框的大小通常为4k,这样就方便我们将磁盘中的数据装载到内存中以供CPU进行处理,因为CPU所处理的数据都是通过内存来直接获取的,所以磁盘中的数据想要被CPU访问到,必须被装载到内存中,内存的页框大小对于不同的CPU平台来说也是不同的

    磁盘块大小的选择:

    这个得参考你要存储的数据的单个文件的大小,文件的占据空间和文件的的实际大小是不同的。

    占据磁盘块(block)的文件分为两类:

    一类是普通文件,另一类是目录文件,文件的block中存放的是文件的实际数据,目录的block中存放的是目录中文件名和它所对应的inode的映射关系

    磁盘分区数据区域的每一个磁盘块都与元数据区域的块位图(block bitmap)中的一个位对应,8位二进制对应一个字节,磁盘分区是被分为一个一个的块组来进行管理的,块组的数量在创建文件系统的时候就已经创建好了,而创建了多少个块组的信息保存在我们磁盘分区中元数据区域中的superblock(超级块)中,超级块保存着我们整个磁盘分区中的全局信息,因此非常重要,必须得有多个备份

    我们的磁盘实际上可以被分为许许多多的块组(block group),每一个块组中也包括了元数据存储区和数据存储区

·在文件系统上创建一个文件的机制:

    首先扫描inode bitmap找到一个空闲的inode,然后再扫描block bitmap找到一个空闲的block,将两者对应起来存储在我们的文件系统当中

·文件系统中文件的复制(cp)

    文件的复制是一个创建新文件的过程,他是把原来文件的数据内容填充到新的文件里面,执行速度慢

·文件系统中文件的移动(mv)

    文件的移动只是将文件的路径改变了,但是文件的inode号码和对应的文件内容都没有发生变化,所以文件的移动的执行速度比较快

·链接文件:

    我们的链接文件分为两种:

    ->硬链接文件:

        指向同一个inode的不同路径(而不是文件数据本身),彼此之间称为硬链接,我们在执行ls -l命令后,文件权限后面紧跟着的数字代表的是该文件被硬链接的次数

        wKiom1f9vh_yjsgyAAAY4DXNU5E428.png

        我们的硬链接有几个注意事项需要注意

        a:硬链接只能对文件创建,不能应用于目录,但是目录的硬链接数目默认为2,这是系统默认的

        wKiom1f9vlXS76XvAAANIim3oiw681.png

              wKioL1f9w7LgunHQAAAUswmH9yQ830.png

        b:我们的硬链接不能跨文件系统创建

        c:创建硬链接会增加文件被硬链接的次数

            wKiom1f9xAvy_T2IAAAgKOkUuFo849.png

    ->符号链接(软连接)

        指向的是一个路径(字符串),而不是inode,相当于windows系统上的快捷方式,软链接的大小是它所指向的字符串的字符个数个字节,符号链接的数字权限都为777,这样是为了保证任何用户都可以找到该链接,但不是任何人都可以访问它所指向的文件

        wKiom1f9v8TST2-eAAAhrmFxWmE709.png

        符号链接也有几个注意事项需要注意

        a:可以应用于目录

          wKiom1f9xHGR5apFAAAkM16M2fI984.png

        b:可以跨文件系统创建

        c:不会增加被链接文件的链接次数

          wKiom1f9xOShX8LrAAA5OiZZyM4325.png

        d:其大小为指向的路径所包含的字符个数

    创建链接

    格式:ln [-sv] SRC DEST

        ln不加任何选项表示的是创建硬链接,-s选项表示创建符号链接,-v选项表示显示命令的执行过程

        wKiom1f9wcrBCO8DAAAuBk9DoZs085.png

              wKioL1f9wkqiwcYZAABDgT_p7Os884.png

·du命令

    显示一个文件系统或者一个目录所占据的整体空间的大小的命令,默认显示该目录下目录和目录下所有子目录以及文件的大小

    -s选项:只显示目录的整体大小

    -h选项:进行大小显示的单位换算

        wKioL1f9xVGz4f_AAAAPWzVZ8oI966.png

·df命令

    显示整个磁盘分区的使用情况

    -h选项:进行大小显示的单位换算

    df命令默认会显示磁盘块(block)的个数,不过-i选项会显示inode的个数

    -P选项:放在同一行中显示信息,不换行

    wKiom1f9xgjj1H03AACSGQxYJQc871.png

·设备文件

    我们Linux系统上常见的设备文件有块设备(b)和字符设备(c):

    ->块设备:按块为单位,能够实现随机访问的设备,常见的块设备有硬盘

    ->字符设备:按字符为单位,能够实现随机访问的设备,常见的字符设备有键盘

    我们Linux系统的设备文件一般都在/dev目录下,/dev目录下的每一个设备文件都有两个数字,分别是主设备号和次设备号,主设备号(major number)用来标识设备类型,次设备号(minor number)用来标识同一种类型中的不同设备,我们在引用不同的设备的时候,对系统而言,是通过引用不同的主设备号和次设备号来实现的,这类文件没有大小,而且这类文件之所以被称为特殊文件的原因是它们并不真正的占据磁盘空间,因为设备文件的inode指向的是文件的主设备号和次设备号,所以该文件没有大小:

    wKiom1f9xpejAJ-PAAAz1iKrGDg595.png

    设备文件的创建方式:

    利用mknod命令->用于创建块或字符特殊文件的命令

    格式:mknod [options] filename type [major minor] 

        -m(mode)选项:后面跟数字权限,在创建文件的时候指定文件的权限

        type->指的是你要创建的设备文件的类型

            b:块文件

            wKiom1f9x7yR9zXkAAAQxSCupAk669.png

            c:字符文件

            wKiom1f9x_HgIoHTAAAY0rYdvjg628.png

            p:管道文件(FIFO:First Input First Output)->管道文件是没有主设备号和次设备号的

             wKiom1f9yGKCWsTdAAAjHaH0lr0750.png

    设备文件的作用是作为设备的访问入口的,因此一定要确定主设备号是和某一个设备关联起来的,设备号默认是被内核识别的,我们往设备文件上发的数据,都自动被发送至设备上去

    硬盘设备的设备文件名:我们分别以a,b,c来区别同一种设备类型下的不同设备

    ->并口硬盘(IDE,ATA):设备文件名以hd开头

        一般来说PC机的主板上只有两个IDE接口,每一个IDE接口的总线上只能接两块硬盘,IDE口被称为IDE控制器,两块硬盘,一块叫做主盘,一块叫做从盘,第一个IDE口的主盘被标识为hda,从盘被标识为hdb,第二个IDE口的主盘被标识为hdc,从盘被标识为hdd  

    ->串口硬盘(SATA):设备文件名以sd开头

        串口硬盘借助于udev来标识,不过通常情况下,它们都被标识为sda,sdb,sdc...

    ->SCSI硬盘:设备文件名以sd开头

    ->USB硬盘:设备文件名以sd开头

    硬盘上的分区是这样来标识的,例如,PC机主板上的第一个IDE口的主盘分区是这样来标识的:

        hda->hda1:第一个主分区

             hda2:第二个主分区

             hda3:第三个主分区

             hda4:第四个主分区

         所有的逻辑分区只能从hda5开始,hda5是第一个逻辑分区,逻辑分区可以有多个,扩展分区只能有一个,主分区最多只能有四个

·Linux支持的文件系统

    文件系统本身是内核中提供的基本功能,创建文件系统是由用户所执行的命令结合内核所提供的功能来实现的,我们的内核支持多种文件系统

·VFS(Virtual File System):虚拟文件系统:

        什么是虚拟文件系统呢?众所周知,我们的内核支持多种文件系统,那么当我们用户执行一条命令的时候,我们这条命令有可能在某些文件系统上可以运行,而在某些文件系统就无法运行,这样一来我们就得在开发这条命令的时候还得给这条命令加上一些可以识别它可以运行的文件系统环境的功能,这样一来就会本末倒置,这个时候我们就需要VFS出场了,VFS可以创建一种沙漏模型,就是给内核中所有不同的文件系统提供一个公共接口,由VFS来判断我们所要执行的命令适合于内核中的哪一种文件系统,从而将VFS提供的这一公共接口当做我们用户执行的命令和内核交互的接口,VFS也是内核上的功能,由于VFS的存在,使得Linux可以支持众多不同的文件系统

    常见的文件系统:

    Windows系统下的文件系统->

        FAT(File Allocation Table:文件分配表)32(32位的操作系统)

        NTFS

        CIFS(Common Internet File System->通用网络文件系统):网络文件系统

        ISO9660:光盘文件系统的存储格式

    Linux系统下的文件系统->

        ext(extend->扩展的文件系统)2

        ext3    

        ext4

        xfs

        reiser(是一个人)fs

        jfs(journal filesystem->日志文件系统):IBM的

        jfs2

        nfs:网络文件系统

        ocfs2:集群文件系统

        gfs2:全局文件系统

        swap

    文件系统实际上就是一种实现文件管理的软件,Linux对以上所有文件系统都支持,除了NTFS,在Linux操作系统上,FAT32叫做vfat,Linux之所以可以支持这么多操作系统的原因是由于VFS的存在,VFS可以弥合这些文件系统的不同,将我们所有的文件系统组成一个沙漏模型,VFS也是内核上的功能

    一个分区就是一个独立的文件系统,每一个分区都可以单独格式化,都可以使用不同的文件系统,但最终都应该归并在/目录下才可以进行使用,归并的方式称为挂载或关联的方式

    在我们的硬盘上,/目录所在的的分区叫做/分区,也叫做/文件系统,/目录下的目录可以独立到硬盘上的其他分区单独作为文件系统来使用,而独立出去的目录的路径只能当做独立到某分区上的文件系统的入口,而独立出去的只是该路径下的数据,但并不是所有的目录都可以独立出去作为一个单独的文件系统,/etc,/bin,/sbin目录都不能独立出去,都必须存在于/分区中

·磁盘格式化

    磁盘的格式化分为两类,一类称为低级格式化,另一类称为高级格式化。

    ->低级格式化:用来创建磁道,在磁盘出厂前,由厂商完成

    ->高级格式化:用来在分区上创建文件系统

        利用mkfs(make filesystem)命令来进行磁盘的格式化

        格式:mkfs [options] devfilename

            -t选项:指定文件系统类型->mkfs -t ext3 ...

                我们当前内核所支持的文件系统种类信息都保存在/proc/filesystems中

                wKiom1f9zM7wlCIIAAAWO1OEFdc884.png

            当我们执行mkfs -t ext2 ...这个命令的时候,实际上是这个命令在调用/sbin/mkfs.ext2这个文件,即mkfs -t ext2 ... = mkfs.ext2 ...

        wKiom1f9zXXSZ3CaAAAJVmnVI90414.png

     专门管理ext系列文件系统的,有一个专门的命令

        mke2fs命令:默认创建为ext2文件系统

            -j(journal)选项->创建为ext3文件系统

            -b #选项->指定磁盘块大小,默认为4096个字节,可用的取值为1024,2048或4096

            -L "..."->指定分区的卷标,指定之后可以利用卷标来引用分区

            -m #(不加百分号):明确手动指定预留给超级用户的块数百分比,这个留给超级用户的空间是为了当我们的分区容量满了之后,如果分区出了问题,那么我们就需要超级用户来进行修复,所以该空间就是为了让超级用户进行修复操作的空间

            -i #(bytes):用于指定为多少个磁盘块预留一个inode,默认为8192,即8k,两个4k磁盘块对应一个inode,这里给出的数值大小应该为磁盘块大小的2^n倍

            -N #:指定要创建的inode个数

            -F:强制创建文件系统

            -E:用于指定额外的文件系统属性

            对磁盘分区进行高级格式化其实就是创建一个新的文件系统,创建完成文件系统之后,该设备才可以被挂载和使用,格式化分区就是重新创建文件系统,这样做会损坏分区上的原有文件。

·查看磁盘分区相关属性的命令

    blkid命令:

    用于显示block的属性,或者用来定位block的属性

    格式:blkid 设备文件名

    wKiom1f9zlvSE0N1AAAVA7eHKw8028.png

    UUID->表示全局标识符,是我们的操作系统自动生成的随机数,用于唯一标识我们的磁盘设备

    TYPE->表示文件系统类型

    LABEL->卷标

·用于查看或定义卷标的命令

    e2label命令

    查看卷标:

    格式:e2label 设备文件名

    wKiom1f9zxLz8JbxAAAc2ohyhTI725.png

    设定卷标:

    格式:e2label 设备文件名 卷标名

    wKiom1f9z0CR_fdeAAANA1kqwHM061.png

·调整文件系统相关属性的命令

    tune2fs命令

    可以无损调整文件系统的属性,就算该分区里面之前有数据,也不会损坏里面的原有数据。

        -j选项->无损的将文件系统升级至ext3,但是不能降级

            wKioL1f90Ejy8P-LAAAf2eBw7qM893.png

        -L选项->用于设定或修改卷标

            wKioL1f90SPAswX7AAAw25qZkUg162.png

        -m #->调整预留百分比

            wKiom1f90auhztOBAAATiGRH8vE612.png

        -r #->指定预留的磁盘块个数

            wKiom1f90fWRWOZOAAARjxDPeRk423.png

        -o->设定默认挂载选项

             常用选项为acl,文件系统可以有设定特殊权限的功能

             wKioL1f-JPTxzX8tAAANgwYur_Q545.png

        -c #->指定挂载次数达到#次之后开始进行自检,0或-1表示关闭此功能

                wKiom1f-JUzxMYIiAAAnXA0-7O4493.png

        -i #->每挂载使用#天后进行自检,0或-1表示关闭此功能

                wKioL1f-JZqy6AmDAAAsGt-UhHg502.png

        -l->显示块组中超级块的信息

          wKioL1f-JeHRWgtKAAA0hSUGGh8956.png

·显示整个文件系统属性信息的命令

    dumpe2fs命令

        wKiom1f-JoLwmXEvAAA0dc4rYao637.png

    -h选项->只显示超级块的信息

        wKioL1f-JsSjc-NGAAAujG6paX0873.png

·检查及修复文件系统的命令

    ->手动检查命令

        fsck命令:检查并修复Linux文件系统

           -t选项->指定所要作用的文件系统的类型,不指定也可以,我们的fsck命令会自动去调用blkid命令去查看所要作用的文件系统是什么类型的

            wKiom1f_Q6nzeJAsAAAy3S76Z5E469.png

          -a选项->fsck命令默认在检查到文件系统的错误的时候默认会询问用户是否对此错误区域进行修复,-a选项表示遇到错误直接修复,而不再进行询问

           wKioL1f_Q9rTrCZKAAAwZWMPcT4945.png

    ->专门用于修复ext系列文件系统的命令

        e2fsck命令:

          -f选项->强制检查文件系统

            

          -a选项->和fsck命令的选项功能一样,只是为了和fsck命令兼容

          -p选项->自动修复,不再询问是否修复文件系统出错的地方

·查看当前系统识别了几块硬盘设备的命令:

    fdisk命令

        -l选项:列出当前系统上的所有磁盘以及对应的所有分区

            wKioL1f-KAmRZV8QAABEwzGJyi8747.png

        fdisk -l [/dev to /some device_file]->只查看某一个特定设备的分区情况,包括里面的磁盘设备信息

        wKiom1f-KD2A_L2wAAAwTb5C2ZU701.png

    fdisk命令还可用于管理磁盘分区:

        ->创建分区:fdisk 设备文件名

            wKioL1f-KdTB6qlbAABIFzk55g8332.png

            p:显示当前磁盘上的分区,包括没保存的改动

            wKioL1f-KfyBarMpAAAcxKvOp-o388.png

            n:创建新的分区

                wKioL1f-KiyTmXjQAAAJiSHSjQ4257.png

                e->创建扩展分区

                p->创建主分区

            d:删除一个分区

              wKioL1f-K9ezwasSAAA_pgfVI-4229.png

            w:保存退出

                      wKioL1f-LVTQK2jBAAAx5PvH3zE365.png

wKiom1f-LXixwJzAAAAROVXD6IA874.png

    wKioL1f-LYyi8Py5AAA1Okmy6vU123.png

            q:不保存退出

              wKiom1f-LHWQRdAnAAAmAq5n9fE840.png

              wKioL1f-LJDy6Y-8AAAdV8WmhzQ981.png

            t:修改分区类型

                修改完分区类型之后再显示分区类型得使用L

                wKiom1f-KvnAG6hLAAAMk7SuGxs483.png

                wKiom1f-KyyRiyVVAAA7DnjtdK8662.png

            l:显示所支持的所有分区类型

                        wKioL1f-K1iy8mKuAAAzxgla8cg360.png

    我们的磁盘分区上的第0个块是不能被使用的,得被预留出来,叫做引导块(Boot Block),bootloader是装载在boot block中的,bootloader属于MBR,但MBR不属于任何分区,和任何分区都没有关系,MBR只是一个扇区,大小为512个字节


·partprobe命令

    这个命令的功能是告诉内核我们的磁盘的新的分区信息,也可以理解为更新分区表,我们在对磁盘分完区之后,内核的里面保存我们的磁盘的分区信息并没有即时更新,分区表信息在/proc/partitions里面保存着:

    wKioL1f-KPWTQcrNAAAWUSL3YT0808.png

    这时我们就可以使用partprobe命令来更新我们的分区表信息,红帽6系统上也可以使用partx命令,二者的功能是相同的

    我们的partprobe命令默认更新所有磁盘得分区信息:

        wKioL1f-LeSRaj88AAA5UFpybwM685.png

    它后面也可以跟一个磁盘路径,用来更新指定的磁盘的分区信息:

        wKiom1f-LvOxvmyYAABl1kPhMXs510.png

        wKioL1f-LwnwLf76AAA87Sutnqk990.png

要想使用任何一个磁盘分区,必须得先创建文件系统

    wKioL1f-L0WSja51AABTOa5C2Lg020.png

·用户进程运行的模式叫做用户模式,运行的内存空间叫做用户空间

  内核进程运行的模式叫做内核模式,运行的内存空间叫做内核空间

  用户进程没有特权去操作硬件,只有内核进程才可以

·ext2与ext3文件系统的区别

    ext3被称为日志文件系统:journal filesystem,磁盘分区上有日志区域的文件系统被称为日志文件系统

    日志区域为我们磁盘分区上的除过数据区域和元数据区域之外的第三个独立的区域,当我们正在进行数据存储的操作的时候,元数据是存储在日志区域的,如果此时我们的计算机非正常关机,那么再次开机的时候我们的系统就会在日志区域查找我们刚刚还未存储的元数据然后修复它的所对应的数据,这大大加快了我们的系统的文件系统的修复操作速度,当我们的数据完成存储的时候,元数据会被重新存储回元数据区域,在我们的Linux系统上的非日志文件系统只有ext2

·挂载

    将我们的在磁盘分区上新建的文件系统关联至我们的/文件系统,叫做挂载,反之,卸载的意思就是将某文件系统与当前/文件系统的关联关系予以移除

    挂载命令:mount命令

      使用格式->mount 设备名称 挂载点(目录)

      设备名称可以使用

        ->设备文件名:/dev/sda#

            wKiom1f-MPrwC8eHAAAceBOtiiM690.png

        ->卷标:LABEL=""

            wKiom1f-MbvjUlbGAAAsTqgqw7Q009.png

        ->UUID:UUID=""

           wKioL1f-NEqjKugKAAArUPSVv-Y416.png

    挂载点要求:

    ->目录没有被其他进程所使用

    ->目录得事先存在

    ->目录中的原始文件会被暂时隐藏

        wKiom1f-NQiy7m0BAAAjr1ZkXPo571.png

    我们在挂载完成后只能通过挂载点来访问对应文件系统上的文件,我们的Linux系统上提供了两个挂载点:

    ->/media:用来挂载移动设备

    ->/mnt:用来挂载其他文件系统

    任何一个新建的文件系统(磁盘分区刚刚格式化完成),里面一定会有一个lost+found目录

    umount命令:卸载某文件系统

        卸载文件系统时的注意事项:挂载点没有被其他进程所使用

        wKiom1f-NbXzX6DlAAAZbosDgG4402.png

    mount命令在不使用任何选项和参数的情况下,可以显示当前系统上所有被已被挂载的设备

    wKioL1f-NgKQ8fPoAAArc36o1mA011.png

    mount命令的使用格式:

        mount [options] [-o options] device mountpoints

          -a(all)选项:表示挂载/etc/fstab中定义的所有文件系统

            wKioL1f-OMPhJbOzAAAn1o_219o955.png

            wKioL1f-OcPyp9RWAABDnuXspbE409.png

            wKioL1f-OdmglDKxAAAyB6mWxs8017.png

          -n选项:默认情况下,利用mount命令每挂在一个设备,都会把挂载的设备信息保存至/etc/mtab(mounttable)文件中, 但是使用-n选项意味着不把挂载信息写入此文件中:

            wKiom1f-N1uxq7PtAABcyh0xhb4377.png

        -t fstype选项:指定正在挂载设备上的文件系统类型,不使用此选项时,mount命令会自动调用blkid命令去查看文件系统类型

        -r选项:只读挂载,挂载光盘时常使用此选项

            wKiom1f-OsyR9Z9wAAA082VKDrM099.png

        -w选项:读写挂载

            wKioL1f-Owvii1OWAAAVdPoxYlo077.png

        -o选项:指定额外的挂载选项,也就是重新指定文件系统的启用属性:

            async选项:表示异步写入,数据在内存中编辑完成之后写入硬盘的存储方式叫做异步写入,同步写入表示数据在内存中一边编辑一遍写入硬盘的存储方式:

            wKiom1f-PJTxH_CxAAAWhsueXk8373.png

            _netdev选项:表示如果我们要挂载的设备为一个网络文件系统,那么如果我们要挂载的主机出现异常,那么就不再开机自动挂载了,这样就不会影响我们的计算机正常开机:

            wKioL1f-PU7A4gjcAAAWnQdGohg430.png

            owner选项:允许普通用户挂载文件系统:

            wKiom1f-PlHToTQnAAAUrB3CPBM958.png

            remount选项:重新挂载当前文件系统:

              remount可以重新指定挂载的文件系统额外选项

            wKiom1f-PsGTTuRmAAA3Qda-vWc650.png

            ro选项->挂载为只读:

            wKioL1f-PwGT06GxAAAV3j2Flqo278.png

            rw选项->读写挂载:

            wKiom1f-PzyiaRt-AAAV48jK04s768.png

            sync选项->重新挂载为同步写入:

            wKiom1f-QG2Qwc1mAAAWVouwwUg849.png

            suid选项->重新挂载使得文件系统具有特殊权限功能,不能让外来设备来启用SUID选项:

              wKioL1f-QM6S-yifAAAWMRv9dsE817.png  

            不同的额外选项之间用逗号隔开:

            wKiom1f-Qc3DuVO2AAAXKeLbvVI029.png

·swap(交换空间)分区

    交换空间的存在使得我们的物理内存可以过载使用(overcommit),在物理内存耗尽时可以拿交换空间来应急,不至于让我们的操作系统挂掉,在我们的Linux系统上交换空间必须是一个单独的分区,这个分区叫做swap分区:

    wKioL1f-QhuTr3_wAAA_wx7jCmQ119.png

    我们将物理内存中的数据交换进交换空间的过程称为page out,也就相当于是swap in,我们将交换空间中的数据交换至物理内存的过程叫做page in,也就是swap out,在所有的存储空间中(内存,硬盘等等),我们CPU中的寄存器的速度是最快的

·查看当前系统上物理内存和交换分区使用情况的命令:

    free命令

    wKioL1f-QoTRVK2kAAAXq0FtTiI826.png

    -m选项:使用MB为单位显示容量的大小

    wKioL1f-QrWCpOeUAAAVAaahUL8296.png

    上图中所显示的信息如下:

    ->buffer(缓冲区):缓冲区的作用是将数据传送速度快的设备传送过来的数据先缓存在我们的缓冲区里,然后再由我们的缓冲区将这些缓存下来的数据传送给数据传送速度较慢的设备,这样做的目的是为了防止数据传送速度较慢的设备受到冲击

    ->cache(缓存):缓存的目的是为了能够使我们的数据能够重复使用,提高我们提取重复数据的速度

    buffer和cache的作用的都是为了衔接两个数据传送速度不同的设备的。

·创建交换分区文件系统的命令

    1,先利用fdisk命令创建一个swap分区,然后调整分区类型为82,82对应的是swap分区类型

        wKioL1f-RFiyMw20AAAzO8RxQ20561.png

    2,利用mkswap命令格式化我们新建的swap分区

        格式:mkswap 设备文件名

            -L选项->指定卷标

            wKiom1f-RR_jh5TMAABAuHpll6o470.png

    3,挂载我们的swap分区的文件系统:任何一个文件系统必须得先挂载才能使用

       挂载就相当于是启用swap分区的命令

        swapon命令->启用swap分区的命令

        格式:swapon 设备文件名

        wKiom1f-Rc-BQ4pTAAArM6XKmlM248.png

           -a选项:表示启用所有的定义在/etc/fstab文件中的交换设备

            wKioL1f-RmawMpawAAA7VK71574515.png

wKiom1f-RqThs49TAAAqcnTWHJ4617.png

·在这里我们先来谈谈/etc/fstab这个文件

    fstab(filesystem table->文件系统表,也就是文件系统的配置文件):

    wKiom1f-R2DCvCNoAAAvUgFH9x0511.png

    ->我们的操作系统在初始化的时候,会自动挂载fstab文件中定义的每一个文件系统

    由上图可以看出,fstab文件中以空白字符隔开的6个字段分别是:

    ->要挂载的设备,可以用LABEL来指定,也可以用UUID来指定

    ->挂载点

    ->文件系统类型

    ->挂载选项:默认为defaults

    ->转储频率:和文件系统的备份相关,指的是我们每隔多少天对我们的文件系统进行一次完全备份

        0表示不备份

        1表示每天都完全备份

        2表示每两天备份一次等等

        一般来说我们自己手动添加的文件系统都不让它进行备份

    ->文件系统检测次序:一般来说只有/文件系统定义为1,因为/文件系统需要先检测,其他的文件系统可以同时为2,表示检测完/文件系统之后,再检测它们,0表示不检测

    在/etc/fatab文件中,交换空间的挂载点不能是任何目录,只能是一个swap,我们想要在/etc/fstab文件中指定新的挂载选项的时候,只需要将不同的挂载选项用逗号隔开即可,我们自己手动挂载的文件系统,在不指定acl挂载选项的时候,它就一定不会有acl功能

·mount命令的-a选项

    我们在把文件系统写入到/etc/fatab文件中的时候,使用mount -a命令,可以将写入的文件系统全部挂载起来

·我们再来谈一个叫做fuser的命令

    这个命令的功能是用来验证进程正在使用的文件或套接字

        格式:fuser [options] 文件名/目录名/挂载点

            -v选项:查看某文件上正在运行的进程,该文件也可以是一个目录

                wKiom1f_NtvjKogsAAAstl7NCoQ109.png

            -k选项:杀死某文件上正在运行的进程,-k只能针对文件使用

                wKioL1f_N1ChhytNAAAOJGm3CJI203.png

            -km选项:用来终止正在访问此挂载点的所有进程

                            wKiom1f_N5yyCpZ7AAAOFsZjKNA566.png

·关闭swap分区的命令

    swapoff命令

        格式:swapoff 设备文件名

        wKioL1f_O6WRqg57AAA8gh8ien4017.png

·当我们的磁盘上已经没有空间来创建新的磁盘分区的时候,但是在我们其他磁盘分区上已经创建的文件系统中还有剩余空间可以使用,而且我们的交换分区在磁盘上是一个独立的分区,如果此时我们系统上的交换分区已经不够用了该怎么办,这时我们可以有一种解决办法,无论是Windows还是Linux系统,它们都支持一种叫做本地回环设备的东西:

    ->本地回环设备(loopback)

    使用软件模拟出来的硬件,一个假的硬件,使用软件模拟出来的

·dd命令

    我们可以使用dd命令在本地文件系统上创建一个镜像文件,规定文件容量大小,然后将该文件当做一个设备来使用,还可以进行分区,格式化等操作,dd命令也可以用来复制文件,和我们的cp命令差不多:

    复制格式:dd if(input file->数据来源)=SRC of(output file->数据存储目标)=DEST

        wKioL1f_PPqSR0dIAAA8VrqSdTI351.png

    dd命令复制文件和cp命令复制文件有着巨大的不同:

    ->cp命令复制文件的时候是以文件为单位进行复制的,而我们的dd命令复制文件的时候,复制的是底层的数据流(二进制代码),dd命令这样的特性使得dd命令可以只复制文件的一部分,还可以使用bs(block size)=1024(没有单位默认为字节)来指定一次性复制多大部分的容量,还可以使用count来指定一次性复制多少个单位这样的容量:

    wKiom1f_PVazIcfiAAA2G-Pd2zc585.png

·dd命令还可以用来备份我们的MBR

    命令:

    dd if=/dev/sda(这里不指定文件而是直接指定我们的设备,表示从我们这块磁盘的最开始处开始,一块磁盘的最开始处就是我们的MBR) of=/mnt/usb/mbr.backup bs=512(从磁盘最开始处的512个字节就是我们的MBR) count=1:

    wKiom1f_PgeiVt-zAAA_UetMfUw361.png

    如果我们的MBR出现问题了,我们还可以使用dd if=/mnt/usb/mbr.backup of=/dev/sda bs=512 count=1命令来还原我们的备份

    dd命令还可以直接创建磁盘镜像文件:

        dd if=/dev/cdrom of=/root/rhel.iso

    cat命令也可以直接创建磁盘镜像文件

        cat /dev/cdrom > /root/rhel.iso->这一条命令就可创建我们的磁盘镜像文件

·创建本地回环设备文件的命令:

    dd if=/dev/zero(此为泡泡文件,可以一直向外吐0,和它相对的就是我们的数据黑洞/dev/null) of=/root/swapfile bs=1M count=1024,该命令可以创建一个大小为1024M的本地回环设备文件,在创建该文件的时候还可以顺便测试一下我们的磁盘性能:

    wKioL1f_P2HB3MVBAAAziiwan38944.png

    dd命令在使用的时候,还可以使用seek=#命令来创建一个假的设备文件,一个虚假的容量大小,而且我们可以从上图看出,创建的这个假的设备文件的大小用ls命令也看不出来真实大小,只有du命令才能看出来真是的大小

    我们现在来利用dd命令来创建一个本地回环设备文件然后将它格式化为swap分区,来供我们使用

    1,利用dd命令创建一个本地回环设备文件

        wKioL1f_QJzgSXcoAAAl8PYMBEY346.png

    2,将创建好的本地回环设备文件格式化为swap分区,再创建一个卷标名

        wKioL1f_QODgBELPAAAYn9ywzrw103.png

    3,然后将此swap分区启用即可

        wKioL1f_QQ-jyXjYAAAv2LM5OQY105.png

    由上图知:

        我们在启用swap分区之前,swap分区容量总共是2047M

        我们启用新建的swap分区之后,swap分区的容量总共是2559M

        说明我们启用swap分区成功

        这时我们的swap分区就可以正常使用了

        最后我们不用的时候再关闭已经启用的swap分区

         wKiom1f_QbTgJCm_AAAvPHoRjb0925.png

    我们在使用mount命令挂载本地回环设备的时候得使用-o loop选项及额外选项,否则无法挂载:

    wKiom1f_QzvTO0ssAABgvVddI3U649.png