○ glibcの設定 4 Xen

・xenを起動するとtlsをdisabledにするよう、警告がでる場合があります
・CentOSのglibc.specにはxen用のライブラリを特別に作成する仕組みがあります
・xen用のライブラリは"-mno-tls-direct-seg-refs"オプション付で作成されます
・xen用のライブラリは/lib/i686/nosegnegディレクトリに作られます
・xen用のライブラリをシステムに認識させるように設定します

・ソースの取得、削除は省略します
・エディタ、ファイラーの操作は省略します
・Enterキーを省略します

・ログイン端末で "#" はroot、"$" は一般ユーザのプロンプトの記号です
・設定ファイルで "#" で始まる行はコメントとして解釈されます

○関連サイト

:glibc-2.12-1.209.el6.src.rpm (http://vault.centos.org/)

○参照ファイル

パッケージの追加
最初の設定 (Xen)

○リビルド環境

:OS CentOS 6.9
:selinux disabled
:kernel kernel-2.6.32-696.el6
:glibc glibc-2.12-1.209.el6
:インストール先 
:作業 ~/src ~/rpmbuild
:言語 LANG=en_US.UTF-8
:ユーザー rootで実行

・メンテナンスは一般ユーザから行います



○xen用のライブラリをシステムに認識させる

・xen-kernelの起動時に出されるWARNING

  ***************************************************************
  ***************************************************************
  ** WARNING: Currently emulating unsupported memory accesses  **
  **          in /lib/tls glibc libraries. The emulation is    **
  **          slow. To ensure full performance you should      **
  **          install a 'xen-friendly' (nosegneg) version of   **
  **          the library, or disable tls support by executing **
  **          the following as root:                           **
  **          mv /lib/tls /lib/tls.disabled                    **
  ** Offending process: iconvconfig.i68 (pid=1256)             **
  ***************************************************************
  ***************************************************************

・CentOSのglibc.specにはxen用のライブラリを特別に作成する仕組みがあります
・xen用のライブラリは"-mno-tls-direct-seg-refs"オプション付で作成されます
・xen用のライブラリは/lib/i686/nosegnegディレクトリに作られます

・xenのkernelにはnosegnegを利用する仕組みがあります

:linux-2.6.32.43-xen/arch/x86/vdso/vdso32/note.S

/*
 * This supplies .note.* sections to go into the PT_NOTE inside the vDSO text.
 * Here we can supply some information useful to userland.
 */

#include <linux/version.h>
#include <linux/elfnote.h>

/* Ideally this would use UTS_NAME, but using a quoted string here
   doesn't work. Remember to change this when changing the
   kernel's name. */
ELFNOTE_START(Linux, 0, "a")
	.long LINUX_VERSION_CODE
ELFNOTE_END

#if defined(CONFIG_X86_XEN) || defined(CONFIG_PARAVIRT_XEN)
/*
 * Add a special note telling glibc's dynamic linker a fake hardware
 * flavor that it will use to choose the search path for libraries in the
 * same way it uses real hardware capabilities like "mmx".
 * We supply "nosegneg" as the fake capability, to indicate that we
 * do not like negative offsets in instructions using segment overrides,
 * since we implement those inefficiently.  This makes it possible to
 * install libraries optimized to avoid those access patterns in someplace
 * like /lib/i686/tls/nosegneg.  Note that an /etc/ld.so.conf.d/file
 * corresponding to the bits here is needed to make ldconfig work right.
 * It should contain:
 *	hwcap 1 nosegneg
 * to match the mapping of bit to name that we give here.
 *
 * At runtime, the fake hardware feature will be considered to be present
 * if its bit is set in the mask word.  So, we start with the mask 0, and
 * at boot time we set VDSO_NOTE_NONEGSEG_BIT if running under Xen.
 */

#include "../../xen/vdso.h"	/* Defines VDSO_NOTE_NONEGSEG_BIT.  */

ELFNOTE_START(GNU, 2, "a")
	.long 1			/* ncaps */
#ifdef CONFIG_PARAVIRT_XEN
VDSO32_NOTE_MASK:		/* Symbol used by arch/x86/xen/setup.c */
	.long 0			/* mask */
#else
	.long 1 << VDSO_NOTE_NONEGSEG_BIT /* mask */
#endif
	.byte VDSO_NOTE_NONEGSEG_BIT; .asciz "nosegneg"	/* bit, name */
ELFNOTE_END
#endif

○nosegnegの仕組みを取り込む

・CentOS6ではkernelパッケージのインストールと共に設定されます
・/etc/ld.so.conf.d/kernel-2.6.32-*.i686.conf(複数)存在します
・kernel-2.6.32-220以降 'hwcap 1 nosegneg'に設定されています
・設定ファイルがない場合は、新しく作成します (下記)

・kernelパッケージを追加インストールする場合は注意
・新しい設定ファイルが/etc/ld.so.conf.dに追加されます
・hwcapの設定を統一しないとldconfigでエラーになります

[root@earth:~]
# echo 'hwcap 1 nosegneg' > /etc/ld.so.conf.d/xen-glibc.conf
# ldconfig

・または(xenのkernelにより)

# echo 'hwcap 0 nosegneg' > /etc/ld.so.conf.d/xen-glibc.conf
# ldconfig

・xen用のglibcライブラリを読み込む例

[root@earth:~]
# ldd /bin/bash
	linux-gate.so.1 =>  (0xb7741000)
	libtinfo.so.5 => /lib/libtinfo.so.5 (0x4ff4e000)
	libdl.so.2 => /lib/libdl.so.2 (0x4febc000)
	libc.so.6 => /lib/i686/nosegneg/libc.so.6 (0x4fd20000)
	/lib/ld-linux.so.2 (0x4fcfe000)

・例外(ライブラリを静的にリンクしている場合など)
・コマンド実行時にWARNINGが出る場合があります

[root@earth:~]
# ldd /usr/sbin/prelink
	not a dynamic executable



○glibcのリビルド

○glibc-2.12-1.209

・redhat系ではxenのサポートをしない方向です
・nosegneg が働かない場合は、全てのglibcパッケージを
・"-mno-tls-direct-seg-refs"オプション付で作成します

# cd ~/src
[root@earth:~/src]
# mkdir glibc
# rpm -ivh glibc-2.12-1.209.el6.src.rpm
# cd ~/rpmbuild/SPECS
[root@earth:~/rpmbuild/SPECS]

・glibc.specファイルの修正 (下記)

# vi glibc.spec

# rpmbuild -bb --clean --rmsource \
--define 'dist .mn' glibc.spec

:glibc.specの修正

・ix86,i686を"no-tls-direct-seg-refs"オプション付きでコンパイルします

・省略

%build
GCC=gcc
GXX=g++
%ifarch %{ix86}
BuildFlags="-march=%{_target_cpu} -mtune=generic -mno-tls-direct-seg-refs"
%endif
%ifarch i686
BuildFlags="-march=i686 -mtune=generic -mno-tls-direct-seg-refs"
%endif
%ifarch i386 i486 i586
BuildFlags="$BuildFlags -mno-tls-direct-seg-refs"
%endif

・省略


○ Copyright(c) 528p.com All Rights Reserved.