引言

为什么要把硬盘分区?
1、维护相关:如可以把相同类型,有共同安全需要的内容,放到不同的分区中,这样方便了维护。
2、效率因素:如果一个大的硬盘,在整个硬盘上找到相应的资料,很费时。
3、硬盘限额:限额的控制,只能对分区来实施。
4、备份资料:这个和第一个控制有一点雷同,我可以对重要的信息放到某个分区,方便备份。
5、安全考虑:如果大的硬盘,一但有损坏的话,就有可能导致整个硬盘资料丢失,如果把硬盘的资料分开来存放的话,损失会很小。
你可以把这个磁盘想像成您家的房子,而分区就相当于房子里面的房间一样。
为什么要对分区进行格式化?
格式化就是对分区进行初始化的一种操作,为了让我们能向分区中写入数据。如果你看过 一天一点学习Linux之认识文件系统 的话,那么就你会明白格式化操作其实就是创建分区的Inode/ block/super block/group block等等信息。

第一部分:磁盘的分区

下面我们就用虚拟机来实验 RHEL6上的硬盘分区与格式化
在虚拟机上增加一块硬盘
我以VMware workstation为例,演示如何给 RHEL6系统上增加一块SCSI硬盘,并设置大小写为20G。
关机状态下:在VMware Workstation的工具栏中选择VM——Settings——Hardware——Add——选择Hard Disk——Next——Create a virtual disk——Next——SCSI(Recommended)——Next——Maximum disk size(GB):20.0——Next——Finish
这样就就为你的系统增加了一块20G的SCSI的硬盘了,然后启动系统,下面就开始今天的分区操作了。
对硬盘进行分区操作
分区
分区
[root@yufei ~]# fdisk -l
显示出系统中所有的硬盘信息
[root@yufei ~]# fdisk -l
Disk /dev/sda: 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: 0x00093fdc
#设备名 是否是启动设备 开始柱面    结果柱面 大小1K为单位 分区类型标识 分区的系统类型
Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1        1913    15360000   83  Linux
/dev/sda2            1913        1978      524288   82  Linux swap / Solaris
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    #硬盘的IO情况
Disk identifier: 0x00000000                        ##磁盘的标识
Disk /dev/sdb doesn't contain a valid partition table
这里面会显示磁盘的空间大小以及磁头、扇区、柱面的数量。如果没有分区的磁盘,他会给有相应的提示“Disk /dev/sdb doesn’t contain a valid partition table”。这就是我们要对其分区的磁盘sdb。
[root@yufei ~]# fdisk /dev/sdb
显示fdisk的帮助信息
Command (m for help):m #显示帮助信息
Command action
a   toggle a bootable flag
b   edit bsd disklabel
c   toggle the dos compatibility flag
d   delete a partition    #删除一个分区
l   list known partition types    #列出分区类型
m   print this menu
n   add a new partition    #增加一个新的分区
o   create a new empty DOS partition table
p   print the partition table    #打印出分区表
q   quit without saving changes    #不保存退出
s   create a new empty Sun disklabel
t   change a partition's system id    #改变分区类型
u   change display/entry units
v   verify the partition table    #校验分区表
w   write table to disk and exit    #保存分区表
x   extra functionality (experts only)
新增分区
Command (m for help): n
Command action
e   extended    #扩展分区
p   primary partition (1-4) #主分区
由于硬盘的设计原因,我们的主分区表最多是4个。至于为什么会是这样,请大家参考:带您深入了解硬盘分区表http://www.opsers.org/base/take-you-in-depth-understanding-of-the-hard-disk-partition-table.html。如果想更详细了解的话,请观看我以前的视频内容:Linux分区与格式化及文件系统优化http://www.opsers.org/videos/chapter-x-linux-partition-and-format-and-file-system-optimization.html
p
Partition number (1-4): 1            #分区号
First cylinder (1-2610, default 1): #柱面默认是1,直接回车
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-2610, default 2610):+1G     #设置结束柱面或者用分区的大小(+K、M、G)来让系统自动计算结束柱面 然后回车
列出分区信息
Command (m for help): p        #列出刚才的分区信息
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: 0xd6737273
Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1         132     1060258+  83  Linux
Command (m for help): n
Command action
e   extended
p   primary partition (1-4)
p
Partition number (1-4): 2
First cylinder (133-2610, default 133):
Using default value 133
Last cylinder, +cylinders or +size{K,M,G} (133-2610, default 2610): +50 #在原来的基础上加上50个柱面
Command (m for help): p
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: 0xd6737273
Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1         132     1060258+  83  Linux
/dev/sdb2             133         183      409657+  83  Linux
新增加扩展分区
Command (m for help): n
Command action
e   extended
p   primary partition (1-4)
e        #我们来分扩展分区
Partition number (1-4): 3        #扩展分区的分区号是3,当然也可以是4,但不可能是大于4的。
First cylinder (184-2610, default 184): #扩展分区的起始柱面
Using default value 184
Last cylinder, +cylinders or +size{K,M,G} (184-2610, default 2610): #扩展分区的结束柱面,默认就是全部划分给扩展分区了
Using default value 2610
Command (m for help): p
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: 0xd6737273
Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1         132     1060258+  83  Linux
/dev/sdb2             133         183      409657+  83  Linux
/dev/sdb3             184        2610    19494877+   5  Extended    #注意这里的类型已经和上面的不一样了
增加逻辑分区
Command (m for help): n
Command action
l   logical (5 or over)            #这时候就和上面的不一样了,因为在扩展分区中再分的话,就是逻辑分区了,必需是5以上
p   primary partition (1-4)    #因为我们还可以分一个主分区出来,所以这里会显示这样的信息。当然,因为我们已经把硬盘所有我空间全分给了扩展分区,所以,我们分不出那个主分区了。
l
First cylinder (184-2610, default 184):
Using default value 184
Last cylinder, +cylinders or +size{K,M,G} (184-2610, default 2610): +2G
Command (m for help): P
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: 0xd6737273
Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1         132     1060258+  83  Linux
/dev/sdb2             133         183      409657+  83  Linux
/dev/sdb3             184        2610    19494877+   5  Extended
/dev/sdb5             184         445     2104483+  83  Linux        #这个分区就是逻辑分区了,我是怎么看出来的呢?关键是你要注意两点:1是分区号。这里是sdb5。2是分区的开始柱面是从184开始的,而我们的扩展分区也是从184开始的,可以肯定是在扩展分区里面分出来的分区,那当然是逻辑分区啊
增加SWAP分区
下面我们再分一个512M的分区出来,为了我们后面的课程讲解。这个分区我们后面会用他当作SWAP分区。
Command (m for help): n
Command action
l   logical (5 or over)
p   primary partition (1-4)
l
First cylinder (446-2610, default 446):
Using default value 446
Last cylinder, +cylinders or +size{K,M,G} (446-2610, default 2610): +512M
Command (m for help): p
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: 0xd6737273
Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1         132     1060258+  83  Linux
/dev/sdb2             133         183      409657+  83  Linux
/dev/sdb3             184        2610    19494877+   5  Extended
/dev/sdb5             184         445     2104483+  83  Linux
/dev/sdb6             446         511      530113+  83  Linux
我们下面来个错误的演示
Command (m for help): n
Command action
l   logical (5 or over)
p   primary partition (1-4)
p
Selected partition 4
No free sectors available
因为已经没有剩余的扇区了,所以肯定是分不了主分区了。
转换分区类型
Command (m for help): l #这个是L的小写,不是1啊!就是列出分区的类型,因为很多,所以我就找几个出来
82  Linux swap /    #这个就是SWAP分区代码了
83  Linux             #这个就是Linux系统的分区代码了
8e  Linux LVM         #LVM分区的代码
Command (m for help): t        #转换分区类型
Partition number (1-6): 6    #选择转换的分区号
Hex code (type L to list codes): 82    #转换成的类型
Changed system type of partition 6 to 82 (Linux swap / Solaris)    #提示内容
Command (m for help): p
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: 0xd6737273
Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1         132     1060258+  83  Linux
/dev/sdb2             133         183      409657+  83  Linux
/dev/sdb3             184        2610    19494877+   5  Extended
/dev/sdb5             184         445     2104483+  83  Linux
/dev/sdb6             446         511      530113+  82  Linux swap / Solaris
我们就先分这么多出来,当然这个磁盘还有很多空间,因为这只是演示,所以无需全部来分完。下面就是重要一个环节,保存我们分好的分区表,如果不保存,那么我们刚才的功劳,等于没有做。
保存分区表
Command (m for help): w    #保存分区表
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
注意,如果出现
The kernel still uses the old table.
The new table will be used at the next reboot.
这样的提示的话,他的意思就是让我们重新启动系统,好让内核认出我们新的分区表,为了不让系统重新启动,我们可以用
partprobe
这个命令,来让内核重新获得一次分区表的信息。
这时候我们再用
[root@yufei ~]# 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: 0xd6737273
Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1         132     1060258+  83  Linux
/dev/sdb2             133         183      409657+  83  Linux
/dev/sdb3             184        2610    19494877+   5  Extended
/dev/sdb5             184         445     2104483+  83  Linux
/dev/sdb6             446         511      530113+  82  Linux swap / Solaris
如果说,你在分区的时候,哪里出现了错误,或者是不想那么操作的话,按q退出,然后重新来过即可。千万在确保正确后再用w保存哦,如果你分错了硬盘的话,那么数据就OVER了!!
这个分区其实很简单,关键是多操作几次,熟练后就很容易了!
注意:SATA 硬盘最多能够支持到15个分区, IDE 则可以支持到63个。如果超过了这个限制,那么你的硬盘多余的空间也就浪费。

第二部分:格式化

分区完,我们的这块硬盘还是不能使用的,需要对分区进行格式化,让其变成系统认识的分区。关于格式化的原理,大家可以参考: Linux分区与格式化及文件系统优化这里我就不多说了,下面进行格式化的操作。
格式化
下面我们以第一个分区为列来讲解如何对分区进行格式化
先查看我们要进行格式化的磁盘分区情况
[root@yufei ~]# fdisk -l /dev/sdb
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: 0xd6737273
Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1         132     1060258+  83  Linux
/dev/sdb2             133         183      409657+  83  Linux
/dev/sdb3             184        2610    19494877+   5  Extended
/dev/sdb5             184         445     2104483+  83  Linux
/dev/sdb6             446         511      530113+  82  Linux swap / Solaris
再来认识一下格式化的工具
mkfs [-t 文件系统格式] 设备名
或者是
mkfs.文件系统格式 设备名
用mkfs[tab][tab]就可以显示出系统所有支持的格式了
这个里面有很多的参数,可以用–hlep来查看
[root@yufei ~]# mkfs.ext4 --hlep
mkfs.ext4: invalid option -- '-'
Usage: mkfs.ext4 [-c|-l filename] [-b block-size] [-f fragment-size]
[-i bytes-per-inode] [-I inode-size] [-J journal-options]
[-G meta group size] [-N number-of-inodes]
[-m reserved-blocks-percentage] [-o creator-os]
[-g blocks-per-group] [-L volume-label] [-M last-mounted-directory]
[-O feature[,...]] [-r fs-revision] [-E extended-option[,...]]
[-T fs-type] [-U UUID] [-jnqvFKSV] device [blocks-count]
-b 指定block的大小 1024 2048 4096 默认是4096
-I 指定inode的大小(min 128/max 4096) 默认是256
-i 指定多少个字节分配一个inode
-L 指定卷标
分区演示
[root@yufei ~]# mkfs.ext4 -L opsers_tech -b 2048 -i 10240 /dev/sdb1
mke2fs 1.41.12 (17-May-2010)
Filesystem label=opsers_tech
OS type: Linux
Block size=2048 (log=1)
Fragment size=2048 (log=1)
Stride=0 blocks, Stripe width=0 blocks
106128 inodes, 530128 blocks
26506 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=537919488
33 block groups
16384 blocks per group, 16384 fragments per group
3216 inodes per group
Superblock backups stored on blocks:
16384, 49152, 81920, 114688, 147456, 409600, 442368
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 32 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
因为我的分区很小,所以格式化是很快的,如果分区很大的话,这个也是要消耗一些时间的。大家可以用默认格式化与自定义格式化来进行对比。
希望大家和其他三篇文章结合起来看,我相信这三篇文章,应该能彻底的让你了解并掌握磁盘的分区、格式化原理与优化了。
注意:如果你遇到了这样的提示
/dev/sdx:No  such  file or directory     //找不到该分区,无法格式化
那么和我们上面的是一样的原因,就是内核无法读到新的分区表。解决方法有两个
1.重启系统。系统重新启动的时候会重新加载分区表,新的分区自然也就生效了。
2.为了节省时间或者系统环境不允许重启,使用partprobe命令,在不重启情况下重新加载分区表。
[root@yufei ~]# partprobe               //重新加载所有硬盘的分区表
[root@yufei ~]# partprobe   /dev/sdb      //只重新加载第一块硬盘的分区表
如果没有那个命令的话,那就安装
rpm -q parted