linuxfromscratch:12.1:075-glibc-2.39

Linux From Scratch - Version 12.1-systemd
Chapter 8. Installing Basic System Software
이전 위로 / 처음으로 다음
Iana-Etc-20240125 Zlib-1.3.1

Glibc 패키지에는 기본 C 라이브러리가 포함되어 있습니다. 이 라이브러리는 메모리 할당, 디렉터리 검색, 파일 열기 및 닫기, 파일 읽기 및 쓰기, 문자열 처리, 패턴 일치, 연산 등을 위한 기본 루틴을 제공합니다.

  • 빌드 시간: 12 SBU
  • 디스크 공간: 3.1GB

일부 Glibc 프로그램은 런타임 데이터를 저장할 때 FHS와 호환되지 않는 /var/db 디렉터리를 사용합니다. 다음과 같이 패치를 적용하여 이러한 프로그램이 런타임 데이터를 FHS 호환 위치에 저장하도록 하세요.

patch -Np1 -i ../glibc-2.39-fhs-1.patch

Glibc 문서에서는 별도의 디렉터리에서 Glibc를 빌드할 것을 권장합니다.

mkdir -v build
cd       build

ldconfigsln 유틸리티가 /usr/sbin에 설치되도록 합니다.

echo "rootsbindir=/usr/sbin" > configparms

Glibc 컴파일을 준비합니다.

../configure --prefix=/usr                            \
             --disable-werror                         \
             --enable-kernel=4.19                     \
             --enable-stack-protector=strong          \
             --disable-nscd                           \
             libc_cv_slibdir=/usr/lib

configure 옵션 설명

  • –disable-werror
    GCC에 전달된 -Werror 옵션을 비활성화합니다. 이 옵션은 테스트 스위트를 실행하는 데 필요합니다.
  • –enable-kernel=4.19
    빌드 시스템에 4.19 이후 커널과 함께 이 Glibc를 사용할 수 있음을 알려줍니다. 즉, 이후 버전에서 도입된 시스템 호출을 사용할 수 없는 경우에 대비하여 해결 방법을 생성합니다.
  • –enable-stack-protector=strong 스택 스매싱 공격과 같은 버퍼 오버플로우를 검사하는 코드를 추가하여 시스템 보안을 강화합니다. Glibc는 항상 GCC의 기본값을 명시적으로 재정의하므로 GCC에 –enable-default-ssp를 이미 지정했더라도 이 옵션은 여전히 필요합니다.
  • –disable-nscd 더 이상 사용되지 않는 이름 서비스 캐시 데몬을 빌드하지 않습니다.
  • libc_cv_slibdir=/usr/lib
    모든 시스템에 대해 올바른 라이브러리를 설정합니다. lib64는 사용하지 않는 것이 좋습니다.

패키지를 컴파일합니다

make

중요
이 섹션에서는 Glibc에 대한 테스트 스위트가 매우 중요합니다. 어떤 상황에서도 건너뛰지 마세요.

통상적으로 몇 가지 테스트는 통과하지 못합니다. 아래에 나열된 테스트 실패는 일반적으로 무시해도 안전합니다.

make check

몇 가지 테스트 실패가 표시될 수 있습니다. Glibc 테스트 스위트는 호스트 시스템에 따라 다소 달라집니다. 5000개가 넘는 테스트 중 몇 가지 실패는 일반적으로 무시할 수 있습니다. 다음은 최신 버전의 LFS에서 가장 흔히 볼 수 있는 테스트 실패 목록입니다:

  • io/tst-lchmod는 LFS chroot 환경에서 실패하는 것으로 알려져 있습니다.
  • 일부 테스트(예: nss/tst-nss-files-hosts-multinptl/tst-thread-affinity*)는 시간 초과로 인해 실패하는 것으로 알려져 있습니다 (특히 시스템이 상대적으로 느리거나 여러 병렬 make 작업으로 테스트 스위트를 실행하는 경우). 이러한 테스트는 다음을 통해 식별할 수 있습니다.
    grep "Timed out" -l $(find -name \*.out)

    TIMEOUTFACTOR=<factor> make test t=<test name>을 사용하여 테스트 제한시간을 늘려서 단일 테스트를 다시 실행할 수 있습니다. 예를 들어, TIMEOUTFACTOR=10 make test t=nss/tst-nss-files-hosts-multi는 원래 시간 제한의 10배를 적용하여 nss/tst-nss-files-hosts-multi를 다시 실행합니다.
  • 또한 일부 테스트는 비교적 오래된 CPU 모델(예: elf/tst-cpu-features-cpuinfo) 또는 호스트 커널 버전(예: stdlib/tst-arc4random-thread)에서 실패할 수 있습니다.

Glibc의 설치 단계에서 /etc/ld.so.conf가 없다는 경고가 발생합니다. 무해한 경고이지만 이를 방지하려면

touch /etc/ld.so.conf

최신 Glibc 구성에서 실패하는 오래된 무결성 검사를 건너뛰도록 메이크파일을 수정합니다:

sed '/test-installation/s@$(PERL)@echo not running@' -i ../Makefile

중요
실행 중인 LFS 시스템에서 Glibc를 마이너 버전 업그레이드를 하는 경우(예: Glibc-2.36에서 Glibc-2.39로) 시스템 중단을 방지하기 위해 몇 가지 추가 예방 조치를 취해야 합니다.

  • 11.0 이전 버전 한정으로 LFS 시스템에서 Glibc를 업그레이드하는 것은 지원되지 않습니다. 이러한 구형 LFS 시스템을 실행 중이지만 최신 Glibc가 필요한 경우 LFS를 다시 빌드해야 합니다.
  • 12.0 이전 버전 한정으로 이전 LFS 시스템에서 업그레이드하는 경우 8.26 "Libxcrypt-4.4.36"에 따라 Libxcrypt를 설치하세요. 일반적인 Libxcrypt 설치와 더불어, Libxcrypt 섹션의 참고 사항에 따라 libcrypt.so.1*을 설치해야 합니다(이전 Glibc의 libcrypt.so.1을 대체).
  • 12.1 이전 버전 한정으로 이전 LFS 시스템에서 업그레이드하는 경우 nscd 프로그램을 제거하세요.
    rm -f /usr/sbin/nscd
    이 시스템(LFS 12.1 이전 한정)이 Systemd를 기반으로 하는 경우 nscd 서비스를 비활성화하고 중지해야 합니다.
    systemctl disable --now nscd
  • 커널이 4.19보다 오래된 경우 업그레이드하고 재부팅하거나(uname -r로 현재 버전을 확인), 어쨌든 업그레이드하려면 10.3 "Linux-6.7.4"의 지침에 따라 업그레이드합니다.
  • 커널 API 헤더가 4.19보다 오래된 경우 업그레이드합니다(cat /usr/include/linux/version.h로 현재 버전을 확인) 또는 5.4. "Linux-6.7.4 API 헤더"(단, cp 명령에서 $LFS를 제거)에 따라 업그레이드합니다.
  • 한번의 install 명령어를 사용하여 DESTDIR 설치를 수행하고 시스템에서 Glibc 공유 라이브러리를 업그레이드합니다.
    make DESTDIR=$PWD/dest install
    install -vm755 dest/usr/lib/*.so.* /usr/lib

수행 중인 작업을 완전히 이해하지 않는 한 위의 단계를 엄격하게 따라야 합니다. 예기치 않게 틀어지는 일이 발생하면 시스템을 완전히 사용할 수 없게 될 수 있습니다. 분명하게 경고 했습니다.

이어서 아래에 나오는 make install 명령, /usr/bin/ldd에 대한 sed 명령, 로캘을 설치하는 명령을 계속 실행합니다. 완료되면 즉시 시스템을 재부팅합니다.

패키지를 설치합니다.

make install

ldd 스크립트에서 실행 로더의 하드코딩된 경로를 수정합니다.

sed '/RTLDLIST=/s@/usr@@g' -i /usr/bin/ldd

다음으로 시스템이 다른 언어로 응답하도록 할 수 있는 로케일을 설치합니다. 이러한 로캘이 반드시 필요한 것은 아니지만 일부가 누락된 경우 몇몇 패키지의 테스트 스위트는 중요한 테스트 케이스를 건너뜁니다.

개별 로캘은 localedef 프로그램을 사용하여 설치할 수 있습니다. 예를 들어, 아래의 두 번째 localedef 명령은 /usr/share/i18n/locales/cs_CZ 문자셋 독립 로캘 정의와 /usr/share/i18n/charmaps/UTF-8.gz charmap 정의를 결합하고 그 결과를 /usr/lib/locale/locale-archive 파일에 추가합니다. 다음 지침은 최적의 테스트 적용 범위에 필요한 최소한의 로캘 세트를 설치합니다:

mkdir -pv /usr/lib/locale
localedef -i C -f UTF-8 C.UTF-8
localedef -i cs_CZ -f UTF-8 cs_CZ.UTF-8
localedef -i de_DE -f ISO-8859-1 de_DE
localedef -i de_DE@euro -f ISO-8859-15 de_DE@euro
localedef -i de_DE -f UTF-8 de_DE.UTF-8
localedef -i el_GR -f ISO-8859-7 el_GR
localedef -i en_GB -f ISO-8859-1 en_GB
localedef -i en_GB -f UTF-8 en_GB.UTF-8
localedef -i en_HK -f ISO-8859-1 en_HK
localedef -i en_PH -f ISO-8859-1 en_PH
localedef -i en_US -f ISO-8859-1 en_US
localedef -i en_US -f UTF-8 en_US.UTF-8
localedef -i es_ES -f ISO-8859-15 es_ES@euro
localedef -i es_MX -f ISO-8859-1 es_MX
localedef -i fa_IR -f UTF-8 fa_IR
localedef -i fr_FR -f ISO-8859-1 fr_FR
localedef -i fr_FR@euro -f ISO-8859-15 fr_FR@euro
localedef -i fr_FR -f UTF-8 fr_FR.UTF-8
localedef -i is_IS -f ISO-8859-1 is_IS
localedef -i is_IS -f UTF-8 is_IS.UTF-8
localedef -i it_IT -f ISO-8859-1 it_IT
localedef -i it_IT -f ISO-8859-15 it_IT@euro
localedef -i it_IT -f UTF-8 it_IT.UTF-8
localedef -i ja_JP -f EUC-JP ja_JP
localedef -i ja_JP -f SHIFT_JIS ja_JP.SJIS 2> /dev/null || true
localedef -i ja_JP -f UTF-8 ja_JP.UTF-8
localedef -i nl_NL@euro -f ISO-8859-15 nl_NL@euro
localedef -i ru_RU -f KOI8-R ru_RU.KOI8-R
localedef -i ru_RU -f UTF-8 ru_RU.UTF-8
localedef -i se_NO -f UTF-8 se_NO.UTF-8
localedef -i ta_IN -f UTF-8 ta_IN.UTF-8
localedef -i tr_TR -f UTF-8 tr_TR.UTF-8
localedef -i zh_CN -f GB18030 zh_CN.GB18030
localedef -i zh_HK -f BIG5-HKSCS zh_HK.BIG5-HKSCS
localedef -i zh_TW -f UTF-8 zh_TW.UTF-8

또한 자신의 국가, 언어 및 문자 집합에 맞는 로케일을 설치하세요.

다른 방법으로는 시간이 오래 걸리리지만 다음 명령을 사용하여 glibc-2.39/localedata/SUPPORTED 파일에 나열된 모든 로캘을 한 번에 설치하는 방법도 있습니다.(위에 나열된 모든 로캘을 비롯하여 더 많은 로캘이 포함되어 있음).

make localedata/install-locales

그런 다음 glibc-2.39/localedata/SUPPORTED 파일에 나열되지 않은 로캘이 필요할 때 localedef 명령을 사용하여 생성 및 설치합니다. 예를 들어, 이 장의 뒷부분에 나오는 일부 테스트에는 다음 두 개의 로캘이 필요합니다.

localedef -i C -f UTF-8 C.UTF-8
localedef -i ja_JP -f SHIFT_JIS ja_JP.SJIS 2> /dev/null || true

참고
이제 Glibc는 국제화된 도메인 이름을 확인할 때 libidn2를 사용합니다. 이는 런타임 종속성입니다. 이 기능이 필요한 경우 libidn2 설치 지침은 BLFS libidn2 페이지에 나와 있습니다.


8.5.2.1. nsswitch.conf 추가하기

Glibc 기본값은 네트워크 환경에서 제대로 작동하지 않으므로 /etc/nsswitch.conf 파일을 만들어야 합니다.

다음과 같이 /etc/nsswitch.conf 파일을 새로 만듭니다.

cat > /etc/nsswitch.conf << "EOF"
# Begin /etc/nsswitch.conf

passwd: files systemd
group: files systemd
shadow: files systemd

hosts: mymachines resolve [!UNAVAIL=return] files myhostname dns
networks: files

protocols: files
services: files
ethers: files
rpc: files

# End /etc/nsswitch.conf
EOF

8.5.2.2. 시간대 데이터 추가하기

다음과 같이 시간대 데이터를 설치하고 설정합니다.

tar -xf ../../tzdata2024a.tar.gz

ZONEINFO=/usr/share/zoneinfo
mkdir -pv $ZONEINFO/{posix,right}

for tz in etcetera southamerica northamerica europe africa antarctica  \
          asia australasia backward; do
    zic -L /dev/null   -d $ZONEINFO       ${tz}
    zic -L /dev/null   -d $ZONEINFO/posix ${tz}
    zic -L leapseconds -d $ZONEINFO/right ${tz}
done

cp -v zone.tab zone1970.tab iso3166.tab $ZONEINFO
zic -d $ZONEINFO -p America/New_York
unset ZONEINFO

zic 명령 설명

  • zic -L /dev/null …
    윤초가 없는 POSIX 시간대가 생성됩니다. 이 시간대를 zoneinfozoneinfo/posix에 모두 넣는 것이 일반적입니다. 그렇지 않으면 다양한 테스트 스위트에서 오류를 보고합니다. 용량이 제한적이고 시간대를 업데이트하지 않는 임베디드 시스템에서는 posix 디렉터리를 사용하지 않음으로써 1.9MB를 절약할 수 있지만 일부 애플리케이션이나 테스트 스위트에서 오류가 발생할 수 있습니다.
  • zic -L leapseconds …
    윤초를 포함한 올바른 표준 시간대를 만듭니다. 용량이 제한적이고 시간대를 업데이트할 계획이 없거나 정확한 시간이 필요하지 않은 임베디드 시스템에서는 right 디렉터리를 생략하여 1.9MB를 절약할 수 있습니다.
  • zic … -p …
    posixrules 파일이 생성됩니다. POSIX에서는 서머타임 규칙이 미국 규칙을 따르도록 요구하기 때문에 뉴욕을 사용합니다.

현지 시간대를 결정하는 한 가지 방법은 다음 스크립트를 실행하는 것입니다.

tzselect

위치에 대한 몇 가지 질문에 답하면 스크립트가 시간대 이름(예: America/Edmonton)을 출력합니다. 스크립트에서 식별하지는 않지만 사용할 수 있는 Canada/Eastern 또는 EST5EDT와 같은 다른 표준 시간대도 /usr/share/zoneinfo에 포함되어 있습니다.

이어서 다음과 같이 /etc/localtime 파일을 만듭니다.

ln -sfv /usr/share/zoneinfo/<xxx> /etc/localtime
<xxx>를 선택한 시간대의 이름(예: Canada/Eastern)으로 바꿉니다.

8.5.2.3. 동적 로더 구성

기본적으로 동적 로더(/lib/ld-linux.so.2)는 프로그램이 실행될 때 /usr/lib에서 프로그램에 필요한 동적 라이브러리를 검색합니다. 그러나 /usr/lib 이외의 디렉터리에 라이브러리가 있는 경우 동적 로더가 해당 라이브러리를 찾을 수 있도록 /etc/ld.so.conf 파일에 해당 라이브러리를 추가해야 합니다. 일반적으로 추가 라이브러리가 설치되는 두 개의 디렉터리는 /usr/local/lib/opt/lib이므로 동적 로더의 검색 경로에 해당 디렉터리를 추가하세요.

다음을 실행하여 /etc/ld.so.conf 파일을 새로 만듭니다:

cat > /etc/ld.so.conf << "EOF"
# Begin /etc/ld.so.conf
/usr/local/lib
/opt/lib

EOF

원하는 경우 동적 로더는 디렉터리를 검색하여 거기서 찾은 파일의 내용을 포함할 수도 있습니다. 일반적으로 이 디렉터리의 파일은 원하는 라이브러리 경로를 지정하는 한 줄로 구성됩니다. 이 기능을 사용하려면 다음 명령을 실행하세요.

cat >> /etc/ld.so.conf << "EOF"
# Add an include directory
include /etc/ld.so.conf.d/*.conf

EOF
mkdir -pv /etc/ld.so.conf.d


  • 설치된 프로그램:
    gencat, getconf, getent, iconv, iconvconfig, ldconfig, ldd, lddlibc4, ld.so(ld-linux-x86-64.so.2 또는 ld-linux.so.2에 심볼 링크), locale, localedef, makedb, mtrace, pcprofiledump, pldd, sln, sotruss, sprof, tzselect, xtrace, zdump, zic
  • 설치된 라이브러리:
    ld-linux-x86-64.so.2, ld-linux.so.2, libBrokenLocale.{a,so}, libanl.{a,so}, libc.{a,so}, libc_nonshared.a, libc_malloc_debug.so, libdl.{a,so.2 }, libg.a, libm.{a,so}, libmcheck.a, libmemusage.so, libmvec.{a,so}, libnsl.so.1, libnss_compat.so, libnss_dns.so, libnss_files.so, libnss_hesiod.so, libpcprofile.so, libpthread.{a,so.0}, libresolv.{a,so}, librt.{a,so.1}, libthread_db.so, libutil.{a,so.1}
  • 설치된 디렉터리:
    /usr/include/arpa, /usr/include/bits, /usr/include/gnu, /usr/include/net, /usr/include/netash, /usr/include/netatalk, /usr/include/netax25, /usr/include/neteconet, /usr/include/netinet, /usr/include/netipx, /usr/include/netiucv, /usr/include/netpacket, /usr/include/netrom, /usr/include/netrose, /usr/include/nfs, /usr/include/protocols, /usr/include/rpc, /usr/include/sys, /usr/lib/audit, /usr/lib/gconv, /usr/lib/locale, /usr/libexec/getconf, /usr/share/i18n, /usr/share/zoneinfo, /var/lib/nss_db

간략한 설명

  • gencat
    메시지 카탈로그를 생성합니다.
  • getconf
    파일 시스템 특정 변수에 대한 시스템 구성 값을 표시합니다.
  • getent
    관리 데이터베이스에서 항목을 가져옵니다.
  • iconv
    문자 집합 변환을 수행합니다
  • iconvconfig
    빠른 로딩 iconv 모듈 구성 파일을 생성합니다.
  • ldconfig
    동적 링커 런타임 바인딩을 구성합니다.
  • ldd
    주어진 각 프로그램 또는 공유 라이브러리에 필요한 공유 라이브러리를 보고합니다.
  • lddlibc4
    ldd에 객체 파일을 지원합니다. x86_64와 같은 최신 아키텍처에는 존재하지 않습니다.
  • locale
    현재 로케일에 대한 다양한 정보를 출력합니다.
  • localedef
    로캘 사양을 컴파일합니다.
  • makedb
    텍스트 입력으로부터 간단한 데이터베이스를 생성합니다.
  • mtrace
    메모리 트레이스 파일을 읽고 해석하여 사람이 읽을 수 있는 형식으로 요약을 표시합니다.
  • pcprofiledump
    PC 프로파일링으로 생성된 정보를 덤프합니다.
  • pldd
    실행 중인 프로세스에서 사용하는 동적 공유 객체를 나열합니다
  • sln
    정적으로 연결된 ln 프로그램
  • sotruss
    지정된 명령의 공유 라이브러리 프로시저 호출을 추적합니다.
  • sprof
    공유 객체 프로파일링 데이터를 읽고 표시합니다.
  • tzselect
    사용자에게 시스템 위치를 묻고 해당 시간대를 출력합니다.
  • xtrace
    현재 실행된 함수를 출력하여 프로그램 실행을 추적합니다.
  • zdump
    입력된 시간대에 대한 현지 시간을 출력합니다.
  • zic
    시간대 컴파일러
  • ld-*.so
    공유 라이브러리 실행 파일을 위한 보조 프로그램
  • libBrokenLocale
    깨진 프로그램(예: 일부 모티프 응용 프로그램)을 실행하기 위한 대량의 해킹으로 Glibc에서 내부적으로 사용합니다. 자세한 내용은 glibc-2.39/locale/broken_cur_max.c의 주석을 참조하십시오.
  • libanl
    함수가 없는 더미 라이브러리. 이전에는 비동기 이름 조회 라이브러리였으며, 이제 함수는 libc에 있습니다.
  • libc
    기본 C 라이브러리
  • libc_malloc_debug
    사전 로드 시 메모리 할당 검사를 켭니다.
  • libdl
    함수가 없는 더미 라이브러리. 이전에는 동적 연결 인터페이스 라이브러리였으며, 이제 기능은 libc에 있습니다.
  • libg
    함수를 포함하지 않는 더미 라이브러리. 이전에는 g++용 런타임 라이브러리였습니다.
  • libm
    연산 라이브러리
  • libmvec
    libm을 사용할 때 필요에 따라 링크되는 벡터 연산 라이브러리
  • libmcheck
    링크될 때 메모리 할당 검사를 켭니다.
  • libmemusage
    프로그램의 메모리 사용량에 대한 정보를 수집하기 위해 memusage에 의해 사용됩니다.
  • libnsl
    네트워크 서비스 라이브러리, 이제 더 이상 사용되지 않음
  • libnss_*
    호스트 이름, 사용자 이름, 그룹 이름, 별칭, 서비스, 프로토콜 등을 확인하는 함수를 포함하는 네임 서비스 스위치 모듈. etc/nsswitch.conf의 구성에 따라 libc에 의해 로드됩니다.
  • libpcprofile
    실행 파일을 PC 프로파일에 미리 로드할 수 있습니다.
  • libpthread
    함수가 없는 더미 라이브러리. 이전에는 POSIX.1c 스레드 확장에 지정된 대부분의 인터페이스와 POSIX.1b 실시간 확장에 지정된 세마포어 인터페이스를 제공하는 함수가 포함되어 있었지만, 이제 이 함수는 libc에 있습니다.
  • libresolv
    인터넷 도메인 네임 서버로 패킷을 생성, 전송 및 해석하는 함수를 포함합니다.
  • librt
    POSIX.1b 실시간 확장에 지정된 대부분의 인터페이스를 제공하는 함수가 포함되어 있습니다.
  • libthread_db
    다중 스레드 프로그램을 위한 디버거를 만드는 데 유용한 함수를 포함합니다.
  • libutil
    함수가 없는 더미 라이브러리. 이전에는 다양한 Unix 유틸리티에서 사용되는 “표준” 함수에 대한 코드가 포함되어 있었습니다. 이제 이러한 함수는 libc에 있습니다.
  • linuxfromscratch/12.1/075-glibc-2.39.txt
  • 마지막으로 수정됨: 2024/06/17 05:52
  • 저자 baecy