- 论坛徽章:
- 0
|
本帖最后由 duanjigang 于 2012-11-15 11:50 编辑
接着。
首先看 Lead 信息。
rpm-devel 这个包中 的文件 /usr/include/rpm/rpmlib.h 中 对 rpmlead
是如是定义的:
- unsigned char magic[4];
- unsigned char major;
- unsigned char minor;
- short type;
- short archnum;
- char name[66];
- short osnum;
- short signature_type; /*!< Signature header type (RPMSIG_HEADERSIG) */
- /*@unused@*/ char reserved[16]; /*!< Pad to 96 bytes -- 8 byte aligned! */
复制代码 通过字面意思大概能看到几分意思,最起码这个结构体包含了包的名字,os 类型, arch数,包类型(二进制包还是源码包)。
前四个字节,magic,是表示这个文件是否是RPM文件的标识,file 命令和 rpm 命令都是靠这前四个字节来判断的
比如:
- file test-rpm-1.1.1-15.x86_64.rpm
- test-rpm-1.1.1-15.x86_64.rpm: RPM v3 bin i386 test-rpm-1.1.1-15
复制代码 基本上就是从 lead 中获取了主要信息输出的。
目前,这个magic 数组是 “edab eedb”,可以通过 ultraedit 打开一个RPM 文件 查看前四个字节,如图示:
接下来两个字节 major 和 minor 是标识 RPM 文件格式的版本的,这个和 TCP/IP 协议的版本一样,就像网络报文中的 version 大多为 4 和 6 一样。
RPM文件中能看到的大多数值都是 major = 3 minor = 0, 也就是 3.0 版本的 RPM 文件。
在上图中同样能看到。
下来是 RPM 文件的类型 type,0 是 二进制 RPM 文件,1 是源码二进制文件,标识了RPM中存的是二进制程序还是源码包。
下来的archnum 是用标识 包将要安装的架构信息的,1 标识i368,在最新的 rpm version 3.0 中看到的 这个字段在 x86_64, noarch 和 i386 中都是0,可能已经不用这个字段了,而是采用header来存储,这个后面再说。
66个字符的 name 是包的名字。
osnum 是标识 操作系统的, 1 标识是 Linux,2 是 IRIX,这些对应的常量定义能在文件 /usr/lib/rpm/rpmrc
中看到:
- os_canon: Linux: Linux 1
- os_canon: IRIX: Irix 2
- # This is wrong
- os_canon: SunOS5: solaris 3
- os_canon: SunOS4: SunOS 4
- os_canon: AmigaOS: AmigaOS 5
- os_canon: AIX: AIX 5
- os_canon: HP-UX: hpux10 6
- os_canon: OSF1: osf1 7
- os_canon: osf4.0: osf1 7
- os_canon: osf3.2: osf1 7
- os_canon: FreeBSD: FreeBSD 8
- os_canon: SCO_SV: SCO_SV3.2v5.0.2 9
- os_canon: IRIX64: Irix64 10
- os_canon: NEXTSTEP: NextStep 11
- os_canon: BSD_OS: bsdi 12
- os_canon: machten: machten 13
- os_canon: CYGWIN32_NT: cygwin32 14
- os_canon: CYGWIN32_95: cygwin32 15
- os_canon: UNIX_SV: MP_RAS: 16
- os_canon: MiNT: FreeMiNT 17
- os_canon: OS/390: OS/390 18
- os_canon: VM/ESA: VM/ESA 19
复制代码 signature_type 字段标识了下一个 数据块 signature 的类型,在 RPM version 3.0 中,这个变量的值是 5. |
|