libschost.so.1
libschost.so.1 共享对象提供一种机制,通过该机制可为启动的进程及其后代进程选择性配置物理主机名。
在 Oracle Solaris Cluster 环境中,应用程序可能会在故障转移或切换后尝试访问同一主机名。因此,故障转移或切换失败,因为在故障转移或切换之后物理主机名进行了更改。在这种情况下,应用程序数据服务可以使用 libschost.so.1 共享对象为应用程序提供逻辑主机名,而不是物理主机名。
要启用 libschost.so.1,您需要设置 SC_LHOSTNAME 环境变量及以下两种环境变量:
LD_PRELOAD_32=$LD_PRELOAD_32:/usr/cluster/lib/libschost.so.1 LD_PRELOAD_64=$LD_PRELOAD_64:/usr/cluster/lib/64/libschost.so.1
通过设置 LD_PRELOAD_32 和 LD_PRELOAD_64 环境变量,您可确保 libschost.so.1 共享对象可与 32 位和 64 位应用程序协同工作。
运行时链接程序访问 32 位对象的默认受信目录 /usr/lib/secure 和 64 位对象的默认受信目录 /usr/lib/secure/64。如果您的安全应用程序使用 libschost.so.1 共享对象,您需要确保从受信目录中访问 libschost.so.1 共享对象。
要执行此操作,请为 32 位应用程序创建从 /usr/cluster/lib/libschost.so.1 到 /usr/lib/secure/libschost.so.1 的符号链接,或为 64 位应用程序创建从 /usr/cluster/lib/64/libschost.so.1 到 /usr/lib/secure/64/libschost.so.1 的符号链接。
在创建这些符号链接之后,LD_PRELOAD_32 和 LD_PRELOAD_64 环境变量将使用受信目录中的 libschost.so.1 共享对象。
您还可以使用 crle 命令指定其他受信目录,或更改安全应用程序的默认受信目录。请参见 crle(1) 手册页。
预装入之后,libschost.so.1 共享对象读取以下环境变量并将其作为主机名返回。
SC_LHOSTNAME 指定逻辑主机名。指定的主机名可用于所有启动的进程和后代进程。
hostname 值最多可为 MAXHOSTNAMELEN 个字符长度。MAXHOSTNAMELEN 常量在 netdb.h 头文件中定义为 256 个字符。
以下示例中的 C 代码将为主机名配置逻辑主机名。该示例包括调用 scds_get_rs_hostnames() Oracle Solaris Cluster 函数,还包括引用 scds_handle_t 和 scds_net_resource_list_t Oracle Solaris Cluster 数据结构。
scds_get_rs_hostnames() 函数提供资源所使用的主机名列表。代码将该列表中的第一个主机名值分配给 SC_LHOSTNAME 环境变量。
在执行以下代码后启动的任何应用程序均将获得一个逻辑主机名,而不是物理主机名。
/* 13 bytes to hold "SC_LHOSTNAME=" string */ #define HOSTLENGTH (MAXHOSTNAMELEN + 13) /* 14 bytes to hold "LD_PRELOAD_XX=" string */ #define PATHLENGTH (MAXPATHLEN + 14) char lhostname[HOSTLENGTH], ld_32[PATHLENGTH], \ ld_64[PATHLENGTH]; scds_get_rs_hostnames(scds_handle, &snrlp); if (snrlp != NULL && snrlp->num_netresources != 0) { snprintf(lhostname, HOSTLENGTH, "SC_LHOSTNAME=%s", \ snrlp->netresources[0].hostnames[0]); putenv(lhostname); } /* Setting LD_PRELOAD_32 environment variable */ if (getenv("LD_PRELOAD_32") == NULL) snprintf(ld_32, PATHLENGTH, "LD_PRELOAD_32=" "/usr/cluster/lib/libschost.so.1"); else snprintf(ld_32, PATHLENGTH, "LD_PRELOAD_32=%s:" "/usr/cluster/lib/libschost.so.1", \ getenv("LD_PRELOAD_32")); putenv(ld_32); /* Setting LD_PRELOAD_64 environment variable */ if (getenv("LD_PRELOAD_64") == NULL) snprintf(ld_64, PATHLENGTH, "LD_PRELOAD_64=" "/usr/cluster/lib/64/libschost.so.1"); else snprintf(ld_64, PATHLENGTH, "LD_PRELOAD_64=%s:/usr/cluster/lib/" "64/libschost.so.1", getenv("LD_PRELOAD_64")); putenv(ld_64);示例 2 使用 Shell 命令在运行时为主机名配置逻辑主机名
以下示例中的 shell 命令显示了应用程序数据服务如何使用 gethostnames 命令为主机名配置逻辑主机名。gethostnames 命令采用以下参数:
–R resource-name
–G resourcegroup-name
–T resourcetype-name
gethostnames 命令返回与该资源关联的所有逻辑主机名,并以分号 (;) 分隔。命令将该列表中的第一个主机名值分配给 SC_LHOSTNAME 环境变量。
phys-schost-1$ LD_PRELOAD_32=$LD_PRELOAD_32:/usr/cluster/lib/libschost.so.1 phys-schost-1$ LD_PRELOAD_64=$LD_PRELOAD_64:/usr/cluster/lib/64/libschost.so.1 phys-schost-1$ SC_LHOSTNAME=`/usr/cluster/lib/scdsbuilder/src/scripts/gethostnames \ -R nfs-r -G nfs-rg -T SUNW.nfs:3.1 |cut -f1 -d","` phys-schost-1$ export LD_PRELOAD_32 LD_PRELOAD_64 SC_LHOSTNAME示例 3 使用 Shell 命令为安全应用程序配置逻辑主机名
以下示例中的 shell 命令将配置逻辑主机名。在执行以下 shell 命令后启动的任何安全应用程序均将获得 SC_LHOSTNAME 环境变量值(即,逻辑主机名),而不是物理主机名。
phys-schost-1$ cd /usr/lib/secure phys-schost-1$ ln -s /usr/cluster/lib/libschost.so.1 . phys-schost-1$ cd /usr/lib/secure/64 phys-schost-1$ ln -s /usr/cluster/lib/64/libschost.so.1 . phys-schost-1$ LD_PRELOAD_32=$LD_PRELOAD_32:/usr/lib/secure/libschost.so.1 phys-schost-1$ LD_PRELOAD_64=$LD_PRELOAD_64:/usr/lib/secure/64/libschost.so.1 phys-schost-1$ SC_LHOSTNAME=test phys-schost-1$ export LD_PRELOAD_32 LD_PRELOAD_64 SC_LHOSTNAME
32 位应用程序的默认共享对象位置
64 位应用程序的默认共享对象位置
有关以下属性的描述,请参见 attributes(5):
|
crle(1)、cut(1)、hostname(1)、ld(1)、ld.so.1(1)、proc(1)、uname(1)、exec(2)、sysinfo(2)、uname(2)、gethostname(3C)、putenv(3C)、snprintf(3C)、system(3C)、proc(4)
会继承逻辑主机名。
通过调用以下命令或函数获取主机名的用户程序可以获得逻辑主机名,而不是物理主机名:
hostname 命令
uname 命令
uname() 函数
sysinfo() 函数
gethostname() 函数
通过调用其他命令或函数获取主机名的用户程序无法获得逻辑主机名。