标签归档:分区表

Linux下大于2TB设备分区工具 -- parted介绍

随着单块硬盘容量的增大和硬盘价格的下降,2TB的磁盘使用将很快会普及,由于传统的MBR方式存储分区表的方 式缺陷,将可能导致很多分区工具不能正确地读取大于2TB容量的硬盘而无法正常分区大容量硬盘。其实linux在很早就已经有相关的工具来化解这个困境 了,那就是parted。
parted是类似fdisk的命令行分区软件,假设我们在linux系统中有一块未分区的硬盘挂载为/dev/hdd,下面以实例的方式来讲解如何使用 parted:
注意:parted的操作都是实时的,也就是说你执行了一个分区的命令,他就实实在在地分区了,而不是像fdisk那样,需要执行w命令写入所做的修改, 所以进行parted的测试千万注意不能在生产环境中!!
标记:#开始表示在shell的root下输入的命令,(parted)表示在parted中输入的命令,其他为自动打印的信息

1、首先类似fdisk一样,先选择要分区的硬盘,此处为/dev/hdd:
# parted /dev/hdd
GNU Parted 1.8.1
Using /dev/hdd
Welcome to GNU Parted! Type 'help' to view a list of commands.

2、现在我们已经选择了/dev/hdd作为我们操作的磁盘,接下来需要创建一个分区表(在parted中可以 使用help命令打印帮助信息):
(parted) mklabel
Warning: The existing disk label on /dev/hdd will be destroyed and all data on this disk will be lost. Do you want to continue?
Yes/No?(警告用户磁盘上的数据将会被销毁,询问是否继续,我们这里是新的磁盘,输入yes后回车) yes
New disk label type? [msdos]? (默认为msdos形式的分区,我们要正确分区大于2TB的磁盘,应该使用gpt方式的分区表,输入gpt后回车)gpt

3、创建好分区表以后,接下来就可以进行分区操作了,执行mkpart命令,分别输入分区名称,文件系统和分区 的起止位置
(parted) mkpart
Partition name? []? dp1
File system type? [ext2]? ext3
Start? 0
End? 500GB

4、分好区后可以使用print命令打印分区信息,下面是一个print的样例
(parted) print
Model: VBOX HARDDISK (ide)
Disk /dev/hdd: 2199GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Number Start End Size File system Name Flags
1 17.4kB 500GB 500GB dp1

5、如果分区错了,可以使用rm命令删除分区,比如我们要删除上面的分区,然后打印删除后的结果
(parted)rm 1 #rm后面使用分区的号码
(parted) print
Model: VBOX HARDDISK (ide)
Disk /dev/hdd: 2199GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Number Start End Size File system Name Flags

6、按照上面的方法把整个硬盘都分好区,下面是一个分完后的样例
(parted) mkpart
Partition name? []? dp1
File system type? [ext2]? ext3
Start? 0
End? 500GB
(parted) mkpart
Partition name? []? dp2
File system type? [ext2]? ext3
Start? 500GB
End? 2199GB
(parted) print
Model: VBOX HARDDISK (ide)
Disk /dev/hdd: 2199GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Number Start End Size File system Name Flags
1 17.4kB 500GB 500GB dp1
2 500GB 2199GB 1699GB dp2

7、由于parted内建的mkfs还不够完善,所以完成以后我们可以使用quit命令退出parted并使用 系统的mkfs命令对分区进行格式化了,此时如果使用fdisk -l命令打印分区表会出现警告信息,这是正常的
#fdisk -l
WARNING: GPT (GUID Partition Table) detected on '/dev/hdd'! The util fdisk doesn't support GPT. Use GNU Parted.
Disk /dev/hdd: 2199.0 GB, 2199022206976 bytes
255 heads, 63 sectors/track, 267349 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/hdd1 1 267350 2147482623+ ee EFI GPT #mkfs.ext3 /dev/hdd1
#mkfs.ext3 /dev/hdd2
#mkdir /dp1 /dp2
#mount /dev/hdd1 /dp1
#mount /dev/hdd2 /dp2

苹果系统分区表结构

Apple用一个专门的分区存储分区表项,这个分区就是起始于1号扇区的分区表分区。分区表分区是磁盘的第一个分区,由一系列大小为512-byte的分区表项组成,每个分区表项描述一个分区,包括分区的起始扇区号、分区大小、分区类型以及卷名等信息。除0号扇区外,其余的所有扇区一定属于某个分区表项所描述的空间。
分区表项的数据结构及其含义见表2.7
2.7  Apple分区表项数据结构及其含义
字节偏移量
(十六进制)
字节数
说明
0001
2
签名(0x504D
0203
2
保留
0407
4
总的分区个数
080B
4
本分区起始扇区号
0C0F
4
本分区大小扇区数
102F
32
分区名(ASCII码)
304F
32
分区类型(ASCII码)
5053
4
本分区内数据起始扇区号
5457
4
本分区内数据区大小扇区数
585B
4
分区状态
5C5F
4
引导代码起始扇区号
6063
4
引导代码大小扇区数
6467
4
引导装载程序地址
686B
4
保留
6C6F
4
引导代码目录指针
7073
4
保留
7477
4
引导代码校验和
7887
16
处理器类型
881FF
376
保留
 
提示:分区表的第一个分区表项一定是对分区表分区自身的描述,所有分区表项扇区的起始两个字节一定是“50 4D”。
 
以下是C代码。
 

/*
 *  fs/partitions/mac.h
 */

#define MAC_PARTITION_MAGIC	0x504d

/* type field value for A/UX or other Unix partitions */
#define APPLE_AUX_TYPE	"Apple_UNIX_SVR2"

struct mac_partition {
	__be16	signature;	/* expected to be MAC_PARTITION_MAGIC */
	__be16	res1;
	__be32	map_count;	/* # blocks in partition map */
	__be32	start_block;	/* absolute starting block # of partition */
	__be32	block_count;	/* number of blocks in partition */
	char	name[32];	/* partition name */
	char	type[32];	/* string type description */
	__be32	data_start;	/* rel block # of first data block */
	__be32	data_count;	/* number of data blocks */
	__be32	status;		/* partition status bits */
	__be32	boot_start;
	__be32	boot_size;
	__be32	boot_load;
	__be32	boot_load2;
	__be32	boot_entry;
	__be32	boot_entry2;
	__be32	boot_cksum;
	char	processor[16];	/* identifies ISA of boot */
	/* there is more stuff after this that we don't need */
};

#define MAC_STATUS_BOOTABLE	8	/* partition is bootable */

#define MAC_DRIVER_MAGIC	0x4552

/* Driver descriptor structure, in block 0 */
struct mac_driver_desc {
	__be16	signature;	/* expected to be MAC_DRIVER_MAGIC */
	__be16	block_size;
	__be32	block_count;
    /* ... more stuff */
};

int mac_partition(struct parsed_partitions *state);