跳转至主要内容

VOS流文件的增长限制在2GB左右。这是因为s$seq_position、s$get_port_status、s$lock_region等接口的定义使用有符号的32位变量来表示文件中的位置,而2**31是可以表示的最大值。在流文件中,位置是字节偏移而不是像其他VOS文件组织中的记录号。

从17.2版开始,64位流文件就可以使用了,并且只允许受VOS文件系统限制的增长(任何文件的最大尺寸是512GB)。除了扩大增长潜力,这些文件还提供了其他优势,特别是在访问二进制数据时。与普通的流文件不同,包含所有二进制零的块不占用磁盘空间,读取此类数据不需要磁盘访问。

符合Posix标准的应用程序可以很容易地建立大文件意识,而不需要改变任何源码:在17.2以上模块上运行的磁盘上创建的新文件将是64位(通常称为stream64)文件,在17.2之前的模块上将是普通的流文件。使用VOS s$接口或VOS语言I/O的应用程序称为原生应用程序,使用流文件的应用程序只要不使用字节定位操作(定位到BOF或EOF不视为字节定位)OR如果文件是 然而,它们需要修改才能创建流64文件。

如果你打算使用64位流文件,这里有一些信息可能会有用。它的组织结构如下:

现有的应用和兼容性
- 现有的Posix应用
- 现有的本地应用
- 兼容性
- 开源产品
稀疏分配
文件转换
物理特性
- 延伸
- 外延是如何影响稀疏分配的?
- 灵活的延伸
工具类
- 在模块上定位64位流文件
- 块比较
- 比较稀疏文件

现有的应用和兼容性
- 现有的Posix应用

从17.2版开始,Posix应用程序可以为大文件意识而构建,如果目标是在17.2或更高版本的磁盘上运行,则允许访问64位文件并创建它们。如果应用程序是符合Posix标准的(例如,在需要的地方被编码为使用off_t等类型而不是int),那么不需要修改源代码;只需按照OpenVOS POSIX.1参考手册R502"将现有的应用程序移植到64位流文件环境"中的描述来构建它。如果正在创建的文件是在运行于17.2之前的模块上的磁盘上,那么就会创建一个普通的流文件,只有当试图增长文件>2GB时,才会出现失败。所以,使你的Posix应用能够使用大文件,在互操作性方面没有任何代价。从17.2版开始,大多数支持VOS的开源产品都可以生成并正确处理64位的流文件。

符合Posix标准的应用程序可以很容易地建立大文件意识,而不需要改变任何源码:在17.2以上模块上运行的磁盘上创建的新文件将是64位流(通常称为stream64)文件,在17.2之前的模块上将是普通的流文件。使用VOS s$接口或VOS语言I/O的应用程序称为原生应用程序,使用流文件的应用程序只要不使用字节定位操作(定位到BOF或EOF不视为字节定位)或者文件小于2GB,就可以访问stream64文件。

- 现有的本地应用

许多原生应用程序只需要改变create_file命令(或s$create_file)的使用,以表明组织结构是STREAM64而不是STREAM。如果应用程序使用定位操作,并且文件增长到> 2 GB,那么s$seq_position会产生错误:为了支持更大的文件,需要将s$seq_position调用改为s$seq_position_x。同样,使用_x接口并不影响应用程序引用存在于可能不支持_x接口的模块上的普通流文件,只要位置参数在支持的范围内即可。所以做这个改动,可以访问任何类型的流文件,而且在互操作性上没有任何代价。

现有的应用程序,如果只使用不交流字节位置的接口:s$seq_read、s$seq_write、s$seq_position BOF/EOF,就可以不加修改地处理流文件64位。许多应用程序都是为了处理ASCII文件而编写的,不管它们是顺序文件还是流文件,因此不需要修改就能处理64位流文件,不管它们的大小。

64位流文件不能有索引,因此索引流文件不能转换为stream64。由于现有索引实现的限制,索引流文件不能增长到>2 GB。

- 兼容性

由于64位流文件具有许多优点,所以如果不需要索引,应尽可能采用。

只要文件不超过2GB,它就可以被复制或移动到运行旧版本VOS的模块中,并在那里作为一个正常的流文件出现。您甚至可以将包含stream64文件的磁盘移动到旧版本的VOS中,只要文件没有受到"限制"。当一个文件的大小超过2GB或分配稀少时,它就会受到限制;如果将包含它们的磁盘移动到17.2之前的VOS上,这样的文件就不能被打开(如果你正计划这样的移动,可以使用工具来识别受限制的文件)。然而,运行旧版本VOS的应用程序可以在网络上打开、读写任何类型的stream64文件;发生的任何故障都与应用程序在17.2+上运行一样(例如,当文件超过2GB时,使用s$seq_position进行字节定位)。

- 开源产品

VOS上支持的大部分开放软件都已经被改造成可以识别大文件的软件,比如ftp、sftp、samba等。这有一定的影响。从17.2版本开始,你现在可以把一个流文件ftp到VOS上,而且不用担心文件太大,因为ftp守护进程会创建一个stream64的文件,ftp会写入所有的字节,因此产生的文件不会是稀疏的(见下一节),即使主要由二进制零组成。简单地复制传输的文件可能会大大减少其占用的磁盘空间。如果你打算在ftp'ed文件中加入索引,你必须先把它转换为普通的流文件(当然它的长度不能超过2GB)。

稀疏分配

包含所有二进制零的块并不总是为stream64文件分配,因此不需要磁盘空间。gnu "truncate"命令(在>system>gnu_library>bin中)可以用来截断和扩展流文件的大小。在18.0中,VOS提供了一个类似的命令,叫做reset_eof。过了EOF的数据是未定义的,但当EOF被扩展时,从当前EOF点开始的文件内容总是被设置为二进制零。

考虑一个普通的流文件和一个流64文件。

create_file stm -organization stream
create_file s64 -organization stream64。

并假设每个文件的内容是'abc'。我们希望扩展文件,使每个文件占用20亿字节。

巴什
bash-4.2$ truncate -s 2000000000 s64
bash-4.2$ truncate -s 2000000000 stm

第一个请求立即完成,而第二个请求需要几分钟。文件显示出逻辑上的等价性。

bash-4.2$ ls -l
共计244382人
-rwxrwxrwx 1 nobody nobody 2000000000 Feb 25 14:08 s64
-rwxrwxrwx 1 nobody nobody 2000000000 Feb 25 14:11 stm

但是,每个文件所占用的磁盘块数是完全不同的,如VOS列表命令所示。

列表

文件:2, 块:488764

W4 S64
W 488760 STM

在18.0版本中,可以使用VOS reset_eof命令进行等价操作。

reset_eof s64 2000000000

如果你要求将一个普通的流文件扩展超过几千个块,VOS命令会发出警告,因为这是一个非常昂贵的操作。

reset_eof stm 2000000000
将eof扩展为2000000000,将给文件增加488281个块。你想把stm扩展1999999996字节吗?(是,不是)

这是64位的流文件,经过扩展后。它只由两个数据块组成。

dump_file s64
块号1

000 6162630A 00000000 00000000 00000000 |abc.............|。
=
FF0 00000000 00000000 00000000 00000000 |................。

区号488282

000 00000000 00000000 00000000 00000000 |…………….|
=
FF0 00000000 00000000 00000000 00000000 |................。

转储普通流文件stm会显示所有已分配的488282个块,其中大部分块含有二进制零。

dump_file stm
块号1
000 6162630A 00000000 00000000 00000000 |abc.............|。
=
FF0 00000000 00000000 00000000 00000000 |................。

块号2
000 00000000 00000000 00000000 00000000 |…………….|
=
FF0 00000000 00000000 00000000 00000000 |................。

块号3

区号488282
000 00000000 00000000 00000000 00000000 |…………….|
=
400 FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF |................|。
=
FF0 FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF |................|。

尽管如此,compare_files和diff将文件视为等价的,但需要读取普通流文件中的所有块,在这种情况下,这可能需要几分钟的时间。

准备好了;compare_files s64 stm。
准备好了 14:29:47
准备好了 14:31:24 45.877 46

文件转换

convert_stream_file命令可用于在任意一种顺序和流文件类型(流、64位流、顺序和扩展顺序)之间进行转换,并改变扩展。通常转换涉及复制文件的内容,这种方式类似于创建一个空的目标文件,并使用带有-truncate选项的copy_file,convert_stream_file可以用来改变文件的位置,其优点是在尝试转换之前,确保现有的内容可以用要求的新格式表示。

There are cases where a stream file can be reset to stream64 and vice versa without conversion, i.e., without copying contents. This is done by resetting the directory entry and is possible only if the file is not sparse, is less that 2 GB and extent size is not changed. This can be useful when migrating a disk containing stream64 files to a pre-17.2 module and again if the disk is moved back. The set_stream_files command is available for this purpose. It is a privileged command intended for use by a System Administrator: it takes a directory as input and resets files in that directory, and optionally in all sub-directories. It affects only those stream64 files which can be reset without conversion (not sparse and otto>stm
file organization: stream file
last used at: 15-02-25 14:34:45 est

extent size: 1
next byte: 2000000000
blocks used: 488760 <<<<<

然后:
convert_stream_file stm -to stream64 -extent_size 8

display_file_status stm
file organization: stream file (64-bit/rstr)
last used at: 15-02-25 14:39:16 est

extent size: 8
next byte: 2000000000
blocks used: 18 <<<<
sparse: yes

产生的文件由于现在是稀疏的,所以显示为受限制的(64位/rstr)。copy_file 命令也会产生一个稀疏的文件。将 stream64 文件转换为普通的流文件会导致所有的块被实例化,因此产生的文件会比原始文件大得多。

在stream64文件中,不能保证一个包含二进制零的块会不会被分配到磁盘上。例如,如果你在一个块中写了一些零,但最后都是零,那么这个块仍然是被分配的--或者如果一个程序明确地写了零数据填满了块。只有从未写入的块才会保持未分配;copy_file和convert_stream_file从未写入包含所有二进制零的块。

物理特性
- 延伸

任何VOS文件的实际增长限制都是由其范围大小决定的,所以了解什么是范围很重要。VOS文件映射包含了文件中每个4k块的磁盘地址,它被限制为523792个条目,因此任何没有范围的文件都被限制为2145452032(523792*4096)字节。这略低于2**31,因此是普通流文件增长的实际限制。

一个范围是磁盘上的N个连续块的组,其中N是范围大小。通过extents分配的文件的文件映射包含了范围内第一个块的地址,因此允许文件映射代表一个大得多的文件。动态分配的extents允许范围大小达到256,允许文件包含512GB(注意:静态分配的extents允许范围大小大于256,除了用于分页文件外,其他都被废弃了;这些都有许多限制和性能问题,使其不能被一般使用)。

为了增长超过2GB,stream64文件必须有extents,extents的值将决定它的实际增长极限。例如:

create_file stm64 -organization steam64 -extent_size 32。

将创建一个可以增长到64GB的文件。

在17.2版本中,Posix Runtime创建的文件的默认范围大小是8,允许增长到16GB。这样的文件每次增长8个块,因此任何文件的最小大小是8个块。这个默认值可以由系统管理员在每个模块的基础上改变,但增长潜力越大,文件的最小尺寸就越大。对于产生许多非常小的文件的应用程序来说,更大的扩展可能是一个问题。

- 外延是如何影响稀疏分配的?

通常从未被写入的块不会被分配给stream64文件;但是如果一个范围内的一个块被写入,那么该范围内的所有块都会被分配,即使有些块包含所有的二进制零。

假设一个包含字符串abc(stm1)的非extent文件被转换为一个extent大小为8的文件(stm8)。

dump_file stm1
块号1
000 6162630A 00000000 00000000 00000000 -abc.............|
010 00000000 00000000 00000000 00000000 |…………….|
=
FF0 00000000 00000000 00000000 00000000 |................。

convert_stream_file stm1 stm8 -extent_size 8。

dump_file stm8
块号1
000 6162630A 00000000 00000000 00000000 -abc.............|
010 00000000 00000000 00000000 00000000 |…………….|
=
FF0 00000000 00000000 00000000 00000000 |................。

块号2
000 00000000 00000000 00000000 00000000 |…………….|
=
FF0 00000000 00000000 00000000 00000000 |................。

块号3

8号楼
000 00000000 00000000 00000000 00000000 |…………….|
=
FF0 00000000 00000000 00000000 00000000 |................。

在18.0版本中,dump_file增加了-brief选项,当你不想看到实际存在的块,但代表"空的"(可能不存在的)块时,这个选项就很有用。在DAE-8文件中使用该选项的方法如下所示。

dump_file stm8 -brief
块号1
000 6162630A 00000000 00000000 00000000 -abc.............|
010 00000000 00000000 00000000 00000000 |…………….|
=
FF0 00000000 00000000 00000000 00000000 |................。

这对于隐藏固定文件相对的包含所有-1′的"空"块也是有效的。

- 灵活的延伸

在18.0版中引入了灵活的范围,允许一个小文件一次只增长一个块,当文件变大时,范围值也会随之改变,这是Posix应用程序在18.0版中创建的所有文件的默认值。这是所有Posix应用程序在18.0版本中创建的文件的默认值,也是你在使用create_file命令时,如果没有给出特定的范围大小,就会得到的结果。

create_file flex -organization stream64 -extent_size.

具有灵活扩展的文件被称为flex文件;只有stream64文件可以具有灵活扩展。display_file_status命令将flex文件的范围大小显示为"flex"。

display_file_status flex
名称: %swsle#Raid4>flex
文件组织:流文件(64位
最后修改于15-02-25 12:06:25 EST

动态扩展:是
范围大小:灵活

如果display_file_status命令是在18.0之前的模块上运行的,它将显示。
extent size: -1

如果一个flex文件被复制到17.2模块的磁盘上,它的extents是该模块的默认值。如果复制到17.1或更早的模块,结果是一个普通的流文件。

在17.2+版本中,compare_files不会看到流文件之间的范围大小差异,而且不管文件的外延是什么,都是一样的。例如,假设 %swsle#m109_mas 是一个运行在 17.2 版本的模块上的文件。

copy_file flex %swsle#m109_mas>Stratus。
compare_files flex %swsle#m109_mas>Stratus>flex。
准备好了 14:42:38 0.001 6。

在17.2之前的模块上运行compare_files会显示出这一差异。

compare_files %swsle#Raid>flex %swsle#m109_mas>Stratus>flex。
A(%swsle#Raid4>flex不匹配B(%swsle#m109_mas>Stratus>flex)。
- 两个文件的一些属性不匹配。
范围大小-1 8

Flex文件能够容纳的容量比512GB要小一些,具体来说是540,142,534,656字节与DAE-256的549,235,720,192字节,但是有一个好处,就是小文件每次增长一个块,然后是8块,然后是32块,然后是256块,而不是每次总是256块。

您不应该在18.0之前的模块上挂载包含flex文件的磁盘;有一些工具可以让您轻松地检查磁盘是否存在flex文件。如果您不小心这样做了,这些文件将不可见,也不能被访问。这样的文件或任何包含的目录不能被删除,所以如果磁盘被移回运行18.0以上的模块,这些文件将保持完整。但是,如果您在18.0之前的模块上进行抢救,所有的弹性文件都会被删除,空间也会被恢复。

工具类
- 在模块上定位64位流文件

当你需要将磁盘移动到旧版本的VOS时,你需要找到与旧版本不兼容的文件。有一个命令可以帮助你完成这项工作。

locate_stream_files -form

---------- locate_stream_files ---------
目录名称。
-深度:
-type:64位
-简报:无
-长:无

-类型也可以是flex、sparse或large(将定位具有该特定特性的64位流文件),或all(将定位所有流文件)。

根据-depth,会搜索下级目录,如果文件有任何属性(不是由类型指定的),也会显示该属性的信息和范围大小。如果没有给出目录名,则从根目录开始搜索模块上的所有磁盘。例如

locate_stream_files -type 64-bit

检查磁盘上的目录%swsle#raid0-1... ...
%swsle#raid0-1.smb_test.stm64 (FLEX/大)
smb_test.stm64 (FLEX/Large)
smb_test.stmb
共2个64位流文件。

检查磁盘上的目录%swsle#raid0-2...。
%swsle#raid0-2:
big_stream (FLEX)
smb_test.stm (FLEX)
smb_test.stm64a (FLEX/large)
共3个64位流文件。

检查磁盘上的目录 %swsle#Raid4...
%swsle#Raid4>otto:
b3(DAE-8)
大(DAE-256/大/稀疏)

- 块比较

在17.2和18.0版本中,compare_files命令有了新的选项,这些选项对流文件很有用。VOS结构化文件类型的逐块比较通常是没有用的,因为两个具有不同值的块通常会代表相同的逻辑记录。例如,相对文件的记录中超过当前长度的未使用数据是无法预测的。此外,顺序文件还包含未定义的填充字节。如果记录大小不同,虽然代表相同的逻辑记录,但扩展的顺序文件的块内容是完全不同的。

然而,块比较有时对固定文件和流文件是有用的,问题是compare_files是面向记录的,设计成用记录号(或行号)来显示差异。问题是compare_files是面向记录的,设计成以记录号(或行号)来显示差异,而记录号可以用编辑器来定位。这就给二进制流文件带来了问题,因为二进制流文件不是以记录为单位组织的。由于任何文件的记录大小都被限制在32767字节,所以在流文件中使用s$seq_read时,当一个超过32k字节的序列发生时,如果没有中间的NL记录定界符,就会提供下一个32767个字符,而不会区分下一个字节是否是NL。这使得面向记录的比较结果对于持有二进制值而不是由NL字符分隔的字符序列的流文件来说是模糊的。

这个问题已经在17.2版本中得到了处理;compare_files将检测以前可能发生的错误成功的情况--特别是当NL后面的32767个字符与没有NL后面的32767个字符相匹配时。如果发生这种情况,将报告一个错误,表明流文件包含的记录>32767。如果这种情况从未发生,那么面向记录的结果将是有效的,可以相信。但无论如何,当你想做的只是保证文件是相同的时候,比较非结构化文件的块比面向记录的方法要快得多。块比较的问题是,由于没有记录作为指导柱,第一次差异之后的比较通常是没有意义的。

在17.2版本中,为此在compare_files命令中增加了-compare_blocks选项。这将快速检测非结构化文件的块与块之间是否相同,并识别它们不同的块。对于罕见的情况,即差异是由覆盖引起的(某些字节被修改而不是插入或删除),而文件的其余部分是相同的,也可以使用-continue选项。这将显示文件剩余部分中不同的块的范围。例如,如果一个字节被插入(而不是覆盖),那么所有剩余的块将有所不同;也就是说,像记录比较那样的重新同步,在块比较中是不可能的。但在上述情况下,这个附加信息可以确定唯一的不同是在几个块中的一些重叠字节,也许代表类似时间戳的东西。

以-compare_blocks与-continue为例。

compare_files flex dae256 -compare_blocks -continue
A (%swsle#m111_mas>Stratus>Newman>flex)与B (%swsle#m111_mas>Stratus>Newman>dae256)不匹配。
- 从2到24的数据块不同。
- 从33到488的数据块不同。
- 文件B中的272个附加块。

- 比较稀疏文件

compare_files 命令会检查文件中所有实际存在的块。在稀疏的文件中,这可能是一个问题,因为一个二进制零块可能在一个文件中作为分配的块出现,但在另一个文件中却不存在。这些文件可能在逻辑上是相同的,但不是一个块一个块的。事实上,使用copy_file将消除目标文件中的二进制零块,如果有的话,这将保证源文件和目标文件不是块与块之间完全相同。

这在基于范围的流文件中也是一个问题,因为范围中的所有块总是被实例化,即使它们包含所有的二进制零。这意味着,一个稀疏的 extent 文件中的块可能看起来与一个相同的非 extent 文件中的块不同,即使它们代表的数据完全相同。运行 copy_file 不能消除一个 extent 中的零块。

上面显示使用-continue的例子实际上涉及两个相同的文件,只是一个有DAE-256扩展,另一个有灵活的扩展。

因此,一个内容为"abc"的DAE-8文件将包含一个带有"abc"的块,然后是7个包含二进制零的块。一个非扩展文件(或柔性文件)将只有一个含有"abc"的块,而一个DAE-16文件将有一个"abc"块,后面跟着15个含有二进制零的块。

使用带有-compare_blocks的compare_files命令将显示所有这些文件是不同的,即使它们都代表相同的文件数据。在18.0版中,-compare_all_blocks选项可用于这种情况。这将导致copy_file在逻辑上将被比较的文件中缺失的块实例化,从而实现真正的逐块比较,消除由稀疏性引起的差异。在 stream64 文件中缺失的块被认为是所有的二进制零,而在固定的(或所有其他文件类型)中则被认为是二进制的-1′s (全部为 FFFF)。

在一个非常稀疏的文件中,这可能会使比较的速度比使用-compare_blocks选项慢得多,但仍然比使用默认的面向记录的比较快得多。通常只有在比较具有不同extents的文件块时才需要这个选项,尽管在其他情况下,稀疏度也会有所不同。这对于具有不同extents的固定文件也很有用。

© 2024Stratus Technologies.