您的位置:首页 > 其它

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

2010-03-18 09:35 274 查看
----------------------------------------------------------------------------

---- 本文为andkylee个人原创,请在尊重作者劳动成果的前提下进行转载;

---- 转载务必注明原始出处
:
http://blog.csdn.net/andkylee

---- 关键字: unix hex file system raw device 文件系统 裸设备 od

----------------------------------------------------------------------------





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


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列表是一致的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐