磁盘管理



目录

  • 设备文件

  • 磁盘介绍

  • 磁盘分区

  • 创建磁盘分区

  • 同步分区表

  • 文件系统


一、设备文件

    设备文件关联至设备驱动程序,用户通过操作这些设备文件间接管理对应的硬件设备

    一个设备的名称表示整个磁盘,而分区则用设备名加上一个分区号来表示

    设备文件类型:

        块设备    存取单位是,如磁盘

        字符设备  存取单位是字符,如键盘

    为了方便管理这些设备,系统设置了主设备号和次设备号用来区分

看如下示例:

Linux学习—磁盘管理知识点总结_设备文件

    8 代表主设备号  后边的数字代表次设备号

    重点在于后边的次设备号,该数字与分区槽所在的位置有关

    创建设备文件:    

        mknod 文件名 b 主设备号 次设备号  创建块设备文件

        mknod 文件名 c 主设备号 次设备号  创建字符设备文件


二、磁盘介绍

    (针对机械硬盘)

磁盘的结构图如下:

Linux学习—磁盘管理知识点总结_设备文件_02

    CHS(柱面/磁头/扇区)

        C:一个柱面号即磁道号,通常由外向内依次编号,通常作为文件系统的最小单位

        H:一个磁头号即盘面号,一个盘面仅有一个磁头

        S:一个磁道可以有多个扇区,通常一个扇区512字节,一个扇区包含三个字段

            标识字段    校验字段    数据字段

    磁盘的存储容量=磁头数*磁道数*扇区数*512(字节)

    磁盘的编址方式:

        ①CHS方式   #柱面,#磁头,#扇区的方式绝对寻址

        ②LBA方式   以0柱面,0磁头,1扇区表示整个磁盘的第一个扇区,后面的扇区相对依次编号


三、磁盘分区

    在虚拟机界面新创建创建一个磁盘

Linux学习—磁盘管理知识点总结_磁盘分区_03

    可是现在远程终端并不能同步新加的磁盘

    需要输入

        echo '- - -' > /sys/class/scsi_host/host0/scan

    同步磁盘信息

    fdisk -l  查看新创建的磁盘

Linux学习—磁盘管理知识点总结_磁盘分区_04


    每个磁盘的第一个扇区存放的是分区信息(MBR—Master Boot Record),包括三部分:

       1、boot loader(446字节)     Linux下为grub

       2、硬盘分区表(16字节*4=64字节)

       3、结束位(2字节)   十六进制的55 aa

    hexdump命令可以查看二进制的文件,-C表示16进制输出

    hexdump -C -n 512 /dev/sda -v  查看分区信息有数据(16进制)

    hexdump -C -n 512 /dev/sdb -v  查看分区信息全为0

Linux学习—磁盘管理知识点总结_设备文件_05

    现在来做这样一个实验(对分区表)

    dd if=/dev/sda of=/dev/sdb bs=1 count=512  将/dev/sda的磁盘前512字节信息复制给/dev/sdb

    再次执行hexdump -C -n 512 /dev/sdb -v,分区表信息和结束位信息如下: Linux学习—磁盘管理知识点总结_磁盘分区_06

    结果两张磁盘的分区信息一样,唯一不同的是/dev/sdb没有第五个分区的信息原因是分区表只有16字节*4=64字节,只能保存四张分区表的信息,即不能保存逻辑分区的信息),效果图如下:

Linux学习—磁盘管理知识点总结_磁盘容量_07

    dd if=/dev/zero of=/dev/sdb bs=1 count=512 破坏/dev/sdb的分区信息

    fdisk -l  

    发现/dev/sdb的分区消失

    总结:MBR中的分区表就是存放着整个磁盘的分区信息,并且最多只能划分三个分区加一个扩展分区

   

    继续实验(对结束位)

    dd if=/dev/sda of=/dev/sdb bs=1 count=512

    dd if=/dev/zero of=/dev/sdb bs=1 count=2 seek=510 (破坏分区信息的结束位)

    hexdump -C -n 512 /dev/sdb -v,结果结束位的55 aa变为了00 00

Linux学习—磁盘管理知识点总结_磁盘分区_08

    fdisk -l 显示/dev/sdb没有分区

    dd if=/dev/sda of=/dev/sdb bs=1 count=2 skip=510 seek=510 

    hexdump -C -n 512 /dev/sdb -v

    fdisk -l 显示/dev/sdb又有分区

    总结:结束位用来区分MBR的结束,如果没有该结束位,则系统无法识别出分区表的结束,即没有分区


四、创建磁盘分区

    fdisk ——磁盘分区

        -l 列出指定外围设备的分区表状况(以柱面为单位)

        -u 搭配-l选项,用扇区数目代替柱面数目(以扇区为单位,一个扇区512字节)

    子命令:

        a 在当前分区设定一个可启动标志

        b 编辑一个BSD磁盘标识

        c 切换为DOS兼容磁盘配额

        d 删除当前分区

        l 列出所有分区的类型

        m 主菜单

        n 创建一个新分区

        o 创建一个DOS分区

        p 输出所有分区列表和每个分区的信息

        q 退出,不保存

        s 创建一个空的Sun磁盘标识

        t 替换当前分区的类型

        u 修改分区表中的条目的显示的单位(柱面和扇区)

        v 检测错误,显示为分配扇区数的总和

        w 保存修改退出

        x 进入高级操作模式,专家级操作命令

    在子命令模式下Ctrl+backspace为删除键

    

    用fdisk命令完成对磁盘的分区工作之后,该磁盘仍然不具备存储功能,还需要对所需的文件系统格式化

    fdisk是一个比较面相底层的系统工具,因此在使用的时候最好预先对数据进行备份,以免误操作造成数据丢失

        

    gdisk 命令--该命令默认没有安装,使用yum -y install gdisk安装 (和fdisk极其类似

   

    parted 命令(实时生效,使用的时候注意)

    格式:parted + [选项] + 设备文件 [命令 + 参数]

    [选项]

        -l 显示所有磁盘的分区信息

    [命令 + 参数] (子命令模式下可以使用tab键补齐

        mklabel  创建分区表结构(gpt结构不能使用fdisk -l查看)

        print    显示分区信息

        mkpart primary 创建分区(默认单位为M)

        rm       删除分区

        quit     退出子命令模式

实例:

parted /dev/sdb
mklabel gpt 
mkpart primary 1 200
mkpart primary 200 300
quit
parted -l

五、同步分区表

    操作系统所在盘不会及时更新分区表信息

    查看内核是否同步分区表信息方法:

        ls 设备文件名*

        cat /proc/partitions

        lsblk 命令不会即时显示,该命令读取的是内存中的磁盘分区信息(树状结构)

    Linux学习—磁盘管理知识点总结_设备文件_09

    同步分区表信息的方法:(只是修改显示的信息,实际对硬盘没有操作

        partprobe 设备文件名(centos6仅对非系统所在盘有效)

        partx -a /dev/sdb  更新增加的分区

        partx -d /dev/sdb --nr NUM1-NUM2  更新删除的分区


六、文件系统

    存储设备或分区上的文件的方法和数据结构,一个硬盘想要存放数据,必须先创建文件系统

    查看当前操作系统支持的文件系统:

        ls /lib/modules/$(uname -r)/kernel/fs/ 

        cat /proc/filesystems

    创建文件系统:

        mkfs  创建文件系统

        mkfs.FS TYPE + 设备文件

        mkfs -t FS TYPE + 设备文件

        mkfs -L label + 设备文件    设定卷标

        mke2fs——创建ext系列文件系统

            -j 相当于-t ext3

    文件系统类型

        blkid 查看文件系统信息 (mount列出所有设备的格式类型)

        tune2fs + 分区    重新设定ext系列文件系统的参数

            -l 显示指定分区的超级块信息

            -L 修改label

            -U 设置UUID

        dumpe2fs + 分区   导出分区的文件系统详细信息(包含超级块信息)

            -h  效果和tune2fs -l一样

    

    超级块 :存储整个文件系统信息的一个块

        一个磁盘有MBR和四个分区,

        一个分区有boot sector和文件系统,

        一个文件系统有多个block group,

        一个block group有超级块,块位图,inode位图,inode表和数据块等

dumpe2fs /dev/sda1
dumpe2fs 1.41.12 (17-May-2010)
Filesystem volume name:   <none>
Last mounted on:          /boot
Filesystem UUID:          051c003c-2cef-4115-bc1c-525759174a77
Default mount options:    user_xattr acl
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              51200
Block count:              204800
Reserved block count:     10240
Free blocks:              153675
Free inodes:              51161
First block:              1
Block size:               1024
Fragment size:            1024
Reserved GDT blocks:      256
Blocks per group:         8192
Fragments per group:      8192
Inodes per group:         2048
Inode blocks per group:   256
Flex block group size:    16
Filesystem created:       Tue Jan  9 04:48:06 2018
Last mount time:          Tue Feb 13 06:48:50 2018
Last write time:          Tue Feb 13 06:48:50 2018
First inode:              11
Inode size:          128
Group 0: (Blocks 1-8192) [ITABLE_ZEROED]
  Checksum 0x4512, unused inodes 2008
  Primary superblock at 1, Group descriptors at 2-2
  Reserved GDT blocks at 3-258
  Block bitmap at 259 (+258), Inode bitmap at 275 (+274)
  Inode table at 291-546 (+290)
  3785 free blocks, 2009 free inodes, 6 directories, 2008 unused inodes
  Free blocks: 4408-8192
  Free inodes: 24, 41-2048

        上为执行dumper2fs /dev/sda1 命令的部分执行结果,Group 0之前是超级块的内容,之后是每个块组的一些信息

        通常将超级块、块位图、inode位图成为文件的元数据,而inode表和数据块成为数据

    文件系统检测和修复

        当对数据修改并将文件写入磁盘时,发生在非正常关机和死机,就会发生数据不一致的问题,为此需要对文件系统进行检查。

        非正常会有标记 no clean

        fsck -p 自动修复

        fsck -r 交互式修复