Linux 磁盘管理

2024/3/28 14:02:24

本文主要是介绍Linux 磁盘管理,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

硬盘分为 机械硬盘和固态硬盘两种。

机械硬盘(HDD):Hard Disk Drive,即是传统普通硬盘,主要由:盘片,磁头,盘片转轴及控制电机,磁头控制器,数据转换器,接口,缓存等几个部分组成。机械硬盘中所有的盘片都装在一个旋转轴上,每张盘片之间是平行的,在每个盘片的存储面上有一个磁头,磁头与盘片之间的距离比头发丝的直径还小,所有的磁头联在一个磁头控制器上,由磁头控制器负责各个磁头的运动。磁头可沿盘片的半径方向运动,加上盘片每分钟几千转的高速旋转,磁头就可以定位在盘片的指定位置上进行数据的读写操作。数据通过磁头由电磁流来改变极性方式被电磁流写到磁盘上,也可以通过相反方式读取。硬盘为精密设备,进入硬盘的空气必须过滤.

固态硬盘(SSD):Solid State Drive,用固态电子存储芯片阵列而制成的硬盘,由控制单元和存储单元(FLASH芯片、DRAM芯片)组成。固态硬盘在接口的规范和定义、功能及使用方法上与普通硬盘的完全相同,在产品外形和尺寸上也与普通硬盘一致.

创建设备文件 mknod 创建指定的设备类型,设备名及路径,主设备号及次设备号

mknod 的格式为:       mknod DEVNAME {b | c}  MAJOR  MINOR

DEVNAME是要创建的设备文件名,如果想将设备文件放在一个特定的文件夹下,就需要先用mkdir在dev目录下新建一个目录;

b和c 分别表示设备和字符设备:

b表示系统从块设备中读取数据的时候,直接从内存的buffer中读取数据,而不经过磁盘;

c表示字符设备文件与设备传送数据的时候是以字符的形式传送,一次传送一个字符,比如打印机、终端都是以字符的形式传送数据;

MAJOR和MINOR分别表示主设备号和次设备号:

为了管理设备,系统为每个设备分配一个编号,一个设备号由主设备号和次设备号组成。主设备号标示某一种类的设备,次设备号用来区分同一类型的设备。linux操作系统中为设备文件编号分配了32位无符号整数,其中前12位是主设备号,后20位为次设备号,所以在向系统申请设备文件时主设备号不好超过4095,次设备号不好超过2^20 -1。

#  mknod /app/sda b 8 0        

在app目录下创建一个名字为sda的块设备文件,主设备号为8,次设备号为0。

#  mknod /app/zhongduan1 c 4 1 

在app目录下创建一个名字为zhongduan1的字符设备文件

主设备号及次设备号完全一致的,被视为同一个设备。

各种时期的硬盘命名规则

centos5及之前

ide  /dev/hda     第一块

    /dev/hdb 第二块

    ...

    /dev/hdaa

sata的硬盘 sata/sas/scsi/usb    /dev/sda第一块 /dev/sdb  第二块

centos6及之后

sata/sas/scsi/usb/ide  /dev/sda

kvm虚拟机的虚拟硬盘   /dev/vda

xen虚拟机的虚拟硬盘   /dev/xvda

vmware的虚拟硬盘      /dev/sda

磁盘的三围  柱面,扇区,磁头  多个磁道合在一起叫柱面。 柱面,扇区,磁头和磁道是硬盘存储术语。计算硬盘的存储总数,需要硬盘三围,即柱面 磁头及扇区。

扇区,磁道(或柱面)和磁头数构成了硬盘结构的基本参数,用这些参数可以得到硬盘的容量

公式为:存储容量=磁头数×磁道(柱面)数×每道扇区数×每扇区字节数。举例:

   柱面     c:2^10=1024    

   磁头     h:2^8=256

   扇区     s:2^6=64

  一个扇区大小512byte,存储总量为256*64*1024*512/1024/1024/1024=8GB

1.磁道,扇区,柱面和磁头数

硬盘最基本的组成部分是由坚硬金属材料制成的涂以磁性介质的盘片,不同容量硬盘的盘片数不等。每个盘片有两面,都可记录信息。

扇区:盘片被分成许多扇形的区域,每个区域叫一个扇区,在DOS 中每扇区是128×2的2次方=512字节,

磁道:盘片表面上以盘片中心为圆心,不同半径的同心圆称为磁道。磁道与柱面都是表示不同半径的圆,

柱面:不同盘片相同半径 的磁道所组成的圆柱称为柱面。在许多场合,磁道和柱面可以互换使用。

磁头:每个磁盘有两个面,每个面都有一个磁头,习惯用磁头号来区分。

Image(1)

存储单位,从低到高 KB, MB, GB, TB, PB, EB, ZB, YB, BB, NB, DB

1   优化I/O性能                更好的读写速度。

2   实现磁盘空间配额限制      

3   提高修复速度             

4   隔离系统和程序            实现多系统,以及中病毒的恢复速度

5   安装多个OS(操作系统)

6   采用不同文件系统          网络共享限制单个用户的上传文件带下

分区的参数:

设备识别                     

设备分区                     

创建文件系统

标记文件系统

在/etc/fstab文件中创建条目

    挂载新的文件系统

分区的种类:MBR和GPT

        MBR:使用32位表示扇区数,单个分区不超过2T

在0磁道0扇区:512bytes上,叫做第一个扇区,叫主引导记录。由三部分组成:第一部分 boot loader 大约446字节作为启动系统来使用。

# hexdump -C -n 446 -v /dev/sda

查看整个硬盘前446个字节的内容

这446个位置如果丢失,系统将无法启动。

最多四个主分区   活动分区引导标志是80,非活动分区为00

1.BIOS basic input/output system(基本输入输出系统) 自检  

2.由第一启动项,引导OS(操作系统)         

3.MBR Master boot record 主引导记录,一共512个字节。

446 boot loader(每个操作系统都有自己的引导方式。)

16*4=64 分区     4个分区,每个分区占16个字节

55 AA  结束位  校验位,读到这个位置,就代表分区全部读完了。一共占2个字节。读到这里之后,没出问题就开始进入系统。

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

查看整个硬盘前512个字节的内容,结束位置是 55 AA,起始值为80.80到55 AA之间共计64个字节,每16个字节代表一个分区,剩余的446个字节,就是主引导记录了.如下图所示:

Image

分区的16个字节(1-16来表示),每个位置代表:

1 引导标志,值为80表示活动分区.值为00代表非活动.

2 磁头号,是那个磁头,定位了那个面.这个分区从那个面开始.占一个字节共八位.

3 扇区号 第三字节低六位.

4 柱面号 第三字节高二位+第四字节 柱面号为10位.第四个字节(八位)加上第三个的二位,共计10位.磁头号,扇区号,柱面号(2,3,4)共同表示这个磁盘分区的起点.共占用了3个字节又24位.最大可以表示2的24次方个扇区,每个扇区是2^9字节.2^24字节*2^9字节/2^30字节=8GB

5 第五个字节表示,分区的类型.83代表linux的正常分区.05表示扩展分区,82表示交换分区.

6 磁头号,表示chs分区结束的位置.

7 扇区号,第七字节低六位.

8 柱面号,第七字节高二位+第八字节(6,7,8)共计24位,占了三个字节表示这个磁盘分区的终点

前8个字节表示的是最大寻址为8GB的方法。

后面的8个字节.前四个字节表示磁盘分区的起点,后四个字节表示磁盘分区的终点.共计2的32次方个扇区。

如果要分5个以上的分区,就要用扩展分区(最后一个主分区,集合了逻辑分区,特殊的主分区)。里面建立逻辑分区。逻辑分区像主分区一样建立主引导记录,并将第一个扇区拿来做引导,叫EBR

但是逻辑分区的引导不用启动系统,所以它前446位的值为空。中间的64位用来表示分区,同样是4个,第一个分区表项指向逻辑分区1,其中的组成结构同MBR。第二个分区指向下一个扩展分区的EBR,后两个暂时不用。最后两位表示结束,值同样为 55 AA。

MBR分区结构

硬盘主引导记录MBR由4个部分组成

主引导程序(偏移地址0000H--0088H),它负责从活动分区中装载,并运行系统引导程序。

出错信息数据区,偏移地址0089H--00E1H为出错信息,00E2H--01BDH全为0字节。

分区表(DPT,Disk Partition Table)含4个分区项,偏移地址01BEH--01FDH,每个分区表项长16个字节,共64字节为分区项1、分区项2、分区项3、分区项4

结束标志字,偏移地址01FE--01FF的2个字节值为结束标志55AA

MBR的分区方式,最大只能寻找2TB的地址。所以,有了新的分区方式,GPT

GPT:GUID(Globals Unique Identifiers) partition table 支持128个分区,使用64位,支持8Z

( 512Byte/block )64Z ( 4096Byte/block)

使用128位UUID(Universally Unique Identifier) 表示磁盘和分区 GPT分区表自动备份在头和尾

两份,并有CRC校验位

主板只能用UEFI (统一扩展固件接口)硬件支持GPT,使操作系统启动,不能使用BIOS来启动系统了。

GPT的分区

第一格为保护MBR,避免老的分区工具不认识,导致数据丢失,所以把511和512两个字节上的值设为55 AA。表示结束。

前面的值都为空。接下来是GUID的起始LBA1,然后1---4的分区位置LBA2,5---8的分区位置LBA3,直到123--128LBA33,

每四个分为一组,然后从第LBA34组开始,写第一个分区的数据,依次类推。直到128个分区数据写完之后,又开始备份

的分区表,直至结束的头。

UEFI运行流程

开机----UEFI初始化----引导操作系统----进入系统

    dd命令

    skip=xxx 是在备份时对if后面的部分也就是原文件跳过多少块

    seek=xxx 是在备份时对of后面的部分也就是目标文件跳过多少块开始写

实验一:备份mbr,并破坏,再恢复

    1.备份mbr

	dd if=/dev/sda of=/app/mbr.img bs=1 count=512

    2.将mbr.img 复制到其他主机 sz /app/mbr.img

    3.破坏mbr

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

    4.关机

    5.在另一个主机上将被破坏的硬盘添加

    6.在vmware虚拟机,新加硬盘不用重启的生效方法

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

    7.恢复

    dd if=mbr.img of=/dev/sdb

    8.poweroff

    9.开启被恢复的主机

    10.从恢复机中删除故障硬盘.

实验二:仅破坏分区表,并恢复.

方法一:

dd if=/dev/zero of=/dev/sda bs=1 count=64 seek=446

方法二:

dd if=/app/mbr.img of=/dev/sda bs=1 count=64 skip=446 seek=446

parted 支持msdos和gpt

   交互和非交互

   parted /dev/sda

   parted -l 列出所有硬盘的分区信息

   parted /dev/sda print 列出指定硬盘的分区

   parted /dev/sdb mklabel msdos 设置硬盘的分区类型或gpt

   parted /dev/sdb mklabel msdos -s 自动回答yes

   parted /dev/sdb mkpart primary 1 2G

   parted /dev/sdb mkpart primary 2G 4G

   parted /dev/sdb mkpart primary 4G 6.5G

   parted /dev/sdb mkpart extended 6.5G 21.5G

   parted /dev/sdb mkpart logical 6.5G 7G

fdisk

支持msdos,在centos7中也支持gpt(不建议使用)

   fdisk -l 查看所有硬盘的分区信息

   fdisk -l /dev/sda 查看指定硬盘的分区信息

   fdisk /dev/sdb

       o 设置msdos分区表

       g 设置gpt分区表(不建议使用)

       m 帮助

       n 创建分区

       p 主分区

       e 扩展分区 (请把所有空间分给扩展)

              起始的扇区数 一般直接回车,取可用的最小扇区

              结束的扇区数 一般用+XX K/M/G 来指定具体分多少大小的分区

       q 退出不保存

       w 退出并保存

       t 设置分区的类型

       L 查看分区的类型所对应的代码表示方式

       d 删除指定分区

       a 设置该分区为启动分区,或设置为非启动

       p 显示分区表

       u 更新显示分区起止的单位,在扇区和柱面之间切换

非交互方式 分区

echo -e "n\np\n\n\n+1G\nw\n" |fdisk /dev/sdb &> /dev/null

gdisk 

只能划分gpt分区

   gdisk -l 列出所有硬盘分区表

   gdisk -l /dev/sdb 列出指定硬盘的分区表

   gdisk /dev/sdb 对分区进行划分

   o 创建gpt分区表

   m 帮助

   n 创建分区

          起始的扇区数 一般直接回车,取可用的最小扇区

          结束的扇区数 一般用+XX K/M/G 来指定具体分多少大小的分区

   q 退出不保存

   w 退出并保存

   t 设置分区的类型

   L 查看分区的类型所对应的代码表示方式

   d 删除指定分区

   p 显示分区表

非交互方式

echo -e "n\n\n\n+2G\n\nw\ny\n" |gdisk /dev/sdb

cat /proc/partitions 当前内核所加载的分区表

lsblk

对于非系统所在硬盘,内核自动更新分区表,而对于系统所在硬盘,不能直接列新,要使用以下命令

   通知内核读取分区表

   cenots5\centos7: partprobe (centos6不可用)

   centos6:partx -a /dev/sda  添加

   partx -d --nr /dev/sda7 删除



这篇关于Linux 磁盘管理的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程