磁盘管理

磁盘设备

一切皆文件

所有的Linux中的设备都可以使用下面命令进行操作:open(), read(), write(), close()(这些是C的函数)
  • 块设备:随机访问

  • 字符设备:线性访问

设备号码:

磁盘管理90316c03-a60e-4157-bb93-8fda7aeab15f.jpg

  • 主设备号:major number,标识设备类型 
    8是主要设备编号,代表类型

  • 次设备号:minor number,标识同一类型下的不同设备 
    0-5是设备唯一编号,同一类型设备进行区分

  • 只要主、次设备编号相同,他们就是同一个设备 
    了解更多关于设备的信息

硬盘接口类型:

  • 并行:多针脚 
    IDE类型最高速度:133MB/s 
    SCSI设备:640MB/s

  • 串口:单针脚,可以多个串口,以提高速度

设备 最高速度
SATA设备最高速度 6Gbps
SAS设备最高速度 6Gbps
USB设备最高速度 480MB/s

tips:注意单位的不同.B是指字符,bps是指每秒传输的位

  • 串行接口速度比并行快,大部分原因是:不受干扰,速度快。

命名

  • IDE设备:/dev/hd*

  • SCSI,SATA,SAS,USB等设备:/dev/sd*

  • 磁盘设备文件都在/dev目录下面

  • 由于IDE设备的弱点,基本被淘汰了。cent7开始,都改名叫sd

  • 有时候,系统/dev文件下或者别的地方,会出现vda,vdb,vdc这种的,是虚拟机上的磁盘。当成硬盘用就可以了。

磁盘分区方式

  • MBR和GTP的分区方式

  • GTP的主分区个数可以超过4个

  • MBR

机械硬盘和固态硬盘

机械硬盘:是盘片的硬盘,所以转速(rpm)对硬盘影响很大,所以就有一个指标rpm 
固态硬盘:内部构建和机械硬盘完全不一样。

机械硬盘组成

磁盘管理86a5295e-4563-4358-8dbf-3dda27fb44e7.jpg

单位 分配字节/每磁面 最大数量
磁头(head) 8 256
磁道(tarck) 10 1024
扇区(sector ) 6 63(512byte/每个)

==每个柱面的数据量=磁道的数据量∗盘面数(=磁头数)

==51263磁道的数据量=柱面扇区数量∗每个扇面的数据量=512∗63

==51263256=8M每个柱面的数据量=柱面扇区数量∗每个扇面的数据量∗盘面数=512∗63∗256=8M

寻址方式

CHS寻址: cylinder(柱面)Head Sector<-----------老式的寻址方式
LBA寻址:开始可以最小单位为扇区(Centos6开始使用)
  • 早期系统中,CHS按照柱面分配时,不允许一个柱面分给多个分区,现在只会给出提醒警告

  • 分配从柱面1开始分配,柱面0存放了开机引导和分配表等信息。

磁盘管理5ac3ce81-97bd-4865-8dba-d3535c4b0967.jpg

  • centos6开始支持LBA了,fdisk默认显示以柱面为单位,-u参数帮助fdisk以扇区为单位显示

磁盘管理4fe71d9e-04c9-4ad3-8258-5c0ffbef93fc.png磁盘管理4fe71d9e-04c9-4ad3-8258-5c0ffbef93fc.png

  • centos7开始,才“默认”LBA,默认就是以扇区为显示单位

    但是如果想用柱面为单位,可以在fdisk中使用 -u=cylinders 
    磁盘管理 84b22271-40f1-4cdf-b0e1-2b93bba6fecf.jpg
    磁盘管理9fbc0d36-dd50-4776-8a47-b67526c00f9e.jpg

给服务器添加硬盘

  • 将硬盘添加到服务器上之后,使用下面命令进行扫描,就可以在系统中看到,硬盘已经添加成功了。

echo “- - -” > /sys/class/scsi_host/host2/scan
//这里有三个,host0,host1,host2,如果一个不成功,可以试试用其他的。
  • lsblk是用来列出在内存中有的块设备文件的。 
    磁盘管理 
    磁盘管理906ddd06-229d-4edb-8ada-53b27cddc4f0.jpg

    fc106efd-c5e3-4fe3-a2d7-1bf371e55465.jpg

分区

为什么创建分区

  • 更高效

    比如数据库或者是日志,或者是操作系统。

    由于他们的存放特性是不一样的,尤其是数据库和日志的存放。

    就需要不同的文件系统,希望能够使用不同的文件结构来存放他们,以便更高效。

  • 防破坏:防止“所有”内容被破坏

  • 减少磁盘修复难度和时间

  • 磁盘配额

分区方式

  • 分区方式和磁盘寻址方式之间存在密切联系。

  • 由于centos6和7之间,寻址方式的改变,他们的默认分区方式也有变化。

  • 分区有两种:MBR和GPT

  • windows中的分区方式也分为这两种,如图:

磁盘管理75b1547d-a47a-41c3-86cc-a6b0bf00b3b0.jpg2c939d40-b787-427d-95eb-d31db13dd1ba.jpg

磁盘管理

MBR

MBR介绍

  • MBR:Master Boot Record,使用32位表示扇区数,分区不超过2T

  • 如何分区:按柱面

  • 分区信息:存放在0磁道0扇区,一共512bytes

    • 前446bytes:boot loader

    • 后64bytes:分区表

      • 16bytes:标识一个分区

      • 将前446个字节,给擦除,擦除后,只要后面分区表的64位字节,还在,就还可以使用。

        b0fe11ac-1892-488d-bdd0-28d1d8a6af00.jpg

    • 最后2bytes: 存放内容“55AA”,这部分内容一定不能够被破坏

      • 如果没有“55AA”,该分区会被认为是裸分区!!

        裸设备(raw device),也叫裸分区(原始分区),是一种没有经过格式化,不被Unix通过文件系统来读取的特殊块设备文件。由应用程序负责对它进行读写操作。不经过文件系统的缓冲。它是不被操作系统直接管理的设备。这种设备少了操作系统这一层,I/O效率更高。不少数据库都能通过使用裸设备作为存储介质来提高I/O效率。 
        裸分区只能够使用dd来进行备份

      • 使用hexdump查看/dev/sdd开头512个字节的十六进制内容

        • 查看分区表中内容这512个信息,如果出现问题,就真的不能够启动系统了。
          所以最好备份,,放在别的地方,

dd if=/dev/sda of=/testdir/mbrbak bs=1 count=512
//if表示inputfile
//of表示outputfile
//bs表示每次读取多少
//count表示读取多少次
//skip表示inputfile跳过多少个字节,从该字节后的一个字节开始读
//seek 表示outputfile跳过多少个字节,从该字节后第一个字节开始写
            若是哪天这512个字节出现了问题,那么就需要使用dd命令恢复

磁盘管理 42c99528-1097-40d8-a470-6529e034b358.jpg
– 实验:如果没有最后的“55AA” 
– 破坏最后两位 
磁盘管理 688a5a58-f277-4461-9448-1f214500e02f.jpg
– 之后,可以看到,和没有分区是一样的效果 
磁盘管理f12cfcf4-b6a3-46ca-8b8e-5c3ce55920ac.jpg

MBR分区结构

  • 4个主分区;3主分区+1扩展(N个逻辑分区)

  • MBR分区结构图 
    磁盘管理af5ab925-74f1-4d4a-9f0a-5aec7d3c4420.png

  • 主分区 
    磁盘管理d7dca4fd-f7d7-4c7a-b5a0-caaf4a132916.png

  • 活动分区:系统开机后,会到那里找分区信息

  • 扩展分区&逻辑分区 
    磁盘管理9d66843e-327f-45e8-992f-a42cc6794ca2.png

  • 扩展分区有自己的MBR–EBR

  • 扩展分区的512个字节中,前466个字节,为了和主分区保持一致,会预留出来,不存放任何内容。

  • 扩展分区中,分区信息都放在自己的分区中。在分区开头位置的第0扇区内。

GPT

GPT介绍

GPT(GUID partition table)支持128个分区,使用64位,支持8Z(512Byte/block)64Z(4096Byte/block)

  • 使用128位UUID表示磁盘和分区GPT分区表自动备份在头和尾两份,并有CRC校验位

    • GUID和UUID

      UUID是一个由4个连字号(-)将32个字节长的字符串(32个十六进制数)分隔后生成的字符串(8-4-4-4-12),总共36个字节长。比如:550e8400-e29b-41d4-a716-446655440000 
      GUID 是微软对UUID这个标准的实现。UUID是由开放软件基金会(OSF)定义的。UUID还有其它各种实现,不止GUID一种。比如我们这里在Java中用到的。 
      UUID的生成:由当前系统时间+其他内容,组合生成,所以一般不会有重复

  • 随机生成UUID 
    磁盘管理d21c6bfa-26a0-4ee7-b61e-d159dfdd6ca9.jpg

  • UEFI (统一扩展固件接口)硬件支持GPT,使操作系统启动,否则即使配置成功,也无法使用。

  • 会自动备份超级快内容

GPT分区结构
  • GPT分区结构图 
    磁盘管理5ef9872f-6d5d-40e0-b7b7-c6395b3016b3.jpg

  • LBA0存放Protected MBR。 
    这是因为大部分的磁盘工具不识别LBA的寻址方式,为了防止这些设备把GPT的分区给认为是裸分区,所以添加MBR信息,保证磁盘不被误破坏。

  • LBA0之后的内容,为EFI部分。该部分包括四个组成区域:

    • EFI信息区(GPT头)

    • 分区表

    • GPT分区

    • 备份区域

分区管理

查看块设备文件

  • 使用lsblk查看

[root@node4 ~]# lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sr0     11:0    1   3.7G  0 rom  /media/CentOS_6.8_Final
sdb      8:16   0    20G  0 disk
 ├─sdb2   8:18   0 784.4M  0 part 
 ├─sdb3   8:19   0   1.5G  0 part 
 ├─sdb4   8:20   0     1K  0 part 
 └─sdb5   8:21   0   3.9G  0 part 
sda      8:0    0   200G  0 disk
 ├─sda1   8:1    0   200M  0 part /boot
 ├─sda2   8:2    0   100G  0 part /
 ├─sda3   8:3    0     2G  0 part [SWAP]
 ├─sda4   8:4    0     1K  0 part 
 └─sda5   8:5    0   7.7G  0 part 
sdc      8:32   0   100G  0 disk 
sdd      8:48   0    10G  0 disk
  • ls /dev/sd* (见下图)

  • cat /proc/partitions ( 见下图)

  • fdisk -l

    • lsblk、/dev/sd*、/proc/partitions查看的都是系统内存中的分区表

    • fdisk查看的是系统最实时的详细分区表

    • 对于一些使用过的分区,添加或删除分区后,需要同步到内存中,否则前三者不能够查看到真实的分区信息。

 [root@node4 ~]# fdisk -l
  Disk /dev/sdb: 21.5 GB, 21474836480 bytes
  255 heads, 63 sectors/track, 2610 cylinders
  Units = cylinders of 16065 * 512 = 8225280 bytes
  Sector size (logical/physical): 512 bytes / 512 bytes
  I/O size (minimum/optimal): 512 bytes / 512 bytes
  Disk identifier: 0x58427b03
  
      Device Boot      Start         End      Blocks   Id  System
      /dev/sdb2             101         200      803250   83  Linux
      /dev/sdb3             201         400     1606500   83  Linux
      /dev/sdb4             401        1000     4819500    5  Extended
      /dev/sdb5             501        1000     4016218+  83  Linux

    Disk    /dev/sda: 214.7 GB, 214748364800 bytes
    255 heads, 63 sectors/track, 26108 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    
    Disk identifier: 0x000ac3f7
    Device       Boot      Start         End      Blocks   Id  System
    /dev/sda1   *           1          26      204800   83  Linux
    Partition 1 does not end on cylinder boundary.
    /dev/sda2              26       13080   104857600   83  Linux
    /dev/sda3           13080       13341     2097152   82  Linux swap/ Solaris
    /dev/sda4           13341       26108   102551934    5  Extended
    /dev/sda5           13341       14341     8033475   83  Linux
  • parted -l

[root@node4 ~]# parted -l
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sda: 215GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
 Number  Start   End    Size    Type      File system     Flags
 1      1049kB  211MB  210MB   primary   ext4            boot 
 2      211MB   108GB  107GB   primary   ext4 
 3      108GB   110GB  2147MB  primary   linux-swap(v1) 
 4      110GB   215GB  105GB   extended 
 5      110GB   118GB  8226MB  logical
 Model: VMware, VMware Virtual S (scsi)
 Disk /dev/sdb: 21.5GB
 Sector size (logical/physical): 512B/512B
 Partition Table: msdos
  Number  Start   End     Size    Type      File system  Flags
   2      823MB   1645MB  823MB   primary   ext2
   3      1645MB  3290MB  1645MB  primary
   4      3290MB  8225MB  4935MB  extended
   5      4113MB  8225MB  4113MB  logical

磁盘管理703a6850-e99e-47ba-8a8e-56d80c13300e.jpg

创建分区

fdisk

磁盘管理2e128103-11fe-4024-8ca6-80dc9ba1a61f.png磁盘管理e2dfc63c-910c-445a-801c-4d630693e5f0.png

  • 创建MBR分区,也支持GPT,对于一块硬盘,最多只能管理15分区

  • 4个主分区;3主分区+1扩展(N个逻辑分区)

  • 使用方法:

    • 修改分区表 fdisk [options]

    • 列出分区表 fdisk [options] -l

    • 定义块大小 fdisk -s

  • 选项

选项 释义 备注
-b sector size (512, 1024, 2048 or 4096)
-c switch off DOS-compatible mode 在7中,使用“-c[=mode]”,mode: ‘dos’ or ‘nondos’ (default)
-u 使用扇区(sector)而不是柱面(cylinder) 在7中,使用“-u[=]”,units: ‘cylinders’ or ‘sectors’ (default)
-v 打印版本信息
-C 指定柱面数量
-H 指定磁头数量
-S specify the number of sectors per track

gdisk

  • 创建GPT分区,分区数量无需担心(数量巨大,因为是基于UUID的)

  • 使用方法类fdisk

parted

  • 高级分区操作(创建、复制、调整大小等等)程序

  • 支持DOC也支持GPT

parted详解
  • 格式:

parted [options] [device [command [options...]...]]

-[options]

  • [device]:如果需要,但是没有指定,默认第一个parted找到的分区

  • [command [options…]

命令 释义 英文
检查 MINOR 对文件系统进行一个简单的检查
cp [FROM-DEVICE] FROM-MINOR TO-MINOR 将文件系统复制到另一个分区
help [COMMAND] 打印通用求助信息,或关于 COMMAND 的信息
(常用)mklabel 标签类型 创建新的磁盘标签 (分区表)
(常用)mkfs num 文件系统类型 在 num 创建类型为“文件系统类型”的文件系统
(常用)mkpart 分区类型 [文件系统类型] 起始点 终止点 创建一个分区
(常用)mkpartfs 分区类型 文件系统类型 起始点 终止点 创建一个带有文件系统的分区
move num 起始点 终止点 移动编号为num 的分区
name num 名称 将编号为 num 的分区命名为“名称”
(常用)print [num] 打印分区表,或者分区
(常用)quit 退出程序
rescue 起始点 终止点 挽救临近“起始点”、“终止点”的遗失的分区
(常用)resize num起始点 终止点 改变位于编号为 num 的分区中文件系统的大小
(常用)rm num 删除编号为num的分区
select 设备 选择要编辑的设备
set num 标志 状态 改变编号为num 的分区的标志
parted 实用命令
  • 更改分区类型:parted /dev/sdb mklabel gpt|msdos

    • 可以对未使用的分区更改分区格式

    • 已分区,但是未使用的分区,更改分区格式后,原来的分区会失效(消失)

    • msdos分区,使用“parted /dev/sdb mklabel msdos”设置分区类型后,查看,显示“dos”

      • partition table部分(使用parted print)9a76258a-234c-4ea4-ac3c-3e1cc1a0a4e0.png

      • Disk label type(fdisk -l)

        4ea0b97a-a85d-4d72-9b86-b9b9fa99708d.jpg

[root@node4 ~]# parted /dev/sdd mklabel gpt
Information: You may need to update /etc/fstab. 
                           
[root@node4 ~]# parted /dev/sdd print
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdd: 10.7GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
 Number  Start  End  Size  File system  Name  Flags

磁盘管理

  • 打印分区详情:parted /dev/sdb print

[root@node4 ~]# parted /dev/sda print
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sda: 215GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
 Number  Start   End    Size    Type      File system     Flags
  1      1049kB  211MB  210MB   primary   ext4            boot
  2      211MB   108GB  107GB   primary   ext4 
  3      108GB   110GB  2147MB  primary   linux-swap(v1) 
  4      110GB   215GB  105GB   extended 
  5      110GB   118GB  8226MB  logical
  • 新建分区:parted /dev/sdb mkpart primary 1 200(默认单位M)

    • 新建分区可以跳着分: 
      磁盘管理 6ca769c3-3fcb-483b-b5e8-9a253b2caf14.jpg
      磁盘管理83b2ded8-60ad-4a16-9ff0-fabd4f7bd63d.jpg

[root@node4 ~]# parted /dev/sdd mkpart primary 1 1024
Information: You may need to update /etc/fstab.                       
     
[root@node4 ~]# parted /dev/sdd print
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdd: 10.7GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt

 Number  Start   End     Size    File system  Name     Flags 
 1      1049kB  1024MB  1023MB            primary
  • 删除分区:parted /dev/sdb rm 1

  • 列出所有分区:parted -l

分区更多细节

  • 如果主分区中,4个分区都分配完成后,删除了分区2,分区1和分区3都不会发生变化,这和逻辑分区不同。

    • 这样容易导致磁盘浪费

  • 如果删除的是扩展分区中的分区,删除后,后面的分区会将原来的分区号覆盖掉(这可能是与逻辑分区的MBR存储方式有关系,也说明,扩展分区的分区名,并不是存储在扩展分区中的,可能是存储在前面的主分区中的。) 
    磁盘管理ffe72e36-71fa-4fa6-82ee-44127cf19d0c.jpg

  • 设备名与UUID之间,在写脚本的时候,最好使用UUID,因为UUID不会重复。设备名,在写脚本的时候最好备用,如上,如果删除了逻辑分区5之后,6会自动覆盖为逻辑分区5。如果脚本中使用逻辑分区5这个设备名,就会导致错误。

  • 分区如果不连续,会报warning出来。 
    磁盘管理81f6740b-3eee-4cd7-bea8-aceb7bc419f5.jpg

  • 使用命令操作分区的时候,分区不要写成:fdisk /dev/sdc3这种的要写成:fdisk /dev/sdc。因为/dev/sdc3已经是分区了,在分区,就会乱

同步分区

  • 修改后查看内存中是否识别新的分区,使用lsblk或者是查看/dev/sd*,或者是查看/proc/partitions中。

  • lsblk、/dev/sd*、/proc/partitions都是查看的内存中的分区结构

  • fdisk和parted查看的是硬盘真实的分区情况

  • 同步是指:通知内核重新读取硬盘分区表新增分区或者删除分区

  • 不要又增加了,又删除了,再去同步 
    – 每次增加操作完成后,就进行同步,每次删除操作完后,就进行同步

新增分区操作的同步

  • partx -a -n M:N /dev/DEVICE

    • 该命令的-n和–nr(指定同步到内存中的添加的设备名),并不好用 
      d05ec62d-9c9b-418a-ad94-a7432035476c.png磁盘管理 
      磁盘管理
      磁盘管理a5c92d24-b051-4c17-a626-71e04849f81e.png

      0f3ae168-f7ee-4d53-bbb9-268af7d916c0.png

  • kpartx -a /dev/DEVICE -f: force

删除分区操作的同步

  • 命令:partx -d -n M:N /dev/DEVICE

    • centos6 : –nr N-M

  • 命令:partprobe

    • CentOS 5,7:使用

    • partprobe用法:partprobe [/dev/DEVICE]

实验 dd

0扇区前512字节删除与恢复总结

扫描磁盘
echo "- - -" > /sys/class/scsi_host/host2/scan
lsblk 
ls /dev/sd

*查看分区
fdisk -l /dev/sda

查看mbr
hexdump  -C -n 512 /dev/sda

备份mbr
dd if=/dev/sda of=/testdir/mbrbak bs=1 count=512
hexdump  -C -v /testdir/mbrbak 
 
恢复mbr
dd if=/testdir/mbrbak  of=/dev/sdd 
fdisk /dev/sdd -l
lsblk
hexdump  -C -n 512 /dev/sdd

破坏boot loader
dd if=/dev/zero of=/dev/sdd bs=1 count=446
hexdump  -C -v -n 512 /dev/sdd

清除分区标识
dd if=/dev/zero of=/dev/sdd bs=1 count=2 skip=510 seek=510 
hexdump  -C -v -n 512 /dev/sddfdisk -l /dev/sdd

恢复分区标识
dd if=/testdir/mbrbak  of=/dev/sdd bs=1 count=2 skip=510 seek=510

恢复分区表
dd if=/dev/zero  of=/dev/sdd bs=1 count=64 skip=446  seek=446
hexdump  -C -v -n 512 /dev/sdd

原创文章,作者:m20-吴清玲,如若转载,请注明出处:http://www.178linux.com/42097

(0)
m20-吴清玲m20-吴清玲
上一篇 2016-09-01
下一篇 2016-09-01

相关推荐

  • N25_第十三周作业

    1、建立samba共享,共享目录为/data,要求:(描述完整的过程)  1)共享名为shared,工作组为magedu;  2)添加组develop,添加用户gentoo,centos和ubuntu,其中gentoo和centos以develop为附加组,ubuntu不属于develop组;密码均为用户名;  3)添加samb…

    Linux干货 2017-03-06
  • 了解sed

    本博客分为四个部分:sed介绍、sed用法、sed高级用法(简略带过)、相关例题。通过本文可以大致了解sed命令。深度可以当成是课前预习吧。 1、sed介绍Stream EDitor, 行编辑器 sed是一种流编辑器,它一次处理一行内容。处理时,把 当前处理的行存储在临时缓冲区中,称为“模式空间”( pattern space),接着用sed命令处理缓冲区中…

    Linux干货 2017-04-25
  • 排名三剑客的VIM _正确的打开姿势!

    vim程序编辑器        vi:是老式的文字处理器。     vi的使用:【vi分为3种模式一般模式、编辑模式、命令模式】         一般模式:   vi打开文件就直接进入到了一…

    Linux干货 2017-04-10
  • Trie树:应用于统计和排序

    1. 什么是trie树 1.Trie树 (特例结构树)         Trie树,又称单词查找树、字典树,是一种树形结构,是一种哈希树的变种,是一种用于快速检索的多叉树结构。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少…

    Linux干货 2015-04-08
  • linux磁盘管理及文件系统介绍

        硬盘是计算机必备组成部分,现在的硬盘分固态硬盘和传统机械硬盘,这里要介绍的是传统机械硬盘。     一.硬盘最基本结构         1.硬盘是由坚硬金属材料制成的涂以磁性介质的盘片,不同容量硬盘的盘片数不等。…

    Linux干货 2016-06-22
  • 初窥门径之脚本书写

    一、几个脚本的编写: 1、编写脚本/root/bin/systeminfo.sh,显示当前主机系统信息,包括主机名,IPv4地址,操作系统版本,内核版本,CPU型号,内存大小,硬盘大小。 #!/bin/bash echo "HOSTNAME: $HOSTNAME" echo "IPV4 A…

    Linux干货 2016-08-15