交互式fdisk分区工具 VS 非交互式parted分区工具

linux中磁盘资源是如何管理?

在windows系统中,我们对磁盘管理或是分区,C盘D盘E盘,打开"磁盘管理器",以设备的形式管理.
而linux哲学"一切皆文本"的思想,无论是设备也好,在linux中都是以文件的形式,来管理磁盘资源的.

设备文件,用于关联至一个设备驱动程序,能够跟与之对应设备产生关联,与硬件设备进行交互使用.

每个设备都有,设备号,用于内核标识识别设备:
主设备号:用于标识设备类型
次设备号:用于标识同一设备类型下的不同设备

[root ~]#ls /dev/sd*
/dev/sda  /dev/sda1  /dev/sda2  /dev/sdb

磁盘有哪些类型?

磁盘接口分类:

并行
IDE: 133MB/s
SCSI: 640MB/s
串口
SATA: 6Gbps
SAS: 6Gbps
USB: 480MB/s

描述机械式磁盘的参数:rpm: rotations per minute 转速(转/分钟)

磁盘设备的设备文件怎样命名?

设备文件的命名一般格式:/dev/DEV_FILE
IDE: /dev/hd (centos6,7不在区分hd和sd统称为sd)
SCSI, SATA, SAS, USB: /dev/sd

一般情况下内核识别到设备后自动为其命名.

[root ~]#ll /dev/sd*
brw-rw----.   1    root disk    8,     0      Apr 27 01:40 /dev/sda
设备 权限  硬链接数 属主  属组 主设备号 次设备号   修改时间     设备名;

如何自行创建设备文件?

mknod [OPTION] NAME TYPE [MAJOR MINOR]
mknod       设备文件  类型 主设备号 次设备号
mknod       /dev/sde  b     8        92
[root ~]#ll /dev/sde
brw-r--r--. 1 root root 8, 92 Apr 27 03:35 /dev/sde
创建成功

分区有哪些优点?

1.优化分区可提升磁盘I/O性能
2.可以对分区进行配置磁盘配额,便于磁盘资源的合理化利用
3.提高文件系统的修复速度
4.有效的隔离系统与应用程序,使得程序运行在与系统不同的分区
5.可以在不同的分区上安装不同的操作系统
6.在不同的分区上格式化为不同文件系统
...

分区有哪些类型?

分区类型:MBR,GPT

MBR:master boot record,32位表示扇区数分区不超过2T

MBR的结构:位于磁盘的零磁道零扇区,512Bytes,

    446Bytes:boot loader

    64Bytes:磁盘分区表,每个分区16Bytes 一般4个扇区,3个主扇区一个扩展扇区,扩展分区中可分多个逻辑分区

    2Bytes:魔数,磁盘分区表有效性的校验,16进制:55aa

GPT:GUID Partition Table (即GUID分区表)

    源自EFI标准的一种较新的磁盘分区表结构的标准,将成为磁盘分区将来的主流形式。

与MBR分区方式相比,具有以下优点。

    突破MBR,4个主分区限制,每个磁盘最多支持128个分区。 支持大于2T的分区,最大卷可达18EB

如何查看内核已经识别到哪些磁盘设备?

lsblk [options] device...

常用选项:

-f 显示文件系统及uuid等信息
-p 显示设备的全路径
-s 显示磁盘的分区及挂载

[root ~]#lsblk -s
NAME                     MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0                       11:0    1  3.7G  0 rom  
sda1                       8:1    0    1G  0 part /boot
└─sda                      8:0    0   20G  0 disk

如何进行分区?交互式fdisk工具 VS 非交互式parted工具

针对MBR和GPT类型的分区,有不同的交互式分区工具

fdisk工具:擅长MBR格式的分区

fdisk  [option] [device...]
常用选项:
    -l <device>:列出磁盘分区信息列表

交互式用法:

fdisk <device>    #进入交互式模式,有许多的子命令
    m  查看所有支持的子命令
    n  添加一个分区
    d  删除分区
    l  列出所有磁盘可支持分区类型
    o  创建一个空的dos分区类型
    p  显示磁盘分区表
    w  将磁盘分区表写入磁盘,并退出分区工具
    q  退出分区工具

实例演示:

[root ~]#fdisk /dev/sdc
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
...
Command (m for help):m  #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     #子命令n创建一个新的分区
Command action
   e   extended             #提示需要选择主分区还是扩展分区
   p   primary partition (1-4)  #主分区最多4个,扩展分区只可创建一个
p      #我这里选择主分区,如果分4个主分区,将无法创建扩展分区
Partition number (1-4): 1       #指定分区编号
First cylinder (1-2610, default 1):    #起始柱面,按照柱面划分一个柱面8M
Using default value 1                  #提示不指定则使用默认值
Last cylinder, +cylinders or +size{K,M,G} (1-2610, default 2610): +2G 
                  #指定结束柱面,可用+size{K,M,G}.我这里+2G直接指定2G容量

修改分区的标签,以标明不同的分区类型便于管理磁盘资源

Command (m for help): t
Selected partition 1
Hex code (type L to list codes): l   #l命令显示分区标签编号

 0  Empty           24  NEC DOS         81  Minix / old Lin bf  Solaris        
 1  FAT12           39  Plan 9          82  Linux swap / So c1  DRDOS/sec (FAT-
 2  XENIX root      3c  PartitionMagic  83  Linux           c4  DRDOS/sec (FAT-
 3  XENIX usr       40  Venix 80286     84  OS/2 hidden C:  c6  DRDOS/sec (FAT-
 4  FAT16 <32M      41  PPC PReP Boot   85  Linux extended  c7  Syrinx         
 5  Extended        42  SFS             86  NTFS volume set da  Non-FS data    
 6  FAT16           4d  QNX4.x          87  NTFS volume set db  CP/M / CTOS / .
 7  HPFS/NTFS       4e  QNX4.x 2nd part 88  Linux plaintext de  Dell Utility   
 8  AIX             4f  QNX4.x 3rd part 8e  Linux LVM       df  BootIt         
 9  AIX bootable    50  OnTrack DM      93  Amoeba          e1  DOS access     
 a  OS/2 Boot Manag 51  OnTrack DM6 Aux 94  Amoeba BBT      e3  DOS R/O        
 b  W95 FAT32       52  CP/M            9f  BSD/OS          e4  SpeedStor      
 c  W95 FAT32 (LBA) 53  OnTrack DM6 Aux a0  IBM Thinkpad hi eb  BeOS fs        
 e  W95 FAT16 (LBA) 54  OnTrackDM6      a5  FreeBSD         ee  GPT            
 f  W95 Ext'd (LBA) 55  EZ-Drive        a6  OpenBSD         ef  EFI (FAT-12/16/
10  OPUS            56  Golden Bow      a7  NeXTSTEP        f0  Linux/PA-RISC b
11  Hidden FAT12    5c  Priam Edisk     a8  Darwin UFS      f1  SpeedStor      
12  Compaq diagnost 61  SpeedStor       a9  NetBSD          f4  SpeedStor      
14  Hidden FAT16 <3 63  GNU HURD or Sys ab  Darwin boot     f2  DOS secondary  
16  Hidden FAT16    64  Novell Netware  af  HFS / HFS+      fb  VMware VMFS    
17  Hidden HPFS/NTF 65  Novell Netware  b7  BSDI fs         fc  VMware VMKCORE 
18  AST SmartSleep  70  DiskSecure Mult b8  BSDI swap       fd  Linux raid auto
1b  Hidden W95 FAT3 75  PC/IX           bb  Boot Wizard hid fe  LANstep        
1c  Hidden W95 FAT3 80  Old Minix       be  Solaris boot    ff  BBT            
1e  Hidden W95 FAT1
Hex code (type L to list codes): 83    #指定分区标签

Command (m for help): w         #将分区保存在MBR分区表
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.                  #提示已将磁盘分区表同步至内核

如果w保存退出时,未提示同步磁盘,或出现其他未同步磁盘报错信息

centos6可执行:
    partx -a /dev/sdc     #通知内核重读分区表
    partx -d /dev/sdc -nr 1-2  #如果不想内核读到1到2分区可执行
centos5或7可执行:
    partprobe

如果发现容量分错误,或这其他原因反悔了,可不执行w,执行q不保存退出

接下来在扩展分区的基础上分一个逻辑分区:

[root ~]#fdisk /dev/sdc
Command (m for help): p     #p显示分区情况

Disk /dev/sdc: 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: 0xa1367dc5

   Device Boot      Start         End      Blocks   Id  System
/dev/sdc1               1         262     2104483+  83  Linux   
      #上一步的分区                                 #这83就是标签
Command (m for help): n      
Command action
   e   extended
   p   primary partition (1-4)
e               #这里选择创建扩展分区,逻辑分区不能总大小不得超过该分区大小
Partition number (1-4): 4
First cylinder (263-2610, default 263): 
Using default value 263
Last cylinder, +cylinders or +size{K,M,G} (263-2610, default 2610): +10G

Command (m for help): n
Command action
   l   logical (5 or over)
   p   primary partition (1-4)
l       #创建完e扩展之后这里是l创建逻辑分区,
        #值得注意的是逻辑分区随扩展分区删除而删除,并且逻辑分区编号必须连续
First cylinder (263-1568, default 263): 
Using default value 263
Last cylinder, +cylinders or +size{K,M,G} (263-1568, default 1568): +1G

Command (m for help): p   #查看一下分区情况

Disk /dev/sdc: 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: 0xa1367dc5

   Device Boot      Start         End      Blocks   Id  System
/dev/sdc1               1         262     2104483+  83  Linux
/dev/sdc4             263        1568    10490445    5  Extended
/dev/sdc5             263         394     1060258+  83  Linux

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.    #已将磁盘分区表同步

分区完成看是否被内核识别?

[root ~]#lsblk
sdc                            8:32   0   20G  0 disk 
├─sdc1                         8:33   0    2G  0 part 
├─sdc4                         8:36   0    1K  0 part 
└─sdc5                         8:37   0    1G  0 part

如何删除一个分区?

[root ~]#fdisk /dev/sdc
Command (m for help): p     #查看分区

Disk /dev/sdc: 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: 0xa1367dc5

   Device Boot      Start         End      Blocks   Id  System
/dev/sdc1               1         262     2104483+  83  Linux
/dev/sdc4             263        1568    10490445    5  Extended
/dev/sdc5             263         394     1060258+  83  Linux

Command (m for help): d     #d命令删除分区
Partition number (1-5): 1   #指定要删除的分区号1

Command (m for help): p     #再次查看分区情况

Disk /dev/sdc: 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: 0xa1367dc5

   Device Boot      Start         End      Blocks   Id  System
/dev/sdc4             263        1568    10490445    5  Extended
/dev/sdc5             263         394     1060258+  83  Linux

gdisk分区工具:擅长GPT分区

gdisk  [option] [device...]
常用选项:
    -l <device>:列出磁盘分区信息列表

交互式用法:

gdisk #进入交互式模式,有许多的子命令,用法基本类似fdisk

? 查看所有支持的子命令
n 添加一个分区
d 删除分区
l 列出所有磁盘可支持分区类型
o 创建一个空的dos分区类型
p 显示磁盘分区表
w 将磁盘分区表写入磁盘,并退出分区工具
q 退出分区工具

[root ~]#gdisk /dev/sdc
GPT fdisk (gdisk) version 0.8.10

Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: present

Found valid GPT with protective MBR; using GPT.

Command (? for help): ?   #与fdisk区别,?为帮助菜单
b   back up GPT data to a file
c   change a partition's name
d   delete a partition
i   show detailed information on a partition
l   list known partition types
n   add a new partition
o   create a new empty GUID partition table (GPT)
p   print the partition table
q   quit without saving changes
r   recovery and transformation options (experts only)
s   sort partitions
t   change a partition's type code
v   verify disk
w   write table to disk and exit
x   extra functionality (experts only)
?   print this menu

如何创建一个GPT分区?

Command (? for help): n     #n创建一个GPT分区
Partition number (1-128, default 1): 1    #与fdisk区别,GTP只有主分区不分逻辑区
First sector (34-41943006, default = 2048) or {+-}size{KMGTP}: 
Last sector (2048-41943006, default = 41943006) or {+-}size{KMGTP}: +2G
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): l  #输入l可查看分区标签代号
0700 Microsoft basic data  0c01 Microsoft reserved    2700 Windows RE          
3000 ONIE boot             3001 ONIE config           4100 PowerPC PReP boot   
4200 Windows LDM data      4201 Windows LDM metadata  7501 IBM GPFS            
7f00 ChromeOS kernel       7f01 ChromeOS root         7f02 ChromeOS reserved   
8200 Linux swap            8300 Linux filesystem      8301 Linux reserved      
8302 Linux /home           8400 Intel Rapid Start     8e00 Linux LVM           
a500 FreeBSD disklabel     a501 FreeBSD boot          a502 FreeBSD swap        
a503 FreeBSD UFS           a504 FreeBSD ZFS           a505 FreeBSD Vinum/RAID  
a580 Midnight BSD data     a581 Midnight BSD boot     a582 Midnight BSD swap   
a583 Midnight BSD UFS      a584 Midnight BSD ZFS      a585 Midnight BSD Vinum  
a800 Apple UFS             a901 NetBSD swap           a902 NetBSD FFS          
a903 NetBSD LFS            a904 NetBSD concatenated   a905 NetBSD encrypted    
a906 NetBSD RAID           ab00 Apple boot            af00 Apple HFS/HFS+      
af01 Apple RAID            af02 Apple RAID offline    af03 Apple label         
af04 AppleTV recovery      af05 Apple Core Storage    be00 Solaris boot        
bf00 Solaris root          bf01 Solaris /usr & Mac Z  bf02 Solaris swap        
bf03 Solaris backup        bf04 Solaris /var          bf05 Solaris /home       
bf06 Solaris alternate se  bf07 Solaris Reserved 1    bf08 Solaris Reserved 2  
bf09 Solaris Reserved 3    bf0a Solaris Reserved 4    bf0b Solaris Reserved 5  
c001 HP-UX data            c002 HP-UX service         ea00 Freedesktop $BOOT   
eb00 Haiku BFS             ed00 Sony system partitio  ed01 Lenovo system partit
Hex code or GUID (L to show codes, Enter = 8300): 8300   #这里是指定分区的标签
Changed type of partition to 'Linux filesystem'

Command (? for help): p    #显示GPT分区情况
Disk /dev/sdc: 41943040 sectors, 20.0 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): E03DD1C3-CB8F-458F-AE7F-48382115B856
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 41943006
Partitions will be aligned on 2048-sector boundaries
Total free space is 37748669 sectors (18.0 GiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048         4196351   2.0 GiB     8300  Linux filesystem
Command (? for help): w     #w保存退出

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed? (Y/N): y   #这里与fdisk区别,需要y/n确认一下
OK; writing new GUID partition table (GPT) to /dev/sdc.
The operation has completed successfully.

看一下如何删除一个GPT分区?

[root ~]#gdisk /dev/sdc
Command (? for help): d  #输入d删除一个GPT分区
Using 1                  #这里我只创建了一个,所以默认了,多则输入指定编号

Command (? for help): p
Disk /dev/sdc: 41943040 sectors, 20.0 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): E03DD1C3-CB8F-458F-AE7F-48382115B856
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 41943006
Partitions will be aligned on 2048-sector boundaries
Total free space is 41942973 sectors (20.0 GiB)

Number  Start (sector)    End (sector)  Size       Code  Name
删除成功,w保存退出,y确认一下

非交互式:

parted:一个GNU的磁盘维护工具,并非交互式,命令敲完回车立即生效,无确认机制,适用于脚本自动化.平时慎用.

用法格式:

parted [options] [device [command [options...]...]]
parted  选项      设备     子命令    子选项   参数

常用选项:

parted -l     列出所有的磁盘信息

非交互式如何对msdos(MBT)或者GPT分区表进行操作?

parted /dev/sdc mklabel gpt|msdos|extended|logical   #创建空分区表
parted /dev/sdc print  #显示磁盘分区的详细信息
parted /dev/sdc mkpart FILE_TYPE|primary  start end  #创建分区(默认M为单位)
                #FILE_TYPE这里可以指定ext4但不建议
parted /dev/sdc rm n  删除第n个分区

实例演示:

创建空的分区表:

[root ~/bin]#parted /dev/sdc mklabel msdos   #创建一个空的MBR分区表   
Warning: The existing disk label on /dev/sdc will be destroyed and all data on  
this disk will be lost. Do you want to continue?  
Yes/No?y #如果磁盘以前做过操作,提示确认数据丢失                                                              
Information: You may need to update /etc/fstab.

创建完成后,看一下刚才创建的是否是MBR类型?

[root ~/bin]#parted /dev/sdc print
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdc: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos    #这里可以看出MBR类型

创建一个新的磁盘分区?

parted  /dev/sdc mkpart primary 1 5G 
        # mkpart 创建一个主分区开始为1 结束为5G 可以指定其他单位,创建了一个5G的分区                          
[root ~/bin]#parted  /dev/sdc print    #显示磁盘分区情况
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdc: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start   End     Size    Type     File system  Flags
 1      1049kB  5000MB  4999MB  primary     #可看到刚才分区情况
分区编号 其实    结束     大小    分区类型

如何创建一个扩展分区?如果是GPT类型,无需创建扩展分区,逻辑分区(只建立扩展分区的基础上)

[root ~/bin]#parted /dev/sdc mkpart extended  4G 100%  这里使用剩余的空间给扩展分区
Information: You may need to update /etc/fstab.

[root ~/bin]#parted  /dev/sdc print   #查看一下分区   
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdc: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start   End     Size    Type      File system  Flags
 1      1049kB  3000MB  2999MB  primary
 2      3000MB  4000MB  1000MB  primary
 3      4000MB  21.5GB  17.5GB  extended               lba
                #可看到扩展分区占据了剩余空间

创建逻辑分区,仅扩展分区是不可用的,如何建立逻辑分区?

[root ~/bin]#parted  /dev/sdc mkpart logic 4.01 5G
Warning: You requested a partition from 4010kB to 5000MB.                 
...
Is this still acceptable to you?
Yes/No? y    #确认                                                                
Warning: The resulting partition is not properly aligned for best performance.
Ignore/Cancel? i                                                          
Information: You may need to update /etc/fstab.                           
创建完成,看一下逻辑分区情况.
[root ~/bin]#parted /dev/sdc print
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdc: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start   End     Size    Type      File system  Flags
 1      1049kB  3000MB  2999MB  primary
 2      3000MB  4000MB  1000MB  primary
 3      4000MB  21.5GB  17.5GB  extended               lba
 5      4000MB  5000MB  1000MB  logical   #可见逻辑分区类型,逻辑区编号从5开始

如何删除一个分区? --以删除刚刚建立的扩展分区为例,并查看逻辑分区的反应.

[root ~/bin]#parted /dev/sdc rm 3   #指定要删除的分区编号
Information: You may need to update /etc/fstab.                           

[root ~/bin]#parted /dev/sdc print   #查看一下分区信息
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdc: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start   End     Size    Type     File system  Flags
 1      1049kB  3000MB  2999MB  primary
 2      3000MB  4000MB  1000MB  primary
#这里看出逻辑分区随着扩展分区的消失,悄无声息的消逝了.所以删除分区时(慎重)

关于分区就先到这了,如有错误,还请多多指教!愿每一位linuxer学习愉快~

我的51cto博客:cityx.blog.51cto.com