以前,RAID控制器和文件系统都有2TB的限制。控制器上的限制,主要是指每个LUN不能大于2TB,而磁盘组一般则没有这个限制;文件系统的限制主要是指每个分区(partition)不能大于2TB,不过32位Windows要求物理盘也不能大于2TB。
现在,控制器还有这个限制的已经越来越少了,不过常用的文件系统上倒还是经常会有这个问题。
NTFS(Windows):支持最大分区2TB,最大文件2TB
FAT16(Windows):支持最大分区2GB,最大文件2GB
FAT32(Windows):支持最大分区128GB,最大文件4GB
HPFS(OS/2):支持最大分区2TB,最大文件2GB
EXT2和EXT3(Linux):支持最大分区4TB,最大文件2GB
JFS(AIX):支持最大分区4P(block size=4k),最大文件4P
XFS(IRIX):这是个正经的64位的文件系统,可以支持9E(2的63次方)的分区
从技术上讲,突破2TB限制并不一定就是64位文件系统。有以下两种技术手段可以在32位的环境中突破2TB限制:
1、block size大于512字节
2、多字段表示block寻址(就像当年的16位DOS能用24位表示内存地址一样)
根据dell的一份白皮书描述,当前的2tb限制,有两个方面原因:
1、由于当前scsi协议规范的局限导致主机不能识别超过2tb的lun
具体是因为当前采用的sbc(scsi block command)标准采用4-byte的lba寻址,由此限制了可寻址的最大lun为2^32*512=2tb,今后若采用sbc-2标准,即可扩展为8-byte寻址,可大大突破2tb
2、当前主流的x86磁盘分区架构限制一个分区不能大于2tb
目前x86平台下的分区格式多是mbr(master boot record)类型,其分区表定义了一个4个字节的chs寻址,同样为2^32*512=2tb。如果采用gpt(global unique identifier partition table)类型的分区格式,其分区表定义了8个字节的lba寻址,可大大突破2tb。目前2.6.x的linux可支持gpt,itanium下的 windows也支持gpt,处于某些考虑,微软没有提供其32位os下的分区转换解决方案。
可见,scsi协议和os是造成2tb限制的原因,某些文件系统来说,是没有限制的,比如ntfs,分区上限的理论值是16eb(e=10^9*t),而且没有文件大小限制。
--------------------------------------------------------------------------------------------------------------
SCSI BLOCK COMMAND第二版:
对于READ(6),READ(10),READ(12),WRITE(10),WRITE(12),其LBA的地址长度为4字节,这也就是说LBA的长度空间为2^32,在加上LBA的地址为块地址,而块的大小为512BYTE,从而其寻址空间为:
2^32 * 512BYTE = 2^32 * 2^9BYTE = 2^41BYTE = 2TB,
以前的大部分OS都是采用这种命令,所以存在2T的限制;
而对于READ(16)、READ(32)、WRITE(16)、WRITE(32),其LBA的地址空间为8字节,就是64位(可能和64位OS相关),因此按照上述计算方法,其寻址空间有:
2^64 * 2^9 B = 2^ 73 BYTE。
因此采用新SCSI命令的OS完全可以克服2TB的限制!
不过对于目前的硬盘来说,大都是支持48bit的LBA寻址,因为对于发下来的64BIT的LBA地址,目前来说是用不完的。但是48bit的LBA对于目前的应用来说已经完全足够啦!
对于存储的各种限制,现在做一个分析!欢迎大家讨论和更正。
对于应用数据到存储系统,通常遵循如下的流程,:
应用
|
OS
|
文件系统
|
卷管理器
|
存储设备驱动程序
|
存储设备
因此,整个流程都可能存在一些限制:
a, 如OS,就有32位OS和64位OS的一些限制;
b, 文件系统,如FAT16,就有2G分区的限制。这是和它定义的簇号变量相关,其簇号最大为0XFFFF(就是16位),同时每簇的大小通常为32KB,所以分区的最大值为2^16 * 2^15B = 2^31B= 2GB。不过这一限制早就突破了!
c,对于卷管理器,一般是将对磁盘的访问,设置为对应的命令,对于ATA设备驱动,就发送ATA的命令(就是处理IDE硬盘);对于SCSI驱动,OS会 发送一个包含SCSI BLOCK COMMAND的命令(可以参考SPEC),而这些SCSI BLOCK COMMAND命令(特别是READ、WRITE命令)里面的LBA地址变量的长度,将决定一个TARGET上LUN能够访问的存储空间,像 READ(6),READ(10),READ(12),WRITE(10),WRITE(12)命令,其LBA为32位长度,而对于硬盘来说每个块大小位 512B,进而存在2TB的限制。在SCSI BLOCK COMMAND第二版中,扩展了该命令,LBA可以有64位,突破了该限制。
d,对于IDE硬盘设备,以前采用的CHS模式,还有512MB的容量限制,这也是因为CHS的空间为20BIT,从而只能寻址2^20 *512B=512MB,
后来采用了28BIT的LBA寻址以及48BIT的LBA寻址,这些限制已经被突破。
值得注意的是,有些数据库应用可以跨越文件系统,直接操作块设备来完成其操作,因此数据库供应商也可能存在限制。同时对于网络存储来说,各个设备和软件都可能存在限制,因此大家都会尊崇统一的SPEC,从而消除这些限制。
总的来说,对于存储设备的限制,如果遵守SCSI协议,那么其存储空间的限制,最重要的部分应该是和实现的SCSI命令相关联的!而且这些限制可能都是早 期的设计中,没有考虑全后面的应用而产生的,扩展这些限制在技术上并不是不可跨越,而是在于一些向后兼容性的问题。
现在,控制器还有这个限制的已经越来越少了,不过常用的文件系统上倒还是经常会有这个问题。
NTFS(Windows):支持最大分区2TB,最大文件2TB
FAT16(Windows):支持最大分区2GB,最大文件2GB
FAT32(Windows):支持最大分区128GB,最大文件4GB
HPFS(OS/2):支持最大分区2TB,最大文件2GB
EXT2和EXT3(Linux):支持最大分区4TB,最大文件2GB
JFS(AIX):支持最大分区4P(block size=4k),最大文件4P
XFS(IRIX):这是个正经的64位的文件系统,可以支持9E(2的63次方)的分区
从技术上讲,突破2TB限制并不一定就是64位文件系统。有以下两种技术手段可以在32位的环境中突破2TB限制:
1、block size大于512字节
2、多字段表示block寻址(就像当年的16位DOS能用24位表示内存地址一样)
根据dell的一份白皮书描述,当前的2tb限制,有两个方面原因:
1、由于当前scsi协议规范的局限导致主机不能识别超过2tb的lun
具体是因为当前采用的sbc(scsi block command)标准采用4-byte的lba寻址,由此限制了可寻址的最大lun为2^32*512=2tb,今后若采用sbc-2标准,即可扩展为8-byte寻址,可大大突破2tb
2、当前主流的x86磁盘分区架构限制一个分区不能大于2tb
目前x86平台下的分区格式多是mbr(master boot record)类型,其分区表定义了一个4个字节的chs寻址,同样为2^32*512=2tb。如果采用gpt(global unique identifier partition table)类型的分区格式,其分区表定义了8个字节的lba寻址,可大大突破2tb。目前2.6.x的linux可支持gpt,itanium下的 windows也支持gpt,处于某些考虑,微软没有提供其32位os下的分区转换解决方案。
可见,scsi协议和os是造成2tb限制的原因,某些文件系统来说,是没有限制的,比如ntfs,分区上限的理论值是16eb(e=10^9*t),而且没有文件大小限制。
--------------------------------------------------------------------------------------------------------------
SCSI BLOCK COMMAND第二版:
对于READ(6),READ(10),READ(12),WRITE(10),WRITE(12),其LBA的地址长度为4字节,这也就是说LBA的长度空间为2^32,在加上LBA的地址为块地址,而块的大小为512BYTE,从而其寻址空间为:
2^32 * 512BYTE = 2^32 * 2^9BYTE = 2^41BYTE = 2TB,
以前的大部分OS都是采用这种命令,所以存在2T的限制;
而对于READ(16)、READ(32)、WRITE(16)、WRITE(32),其LBA的地址空间为8字节,就是64位(可能和64位OS相关),因此按照上述计算方法,其寻址空间有:
2^64 * 2^9 B = 2^ 73 BYTE。
因此采用新SCSI命令的OS完全可以克服2TB的限制!
不过对于目前的硬盘来说,大都是支持48bit的LBA寻址,因为对于发下来的64BIT的LBA地址,目前来说是用不完的。但是48bit的LBA对于目前的应用来说已经完全足够啦!
对于存储的各种限制,现在做一个分析!欢迎大家讨论和更正。
对于应用数据到存储系统,通常遵循如下的流程,:
应用
|
OS
|
文件系统
|
卷管理器
|
存储设备驱动程序
|
存储设备
因此,整个流程都可能存在一些限制:
a, 如OS,就有32位OS和64位OS的一些限制;
b, 文件系统,如FAT16,就有2G分区的限制。这是和它定义的簇号变量相关,其簇号最大为0XFFFF(就是16位),同时每簇的大小通常为32KB,所以分区的最大值为2^16 * 2^15B = 2^31B= 2GB。不过这一限制早就突破了!
c,对于卷管理器,一般是将对磁盘的访问,设置为对应的命令,对于ATA设备驱动,就发送ATA的命令(就是处理IDE硬盘);对于SCSI驱动,OS会 发送一个包含SCSI BLOCK COMMAND的命令(可以参考SPEC),而这些SCSI BLOCK COMMAND命令(特别是READ、WRITE命令)里面的LBA地址变量的长度,将决定一个TARGET上LUN能够访问的存储空间,像 READ(6),READ(10),READ(12),WRITE(10),WRITE(12)命令,其LBA为32位长度,而对于硬盘来说每个块大小位 512B,进而存在2TB的限制。在SCSI BLOCK COMMAND第二版中,扩展了该命令,LBA可以有64位,突破了该限制。
d,对于IDE硬盘设备,以前采用的CHS模式,还有512MB的容量限制,这也是因为CHS的空间为20BIT,从而只能寻址2^20 *512B=512MB,
后来采用了28BIT的LBA寻址以及48BIT的LBA寻址,这些限制已经被突破。
值得注意的是,有些数据库应用可以跨越文件系统,直接操作块设备来完成其操作,因此数据库供应商也可能存在限制。同时对于网络存储来说,各个设备和软件都可能存在限制,因此大家都会尊崇统一的SPEC,从而消除这些限制。
总的来说,对于存储设备的限制,如果遵守SCSI协议,那么其存储空间的限制,最重要的部分应该是和实现的SCSI命令相关联的!而且这些限制可能都是早 期的设计中,没有考虑全后面的应用而产生的,扩展这些限制在技术上并不是不可跨越,而是在于一些向后兼容性的问题。