Board logo

标题: LSB 简介(3) [打印本页]

作者: look_w    时间: 2018-5-18 22:16     标题: LSB 简介(3)

实例:lsb_release 的规范定义和实现我们知道,在 /etc 目录中有一个文件可以查看当前系统的版本信息,在 RHEL4U3(Red Hat Enterprise Linux 4 Update 3)上这个文件是 /etc/redhat-release:
1
2
# cat /etc/redhat-release
Red Hat Enterprise Linux ES release 4 (Nahant Update 3)




在 SLES9SP3(SUSE LINUX Enterprise Server 9 Service Pack 3)上这个文件是 /etc/SuSE-release:
1
2
3
4
# cat /etc/SuSE-release
SUSE LINUX Enterprise Server 9 (i586)
VERSION = 9
PATCHLEVEL = 3




我们可以看出,在这两个发行版上,不但使用的文件不同,文件的内容和格式也完全不同。如果开发人员在自己的程序中使用这些信息,他们就很难使用一个统一的接口来获取发行版本的信息,因此必须为每种平台都定制一个脚本或开发一个程序才能实现这种功能,这无疑会增加很多工作量,而且所生成的程序的可移植性也会很差。
为了解决这个问题,LSB 规范中增加了对 lsb_release 接口及其输出格式的定义:lsb_release 的功能是打印与发行版本相关的信息,必须实现以下选项(详细规范的定义请参考http://refspecs.freestandards.or ... ric/lsbrelease.html):
表1. LSB对lsb_release 接口定义我们前面已经介绍过,通过 LSB 认证发行版或软件可以得到 FSG/LSB 的授权,贴上 "LSB Certified"的标签进行销售。实际上,在通过 LSB 认证的系统上,我们可以看到一个与 LSB 有关的包,其中包含了 LSB 规范中对 lsb_release 接口规范的实现。lsb_release 是 LSB-Core-generic 规范中要求的一个接口,各种平台(目前可以支持的 7 种平台: IA32、IA64、X86_64、PPC32、PPC64、S390 和 S390x)上都应该提供这个接口的实现。在 RHEL4U3 上,我们可以找到一个名为 redhat-lsb 的包(RHEL4U3 遵守的是 LSB 3.0 版本的规范,因此这个包的版本是 redhat-lsb-3.0-8.EL),该包的内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# rpm -ql redhat-lsb
/bin/mailx
/etc/lsb-release.d
/etc/lsb-release.d/core-3.0-ia32
/etc/lsb-release.d/core-3.0-noarch
/etc/lsb-release.d/graphics-3.0-ia32
/etc/lsb-release.d/graphics-3.0-noarch
/etc/redhat-lsb
/etc/redhat-lsb/lsb_killproc
/etc/redhat-lsb/lsb_log_message
/etc/redhat-lsb/lsb_pidofproc
/etc/redhat-lsb/lsb_start_daemon
/lib/ld-lsb.so.3
/lib/lsb
/lib/lsb/init-functions
/usr/bin/lsb_release
/usr/lib/lsb
/usr/lib/lsb/install_initd
/usr/lib/lsb/remove_initd
/usr/sbin/redhat_lsb_trigger.i386
/usr/share/man/man1/lsb_release.1.gz




而在 SLES9SP3 中,这个包的名字是 lsb(lsb-3.0-4.8),它包含的内容如下:
1
2
3
4
5
6
7
8
9
10
11
# rpm -ql lsb
/etc/lsb-release
/etc/lsb-release.d
/etc/lsb-release.d/graphics-2.0-ia32
/etc/lsb-release.d/graphics-2.0-noarch
/etc/lsb-release.d/graphics-3.0-ia32
/etc/lsb-release.d/graphics-3.0-noarch
/lib/ld-lsb.so.2
/lib/ld-lsb.so.3
/usr/bin/lsb_release
/usr/share/man/man1/lsb_release.1.gz




我们可以看出,在这两个发行版上的两个包中存在一些共同的文件:
其中 /lib/ld-lsb.so.3 在两个系统上都是一个符号链接:
1
2
# ls -l /lib/ld-lsb.so.3
lrwxrwxrwx  1 root root 13 Apr 20 03:04 /lib/ld-lsb.so.3 -> ld-linux.so.2




系统中提供的大部分应用程序都是链接到了 ld-linux.so.2 上,但是兼容 LSB 标准的应用程序都可以链接到 ld-lsb.so.3 上(由于 SLES9SP3 还兼容 LSB 2.0 的规范,因此系统中还存在一个 /lib/ld-lsb.so.2 库,也是指向 ld-linux.so.2 的符号链接;而 RHEL4U3 不兼容 LSB 2.0 的规范,因此没有这个库)。
而 /usr/bin/lsb_release 就是对 lsb_release 接口的具体实现,在这两个系统上都是一个 shell 脚本。下面我们分别在这两个系统上执行 lsb_release -a 命令,在 RHEL4U3 上的结果如下:
1
2
3
4
5
6
7
# /usr/bin/lsb_release -a
LSB Version:   
:core-3.0-ia32:core-3.0-noarch:graphics-3.0-ia32:graphics-3.0-noarch:log
Distributor ID: RedHatEnterpriseES
Description:    Red Hat Enterprise Linux ES release 4 (Nahant Update 3)
Release:        4
Codename:       NahantUpdate3




在 SLES9SP3 上的结果如下:
1
2
3
4
5
6
7
8
# /usr/bin/lsb_release -a
LSB Version:   
core-2.0-noarch:core-3.0-noarch:core-2.0-ia32:core-3.0-ia32:graphics-2.0-ia32:
graphics-2.0-noarch:graphics-3.0-ia32:graphics-3.0-noarch
Distributor ID: SUSE LINUX
Description:    SUSE LINUX Enterprise Server 9 (i586)
Release:        9
Codename:       n/a




我们可以看出,在这两个系统上,lsb_release 命令的位置、用法、输出格式都是相同的,因此开发人员可以使用它编写兼容性非常好的程序。
再看一下在这两个系统上与 lsb_release 有关的包,我们会发现二者之间有一些区别,例如在 SLES9SP3 上存在一个 /etc/lsb-release 文件,其中存放的是所遵循的 LSB 标准的版本,内容如下:
1
2
# cat /etc/lsb-release
LSB_VERSION="core-2.0-noarch:core-3.0-noarch:core-2.0-ia32:core-3.0-ia32"




而在 RHEL4U3 上并没有这个文件,但是在 /etc/lsb-release.d 目录中的文件却比 SLES9SP3 上多:
而在 SLES9SP3 上只有以 graphics 开头的文件。仔细查看一下 /usr/bin/lsb_release的实现我们就会发现,所遵守的 LSB 规范的列表既可以保存在 /etc/lsb-release 文件中,也可以以文件的形式放到 /etc/lsb-release.d 目录中。因此 LSB 只是对接口定义进行了规范,但却没有限定具体的实现,这样既可以为发行版供应商提供充分的自由,又为应用程序开发人员提供了一致的接口,可以得到最大限度的推广和应用。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0