如何以十六进制的形式读unix平台下的文件系统与裸设备文件

先来介绍一下裸设备的知识

1.什么是裸设备(RAW DEVICE)
裸设备是指未创建文件系统的磁盘分区(raw partition)或逻辑卷(raw logical volume),应用程序直接通过一
个字符设备驱动程序对它进行访问。如何对设备上的数据读写决定于使用它的应用程序。由于对裸设备的操作不通过UNIX的缓冲区,数据在ORACLE的数据 缓冲区(BUFFER CACHE)和磁盘之间直接传递,所以使用裸设备在一定程度上能够提高I/O性能,适合I/O量大的系统。另外OPS/RAC (Oracle Parallel Server/Real Application Cluster)环境下,多个节点同时访问同一个数据库,所以CONTROL FILE、DATA FILE、REDO LOG都必须建在RAW DEVICE上。

2.裸设备的可用空间
不同的UNIX对裸设备的管理不完全相同,特别要注意的是某些UNIX在每个裸设备的头部要保留一定的空间,应用程序在使用裸设备时不可以覆盖这一部分, 否则会对裸设备造成损坏。所以一个裸设备的实际可用空间是分配给裸设备的空间再减去这部分操作系统保留空间。下面是常用UNIX的OS Reserved Size列表:
UNIX     OS Reserved Size
------------ ----------------
SUN Solaris       0
HP-UX          0
IBM AIX         4k
Tru64 UNIX       64k
Linux          0
3.如何读裸设备上的数据?

UNIX上读写裸设备不能使用cp, cpio, tar等命令,必须用dd,下面是几个dd常用参数的简单说明,更详细的信息请参考UNIX使用手册或用命令man dd。
dd [ operand=value ... ]
if=file 指定输入文件,缺省值是标准输入
of=file 指定输出文件,缺省值是标准输出
bs=n 设置输入和输出的块大小为n字节,也可以用“k”作单位
skip=n 在拷贝之前跳过n个输入块,缺省值是0
seek=n 在拷贝之前从输出文件首部跳过n块,缺省值是0
count=n 指定拷贝的块数,缺省拷贝到输入文件结束

4.用十六进制读取unix的文件系统上的文件

介绍一下od命令的用法,linux od(octal dump) 命令详解
功能说明:输出文件内容。
语  法:od [-abcdfhilovx][-A <字码基数>][-j <字符数目>][-N <字符数目>][-s <字符串字符数>][-t <输出格式>][-w <每列字符数>][--help][--version][文件...]

补充说明:od指令会读取所给予的文件的内容,并将 其内容以八进制字码呈现出来。

参  数:
-a  此参数的效果和同时指定"-ta"参数相同。
-A<字码基 数>  选择要以何种基数计算字码。
-b  此参数的效果和同时指定"-toC"参数相同。
-c  此参数的效果和同时指定"-tC"参数相同。
-d  此参数的效果和同时指定"-tu2"参数相同。
-f  此参数的效果和同时指定"-tfF"参数相同。
-h  此参数的效果和同时指定"-tx2"参数相同。
-i  此参数的效果和同时指定"-td2"参数相同。
-j<字符数目>或--skip-bytes=<字符数目>  略过设置的字符数目。
-l  此参数的效果和同时指定"-td4"参数相同。
-N<字符数目>或--read- bytes=<字符数目>  到设置的字符数目为止。
-o  此参数的效果和同时指定"-to2"参数相同。
-s<字符串字符数>或--strings=<字符串字符数>  只显示符合指定的字符数目的字符串。
-t<输 出格式>或--format=<输出格式>  设置输出格式。
-v或--output-duplicates  输出时不省略重复的数据。
-w<每列字符数>或--width=<每列字符数>  设置每列的最大字符数。
-x  此参数的效果和同时指定"-h"参数相同。
--help  在线帮助。
--version  显示版本信息。

5.实例

用od命令读solaris上的文件,以十六进制的形式显示结果

bash-3.00$ uname -a
SunOS sunv890 5.10 Generic_137111-08 sun4u sparc SUNW,Sun-Fire-V890
bash-3.00$ od -t x4 master.dat | head -10
0000000 00000800 00000002 00000000 00000014
0000020 00000002 00000000 00000005 00000000
0000040 00000019 00008706 0000000c 00002710
0000060 000001f4 00000000 00001000 00000000
0000100 00000064 00000006 00000000 00000000
0000120 00000000 00002000 0000000a 00000001
0000140 4e554c4c 00000000 00000000 00000000
0000160 00002000 00000200 00001000 00000050
0000200 00000000 00000000 00000000 00000000
*
bash-3.00$

上面是我在solaris sparc平台上执行od命令用16进制读取文件的结果。

最左边用红色标记的是偏移量(八进制形式)。如:0000000表示偏移0,0000020表示偏移16(因为0000020(o)=16(d)),0000040表示偏移32。。。

od -t x4 master.dat 这条命令的意思是:用od读取master.dat文件的内容,用16进制的形式显示结果,并且每四个字节为一个显示单位,之间用空格分隔。一般都是每行显示16个字节的数据。

head -10 这条命令的意思是只显示前10行的数据。

在IBM-AIX上读取文件内容

-bash-3.2$ prtconf
System Model: IBM,7044-170
Machine Serial Number: 10D908C
Processor Type: PowerPC_POWER3
Processor Implementation Mode: POWER 630
Processor Version: PV_630
Number Of Processors: 1
Processor Clock Speed: 333 MHz
CPU Type: 64-bit
Kernel Type: 64-bit
以上为系统配置

-bash-3.2$ od -t x4 master.dat |head -10
0000000 00000000 00000000 00000000 00000000
*
0010000 00000800 00000002 00000000 00000014
0010020 00000002 00000000 00000005 00000000
0010040 00000019 00009481 0000000c 00002710
0010060 000001f4 00000000 00001000 00000000
0010100 00000064 00000006 00000000 00000000
0010120 00000000 00002000 0000000a 00000001
0010140 4e554c4c 00000000 00000000 00000000
0010160 00002000 00000200 00001000 00000050
-bash-3.2$

说明:中间的红色星号是od命令显示出来的,非人工添加。最左边红色一列表示偏移量(8进制形式)。第一行的偏移为0,并且结果好像都是0(ascii中的0)。然后第二行的偏移量就变成了4096(0010000(o)=4096(d) )。右边的数据是master.dat文件中的内容。以16进制的形式显示出来,每行16字节,每四个字节为一个单位,之间用空格分隔。

可以看出在ibm-aix powerpc平台上文件系统的数据是从4096偏移处开始存储的。前4096字节的内容为文件的控制信息。

用UltraEdit读取windows平台上的文件master.dat。

00000000 | 00 00 00 00 03 00 00 00 A6 00 00 00 63 00 00 00 | ...........c... | ....¦.c.
00000010 | 01 00 00 00 00 00 00 00 00 00 00 00 00 03 00 00 | ................ | ......̀.
00000020 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................ | ........
00000030 | 01 00 00 00 00 00 00 00 01 00 00 00 FF 00 00 00 | ............... | ......ÿ.
00000040 | 01 00 00 00 00 00 00 00 01 00 00 00 0F 00 03 00 | ................ | ........
00000050 | 02 00 00 00 00 00 00 00 02 00 00 00 FF 00 00 00 | ............... | ......ÿ.
说明:最左边一列表示偏移量(16进制数据)。中间的部分数据是文件master.dat的内容。

windows上的文件自偏移0开始存储,没有类似ibm-aix上的类似的前4096字节的控制内容。

在linux平台上读取文件的16进制数据的结果,我这边只有一个32bit的虚拟机。就不演示了。

大家可以对比上面的显示结果。发现文件系统或者裸设备的文件可用空间和上面介绍的常用UNIX的OS Reserved Size列表是一致的。

————————————————————————————————————
——— 本文为andkylee个人原创,请在尊重作者劳动成果的前提下进行转载;
——— 转载务必注明原始出处 : http://www.dbainfo.net
——— 关键字:unix hex file system raw device 文件系统 裸设备 od
————————————————————————————————————

  • 本文链接地址:http://www.dbainfo.net/unix-hex-read-from-filesystem-rawdevice-files.htm
  • 本文为dbainfo个人原创,请在尊重作者劳动成果的前提下进行转载;
  • 转载务必注明原始出处 : Sybase数据库技术,数据库恢复专家
  • 对《如何以十六进制的形式读unix平台下的文件系统与裸设备文件》有何疑问或见解,请在本文下方发表;
  • 对网站还有其他问题或建议,请提交在留言板,谢谢!
  • 目前还没有任何评论.
    :wink: :twisted: :roll: :oops: :mrgreen: :lol: :idea: :evil: :cry: :arrow: :?: :-| :-x :-o :-P :-D :-? :) :( :!: 8-O 8)