linux 磁盘文件系统详解

硬盘一般分为机械硬盘和SSD硬盘:

    机械硬盘的速度相比SSD硬盘差一大截.但价格比后者便宜一个档次,而服务器一般用的也是机械硬盘.我们以下讲的知识都是机械硬盘相关


每块硬盘可以分为多个磁道或者多个扇区(512 bytes)或者多个柱面(分区的基本单位)。

MBR:Master Boot Record(主引导分区)

512bytes

446: bootloader

64: 文件系统分区表

16: 标识一个分区(最多只能分4个主分区,一个主分区代表16bytes)

2:标识磁盘分区信息(是一主一扩展分区还是两主一扩展等等)


磁盘接口类型:

IDE (ATA):133MB/s,/dev/hd

SCSI: 640MB/s

SATA:6Gbps

SAS:6Gbps

USB:480MB/s

    

识别硬盘设备:/dev/sd

        标记不同的硬盘设备:/dev/sd[a-z](centos 5以及以前版本 ide接口硬盘为/dev/hd开头)

     标记同一设备上的不同分区:/dev/sd[a-z][1-]

     1-4: 主或扩展分区标识

     5+:逻辑分区标识


设备文件:特殊文件

设备号:

major, minor

major: 设备类型(下面截图第一个major为10)

    minor: 同一类型下的不同设备(截图第一minor为175)

wKiom1XpthSDHux5AAYoWrYGybA497.jpg


“块”:block,随机设备

“字符”:character,线性设备


从截图可看出普通文件第五项为文件大小,设备文件(包括块设备文件和字符设备文件)该项为major,minior


问题:我们为什么要分多个分区?

解答:这个跟windows分C,D,E,F盘一样,如果要重装系统之类的整盘就格式化了.还有一点在linux下分多个分区每个分区可以单独使用文件系统


分区工具:

fdisk,parted,sfdisk

下面我主要讲解fdisk工具


fdisk详解


选项参数:

    -l [device] 列出所有分区表,如果指定设备,就只列出该设备的分区表


wKiom1XpuP3B6PQHAAG5ZLkpag8040.jpg

从该截图看我这只有一个硬盘,磁盘大小为21.5GB,分了3个主分区,显示各分区start end是以柱面为单位,该系统是centos 6.0系列,而在centos 7.0系列该单位就是扇区.


为了整个fdisk实验我特地在虚拟机上加了一块新硬盘

wKiom1Xpu6igOFzxAAKbDYkerb4145.jpg


新硬盘为/dev/sdb 该新硬盘大小为10.7GB

现在我们给这块新硬盘分区 fdisk /dev/sdb

    fdisk之后选项常用参数:

        m:帮助信息

        p:显示分区表

        d:删除一个分区表

        l:列出已知的分区类型

        n:新建一个分区表

        q:退出不保存

        w:保存并退出

        t:修改分区表系统id


创建完成之后,查看内核是否已经识别新的分区:

    cat /proc/partitions

    

有三个命令可以让内核重读磁盘分区表:

    CentOS 5: partprobe [DEVICE]

    CentOS 6,7: partx, kpartx

        partx命令:

            partx DEVICE

            partx -a DEVICE

            partx -a -n M:N DEVICE

            M

            M:

            :N

        

        kpartx命令:

            kpartx -af DEVICE


详细实例操作可以参看后面习题解答


分区又可以分为块设备区域,索引节点区域

wKiom1Xpv7nzGeckAADLag3ar-0047.jpg

图画的有点丑...

索引区域就好比一本书的目录通过索引可以快速的定位书中指定的章节.每一个索引节点被称为inode.每个inode也有自己的编号.inode存储的是该文件的属主,属组,权限信息,文件大小,最新修改时间,文件访问时间之类的相当于stat文件的详细信息(这里要除了文件名),还有一项很重要的信息:就是该inode使用对应的数据块.

wKiom1XpwYfhvzpFAAFC8K83zHY441.jpg


而块设备区域分为多个块,对于文件类型来说每个块存储的是实际数据,对于目录来说该块存储的是该目录下的所有文件或目录的文件名以及该文件对应的inode编号,该索引编号刚好对应索引区域的inode


文件查看,增加,复制,移动, 删除原理

查看实例:cat /etc/fstab

    解答:

    1.首先肯定先通过rootfs找到根/目录(指定的分区以及块),通过块的内容可以得到根下所有文件或者目录的文件名以及inode编号,从此找到了etc对应的inode编号

    2.通过inode编号就去索引区域查找inode,从此找到了指定的inode

    3.得到了inode就可以找到etc数据块,也可以知道etc为目录,可以得到etc目录下的文件或目录以及对应的inode编号,由此可以找到fstab的inode编号

    4.通过inode编号可以找到inode,再通过inode找到对应的数据块由此就得到/etc/fstab文件的信息


增加实例:touch /tmp/abc.txt

    解答:

    1.首先在索引区域找到一个没有标识为1的inode将他标识为1

    2.首先通过根找到tmp目录以及tmp目录的数据块

    3.将tmp数据块内容增加一行abc.txt以及对应的inode编号(该编号就是第一步得到inode编号)

    4.找到几个未使用的数据块(默认为8个数据块),标识为1,将这批数据块指向到inode信息


复制实例:cp /etc/fstab /tmp/test.txt

    解答:

    1.先找个空闲的inode标识为1,并记住该inode号

    2.通过第一个查看实例找到tmp对应的数据块并在内容里加一行test.txt以及上一步得到的inode号

    3.从数据区域找到几个空闲的数据块,再将这些数据块号信息写到inode信息中去。

    4.将/etc/fstab中的内容写到上面得到的数据块中


移动实例:mv /etc/fstab /tmp/test.txt

    解答:

    1.找到/etc对应的数据块内容,删除fstab那项,并记住该fstab对应的inode编号

    2.在/tmp对应的数据块内容增加一行test.txt以及对应inode编号(该编号即为第一步得到的inode编号)


这里很容易就可以明白为什么移动一个文件比复制一个文件快一个档次了把,移动文件根本没有在文件对应的数据块写入该文件的内容,而复制要写入数据.

当然这个前提是/etc和/tmp一定要在同一个分区,如果没在同一个分区,就跟复制一样了.因为不一样的分区是不能使用别的分区的inode以及数据块的。都得重新创建inode号以及数据块并且要将数据写入到新的数据块内容中去



删除实例:rm -f /tmp/test.txt

    解答:

    1.找到/tmp对应的数据块内容,删除test.txt以及对应inode编号那项

    2.将test.txt对应的inode编号的inode标记未使用状态

    3.将inode对应的数据块全部标记为0(未使用状态)


删除文件实际上根本就没删除数据块对应的数据,只是将那些数据块标记为0,所以再没有新数据写到那批数据块覆盖掉之前的数据,恢复指定文件还是挺容易的.


讲了以上原理,顺便讲讲硬链接和软链接:

硬链接特性:

    1.inode一致的两个文件。由于inode节点一致,如果改了任何一个文件,另外一个文件内容肯定会改变,包括权限信息之类。因为inode是一致的,inode存的信息之前我就讲的很详细了

    2.指向同一个inode的多个不同路径; 创建文件的硬链接会增加inode的引用计数;删除硬链接仅是删除其一个访问路径,只到最后一个路径被删除。

    3.不能对目录进行。原因,假如两个目录同时指向到同一个inode。我如果查看其中一个目录的一个文件。我通过该目录的父级目录可以得到该inode,但通过根本无法找到该目录对应的数据块(当然我提的这点只是冰山一角)

    4.不能跨分区。原因:很简单,不一样的分区是不能用别的分区的inode。


软连接特性:

    1.不一样的inode

    2.创建的软连接文件对应的数据块指向另一个文件路径,该文件大小当然就是另一个文件路径字符的大小.

    3.可以对目录进行

    4.可以跨分区

    5.对文件创建符号链接不会增加其引用计数;删除原文件,符号链接文件也将无法


创建(硬|软)链接命令:

    ln

    创建硬链接: ln /etc/fstab /tmp/1.txt

    创建软连接: ln -s /etc/fstab /tmp/2.txt


块位图和inode位图

对应上面提到的查找空闲的inode或者空闲的数据块,我们如果一个个去遍历查询有没有被使用到,效率就太慢了,所以就引入了inode位图以及数据块位图,通过位图就可以快速得到空闲的inode以及块.


超级块

描述文件系统整体信息的数据结构,主要描述文件系统的目录和文件的静态分布情况,以及描述文件系统的各种组成结构的尺寸、数量等。


块组:

对于非常大的文件系统,就算有位图,去遍历整个位图,也是很慢的。为了进一步提高效率又将独立文件系统分为各个组,称为块组,每个块组都分为块位图,inode位图,inode区域,块区域.对于个别组还会保存超级块的信息,如果只有一个块组保存超级块信息肯定不靠谱.



创建文件系统

    在分区上执行格式化(高级格式化)

        要使用某种文件系统,满足两个条件:

            内核中:支持此种文件系统

            用户空间:有文件系统管理工具


    mkfs, mkfs -t type = mkfs.type

    ext系列可以使用mke2fs

    

    blkid命令:

        blkid DEVICE

            显示信息:LABEL, UUID, TYPE(三项)

wKioL1Xp3TjDUB8PAACGWzpWBzY603.jpg

    

mke2fs [OPTION]... DEVICE

-t {ext2|ext3|ext4}

-b {1024|2048|4096}

-L 'LABEL'

-j: mke2fs -t ext3

-i #:

-N #:

-m #: 预留磁盘空间占据多大百分比的空间为后期管理使用;

-O FEATURE[,...]

-O ^FEATURE:关闭此特性

has_journal


文件系统属性查看及调整工具

e2label

    e2lable DEVICE [LABEL]

        1.不指定[LABEL]选项,显示设备的卷标

        2.指定[LABEL]选项,设置该设备的卷标


tune2fs

    显示ext系列文件系统的属性,或调整其属性;

    

     -l:显示超级块中的信息;显示整个文件的属性及布局等相关信息;

     -L 'LABEL':修改卷标;

     -m #: 调整预留给管理员的管理空间百分比;

     -j: ext2 --> ext3

     -O:文件系统属性的启动或关闭 

     -o:文件系统默认挂载选项的启用或关闭


dumpe2fs:

-h: 仅显示超级块信息;


文件系统检测


fsck: Filesystem check

fsck -t type

fsck.type

-a: 自动修复错误

-r: 交互式修复错误

-f: 强制检测


e2fsck:ext系列文件系统专用的检测修复工具;

-y: 自动回答为“yes”

-f:force



文件系统的挂载和使用

将额外文件系统与根文件系统某现存的目录建立起关联关系,进而使得此目录做为其它文件系统访问入口的行为,称之为挂载;

而解除此关联关系的过程:叫卸载;

挂载点:mount point, 设备挂载至目录;

注意:挂载点在挂载在之后,其内部原有的文件会被暂时隐藏;建立使用空目录做为挂载点;


挂载方法:    

    mount:通过读取/etc/mtab文件来显示当前系统所有已经挂载的设备;

    mount -a:挂载/etc/fstab文件中的所有支持自动挂载的文件系统;

    mount [options] [-o options] DEVICE MOUNT_POINT

        [options]:命令选项

[-o options]:挂载选项


        DEVICE: 要挂载的设备

            (1) 设备文件:/dev/sda5

            (2) 卷标:-L 'LABEL'

            (3) UUID:-U 'UUID'

            (4) 伪文件系统名称

        我们一般挂载设备选得都是第一种方式


        MOUNT_POINT: 挂载点

        

    mount常用选项:

        -t type:文件系统类型

        -r: 以“只读”方式挂载此文件系统

        -w: 以“读写”方式挂载此文件系统

        -n:每个文件系统在挂载时都会自动更新/etc/mtab文件,-n用于禁止此功能;

            此时,如果想查看挂载的所有文件系统:cat /proc/mounts

        -a: 自动挂载所有支持自动挂载的设备;一般去查看/etc/fstab文件的选项自动挂载

        -B:绑定目录至另一个目录上;


        -o 挂载选项:

            async:异步模式

            sync: 同步模式

            atime/noatime:是否更新访问时间戳;

            diratime/nodiratime:是否更新目录的访问时间戳;

            auto/noauto: 是否允许此设备被自动挂载;

            exec/noexec:是否允许执行此文件系统上应用程序;

            dev/nodev:是否支持在此设备上使用设备文件;

            suid/nosuid:是否支持suid

            remount:重新挂载

            ro

            rw

            user/nouser: 是否允许普通挂载此设备;

            acl:是否支持此设备上使用facl;

            defaults:rw, suid, dev, exec, auto, nouser, and async

            

        感觉一般的挂载选项都是defaults


    umount:卸载命令

        umount DEVICE | umount MOUNT_POINT

        查看正在访问指定挂载点的进程:

        fuser -v MOUNT_POINT

        补充:如果有进程正在访问挂载点,是不允许卸载的,因此需要下面的命令

        终止所有正在访问指定的挂载点的进程:

        fuser -km MOUNT_POINT

    

交换分区        

    free命令:

        查看memory和swap的使用状态

        -m: 以MB为单位

        -g: 以GB为单位

    

    mkswap:创建交换分区

        mkswap [option] DEVICE

            -L 'LABEL'


    swapon:启用交换分区

        swapon [option] [DEVICE]

            -a: 激活所有交换分区

            -p PRIORITY: 设定其优先级;


    swapoff:禁用交换分区

        swapoff [option] [DEVICE]


文件系统等空间占用信息的查看

    df: disk free

        -h: human-readable

        -i: inode数量

        -P: 以Posix兼容的格式输出

    du: disk usage

        -h: human-readable

        -s: summary


文件系统相关挂载配置文件:/etc/fstab

    每行定义一个文件系统;


wKioL1Xp2R2g1cEhAAIYZvptoF0375.jpg        


要挂载的设备或伪文件系统:设备文件、LABEL=、UUID=、伪文件系统名称

挂载点:挂载指定的目录

文件系统类型

挂载选项:defaults

转储频率:0 => 不转储, 1 => 每天转储, 2 => 每隔一天转储(一般为0即可)

自检次序:0 => 不自检, 1=> 首先自检,通常只有/才为1, 2 => ...(一般为0即可)


一般修改了/etc/fstab文件增加几项新的挂载点,它不会立马生效,它只会在重启之后才会生效.如果要立马生效,需要执行命令mount -a即可


实战


  1. 创建一个10G文件系统,类型为ext4,要求开机可自动挂载至/mydata目录;        

解答步骤:

1.首先我这里新加块10G的硬盘展示为/dev/sdb

2.fdisk /dev/sdb

3.敲n 新创建一个分区.

4.之后选择p 创建一个主分区,因为模拟的是一块10G的新硬盘,无所谓. 

5.w保存分区表

wKiom1Xp2mLS9SglAAFSTU9lGVw472.jpg

6.partx -a /dev/sdb

7.cat /proc/partitions,由下图可以看出/dev/sdb1已经加载到内核中

wKioL1Xp3oqD7X5TAAC1UTYVfCQ485.jpg

8.mke2fs -t ext4 /dev/sdb1

wKiom1Xp3O6CDywCAAKO6T82dNU509.jpg

9.mkdir /mydata

10.vim /etc/fstab(修改保存)

wKioL1Xp4A6B_toPAAHpsNbzlE8169.jpg

11.mount -a(让该挂载即时生效,否则只能重启才能生效)

12.df -h查看是否挂载成功

wKiom1Xp3kSTA4BGAADWovvhWgo436.jpg


由此整题解答完毕






你可能感兴趣的:(linux)