磁盘设备
一切皆文件
所有的Linux中的设备都可以使用下面命令进行操作:open(), read(), write(), close()(这些是C的函数)
-
块设备:随机访问
-
字符设备:线性访问
设备号码:
-
主设备号: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
固态硬盘:内部构建和机械硬盘完全不一样。
机械硬盘组成
单位 | 分配字节/每磁面 | 最大数量 |
---|---|---|
磁头(head) | 8 | 256 |
磁道(tarck) | 10 | 1024 |
扇区(sector ) | 6 | 63(512byte/每个) |
每个柱面的数据量=磁道的数据量∗盘面数(=磁头数)每个柱面的数据量=磁道的数据量∗盘面数(=磁头数)
磁道的数据量=柱面扇区数量∗每个扇面的数据量=512∗63磁道的数据量=柱面扇区数量∗每个扇面的数据量=512∗63
每个柱面的数据量=柱面扇区数量∗每个扇面的数据量∗盘面数=512∗63∗256=8M每个柱面的数据量=柱面扇区数量∗每个扇面的数据量∗盘面数=512∗63∗256=8M
寻址方式
CHS寻址: cylinder(柱面)Head Sector<-----------老式的寻址方式 LBA寻址:开始可以最小单位为扇区(Centos6开始使用)
-
早期系统中,CHS按照柱面分配时,不允许一个柱面分给多个分区,现在只会给出提醒警告
-
分配从柱面1开始分配,柱面0存放了开机引导和分配表等信息。
-
centos6开始支持LBA了,fdisk默认显示以柱面为单位,-u参数帮助fdisk以扇区为单位显示
-
centos7开始,才“默认”LBA,默认就是以扇区为显示单位
但是如果想用柱面为单位,可以在fdisk中使用 -u=cylinders
给服务器添加硬盘
-
将硬盘添加到服务器上之后,使用下面命令进行扫描,就可以在系统中看到,硬盘已经添加成功了。
echo “- - -” > /sys/class/scsi_host/host2/scan //这里有三个,host0,host1,host2,如果一个不成功,可以试试用其他的。
-
lsblk是用来列出在内存中有的块设备文件的。
分区
为什么创建分区
-
更高效
比如数据库或者是日志,或者是操作系统。
由于他们的存放特性是不一样的,尤其是数据库和日志的存放。
就需要不同的文件系统,希望能够使用不同的文件结构来存放他们,以便更高效。
-
防破坏:防止“所有”内容被破坏
-
减少磁盘修复难度和时间
-
磁盘配额
分区方式
-
分区方式和磁盘寻址方式之间存在密切联系。
-
由于centos6和7之间,寻址方式的改变,他们的默认分区方式也有变化。
-
分区有两种:MBR和GPT
-
windows中的分区方式也分为这两种,如图:
MBR
MBR介绍
-
MBR:Master Boot Record,使用32位表示扇区数,分区不超过2T
-
如何分区:按柱面
-
分区信息:存放在0磁道0扇区,一共512bytes
-
前446bytes:boot loader
-
后64bytes:分区表
-
16bytes:标识一个分区
-
将前446个字节,给擦除,擦除后,只要后面分区表的64位字节,还在,就还可以使用。
-
最后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命令恢复
– 实验:如果没有最后的“55AA”
– 破坏最后两位
– 之后,可以看到,和没有分区是一样的效果
MBR分区结构
-
4个主分区;3主分区+1扩展(N个逻辑分区)
-
MBR分区结构图
-
主分区
-
活动分区:系统开机后,会到那里找分区信息
-
扩展分区&逻辑分区
-
扩展分区有自己的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
-
UEFI (统一扩展固件接口)硬件支持GPT,使操作系统启动,否则即使配置成功,也无法使用。
-
会自动备份超级快内容
GPT分区结构
-
GPT分区结构图
-
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
创建分区
fdisk
-
创建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)
-
Disk label type(fdisk -l)
[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)
-
新建分区可以跳着分:
[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存储方式有关系,也说明,扩展分区的分区名,并不是存储在扩展分区中的,可能是存储在前面的主分区中的。)
-
设备名与UUID之间,在写脚本的时候,最好使用UUID,因为UUID不会重复。设备名,在写脚本的时候最好备用,如上,如果删除了逻辑分区5之后,6会自动覆盖为逻辑分区5。如果脚本中使用逻辑分区5这个设备名,就会导致错误。
-
分区如果不连续,会报warning出来。
-
使用命令操作分区的时候,分区不要写成: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(指定同步到内存中的添加的设备名),并不好用
-
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