linux下的磁盘管理

1.磁盘管理

磁盘是我们日常生活中最主要的存储介质,在工业领域同样有着大量的使用,对于一块硬盘,我们并不能直接读取上面的数据,因为磁盘上的是二进制数据,有磁性代表着1,没磁性代表着0,读取数据是计算机操作系统帮我们做的,那么计算机是如何读取磁盘上的数据呢?
计算机通过磁头检查磁盘上有没有磁性来读取数据,磁盘有着3组重要的数据,即是柱面号,盘片号(也可以称作磁头号),扇区号,通过这3组数据我们就能够在磁盘上定位扇区,系统通过其他操作可以找到具体存在该扇区的数据。
磁盘的最小模块称作块,即blank,所以我们将一切以块为最小模块的设备称为块设备。
1.分区表结构
一块硬盘上至少会有一个分区,我们可以通过下面的命令查看当前的分区表结构:

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

-C表示使用16进制显示,-n表示显示前多少字节,由于分区表结构存储在前512字节,所有我们只需要查看前512 字节,-v不忽略0,如果不加-v,会把分区表中的结构中的0忽略不现实。我当前的分区表结构如下图:
linux下的磁盘管理
在前512字节中,又可以分为三个部分,其中0-446字节代表的是系统启动时的引导启动程序,第447到第510字节存储的是真正的分区表结构,第511和第512字节的55aa代表的是结束标志。
在第447到510字节,一共有64字节,对于MBR分区表结构来说,这64字节一共分为4部分,每一部分都是一张分区表,每一部分16字节,第一字节是80或者00,80代表活动分区,00代表非活动分区, MBR分区表结构采用的是CHS寻址方式,所以第二到第四字节代表的是该分区开始的磁头号,扇区号,柱面号,其中第二字节8位表示磁头号,第三字节低6位代表的是扇区号,第三字节的高两位与第四字节的8位一共10位代表柱面数,第五字节表示分区类型,如果是0表示未被占用,我们可以用下面的命令查看所有的分区表类型

fdisk /dev/sda
L/l

L或者l都可以查看到所有的分区表类型,然后接下来的三字节代表的是该分区表的结束的磁头号,扇区号,柱面数,第6字节表示结束磁头号,第七字节低六位表示扇区号,高两位以及第八字节表示结束的柱面号,采用这种CHS寻址方式,最大寻址空间只有8G,采用24位寻址,即是有2^24个扇区,每个扇区512B,即2^9B,得出一共2^33B,即是8G,但是大多数的硬盘大小都是大于8G的,这种时候就只能采用LBA寻址方式了,LBA采用48位寻址,最大寻址空间128PB,即为2^48*2^9B,得出结果即为128PB。而分区表的后8字节采用的即是LBA寻址方式,前4字节代表起始位,后4字节代表结束位,采用32位寻址方式,寻址范围为2T,所有MBR分区表结构的最大分区大小为2T,如果超过2T,就只能采用GPT分区表结构了。
但是64位只能有4个分区,这在实际使用中是不够的,这时候就需要扩展分区,扩展分区需要牺牲一个主分区来标识扩展分区,指向第一个扩展分区,扩展分区同样有一张分区表结构,同样是512字节,不过前446字节全为0,最后两字节仍然是55aa代表分区表结束,中间64字节,同样分为4个16字节,第一个16字节与主分区的16字节完全相同,第二个16字节则指向下一个扩展分区表,后两个16字节暂时未被使用,这样我们可以创建任意多个分区。
至于GPT分区表结构,暂时不学习。
2.分区管理
我们可以使用lsblk列出当前所有的块设备,例如:

lsblk

linux下的磁盘管理
创建分区可以使用三个命令,分别是fdisk,parted,gdisk。
fdisk
可以使用fdisk命令查看分区。

fdisk -l

列出当前硬盘中的所有分区表信息,如
linux下的磁盘管理

fdisk -l /dev/sda

列出/dev/sda的分区表,如
linux下的磁盘管理
可以使用fdisk命令来管理分区,如

fdisk /dev/sda

linux下的磁盘管理
使用上面的命令后,会脱离当前shell,进入管理分区表的界面,这里有一些子命令:
p,查看当前分区列表,如:
linux下的磁盘管理
o,创建新的分区表结构,分区表结构为,msdos,即为MBR分区表结构,在这之前我们添加一块硬盘,并使其生效,生效的命令如下:

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

然后用o创建新的分区表结构,如下
linux下的磁盘管理
t,更改分区类型,如:
linux下的磁盘管理
n,创建新的分区,如:
linux下的磁盘管理
p代表的是创建主分区,e代表的是扩展分区,然后输入分区号,和分区开始柱面和分区大小,可以是结束柱面号,也可以是+分区大小,单位是K,M,G
可以用p查看一下,例如:
linux下的磁盘管理
d,删除分区,如:
linux下的磁盘管理
w,保存分区并退出,如
当我们创建一张分区表后,可以在管理页面用p查看到该分区表的信息,但是如果脱离当前页面就不会生效,我们可以用w使其生效,例如:
w前
linux下的磁盘管理
保存
linux下的磁盘管理
w后
linux下的磁盘管理

q,不保存退出

分区创建后,可以用下面的命令查看内核是否已经识别到新的分区表,例如:

cat /etc/partations

linux下的磁盘管理
可以看到新的分区sdb1已经被内核识别到,但当我们对系统盘新加一个分区时,情况就会不一样,例如:
新建一个分区sda6:
linux下的磁盘管理
使用上面命令查看是否被内核识别到:
linux下的磁盘管理
我们可以发现并没有sda6,这是因为系统盘中的操作系统已经被读取,不会再次被内核重新读取,下次重启生效,使其立即生效的方法如下:

partprobe /dev/sda

这条命令在centos7,以及6之前的系统都是可用的,但6是不可用的,在centos6中可以使用下面的这条命令:

partx -a /dev/sda

然后用之前的命令查看:
linux下的磁盘管理
gdisk
gdisk命令和fdisk命令相似,只不过创建的是gpt分区,使用的依然是msdos分区表结构,例如:
linux下的磁盘管理
parted

parted -l

列出分区信息:
linux下的磁盘管理

parted /dev/sda print

列出指定分区的信息,例如:
linux下的磁盘管理
可以用下面的命令创建分区

parted /dev/sdb mkpart primary 1 2G

1代表从第一个字节开始,2G代表大小为2G
parted是实时生效的,所有在使用过程中小心使用。

猜你喜欢

转载自blog.51cto.com/13412442/2159081