^ Linux From Scratch - Version 12.1-systemd ^^^ ^ Chapter 4. Final Preparations ^^^ |[[.:027-Adding the LFS User|이전]] | [[.:04-final_preparations|위로]] / [[.:12.1|처음으로]] | [[.:029-About SBUs|다음]]| |LFS 사용자 추가 | SBU 설명| ---- ===== 4.4. 환경 설정 ===== 두 개의 **bash** 셸 시작 파일을 새로 작성해서 작업 환경을 설정합니다. 사용자 //lfs//로 로그인한 상태에서 다음과 같이 새로운 ''.bash_profile''을 만듭니다. cat > ~/.bash_profile << "EOF" exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash EOF //lfs// 사용자로 로그온하거나 "-" 옵션이 포함된 **su** 명령을 사용하여 //lfs// 사용자로 전환한 경우, 해당 셸은 호스트의 ''/etc/profile''(일부 설정 및 환경 변수가 포함되어 있을 수 있음)을 읽은 다음'' .bash_profile''을 읽는 로그인 셸입니다. ''.bash_profile'' 파일에서 **exec env -i.../bin/bash** 명령은 ''HOME'', ''TERM'' 및 ''PS1'' 변수를 제외하고 완전히 빈 환경을 가진 새 셸로 실행 중인 셸을 대체합니다. 이렇게 하면 호스트 시스템에 있지만 사용하길 원치 않거나 잠재적으로 위험한 환경 변수가 빌드 환경에 적용되지 않습니다. 새로운 셸 인스턴스는 //non-login// 셸로, ''/etc/profile'' 또는 ''.bash_profile'' 파일의 내용을 읽고 실행하지 않고 대신 ''.bashrc'' 파일을 읽고 실행합니다. 다음과 같이 ''.bashrc'' 파일을 생성합니다. cat > ~/.bashrc << "EOF" set +h umask 022 LFS=/mnt/lfs LC_ALL=POSIX LFS_TGT=$(uname -m)-lfs-linux-gnu PATH=/usr/bin if [ ! -L /bin ]; then PATH=/bin:$PATH; fi PATH=$LFS/tools/bin:$PATH CONFIG_SITE=$LFS/usr/share/config.site export LFS LC_ALL LFS_TGT PATH CONFIG_SITE EOF === .bashrc 설정 설명 === * **set +h** \\ **set +h** 명령은 **bash**의 해시 기능을 끕니다. 해시 기능은 일반적으로는 유용한 기능으로, 해시 테이블을 사용하여 실행 파일의 전체 경로를 기억함으로써 동일한 실행 파일을 찾기 위해 경로를 반복해서 검색하지 않아도 됩니다. 하지만 크로스 컴파일 도구는 설치되자마자 사용해야 합니다. 해시 기능을 끄면 프로그램을 실행할 때마다 셸이 ''PATH''를 검색하도록 지정합니다. 따라서 셸은 호스트 ''/usr/bin'' 또는 ''/bin''에 있는 배포판에서 제공한 동일한 프로그램의 이전 버전을 기억하지 않고 새로 컴파일된 도구를 사용할 수 있는 ''$LFS/tools/bin''에서 찾습니다. * **umask 022** \\ 사용자 파일 생성 마스크(umask)를 022로 설정하면 새로 만든 파일과 디렉터리는 소유자만 쓸 수 있지만 누구나 읽고 실행할 수 있습니다(기본 모드가 [[https://man.archlinux.org/man/open.2|open(2)]] 시스템 호출에 사용된다고 가정하면 새 파일은 권한 모드 644로, 디렉터리는 모드 755로 끝납니다). * **LFS=/mnt/lfs** \\ ''LFS'' 변수는 선택한 마운트 지점으로 설정해야 합니다. * **LC_ALL=POSIX** \\ ''LC_ALL'' 변수는 특정 프로그램의 현지화를 제어하여 해당 메시지가 지정된 국가의 규칙을 따르도록 합니다. ''LC_ALL''을 "POSIX" 또는 "C"(둘은 동일)로 설정하면 크로스 컴파일 환경에서 모든 것이 예상대로 작동합니다. * **LFS_TGT=$(uname -m)-lfs-linux-gnu** \\ ''LFS_TGT'' 변수는 기본값은 아니지만, 크로스 컴파일러와 링커를 빌드할 때와 임시 툴체인을 크로스 컴파일할 때 사용할 호환 가능한 머신 설명을 설정합니다. 자세한 내용은 [[.:032-toolchain_technical_notes|툴체인 기술 노트]]에서 확인할 수 있습니다. * **PATH=/usr/bin** \\ 많은 최신 리눅스 배포판은 ''/bin''과 ''/usr/bin''을 병합했습니다. 이 경우 [[.:06-cross_compiling_temporary_tools|챕터 6]] 환경에서는 표준 ''PATH'' 변수를 ''/usr/bin/''으로 설정해야 합니다. 그렇지 않은 경우 다음 줄은 경로에 ''/bin''을 추가합니다. * **if [ ! -L /bin ]; then PATH=/bin:$PATH; fi** \\ ''/bin''이 심볼릭 링크가 아니라면 ''PATH'' 변수에 추가합니다. * **PATH=$LFS/tools/bin:$PATH** \\ 기본 ''PATH'' 앞에 ''$LFS/tools/bin''을 넣으면 [[05-compiling_a_cross_toolchain|5장]] 초반에 설치한 크로스 컴파일러가 설치 직후 셸에서 사용됩니다. 위에서 설정한 해싱을 끄는것과 이 설정으로 크로스 컴파일러 대신 호스트의 컴파일러가 사용될 위험이 줄어듭니다. * **CONFIG_SITE=$LFS/usr/share/config.site** \\ [[05-compiling_a_cross_toolchain|5장]]과 [[.:06-cross_compiling_temporary_tools|챕터 6]]에서 이 변수가 설정되어 있지 않으면 **configure** 스크립트가 호스트 시스템의 **/usr/share/config.site**에서 일부 배포판의 특정한 구성 항목을 로드하려고 시도할 수 있습니다. 호스트에 의한 잠재적인 오염을 방지하기 위해 이 변수를 다시 정의합니다. * **export ...** \\ 앞의 명령으로 일부 변수를 설정했지만, 모든 서브 셸에서 볼 수 있도록 해당 변수를 내보냅니다. **중요** 몇몇 상용 배포판은 문서화되지 않은 인스턴스 ''/etc/bash.bashrc''를 **bash**의 초기화 과정에 추가합니다. 이 파일은 중요한 LFS 패키지 빌드에 영향을 줄 수 있는 //lfs// 사용자 환경을 수정할 수 있습니다. //lfs// 사용자의 환경이 깨끗한지 확인하려면 ''/etc/bash.bashrc가'' 있는지 확인하고 있는 경우 이 파일을 다른 곳으로 옮기세요. ''root'' 사용자로 다음을 실행합니다. [ ! -e /etc/bash.bashrc ] || mv -v /etc/bash.bashrc /etc/bash.bashrc.NOUSE //lfs// 사용자가 더 이상 필요하지 않고 파일을 복원하길 경우([[.:07-entering_chroot_and_building_additional_tempory_tools|7장]] 시작 부분) ''/etc/bash.bashrc''를 안전하게 되돌릴 수 있습니다. [[.: 105-bash-5.2.21|8.35장 "Bash-5.2.21"]]에서 빌드할 LFS Bash 패키지는 ''/etc/bash.bashrc''를 로드하거나 실행하도록 구성되지 않았으므로 완성된 LFS 시스템에서는 이 파일이 쓸모가 없다는 점에 유의하세요. 여러 프로세서(또는 코어)를 사용하는 많은 최신 시스템의 경우 명령줄 옵션이나 환경 변수를 통해 사용 가능한 프로세서 수를 make 프로그램에 알려주는 "parallel make"를 수행하여 패키지의 컴파일 시간을 줄일 수 있습니다. 예를 들어 인텔 코어 i9-13900K 프로세서는 8개의 P(성능) 코어와 16개의 E(효율성) 코어가 있으며, P 코어는 동시에 2개의 스레드를 실행할 수 있으므로 리눅스 커널에서 각 P 코어는 2개의 논리적 코어로 모델링됩니다. 결과적으로 총 32개의 논리 코어가 있습니다. 이러한 논리적 코어를 모두 사용하는 한 가지 확실한 방법은 **make**가 최대 32개의 빌드 작업을 생성하도록 허용하는 것입니다. 이는 **make**에 //-j32// 옵션을 전달하여 수행할 수 있습니다. make -j32 또는 ''MAKEFLAGS'' 환경 변수를 설정하면 해당 내용이 명령줄 옵션으로 make에서 자동으로 사용됩니다. export MAKEFLAGS=-j32 **중요** \\ 숫자없는 //-j// 옵션을 **make**에 전달하거나 ''MAKEFLAGS''같은 옵션으로 전달하지 마세요.그렇게 하면 **make**가 무제한으로 빌드 작업을 생성하여 시스템의 안정성에 문제를 일으킬 수 있습니다. [[05-compiling_a_cross_toolchain|5장]]과 [[.:06-cross_compiling_temporary_tools|챕터 6]]에서 패키지를 빌드하는 데 사용할 수 있는 모든 논리 코어를 사용하려면 ''.bashrc''에서 ''MAKEFLAGS''를 설정하세요. cat >> ~/.bashrc << "EOF" export MAKEFLAGS=-j$(nproc) EOF 모든 논리적 코어를 사용하지 않으려면 //$(nproc)//를 사용하려는 논리 코어 갯수로 설정하세요. 마지막으로 임시 도구 빌드를 위한 환경이 완전히 준비되었는지 확인하려면 **bash** 셸이 새로운 사용자 프로필을 다시 읽도록 합니다. source ~/.bash_profile