You cannot see this page without javascript.

LFS/Preparation - 준비

Linux 조회 수 756 추천 수 0 2014.08.06 10:29:25

1. 새파티션 만들기

1.1. 소 개


이번 장에서는 LFS시스템을 설치하기 위한 파티션 작업에 대해 다룰 것입니다. 우리는 이제 새로운 파티션을 만들고 그 파티션에 파일 시스템을 구축하고 마운트를 할 것입니다.

1.2. 새 파티션 만들기


새로운 Linux 시스템을 구축하기 위해서는 어느 정도 빈 공간이 있어야 합니다.(디스크의 빈 파티션). 만약 LFS를 만들기 위한 HDD의 여유공간이 없고, 남는 파티션도 없다면, 기존 배포판이 설치된 곳에 설치해야 합니다. 처음부터 LFS를 설치하는것은 추천하지 않습니다. 하지만, HDD공간이 정말 없고, 당신이 용감하다면 다음의 문서를 참고하기 바랍니다. http://www.linuxfromscratch.org/hints/downloads/files/lfs_next_to_existing_systems.txt

최소 설치 사양을 위해서는 1.2GB정도의 파티션이 필요합니다. 모든 소스 타르볼을 저장하고 모든 패키지를 컴파일 하는데 이 정도의 공간이면 충분합니다.하지만, LFS시스템을 첫번째 리눅스 시스템으로 사용 할 것이라면,당신은 아마도 응용소프트웨어를 더 설치해야 할 것이고, 그러기 위해서는 약 2~3GB정도가 더 필요할 것입니다.

시스템에 램이 충분하지 않을 경우, 가상 메모리를 사용하는 것은 좋은 방법입니다. -- 가상 메모리는 램이 부족할때만 가끔씩 사용됩니다 .LFS시스템은 기존 리눅스 시스템과 가상공간을 공유할 수 있습니다. 그러므로 만약, 기존의 리눅스 시스템이 가상메모리를 사용하고 있다면 새롭게 만들 필요가 없습니다.

cfdisk2나 fdisk를 실행할때 arguement로 HDD이름을 넣어주면 새로운 파티션을 만들수 있습니다. -- 예를 들어 /dev/hda는 첫번째 IDE 디스크입니다. 필요하다면 리눅스 native파티션과 swap파티션을 만드세요. 만약 프로그램의 사용법을 모른다면 cfdisk나 fdisk의 man페이지를 참조하기 바랍니다.

새로운 파티션을 어떻게 나눴는지 기억하세요. -- hda5같은. (이름) 만약 스왑공간을 만들었다면 그 이름 역시 기억하세요. 이런 이름들은 나중에 /etc/fstab파 일에서 사용될 겁니다

1.3. 새 파티션에 파일 시스템 만들기


빈 파티션이 있다면, 그 위에 파일 시스템을 만들 수 있습니다. 리눅스상에서는 ext2가 주로 사용되지만, 요즘의 대용량 HDD에서는 journaling file system (ext3)가 점점 보편화 되는 추세입니다.우리는 ext2를 만들것입니다, 하지만 다른 파일 시스템을 사용하고 싶다면 http://www.linuxfromscratch.org/blfs/view/stable/postlfs/filesystems.html <--에서 찾아 보세요.

LFS 파티션에 ext2 파일 시스템을 만들려면 아래처럼 하세요.
mke2fs /dev/xxx

xxx를 LFS 파티션 이름으로 바꾸세요.(예를들면 hda5)

새로운 스왑 파티션을 만들었다면 초기화해야 합니다. (사용법은 mke2fs를 참조..)
mkswap /dev/yyy

yyy를 swap 파티션 이름으로 바꾸세요.

1.4. 새 파티션을 마운트하기


이제 우린 파일 시스템을 만들었고, 그 파티션을 사용하기 위해서 마운할 장소를 고르고, 마운트를 해야합니다.이 문서에서는 파일 시스템이 /mnt/lfs 에 마운트 되어 있다고 가정할 것이지만, 어떤 디렉토리를 선택하더라도 상관 없습니다.

마운트 할 곳을 선택하고 아래와 같이 실행하여 환경변수에 적용시키세요.
export LFS=/mnt/lfs

마운트 할 디렉토리를 만들고 아래와 같이 실행하여 LFS 파일 시스템을 마운트 하세요:
mkdir -p $LFS
mount /dev/xxx $LFS

xxx를 lfs파티션이름으로 바꾸세요.

lfs 시스템을 멀티 파티션으로 구성할 생각이라면(예를 들어 "/" 와 "/usr)"를 각기 다른 파티션으로 배정할 경우) 마운트는 다음과 같이 하세요.
mkdir -p $LFS
mount /dev/xxx $LFS
mkdir $LFS/usr
mount /dev/yyy $LFS/usr

물론, xxx와 yyy는 적절한 이름으로 바꿔줍니다.

새로운 파티션을 마운트 할 때는 suid,dev,atime 같은 옵션을 사용하지 않고 마운트 합시다. LFS 파티션이 어떤 옵션을 가지고 마운트 되었는지 보기 위해서 파라미터없이 마운트 명령을 실행 시킬수 있습니다. 만약 suid, dev, atime 이 잘못되었다면 다시 마운트 해야합니다.

이제 우리는 작업할 공간을 만들었고, 패키지를 다운로드 받을 준비가 되었습니다.

2. 필요한 패키지와 패치들

2.1. 소 개


다음은 기본 리눅스 시스템을 설치하기 위해 다운로드를 받아야하는 패키지의 목록입니다.목차의 버전 번호는 이미 발표된 소프트웨어의 버전과 상응하고, 이 책은 그것들에 바탕을 두고 있습니다. LFS 설치를 많이 해 본 사람이 아니라면, 새로운 버전으로 시도하지 않기를 강력히 충고합니다. 또한 신버전은 아직 알려지지 않은 버그들이 있을 수 있으므로 사용하지 않는 것이 좋습니다.

모든 URL들이 사용 가능하면, 다음의 프로젝트 페이지를 추천합니다.http://www.freshmeat.net/. Freshment page는 프로젝트 웹 사이트, 메일링 리스트 , FAQ , changelogs 등 뿐만아니라 공식다운로드 사이트에 찾아가기 쉽도록 도와줍니다.

이런 다운로드 사이트들이 항상 이용가능하다고 보장할 수는 없습니다. 이 책이 발간된 후에 다운로드 사이트가 변경된 경우 google 을 이용해 찾아보기 바랍니다. 찾지 못한게 있을 경우, errata page(http://www.linuxfromscratch.org/lfs/print/) 에서 도움을 받거나 그래도 해결이 안되면 다음 웹사]이트의 다운로드 리스트들 중에서 하나를 참고하세요.http://www.linuxfromscratch.org/lfs/packages.html

당신은 패키지와 패치들은 설치 과정에서 편하게 이용할 수 있는 장소에 저장하는 걸 원할 것입니다. 또한 소스의 압축을 풀고 그것들을 컴파일하고 설치하는 작업디렉토리가 필요할 것입니다.$LFS/sources는 타르볼들과 패치들을 저장하고 작업할 장소로 써 사용될것입니다. 이런식으로 필요한 모든것들은 LFS파티션에 위치할 것이고, 모든 설치과정 동안 사용할 것입니다.

패키지와 패치들을 다운로드 하기 전에 root권한으로 다음 명령들을 실행하기 바랍니다.
mkdir $LFS/sources

일반사용자 계정으로 다운로드 받으려면 일반사용자도 쓰기 가능하도록 권한을 주어야 합니다:
chmod a+wt $LFS/sources

[http]wget-list를 wget으로 입력하여 모든 패키지를 쉽게 다운로드 하는 방법이 있습니다:
wget -i wget-list -P $LFS/sources

추가적으로, LFS-7.0으로 시작하면, md5sums라는 분리된 파일이 있습니다. 이 파일은 모든 패키지들이 진행하기 이전에 유효한 올바른 패키지인가를 검사하는데 사용됩니다. $LFS/sources 파일에 해당 파일을 넣게 실행하십시오:
pushd $LFS/sources
md5sum -c md5sums
popd

2.2. 모든 패키지들

-- chaoxifer 2013-01-20 00:11:06

Autoconf (2.69) - 1,186 KB:
Home page: http://www.gnu.org/software/autoconf/

Download: http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.xz

MD5 sum: 50f97f4159805e374639a73e2636f22e
Automake (1.12.3) - 1,352 KB:
Home page: http://www.gnu.org/software/automake/

Download: http://ftp.gnu.org/gnu/automake/automake-1.12.3.tar.xz

MD5 sum: 0df082825f8f41087eb70c5088f4515e
Bash (4.2) - 6,845 KB:
Home page: http://www.gnu.org/software/bash/

Download: http://ftp.gnu.org/gnu/bash/bash-4.2.tar.gz

MD5 sum: 3fb927c7c33022f1c327f14a81c0d4b0
Binutils (2.22) - 19,505 KB:
Home page: http://www.gnu.org/software/binutils/

Download: http://ftp.gnu.org/gnu/binutils/binutils-2.22.tar.bz2

MD5 sum: ee0f10756c84979622b992a4a61ea3f5
Bison (2.6.2) - 1,612 KB:
Home page: http://www.gnu.org/software/bison/

Download: http://ftp.gnu.org/gnu/bison/bison-2.6.2.tar.xz

MD5 sum: dea291996f98c34c3fd8e389a9cf6ea1
Bzip2 (1.0.6) - 764 KB:
Home page: http://www.bzip.org/

Download: http://www.bzip.org/1.0.6/bzip2-1.0.6.tar.gz

MD5 sum: 00b516f4704d4a7cb50a1d97e6e8e15b
Check (0.9.8) - 546 KB: Coreutils (8.19) - 4,992 KB:
Home page: http://www.gnu.org/software/coreutils/

Download: http://ftp.gnu.org/gnu/coreutils/coreutils-8.19.tar.xz

MD5 sum: 1a01231a2f3ed37c0efc073ccdda9375
DejaGNU (1.5) - 563 KB:
Home page: http://www.gnu.org/software/dejagnu/

Download: http://ftp.gnu.org/gnu/dejagnu/dejagnu-1.5.tar.gz

MD5 sum: 3df1cbca885e751e22d3ebd1ac64dc3c
Diffutils (3.2) - 1,976 KB:
Home page: http://www.gnu.org/software/diffutils/

Download: http://ftp.gnu.org/gnu/diffutils/diffutils-3.2.tar.gz

MD5 sum: 22e4deef5d8949a727b159d6bc65c1cc
E2fsprogs (1.42.5) - 5,780 KB: Expect (5.45) - 614 KB:
Home page: http://expect.sourceforge.net/

Download: http://prdownloads.sourceforge.net/expect/expect5.45.tar.gz

MD5 sum: 44e1a4f4c877e9ddc5a542dfa7ecc92b
File (5.11) - 596 KB:
Home page: http://www.darwinsys.com/file/

Download: ftp://ftp.astron.com/pub/file/file-5.11.tar.gz

MD5 sum: 16a407bd66d6c7a832f3a5c0d609c27b
Findutils (4.4.2) - 2,100 KB:
Home page: http://www.gnu.org/software/findutils/

Download: http://ftp.gnu.org/gnu/findutils/findutils-4.4.2.tar.gz

MD5 sum: 351cc4adb07d54877fa15f75fb77d39f
Flex (2.5.37) - 1,280 KB:
Home page: http://flex.sourceforge.net

Download: http://prdownloads.sourceforge.net/flex/flex-2.5.37.tar.bz2

MD5 sum: c75940e1fc25108f2a7b3ef42abdae06
Gawk (4.0.1) - 1,575 KB:
Home page: http://www.gnu.org/software/gawk/

Download: http://ftp.gnu.org/gnu/gawk/gawk-4.0.1.tar.xz

MD5 sum: a601b032c39cd982f34272664f8afa49
GCC (4.7.1) - 80,703 KB:
Home page: http://gcc.gnu.org/

Download: http://ftp.gnu.org/gnu/gcc/gcc-4.7.1/gcc-4.7.1.tar.bz2

MD5 sum: 933e6f15f51c031060af64a9e14149ff
GDBM (1.10) - 640 KB:
Home page: http://www.gnu.org/software/gdbm/

Download: http://ftp.gnu.org/gnu/gdbm/gdbm-1.10.tar.gz

MD5 sum: 88770493c2559dc80b561293e39d3570
Gettext (0.18.1.1) - 14,785 KB:
Home page: http://www.gnu.org/software/gettext/

Download: http://ftp.gnu.org/gnu/gettext/gettext-0.18.1.1.tar.gz

MD5 sum: 3dd55b952826d2b32f51308f2f91aa89
Glibc (2.16.0) - 9,756 KB:
Home page: http://www.gnu.org/software/libc/

Download: http://ftp.gnu.org/gnu/glibc/glibc-2.16.0.tar.xz

MD5 sum: 80b181b02ab249524ec92822c0174cf7
GMP (5.0.5) - 1,632 KB:
Home page: http://www.gnu.org/software/gmp/

Download: http://ftp.gnu.org/gnu/gmp/gmp-5.0.5.tar.xz

MD5 sum: 8aef50959acec2a1ad41d144ffe0f3b5
Grep (2.14) - 1,172 KB:
Home page: http://www.gnu.org/software/grep/

Download: http://ftp.gnu.org/gnu/grep/grep-2.14.tar.xz

MD5 sum: d4a3f03849d1e17ce56ab76aa5a24cab
Groff (1.21) - 3,774 KB:
Home page: http://www.gnu.org/software/groff/

Download: http://ftp.gnu.org/gnu/groff/groff-1.21.tar.gz

MD5 sum: 8b8cd29385b97616a0f0d96d0951c5bf
GRUB (2.00) - 5,016 KB:
Home page: http://www.gnu.org/software/grub/

Download: http://ftp.gnu.org/gnu/grub/grub-2.00.tar.xz

MD5 sum: a1043102fbc7bcedbf53e7ee3d17ab91
Gzip (1.5) - 704 KB:
Home page: http://www.gnu.org/software/gzip/

Download: http://ftp.gnu.org/gnu/gzip/gzip-1.5.tar.xz

MD5 sum: 2a431e169b6f62f7332ef6d47cc53bae
Iana-Etc (2.30) - 201 KB: Inetutils (1.9.1) - 1,941 KB:
Home page: http://www.gnu.org/software/inetutils/

Download: http://ftp.gnu.org/gnu/inetutils/inetutils-1.9.1.tar.gz

MD5 sum: 944f7196a2b3dba2d400e9088576000c
IPRoute2 (3.5.1) - 379 KB: Kbd (1.15.3) - 1,621 KB: Kmod (9) - 1,096 KB:
Download: http://www.kernel.org/pub/linux/utils/kernel/kmod/kmod-9.tar.xz

MD5 sum: c8ae2d2694fbca2b28e238b30543a0cd
Less (444) - 301 KB:
Home page: http://www.greenwoodsoftware.com/less/

Download: http://www.greenwoodsoftware.com/less/less-444.tar.gz

MD5 sum: 56f9f76ffe13f70155f47f6b3c87d421
LFS-Bootscripts (20120901) - 33 KB: Libpipeline (1.2.1) - 723 KB: Libtool (2.4.2) - 2,571 KB:
Home page: http://www.gnu.org/software/libtool/

Download: http://ftp.gnu.org/gnu/libtool/libtool-2.4.2.tar.gz

MD5 sum: d2f3b7d4627e69e13514a40e72a24d50
Linux (3.5.2) - 66,060 KB:
Home page: http://www.kernel.org/

Download: http://www.kernel.org/pub/linux/kernel/v3.x/linux-3.5.2.tar.xz

MD5 sum: b3cfccfb6961ea407acf0b070184b0b1

리눅스 커널은 자주 업데이트 되는데 이는 보안 취약점이 계속해서 발견되기 때문입니다. errata 페이지에서 새로운 말이 있기 전까지는 사용가능한 최신 커널 버전은 3.5.x 커널입니다.
제한된 속도 또는 비싼 대역폭 때문에 리눅스 커널을 업데이트하고 싶은 유저들을 위해 기준버전의 패키지와 패치파일은 따로 다운로드 할 수 있도록 하였습니다. 이것이 약간의 시간, 비용을 어느정도는 줄여줄 수 있을 것입니다.

M4 (1.4.16) - 1,229 KB:
Home page: http://www.gnu.org/software/m4/

Download: http://ftp.gnu.org/gnu/m4/m4-1.4.16.tar.bz2

MD5 sum: 8a7cef47fecab6272eb86a6be6363b2f
Make (3.82) - 1,213 KB:
Home page: http://www.gnu.org/software/make/

Download: http://ftp.gnu.org/gnu/make/make-3.82.tar.bz2

MD5 sum: 1a11100f3c63fcf5753818e59d63088f
Man-DB (2.6.2) - 1,353 KB: Man-pages (3.42) - 1,076 KB: MPC (1.0) - 614 KB:
Home page: http://www.multiprecision.org/

Download: http://www.multiprecision.org/mpc/download/mpc-1.0.tar.gz

MD5 sum: 13370ceb2e266c5eeb2f7e78c24b7858
MPFR (3.1.1) - 1,047 KB:
Home page: http://www.mpfr.org/

Download: http://www.mpfr.org/mpfr-3.1.1/mpfr-3.1.1.tar.xz

MD5 sum: 91d51c41fcf2799e4ee7a7126fc95c17
Ncurses (5.9) - 2,760 KB:
Home page: http://www.gnu.org/software/ncurses/

Download: ftp://ftp.gnu.org/gnu/ncurses/ncurses-5.9.tar.gz

MD5 sum: 8cb9c412e5f2d96bc6f459aa8c6282a1
Patch (2.6.1) - 248 KB:
Home page: http://savannah.gnu.org/projects/patch/

Download: http://ftp.gnu.org/gnu/patch/patch-2.6.1.tar.bz2

MD5 sum: 0818d1763ae0c4281bcdc63cdac0b2c0
Perl (5.16.1) - 13,256 KB:
Home page: http://www.perl.org/

Download: http://www.cpan.org/src/5.0/perl-5.16.1.tar.bz2

MD5 sum: b87358e2c461a898cfd7c334e7dd8993
Pkg-config (0.27) - 1872 KB: Procps (3.2.8) - 279 KB:
Home page: http://procps.sourceforge.net/

Download: http://procps.sourceforge.net/procps-3.2.8.tar.gz

MD5 sum: 9532714b6846013ca9898984ba4cd7e0
Psmisc (22.19) - 481 KB:
Home page: http://psmisc.sourceforge.net/

Download: http://prdownloads.sourceforge.net/psmisc/psmisc-22.19.tar.gz

MD5 sum: 38563b4760ffce54b0eadf99cb5b16e8
Readline (6.2) - 2,225 KB: Sed (4.2.1) - 878 KB:
Home page: http://www.gnu.org/software/sed/

Download: http://ftp.gnu.org/gnu/sed/sed-4.2.1.tar.bz2

MD5 sum: 7d310fbd76e01a01115075c1fd3f455a
Shadow (4.1.5.1) - 2,142 KB: Sysklogd (1.5) - 85 KB: Sysvinit (2.88dsf) - 108 KB: Tar (1.26) - 2,285 KB:
Home page: http://www.gnu.org/software/tar/

Download: http://ftp.gnu.org/gnu/tar/tar-1.26.tar.bz2

MD5 sum: 2cee42a2ff4f1cd4f9298eeeb2264519
Tcl (8.5.12) - 4,396 KB:
Home page: http://tcl.sourceforge.net/

Download: http://prdownloads.sourceforge.net/tcl/tcl8.5.12-src.tar.gz

MD5 sum: 174b2b4c619ba8f96875d8a051917703
Time Zone Data (2012e) - 208 KB: Texinfo (4.13a) - 2,687 KB:
Home page: http://www.gnu.org/software/texinfo/

Download: http://ftp.gnu.org/gnu/texinfo/texinfo-4.13a.tar.gz

MD5 sum: 71ba711519209b5fb583fed2b3d86fcb
Systemd (188) - 1,324 KB: Udev-lfs Tarball (188) - 20 KB:
Download: http://anduin.linuxfromscratch.org/sources/other/udev-lfs-188-3.tar.bz2

MD5 sum: ef6cd9f078c39c61ba744d08276a1210
Util-linux (2.21.2) - 2,916 KB: linux-2.21.2.tar.xz
MD5 sum: 54ba880f1d66782c2287ee2c898520e9
Vim (7.3) - 8,675 KB:
Home page: http://www.vim.org

Download: ftp://ftp.vim.org/pub/vim/unix/vim-7.3.tar.bz2

MD5 sum: 5b9510a17074e2b37d8bb38ae09edbf2
Xz Utils (5.0.4) - 894 KB:
Home page: http://tukaani.org/xz

Download: http://tukaani.org/xz/xz-5.0.4.tar.xz

MD5 sum: 161015c4a65b1f293d31810e1df93090
Zlib (1.2.7) - 493 KB:
Home page: http://www.zlib.net/

Download: http://www.zlib.net/zlib-1.2.7.tar.bz2

MD5 sum: 2ab442d169156f34c379c968f3f482dd

Total size of these packages: about 292 MB

tarball은 LFS mirror 사이트에서 다운로드 받아서 사용할 수 있습니다. Glibc 섹션에서 다운로드 링크를 참고하세요.

2.3. 필요한 패치들


팩키지들 뿐만 아니라 각종 패치들도 필요합니다. 팩키지를 우리가 원하는 대로 수정하거나 메인테이너가 버그를 해결하기 위해 만든 패치가 필요합니다. 다음 패치들을 다운로드 받으세요.

Bash Upstream Fixes Patch - 51 KB:
Download: http://www.linuxfromscratch.org/patches/lfs/7.2/bash-4.2-fixes-8.patch

MD5 sum: e82d2200e82aa28640299bbcad140361
Binutils Build Fix Patch - 1.4 KB: Bzip2 Documentation Patch - 1.6 KB: Coreutils Internationalization Fixes Patch - 272 KB:
Download: http://www.linuxfromscratch.org/patches/lfs/7.2/coreutils-8.19-i18n-1.patch

MD5 sum: befbf82628d019ef08d522c95cba331d
Flex Regression Tests Patch - 2.8 KB: Glibc DNS Resolve Patch - 2.0 KB: Kbd Loadkeys Fix Patch - 1.6 KB: Kbd Backspace/Delete Fix Patch - 12 KB:
Download: http://www.linuxfromscratch.org/patches/lfs/7.2/kbd-1.15.3-backspace-1.patch

MD5 sum: f75cca16a38da6caa7d52151f7136895
Kmod Testsuite Patch - 2.2 KB:
Download: http://www.linuxfromscratch.org/patches/lfs/7.2/kmod-9-testsuite-1.patch

MD5 sum: 11ab14f5b63ae3c163804517cf110fbb
Make Upstream Fixes Patch - 9.7 KB: Patch Testsuite Fix Patch - 1 KB:
Download: http://www.linuxfromscratch.org/patches/lfs/7.2/patch-2.6.1-test_fix-1.patch

MD5 sum: c51e1a95bfc5310635d05081472c3534
Perl Libc Patch - 1.6 KB:
Download: http://www.linuxfromscratch.org/patches/lfs/7.2/perl-5.16.1-libc-2.patch

MD5 sum: daf5c64fd7311e924966842680535f8f
Procps HZ Errors Patch - 2.3 KB: Procps Watch Patch - 3.5 KB: Readline Upstream Fixes Patch - 1.3 KB:
Download: http://www.linuxfromscratch.org/patches/lfs/7.2/readline-6.2-fixes-1.patch

MD5 sum: 3c185f7b76001d3d0af614f6f2cd5dfa
Sed Regression Tests Patch - 1.9 KB: Total size of these patches: about 367.9 KB


LFS 동호회에 가 보면 위에 나열된 패치외에 다른 많은 패치들이 존재합니다. 이런 패치들은 사소한 버그들을 해결해주거나, 부가적인 기능들을 추가해줍니다. http://www.linuxfromscratch.org/patches/downloads/ 에 위치한 패치 데이터베이스를 자유롭게 시험해보고, 사용하기를 원하는 패치들을 선택하세요.

3. 마지막 준비 과정

(chaoxifer: 7.2버전으로 업데이트 하면서 추가된 부분입니다)

3.1. $LFS에 대하여


이 책에서는 LFS라는 환경변수(environment variable)가 사용될 것입니다. 이것은 항상 정의되어 있어야 하는 아주 중요한 변수입니다. 이것은 LFS 파티션으로 사용될 마운트포인트를 설정하기 위해 반드시 있어야 합니다. LFS 변수가 설정되어 있는지 확인하려면 다음의 명령을 사용하십시오:
echo $LFS

위의 명령이 LFS 파텨션의 마운트 포인트(이 책의 예제에서는 /mnt/lfs로 설정되어 있습니다)를 가리키고 있는지 확실하게 해야 합니다. 만약 출력결과가 올바르지 않다면 다음의 명령으로 설정하실 수 있습니다.
export LFS=/mnt/lfs

이러한 환경변수를 갖는 것은 mkdir $LFS/tools와 같은 명령처럼 문자 그대로 사용할 수 있다는 점에 있어서 유용합니다. 셸은 명령문에 사용되는 구문에서 자동적으로 $LFS을 "/mnt/lfs"로 바꾸어서 사용할 겁니다.

여러분이 현재의 설치 환경에서 벗어나거나 다시 현재의 설치 환경으로 되돌아올 때도 환경변서 $LFS가 제대로 설정되어 있는지 반드시 확인하십시오.(su로 루트나 다른 사용자로 터미널 환경이 바뀌었을 때)

3.2. $LFS/tools 디렉토리 만들기


[http]Chapter 5(임시시스템 만들기)에서 컴파일된 모든 프로그램은 [http]Chapter 6(빌드하기)에서 설치될 프로그램과 구분되게 하기 위해 $LFS/tools 디렉토리 내에 설치될 것입니다. 이 곳에 컴파일되는 프로그램들은 모두 임시 툴들이며 최종적인 LFS시스템에는 포함되지 않습니다. 이렇게 하므로써 임시 툴들이 사용하여 최종적인 시스템이 완성된 뒤에 쉽게 이 툴들을 시스템에서 제거할 수 있습니다. 또한 이들 프로그램들이 호스트 시스템의 디렉토리에 위치하는 것을 미리 사전에 방지할 수 있습니다.

root로 실행하여 필요한 디렉토리를 생성합니다:
mkdir -v $LFS/tools

다음은 /tools에 대한 심볼링 링크를 '/' 루트 디렉토리에 만드는 것입니다. 이것은 새로 만들어진 디렉토리를 가리키는 것입니다. root권한으로 다음과 같이 실행합니다.
ln -sv $LFS/tools /

Note

위의 명령은 올바른 명령입니다. ln 커맨드는 몇가지의 문법들이 있습니다. 여기에 대해서 오류가 있다고 생각하셔서 알려야겠다는 분은 그전에 info coreutils ln와 ln(1)을 확인하십시오.

3.3. LFS 사용자 추가하기


여러분들이 root 계정으로 로그인을 할 경우, 단 한번의 실수로 시스템에 손상을 입히거나 아예 파괴해버릴 수도 있습니다. 그렇게 때문에 이 절에서 패키지를 빌드할 때는 그러한 권한이 없는 사용자로 하는 것을 권장합니다. 여러분들은 여러분만의 이름을 사용할 수 있지만 좀 더 간편하게 하기 위해 여기에서는 간단히 lfs라고 이름짓고 lfs라는 그룹에 포함시키도록 하겠습니다. root권한으로 다음의 명령을 실행하여 새로운 사용자를 만듭니다:
groupadd lfs
useradd -s /bin/bash -g lfs -m -k /dev/null lfs
커맨드라인 옵션 설명
-s /bin/bash
lfs 사용자의 기본 셸을 bash로 지정합니다.
-g lfs

lfs 사용자를 lfs 그룹에 포함시킵니다.

-m

lfs를 위한 홈 디렉토리를 생성합니다.

-k /dev/null

이 파라미터는 특정 null device(/dev/null)로의 입력 위치가 skeleton 디렉토리(/etc/skel)의 파일을 복사하면서 바뀔 수 있는 경우를 방지하기 위한 것입니다.

/dev/null에 대해 더 자세히 알고 싶으신 분은 다음을 참고하세요:[http]/dev/null 예제

lfs 실제로 사용될 사용자의 이름입니다.

lfs로 로그인하기 위해서는 패스워드가 필요합니다. 다음 명령을 통해 설정해 줍니다.
passwd lfs

lfs에게 $LFS/tools 디렉토리에 대한 모든 권한을 줍니다.
chown -v lfs $LFS/tools

만약 작업 디렉토리가 설명한 대로 만들어졌다면 이 디렉토리에 대해서도 권한을 줍니다.
chown -v lfs $LFS/sources

이제, lfs로 로그인을 합니다. 이것은 virtual console, display manager, 혹은 다음의 명령으로 가능합니다.
su - lfs
"-" 라는 것은 non-login 셸과는 반대로 su가 login 셸을 시작하는 것을 가리킵니다. 이 두종류의 셸의 차이점은 bash(1), info bash에서 자세하게 찾아볼 수 있습니다.

예) su만 사용해서 root로 로그인할 경우 환경변수는 가져오지 않습니다. 단지 로그인계정만 바뀝니다. 하지만 su - 를 이용하면 현재의 환경변수까지 가져오기 때문에 로그인 후의 위치도 그대로이며 이는 su lfs와 su - lfs와의 차이점에서도 똑같습니다. 이점 꼭~! 기억하시기 바랍니다.

3.4. 환경 설정하기


bash 셸을 위한 새로운 시작 파일(startup file)을 만들어서 설치 환경을 만드는 것도 좋은 방법입니다. 여러분이 lfs라는 사용자로 로그인한 뒤 .bash_profile을 새로 만드려면 다음 명령을 실행하십시오:
cat > ~/.bash_profile << "EOF"
exec env -i HOME=$HOME TERM=$TERM PS1='u:w$ ' /bin/bash
EOF

lfs 사용자에 로그인을 하면, 일반적으로 initial 셸을 login 셸이라 하는데- 이 셸은 호스트의 /etc/profile(여러 설정파일들이나 환경 변수들)을 읽은 뒤 .bash_profile파일을 읽습니다. .bash_profile 파일 안에 exec env -i.../bin/bash 와 같은 커맨드는 현재 실행되고 있는 셸을 새로운 것으로 대체하는데 이때 HOME, TERM, PS1 이 세가지의 환경변수를 제외하고 완벽하게 새로운(empty) 환경으로 대체됩니다. 이러한 방법은 사용자가 원하지 않거나 잠재적으로 호스트 시스템에 해로운 환경변수가 설정되는 것을 방지합니다.

non-login셸의 새로운 인스턴스인 셸은 /etc/profile이나 .bash_profile을 읽지 않습니다. 대신 .bashrc라는 파일을 읽습니다. 따라서 새로운 .bashrc파일을 만들어 줍니다.

chaoxifer- .bashrc는 bash가 실행될 때마다 읽는 파일이고 .bash_profile은 bash가 login shell로써 사용자가 처음 로그인될 때 읽는 파일입니다.
cat > ~/.bashrc << "EOF"
set +h
umask 022
LFS=/mnt/lfs
LC_ALL=POSIX
LFS_TGT=$(uname -m)-lfs-linux-gnu
PATH=/tools/bin:/bin:/usr/bin
export LFS LC_ALL LFS_TGT PATH
EOF

set +h 커맨드는 bash의 해시 기능을 끄는 것입니다. 해시 기능은 bash에서 해시 테이블을 이용해 실행파일의 완전한 경로(full path)를 기억하기 위해 사용됩니다. 그래서 똑같은 파일에 대해서 경로를 다시 찾을 필요 없이 바로 실행할 수 있도록 하는 기능인데, 지금의 경우같은 경우는 호스트 시스템과 분리되어 $LFS/tools에 컴파일된 프로그램만 사용되도록 셸이 작동되어야 하기 때문에 기존에 호스트 시스템에서 사용되었던 프로그램의 path에 대한 해싱기능을 꺼놓은 것입니다.

umask 022는 새롭게 파일이나 디렉토리를 만들 때의 디폴트 권한을 생성하기 위한 mask입니다.

예)777( 111 111 111 )- 022( 000 001 001 )= 755( 111 110 110 )

LFS 변수는 마운트 포인트로 설정되어 있어야 합니다.

LC_ALL 변수는 특정 국가에 맞게 프로그램의 언어를 설정하기 위한 것입니다. 만약에 호스트 시스템이 Glibc의 버전이 2.2.4보다 낮다면 LC_ALL을 "POSIX"나 "C"와는 다른 것으로 설정할 경우 나중에 chroot 환경에서 문제가 발생할 수 있으니 "POSIX"나 "C"로(이 둘은 서로 같은 것입니다) 설정하길 권장합니다.

LFS_TGT는 기본으로 설정되는 변수는 아니지만 앞으로 우리가 크로스 컴파일러, 링커를 빌드할 때나 임시 툴체인을 위해서 크로스 컴파일을 할 때 필요한 변수입니다. 여기에 대해 더 자세히 알고 싶으시면 [http://wiki.kldp.org/wiki.php/LFS/Preparation#s-4.2 4.2.Toolchain Technical Notes"를 참고하십시오.

PATH에 /tools/bin을 앞에 둠으로써 임시 시스템을 만들기 위해 앞으로 설치될 모든 프로그램들은 이 경로에 있기 때문에 shell에 의해 즉시 선택되어 실행될 겁니다. 이는 앞에서 해싱 기능을 끄고 셸이 커맨드를 실행할 때 찾는 경로(PATH)를 변경하였기 때문에 가능합니다.

마지막으로 임시 툴들을 빌드할 시스템환경을 위해 다음의 명령을 실행하여 사용자 프로파일을 읽어들입니다.
source ~/.bash_profile

3.5. SBUs란?


많은 사람들이 각각 패키지를 컴파일하고 설치하는데 얼마나 오래 걸리는지 대략적으로 미리 알기를 원합니다. 하지만 Linux From Scratch는 서로 다른 많은 시스템에서 설치될 수 있기 때문에 정확한 소요시간을 제공하기가 어렵습니다. 가장 큰 패키지(Glibc)가 대략적으로 가장 빠른 시스템에서 20분전도 걸리는데, 느린 시스템의 경우에는 3일이나 걸릴 수도 있습니다. 이와 같은 이유로 실제적인 시간을 제공하기보다 Standard Build Unit(SBU) 측정방식을 사용하기로 했습니다.

SBU 측정방식은 다음과 같이 측정됩니다. 책에 소개된 컴파일될 첫번째 패키지는 Binutils입니다. 이 패키지를 컴파일 하는데 걸리는 시간은 SBU로써 언급될 것입니다. 다른 모든 패키지들도 이러한 표준으로 나타낼 수 있습니다.

예를들어, 어떤 패키지의 컴파일 시간이 4.5SBUs라고 한다면, 이는 Binutils를 컴파일하고 설치하는데 10분이 걸렸다고 했을 때, 대략적으로 45분이 걸린다는 뜻입니다. 하지만 실제로는 운좋게도 대부분의 패키지들의 빌드시간은 Binutils보다 짧습니다.

일반적으로 SBUs는 호스트 시스템의 GCC버전을 포함해서 빌드시간에 영향을 끼치는 것들이 많기 때문에 정확하다고는 볼 수 없습니다. 단지 해당 패키지를 설치하는데 드는 대략적인 시간을 제공할 뿐입니다.

만약 특정 machine에 드는 실질적인 시간을 살펴보고자 한다면 LinuxFromScratch SBU 홈페이지를 참고하십시오. [http]http://www.linuxfromscratch.org/~sbu/

Note
요즘의 많은 시스템들이 두 개 이상의 프로세서(혹은 코어)를 가지고 있어서 이러한 경우 환경변수를 설정하여 "parallel make"를 이용하면 컴파일하는 데 걸리는 시간을 줄일 수 있습니다. 예를 들어, Core2Duo는 동시에 두개의 프로세서를 다음의 환경변수 설정으로 사용할 수 있습니다:
export MAKEFLAGS='-j 2'

또는 빌드 시에 다음과 같이 할 수 있습니다:
make -j2

이러한 두 개 이상의 프로세서가 이러한 방법으로 사용될 경우 책에 나와있는 SBU는 많이 변할 수 있으며 심지어 정상적으로 실행했을 때보다 더 크게 나올 수 있습니다. 출력결과를 분석할 때에도 서로 다른 프로세서가 동시에 액세스되기 때문에 분석이 더 어려위질수도 있습니다. 만약 여러분이 위의 옵션으로 빌드를 하다가 문제가 생겼을 경우 에러 메세지를 분석하기 위해서는 옵션을 해제하고 single processor로 빌드해보시기 바랍니다.

3.6. Test Suites란?


대부분의 패키지들이 test suites를 제공합니다. 새롭게 빌드된 패키지에 대해 test suites를 실행하는 것은 컴파일이 제대로 되었는지 확인할 수 있는 "sanity check"를 제공하기 때문에 개발자가 의도한 패키지의 기능들이 올바르게 설치되었는지 확인하여 bug free를 완벽하게 보장할 수 있습니다.

다른 것들보다 더 중요한 test suites도 있습니다. 예를 들어 core toolchain 패키지에 대한test suites들(GCC, Binutils, Glibc)는 시스템의 중요한 핵심부분이기 때문에 test suites가 시간이 오래걸리더라도 반드시 테스트를 해봐야합니다.

Binutils과 GCC에 대한 test suites에 대해 자주 등장하는 이슈는 'running out of pseudo terminals'입니다. 이것은 몇가지 원인으로 인해 일어날 수 있지만 대부분의 경우 호스트시스템에서 devpts 파일 시스템을 올바르게 가지고 있지 않아 생긴 문제입니다. 이 문제에 대한 글을 보려면 다음을 참고하십시오: [http]http://www.linuxfromscratch.org//lfs/faq.html#no-ptys

가끔씩 개발자가 test suites에 실패해도 심각하다고 여기지 않는 경우 때문에 종종 test suites에 실패하는 패키지도 더러 있습니다. 이런 경우에 해당하는 패키지를 확인하려면[http]http://www.linuxfromscratch.org/lfs/build-logs/7.2/에 있는 로그파일을 확인하십시오. 이 사이트는 이 책에 있는 모든 패키지에 해당합니다.

4. 임시 시스템 구축하기

4.1. 소 개


이 장에서 우리는 리눅스 시스템 최소사양을 컴파일하고 설치 할 것입니다. 이 시스템은 다음 장에서 최종 LFS 시스템 설치를 시작할 수 있도록 하기 위한 충분한 도구들을 포함 할 것입니다

이런 최소사양의 설치는 두 단계를 걸칩니다. 최신 팩키지들과 독립적으로 작동되는 Toolchain(compiler,assembler, linker and libraries)을 설치하고, 그 다음 다른 필수적인 모든 도구들을 설치하기 위해 이것들을 사용합니다.

이 장에서 컴파일된 파일들은 $LFS/tools 디렉토리 밑에 설치 될 것입니다. 여기에서 컴파일된 패키지들은 이번 장에서만 쓰이기 때문에, 우리는 그것들이 최종 LFS시스템과 섞이는 것을 원하지 않습니다.

설치명령들은 bash shell을 사용한다고 가정합니다 또한 이미 소스팩키지의 압축을 풀었다고 가정하고,(lfs사용자로서 로그인된 동안 - 앞에서 간단히 설명했음 .) 설치명령을 사용하기 전에 팩키지의 소스 디렉토리로 들어가기위해 cd 명령을 사용합니다.

그 팩키지들의 일부는 컴파일전에 패치됩니다. 그 패치는 버그를 피하기 위해 필요로 합니다. 패치는 종종 이 장과 다음 장 둘다에서 필요하지만 그리 큰 문제는 아닙니다.그러므로 패치를 다운로드 하기 위한 설명을 볼 때 헷갈리더라도 너무 걱정하지 마세요. 패치를 적용할 때 경우에 따라 offset 이나 fuzz.에 관한 경고 메세지를 보게 될것입니다. 이런 경고들은 패치를 성공적으로 적용 하는데 있어서 전혀 걱정할 것이 없습니다.

대부분의 팩키지 설치과정동안 화면에서 모든 종류의 컴파일 경고를 볼 것입니다. 이 경고들은 정상적이므로 신경쓰지 않아도 좋습니다. C 언어의 표준은 많이 바뀌었는데, 일부 팩키지들은 옛 버전의 C에 맞추어져 있기 때문에 나오는 메세지입니다. 신경쓸 부분은 아닙니다.

잊지 말아 주세요. 불필요한 것 없이 공간을 절약하기 위해, 각 팩키지를 설치한 후에 소스와 설치 디렉소리를 삭제하는 것이 좋습니다.

작업을 진행하기전에 아래처럼 실행함으로써 LFS 환경변수를 적용 되었음을 확인할 수 있습니다.
echo $LFS

LFS 파티션의 마운트된 곳의 경로를 출력결과로 확인 할 수 있습니다. 책의 내용을 따랐다면 "/mnt/lfs"을 볼 수 있을 겁니다.

4.2. Toolchain technical notes


이 장에서는 세부적인 기술과 원리의 일부를, 뒤에서는 전체적인 설치방법을 설명 할 것입니다. 여기의 내용을 바로 이해하지 못해도 상관없습니다. 일단 한번 실제로 설치해보면 대부분 감이 올 것입니다. 나중에라도 언제든지 이곳을 참조하세요.

5장은 '/'를 임시로 바꿈으로써 6장에 서 LSF 시스템을 깔끔하고 문제없이 설치할 수 있는 환경을 제공하는 것을 목표로 합니다. 이런식으로 되도록 호스트 시스템으로 부터 우리의 시스템을 분리하기를 시도하고, 독립적으로 작동 할 수 있는 Toolchain을 설치합니다. 처음 접하는 사람들에게 위험부담을 최소화하고 교육효과는 최대화 되도록 설치과정이 고안되었습니다. 다시말해, 이 시스템을 설치해봄으로써 더 나은 기술을 얻을 수 있다는 말입니다.

주의사항 : 작업을 계속하기에 앞서, 자신의 플랫폼를들면 i386이 무엇인지 알아두어야 합니다.대부분의 경우는 i686기반 리눅스에 적절할 것입니다. 간단한 방법으로 소스팩키지 속에 있는 config.guess 를 실행함으로써 자신의 플랫폼에 맞는 것을 선택할 수 있습니다. Binutils 소스의 압축을 풀고 ./config.guess를 실행해서 그 출력문을 메모하세요.

설치를 할 때 자신의 플랫폼에 맞는 dynamic linker 의 이름을 알아두어야 하고, 종종 dynamic loader 를 참조 할 때 Binutils 안에 들어있는 표준링커인 ld 와 혼동하지 말아야 합니다. The dynamic linker is provided by Glibc and has the job of finding and loading the shared libraries needed by a program, preparing the program to run and then running it. 전통적으로 dynamic linker 의 이름은 ld-linux.so.2를 사용합니다. ld.so.1이라는 이름은 잘 사용하지 않았고, 새로운 64비트 기반 플랫폼에서는 전혀 다른 이름을 사용합니다. 당신 시스템의 /lib 디렉토리에서 dynamic linker의 이름을 확인 할 수 있습니다. 가장 확실한 방법은 호스트의 불특정한 프로그램을 대상으로 readelf -l <name of binary> | grep interpreter 을 실행함으로써 확인을 해보는 것입니다. Glibc 소스 트리의 root에 있는 shlib-versions의 파일에 모든 플랫폼에 대한 정보가 들어있습니다.

5 장에서 설치작업을 할 때 아래 내용도 참조하세요.

  • 원칙적으로 크로스 컴파일은 같은 프리픽스안에 설치된 툴이 협력에서 작동하고 작은 GNU "magic"을 이용한다.
  • 프로그램이 연결되는 것을 보증하는 표준이 되는 링커의 라이브러리 탐색패스의 조작은 단지 우리가 선택한 라이브러리에 반대한다.
  • 동적인 링커를 타겟으로 하는 gcc 스펙파일의 주의깊게 사용해야 한다.

Binutils는 GCC와 Glibc이 그들의 각각의 수행 동안 어셈블러와 linker에 대한 다양한 특징 시험을 수행하기 때문에 첫번째 설치됩니다. Binutils는 GCC와 Glibc이 가능하게 하거나 무능하게 만드는 어떤 소프트웨어 특징을 결정하는 ./configure의 각각의 구동동안 어셈블러와 linker에 대해 다양한 기능 시험을 수행하기 때문에 첫번째 설치됩니다. 이것은 첫번째 인식한것보다 더 중요하다. 부정확하게 구성된 GCC와 Glibc는 결과적으로 미세하게 부숴진 그런 파손의 충격이 모든 분배의 빌드의 끝까지 보이면 안되는 Toolchain이 될 수 있습니다. 고맙게도, test suite 실패는 너무 많은 시간을 낭비하기 전에 보통 우리에게 경고 할 것이다.

Binutils는 /tools/bin 와 /tools/$TARGET_TRIPLET/bin의 안에 그것의 어셈블러와 링커를 인스톨합니다. 현실에서 한 위체에 있는 도구는 다른 몇몇에게 연결됩니다. 링커의 중요한 면은 그것의 라이브러리 탐색 순서입니다. 상세한 정보는 verbose flag를 지나가는 것에 의해 ld 로부터 얻어 질 수 있습니다. 예를 들면, ld verbose | grep SEARCH은 당신에게 그 현재의 탐색 패스와 그들의 순서를 보여줄 것입니다. 당신은 실제로 파일이 무엇인지 dummy 프로그램을 컴파일하고 verbose 교환을 링커에게 건넴으로써 ld에 의해 연결되는 것을 볼 수 있습니다. 예를 들면, gcc dummy.c -Wl,verbose 2>&1 | grep은 당신에게 성공적으로 그 연결동안 열린 모든 파일을 보여줄 것입니다.

설치된 다음의 패키지는 GCC입니다. GCC의 ./configure수행동안에 당신은 아래 예를 볼 것입니다.
checking what assembler to use... /tools/i686-pc-linux-gnu/bin/as
checking what linker to use... /tools/i686-pc-linux-gnu/bin/ld

이것은 위에 언급된 이유때문에 중요합니다. 그것은 GCC의 설정 스크립트는 사용하는 tool을 발견하기 위해 $PATH 디렉토리를 를 탐색하지 않는것을 보여줍니다. 그러나 gcc의 실제 작동안 같은 탐색 패스는 필연적으로 사용되지 않습니다. 당신은 gcc -print-prog-name=ld의 구동에 의해 표준 링커 gcc를 찾아낼 수 있습니다. 상세한 정보는 컴파일하는 더미 프로그램동안의 -v flag를 패싱하는 것에 의해 gcc로부터 얻어질 수 있습니다. 예를 들면, gcc -v dummy.c의 탐색 패스와 그들의 순서를 포함함으로써 프리프로세서, 컴파일, 어셈브리한 스테이지에 대한 상세한 정보를 보여줄 것입니다.

설치된 다음의 패키지는 Glibc입니다.

Glibc을 빌드하는 것에 대한 가장 중요한 고려사항은 그 컴파일러, 바이너리 툴과 커널 헤더입니다. 컴파일러는 Glibc이 항상 $PATH 디렉토리에서 gcc를 발견하는데 항상 사용것이므로 일반적으로 아무런 문제가 없습니다. 바이러리 툴과 커널 헤더는 작고 더 까다로울 수 있습니다.그러므로 우리는 위험이 없고 올바른 선택을 강화하기위해 스위치 설정을 사용합니다. ./configure 후에 당신은 모든 중요한 세부사항을 위해 glibc-build 디렉토리에서 config.make 파일의 내요을 검사 할 수 있습니다. 당신은 바이너리 툴이 사용되는 제어에 CC="gcc -B/tools/bin/"의 사용과 같은 재미있는 아이템을 주목할 것이고, 또한 탐색 패스을 포함한 컴파일러의 제어에 -nostdinc and -isystem flags의 사용과 같은 재미있는 아이템을 주목할 것입니다. 이 아이템은 Glibc 패키지의 중요한 관점에 강조하는 것을 돕습니다. 이것은 그것의 빌드 장치에서 매우 독립적이고 일반적으로 toolcahin default를 믿지 않습니다.

Glibc 인스톨후 우리는 우리의 /tools frefix에서 탐색하는 것과 연것하는 것이 발생하는 것을 보증하는 조정을 만듭니다. 우리는 조정된 ld를 설치하는데 그것은 컴퓨터안의 탐색길은 /tools/lib까지 한정되게 합니다. 그리고 우리는 /tools/lib에 우리의 새로운 동적인 링커를 가리키기 위해 gcc의 스펙파일을 고칩니다. 이 마지막 단계는 모든 과정에 중요합니다. 위에 말한대로, 동적인 링커로의 컴퓨터내의 패스는 모든 공유된 실행가능한 ELF로 내장됩니다. 당신은 readelf -l <name of binary> | grep interpreter을 수행함으로써 이것을 점검할 수 있습니다. 수정된 gcc의 스펙 파일에 의해 우리는 이 장의 끝을 통해 여기로부터 컴파된 모든 프로그램이 /tools/lib에 우리들의 새로운 동적인 링커를 사용할 것을 보증하고 있습니다.

새로운 동적인 링커를 사용할 필요성은 GCC의 두번째 패스를 위해 스펙 패치를 적용하는 것이 이유입니다. 그렇게 하는 데 있어서의 실패는 결과적으로 그들안으로 내장된 호스트 시스템 /lib 디렉토리로부터 그들 스스로 동적인 링커의 이름을 가지고 있는 GCC 프로그램이 될 것입니다. 그런데 그것은 호스트로부터 물러가는 우리들의 목적을 좌절 시킬 것입니다.

Binutil의 두번째 패스동안에 우리는 --with-lib-path 패스를 이용할 수있습니다. ld의 라이브러리 탐색 패스를 관리하기 위해 스위치를 구성합니다. 전방으로 이 포인트로부터 코어 toolchain은 독립식이고 호스트입니다. 5장의 나머지는 /toos에 새로운 Glibc에 반대하는 모든 빌디를 패키지합니다. 모두 잘 있습니다. 6장에서 chroot환경에 들어가자마자, 우리가 언급한 그것의 독립식 때문에 우리가 첫번째 중요한 팩키지에서 인스톨한것은 Glibc이다.

4.3. 정적연결에 대한 주의


모든 프로그램은 그들의 특정한 테스크옆에서, 오히려 보통적이고 때때로 하찮은 많은 동작을 수행합니다. 할당하는 메모리, 디렉토리와 파일 쓰기, 파일 읽기 string 조작, 패터 매칭, 수학과 다른 많은 직무를 포합니다. Wheel을 재발명하기 위해 각각의 프로그램을 어쩔수 없이 하게 하는 대신에, GNU 시스템은 이미 만들어진 라이브러리에 있는 기본적인 이 기능을 제공합니다.

그 들을 사용하는 프로그램에 대한 라이브러리로부터의 기능을 연결하는 두 주요한 방법(정적, 동적 :statically 또는 dynamically)이 있습니다. 프로그램이 정적으로 링크되었을때, 결과적으로 더 부피가 큰 프로그램이 되면서 실행가능한 그 사용된 function의 코드는 포함됩니다. 프로그램이 동적으로 링크되었을때, 포함되는 것은 동적인 링커, 라이브러리의 이름, 그리고 그 function의 이름에 대한 참조입니다. 그런데 그것은 더 작은 많은것에서의 실행가능한 결과입니다. 세번째 방법은 동적인 링커의 프로그래밍 인터페이스를 사용하는 것입니다. 더 많은 정보는 dlopen manpage를 보세요.

D동적인 연결은 Linux에 default하고 정적인 연결에 대한 중요한 세가지 중요한 장점을 가지고 있습니다.

첫 번째, 그 같은 코드의 많은 복사를 프로그램의 모든 가지(bunch)안으로 포함되게 하는 대신에 하드디스크에서 실행가능한 라이브러리 코드의 단지 하나의 복사를 필요로 합니다. 그래서 디스크공간 절약됩니다.두번째, 여러개의 프로그램이 같은 라이브러스 펑션을 동시에 사용할 때, 펑션 코드의 단지 한 복사는 core에 요구됩니다. 그래서 메모리공간이 절약됩니다.세번째, 라이브러리 펑션이 버그를 고정되게 하거나 그렇지 않으면 개선될 때, 그 개선된 펑션을 이용하는 모든 프로그램을 다시 컴파일해야 하는 대신에 단지 이 한 라이브러리를 다시 컴파일 필요가 있습니다.

동적인 연결이 여러 장점을 가지고 있다면 왜? 우리는 이 장에서 첫번째 두 팩키지를 정적으로 연결할까요? 그 이유는 3부분입니다.- 역사적이고, 교육적이고, 기술적입니다(historical, educational, and technical). 역사적으로는, 더 일찍이 LFS의 버젼 이 장의 모든 프로그램에서 정적으로 연결되었기 때문입니다. 교육적으로는, 차이점을 아는것이 유용하기 때문입다. 기술적으로는, 우리가 그렇게 하는데 있어서 호스트로부터 독립적인 부분을 얻기 때문입니다. 의미는 프로그램이 호스트 시스템으로부터 독립적으로 사용되는 것입니다. 그러나 처음 두 패키지가 동적으로 빌드될 때, 전체의 성공적인 LFS 빌드는 여전히 성취할 수 있다는 것을 유의할 가치가 있습니다.


4.4. 일반적인 컴파일 설명들

chaoxifer - 7.2로 업데이트하면서 새로 추가한 부분입니다.

패키지들을 빌드하기 전에 기본적으로 알아두어야할 것들이 몇가지 있습니다.

* 몇몇의 패키지들은 빌드 중 문제들을 피하기 위해 컴파일전에 패치가 적용되어야합니다. 어떤 패치는 이번 장에서나 다음 장에서 두번 다 패치되어야하는 경우도 있지만 또 다른 경우에는 한번만 패치되어도 되는 것이 있습니다. 이때문에 여러분들은 패키지를 설치하면서 패치가 이루어지지 않아 설명서에서 실수로 빠진것이 아닐까 걱정할 필요가 없습니다. 패치를 적용하고서 빌드시에 나타나는 offset이나 fuzz에 대한 경고메세지들은 이미 패치안에서 충분히 계산된 결과입니다. 이부분에 대해서는 걱정하실 필요는 없습니다.

* 대부분의 패키지를 컴파일하는 동안 화면에 몇몇 경고메세지들이 나타날 것입니다. 이것은 무시해도 되는 경고입니다. 이러한 경고메세지들은 혹은 C, C++ 구문에서 사용되는 deprecated(예전에는 사용되었지만 이제는 사용되지 않는 것들)에 대한 것들입니다. C 표준은 자주 바뀌기 때문에 패키지들중 어떤 것들은 오래된 표준을 사용하는 것들도 있습니다.

* 마지막으로 LFS 환경 변수가 제대로 설정되어있는지 확인하십시오:
echo $LFS

2가지 중요한 사실들
  1. 이 책에서 이루어지는 빌드는 bash셸을 사용한다고 가정합니다.

  2. 빌드 과정에 대해 다시 강조합니다:
  1. 모든 소스와 패치들이 들어있는 디렉토리는 chroot환경에서 접근가능한 /mnt/lfs/sources같은 디렉토리이어야 합니다. 절대로 /mnt/lfs/tools/ 디렉토리 안에 소스를 놓지 마십시오.

  2. 소스 디렉토리로 현재 디렉토리를 바꾸십시오.

  3. 각 패키지들에 대하여
    3-1. tar 프로그램을 이용해서 빌드할 패키지를 푸십시오. 이 장에서는 여러분이 lfs 로 패키지를 풀었는지 다시한번 확인하십시오.
    3-2. 여러분이 패키지를 풀어서 생성된 디렉토리로 이동하십시오.

    3-3. 책의 설명에 따라 패키지를 빌드하십시오.

    3-4. 다시 소스 디렉토리(cd ../)로 이동합니다.

    3-5. 방금 작업했던 디렉토리를 삭제하고 <package>-build와 같은 디렉토리들은 책의 설명에 따라 더이상 관련 패키지를 빌드할 필요가 없으면 그 때 삭제하시기 바랍니다.

4.5. Binutils-2.22 - Pass 1 설치


Approximate build time: 1.0 SBU Required disk space: 194 MB

Bintutils(2.14) 공식 다운로드 사이트: ftp://ftp.gnu.org/gnu/binutils/

Binutils와 의존성 관계에 있는 프로그램들: Bash, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, Make, Perl, Sed, Texinfo.

4.5.1. Binutils의 인스톨


binutils는 가장 먼저 컴파일 해야 합니다.

기본 최적화 플래그(including the -march and -mcpu options)들을 변경하는것은 그리 좋지 습관이 아닙니다. 그러므로 만약에 당신이 CFLAGS나 CXXFLAG 같은 이미 최적화 되어있는 환경변수들을 변경했을 경우에는 Glibc를 설치할 때 원상복귀 시켜주세요.

컴파일 최적화 사용으로 빌드 실패가 일어나지 않도록 패치를 적용합니다.
patch -Np1 -i ../binutils-2.22-build_fix-1.patch

binutils 문서에서는 binutils를 설치할때 /tools 밖에서 설치하는것을 권장합니다:
mkdir -v ../binutils-build
cd ../binutils-build
Note: SBU를 제대로 측정하기 위해서는 한 팩키지를 설치할 때 필요한 총 시간을 계산할 수 있는 방법을 사용해야 합니다. 다음과 같이 하면 SBU를 제대로 구할 수 있습니다. time { ./configure ... && ... && ... && make install; }.

Binutils 컴파일 준비하기:
../binutils-2.22/configure     
    --prefix=/tools            
    --with-sysroot=$LFS        
    --with-lib-path=/tools/lib 
    --target=$LFS_TGT          
    --disable-nls              
    --disable-werror

The meaning of the configure options:
  • --prefix=/tools: binutils프로그램들을 /tools로 설치하라는 옵션.
  • --disable-nls: 다국어 지원옵션을 끈다. 우리는 앞으로 프로그램을 정적으로 컴파일해서 사용할 건데 이와같은 옵션을 켜두면 나중에 문제가 생길수 있어서 사용하지 않는다.
  • --with-sysroot=$LFS: 이것은 빌드 시스템이 $LFS(/mnt/lfs)안에서 필요한 타겟 시스템 라이브러리를 ㅤㅊㅏㅊ으라고 설정하는 옵션입니다.
  • --with-lib-path=/tools/lib: 이것은 링커가 설정될 때 사용되는 라이브러리 경로입니다.
  • --target=$LFS_TGT: 컴퓨터에 대한 디스크립션이 저장된 $LFS_TGT 환경변수는 config.guess스크립트에서 리턴되는 값과 약간 다릅니다. 이때문에 configure 스크립트로 크로스 링커를 만들기 위해 $LFS_TGT값을 Binutils의 빌드 시스템에 적용하라고 말해주는 옵션입니다.
  • --disable-werror: 이것은 호스트 컴파일러부터 나오는 경고들에 의해 빌드가 멈추는 것을 막아주는 옵션입니다.

이어서 컴파일을 계속 합시다.:
make

자, 이제 컴파일은 끝났습니다. test suite를 어디에서 실행할 것인지가 중요합니다. 아직 언급이 조금 이른 것이기에, 이 장에서는 test suites 를 실행하는것은 추천하지 않습니다.(for the temporary) GCC test suite를 실행하기를 원할지라도 아직 없기때문에 이 장에서 사용할 수 없습니다. 게다가 이번장에서 설치한 프로그램은 다음 설치과정에서 덮어쓰기 됩니다.

만약 x86_64에서 빌드했다면 툴체인을 정상적으로 하기 워해 심볼릭 링크를 만들어줍니다
case $(uname -m) in
  x86_64) mkdir -v /tools/lib && ln -sv lib /tools/lib64 ;;
esac

패키지 인스톨하기:
make install

Glibc를 설치한 후에 보게 될 "locking in"부분을 위한 선행작업:
make -C ld clean
make -C ld LDFLAGS="-all-static" LIB_PATH=/tools/lib

make 파라미터의 의미:
  • -C ld clean: ld 디렉토리안의 모든 컴파일된 실행화일들을 지운다.
  • -C ld LDFLAGS="-all-static" LIB_PATH=/tools/lib: 이옵션은 ld 서브 디렉토리 안의 모든 프로그램들을 리빌드한다. LIB_PATH 변수에 "/tools/lib"를 지정하면 기본 셋팅되어 있는 디렉토리를 참조하는 것이 아니라 라이브러리 패스로 /tools/lib를 참조하게 된다. 이 변수는 링커의 경로를 지정하는 역할을 한다.
주의

Binutils 와 소스 디렉토리를 지우지 마세요. 이 장의 뒷쪽에서 다시 사용하게 됩니다.

자세한 내용은 the Section called Contents of Binutils in Chapter 6을 참조하세요.

4.6. GCC-4.7.4 - Pass 1 설치


Approximate build time: 5.5 SBU Required disk space: 1.G GB

GCC (4.7.1) 공식 다운로드 사이트: ftp://ftp.gnu.org/pub/gnu/gcc/

GCC와 의존성 관계에 있는 프로그램들: Bash, Binutils, Coreutils, Diffutils, Findutils, Gawk, Gettext, Glibc, Grep, Make, Perl, Sed, Texinfo.

설명: GCC 패키지는 C와 C++ 컴파일러들을 포함한 GNU 컴파일러 컬렉션을 포함합니다. ''' 기본 최적화 플래그(including the -march and -mcpu options)들을 변경하는것은 그리 좋지 습관이 아닙니다. 그러므로 만약에 당신이 CFLAGS나 CXXFLAG 같은 이미 최적화 되어있는 환경변수들을 변경했을 경우에는 Glibc를 설치할 때 원상복귀 시켜주세요. '''

4.6.1. Cross GCC 설치


GCC는 GMP, MPFR, MPC 패키지들을 필요로 합니다. 만약 여러분들의 호스트 시스템에 언급한 것들이 패키지 형태로 따로 있지 않다면 GCC패키지 안에 전부 포함되어 있을 것입니다.

먼저 GCC 소스 디렉토리 안에 각각의 패키지들을 풀고 GCC 빌드과정에서 이들 패키지들이 자동적으로 사용되도록 이름을 바꿔줍니다.
tar -Jxf ../mpfr-3.1.1.tar.xz
mv -v mpfr-3.1.1 mpfr
tar -Jxf ../gmp-5.0.5.tar.xz
mv -v gmp-5.0.5 gmp
tar -zxf ../mpc-1.0.tar.gz
mv -v mpc-1.0 mpc

다음의 명령문은 GCC의 default dynamic linker를 /tools에 설치되어 있는 프로그램을 사용하도록 바꿀것입니다. 또한 GCC의 include 검색 경로또한 삭제합니다.(/usr/include)
for file in 
 $(find gcc/config -name linux64.h -o -name linux.h -o -name sysv4.h)
do
  cp -uv $file{,.orig}
  sed -e 's@/lib(64)?(32)?/ld@/tools&@g' 
      -e 's@/usr@/tools@g' $file.orig > $file
  echo '
#undef STANDARD_STARTFILE_PREFIX_1
#undef STANDARD_STARTFILE_PREFIX_2
#define STANDARD_STARTFILE_PREFIX_1 "/tools/lib/"
#define STANDARD_STARTFILE_PREFIX_2 ""' >> $file
  touch $file.orig
done

처음 보면 무슨말인지 이해하기 힘들 겁니다. 하나하나 살펴보도록 합시다. 먼저 우리는 gcc/config 디렉토리안에서 linux.h, linux64.h, sysv4.h라는 이름을 가지는 파일을 찾아냅니다. 파일이 검색되면 해당 파일을 .orig를 파일명 뒤에 덧붙여서 복사합니다. 그 뒤에 sed 명령으로 사용된 정규표현식이 "/lib/ld", "/lib64/ld", "lib32/ld"에 "/tools"를 덧붙이고 두번째 표현에서는 "/usr"가 "/tools"로 대체됩니다. 다음문장운 기존 startfile의 경로를 파일의 끝부분으로 설정하는 것입니다. STANDARD_STARTFILE_PREFIX_1에서 새로 정의한 부분의 "/tools/lib/" 이부분을 자세히 보십시오. 뒷부분에 "/"가 있어야 합니다. 마지막으로 touch를 이용해 원본 파일의 비정상적인 변경을 미리 막을 수 있습니다. 이는 파일의 변경날짜를 설정해서 cp -u를 사용하였을 때 원본파일의 잘못된 변경을 막을 수 있습니다. (cp -u 는 복사할 파일이 있을 때 이 파일의 변경 날짜가 같거나 더 최근의 것이면 복사하지 않습니다.)

GCC는 스택보호를 제대로 감지하지 못하기 때문에 Glibc-2.16.0을 빌드할 때 문제가 발생할 수도 있습니다. 다음의 명령으로 해당 문제를 해결할 수 있습니다:
sed -i '/k prot/agcc_cv_libc_provides_ssp=yes' gcc/configure

GCC 문서에서는 GCC를 설치할때 /tools 밖에서 설치하는것을 권장하고 있습니다.
mkdir -p $LFS/build/gcc-build
cd $LFS/build/gcc-build

GCC컴파일을을 워해 configure:
../gcc-4.7.1/configure         
    --target=$LFS_TGT          
    --prefix=/tools            
    --with-sysroot=$LFS        
    --with-newlib              
    --without-headers          
    --with-local-prefix=/tools 
    --with-native-system-header-dir=/tools/include 
    --disable-nls              
    --disable-shared           
    --disable-multilib         
    --disable-decimal-float    
    --disable-threads          
    --disable-libmudflap       
    --disable-libssp           
    --disable-libgomp          
    --disable-libquadmath      
    --enable-languages=c       
    --with-mpfr-include=$(pwd)/../gcc-4.7.1/mpfr/src 
    --with-mpfr-lib=$(pwd)/mpfr/src/.libs

configure 옵션의 의미
  • --with-newlib: 아직 C library가 사용가능하지 않은 상태에서 libgcc가 빌드되면 문제가 실패할 수도 있습니다. 때문에 inhibit_libc 상수가 정의되어있다는 것을 미리 알려줘서 libc를 필요로하는 코드가 컴파일되지 않도록 합니다.
  • --without-headers: cross-compiler를 완벽하게 만드려면 GCC는 target시스템과 호환이되는 표준 헤더파일들이 필요합니다. 하지만 우리의 목표에는 이러한 헤더파일들은 필요하지 않습니다. 이 플래그는 GCC가 해당 헤더파일들을 찾지 않도록 해줍니다.
  • --with-local-prefix=/tools: gcc include path가 /usr/local/include로 되어 있는 것을 /tools/로 바꾸어 주기 위서입니다. 이 옵션이 꼭 필요한 것은 아니지만 우리는 호스트 시스템에 영향을 최소화 하기를 원하기 때문에 이 옵션을 사용합니다.
  • --with-native-system-header-dir=/tools/include: GCC는 기본적으로 /usr/include에서 시스템 헤더파일들을 찾습니다. sysroot 스위치( GCC 옵션으로, 표준 C 라이브러리 헤더 파일과 리이브러리 위치를 변경할 때 사용합니다. 보통 크로스 컴파일을 할 때 사용됩니다. 예:gcc --sysroot=/example 하면 /example/usr/include에서 헤더파일을 찾게 됩니다 )와 함께 이용하면 보통 $LFS/usr/include로 바뀔 것입니다.
  • --disable-shared: GCC가 정적 내부 라이브러리를 링크하도록 만듭니다. 이렇게 하여 호스트 시스템에서 발생될 수 있는 문제를 피할 수 있습니다.
  • --disable-decimal-float, --disable-threads, --disable-libmudflap, --disable-libssp, --disable-libgomp, --disable-libquadmath: 크로스 컴파일러를 빌드할때 위의 decimal-float, threads, libmudflap, libssp들은 빌드시에 실패할 뿐더러 임시 libc를 만드는 데에 필요가 없기 때문에 사용하지 않도록 합니다.
  • --disable-multilib: x86_64에서 LFS는 아직 multilib 설정을 지원하지 않습니다. 이 스위치는 x86 시스템에서는 아무런 영향이 없습니다.
  • --enable-languages=c: 이 옵션은 설치시에 C 컴파일러를 사용하도록 지정합니다. 이 옵션은 GCC 타르볼을 다운로드 받아서 설치할때만 사용합니다.

패키지 컴파일하기.
make 

make파라미터의 의미

컴파일은 끝났습니다. test suite를 어디에서 실행할 것인지가 중요합니다. 아직은 그런걸 말하기엔 조금 이르기 때문에, 이 장에서는 test suites 를 실행하는것은 추천하지 않습니다. GCC test suite를 실행하기를 원할지라도 아직 없기 때문에 이 장에서 사용할 수 없습니다. 게다가 이번장에서 설치한 프로그램은 다음 설치 과정에서 덮어 쓰게 됩니다.

패키지 설치하기:
make install
지금까지의 과정이 끝나면 /tools/bin/cc의 symlink를 만들것입니다. 많은 프로그램들과 스크립트들은 gcc 대신에 cc를 이용합니다. 이것은 프로그램의 속성을 유지하게 하고, 모든 종류의 유닉스 시스템에서 사용할 수 있게 해줍니다. 모든 종류의 유닉스 시스템에 GNU C 컴파일러가 설치되어 있는건 아닙니다. 이렇게 하면, 시스템에 어떤 종류의 C 컴파일러가 설치되어 있던간에 일일히 관리자 신경써줄 필요가 없기 때문에 편합니다. 심볼릭 링크의 장점이 바로 이런 것입니다.
cd /tools/bin
ln -s gcc /tools/bin/cc 

ln -vs libgcc.a `$LFS_TGT-gcc -print-libgcc-file-name | sed 's/libgcc/&_eh/'`

--disable-shared를 사용하는것은 libgcc_eh.a 파일을 생성, 설치하지 않는다는 것을 의미합니다. Glibc 패키지는 -lgcc_eh를 빌드시에 사용하게 되면 libgcc_eh.a에 의존하게 됩니다. 이 의존성은 위와 같이 심볼릭링크롤 만들어 줌으로써 해결할 수 있습니다.

4.7. Linux-3.5.2 API 헤더들 설치


Approximate build time: 0.1 SBU Required disk space: 511 MB

설명: Linux API Headers(파일 linux-3.5.2.tar.xz)들은 Glibc에 의해 사용됩니다.

4.8. Linux API Headers 설치


리눅스 커널은 시스템의 C 라이브러리 사용을 위해 Application Programming Interface(API)를 제공합니다. 이것은 Linux kernel tarball 내에 있는 C 헤더파일들을 사용가능하도록 만들어서 설치할 수 있습니다. 자, 이제 우린 커널의 압축을 풀고, 설치하고, 필요한 파일들을 gcc가 참조할 위치에 복사할겁니다.

헤더파일 설치 준비하기
make mrproper
make mrproper를 실행함으로써 커널트리에 있는 불필요한 것들이 제거되었습니다. 리눅스 커널팀에서는 다른 여러 종류의 커널 컴파일전에 make mrproper을 실행하는 것을 추천합니다.

이제 사용자가 볼 수 있는 커널헤더파일이 추출합니다.
make headers_check
make INSTALL_HDR_PATH=dest headers_install
cp -rv dest/include/* /tools/include

4.9. Glibc-2.16.0 설치


Approximate build time: 5.4 SBU Required disk space: 554 MB


Glibc와 의존성 관계에 있는 프로그램들: Bash, Binutils, Coreutils, Diffutils, Gawk, GCC, Gettext, Grep, Make, Perl, Sed, Texinfo.

설명: Glibc 패키지는 주요 C 라이브러리를 포함하고 있습니다. 이 라이브러리들은 메모리할당이나 디렉토리 검색, 파일에 대한 열기와 닫기, 읽기/쓰기, 문자열 핸들링, 패턴 매칭, 산술연산 등에 대한 기본적인 방법들을 제공합니다.

4.9.1. Glibc 설치

-- 기본 최적화 플래그(including the -march and -mcpu options)들을 변경하는것은 그리 좋지 습관이 아닙니다. 그러므로 만약에 CFLAGS나 CXXFLAG 같은 이미 최적화 되어있는 환경변수들을 변경했을 경우에는 Glibc를 설치할 때 원상복귀 시켜주세요.

기본적으로, Glibc를 책에서 제시하는것이 아닌 다른 방법으로 컴파일하는것은 사용자의 시스템의 안정성을 해칠 수 있습니다. --

LFS 7.1에서 rpc 헤더파일이 정상적으로 설치되지 않는 경우가 있었습니다. 여러분의 호스트 시스템에 제대로 설치되어 있는지 확인하고 만약 설치되어 있지 않다면 다음 명령을 실행하십시오:
if [ ! -r /usr/include/rpc/types.h ]; then
  su -c 'mkdir -p /usr/include/rpc'
  su -c 'cp -v sunrpc/rpc/*.h /usr/include/rpc'
fi

GCC-4.7.1로 Glibc-2.16.0을 빌드할 때 생기는 버그를 픽스합니다:
sed -i 's/ -lgcc_s//' Makeconfig

Glibc문서는 전용디렉토리안에 소스디렉토리 밖에서 Glibc를 빌드하는것을 추천합니다:
mkdir -v ../glibc-build
cd  ../glibc-build

Glibc 컴파일 준비:
../glibc-2.16.0/configure                             
      --prefix=/tools                                 
      --host=$LFS_TGT                                 
      --build=$(../glibc-2.16.0/scripts/config.guess) 
      --disable-profile                               
      --enable-add-ons                                
      --enable-kernel=2.6.25                          
      --with-headers=/tools/include                   
      libc_cv_forced_unwind=yes                       
      libc_cv_ctors_header=yes                        
      libc_cv_c_cleanup=yes

여기서 잠깐. Glibc를 컴파일 할 때는 절대! Glibc의 압축을 풀어 놓은 디렉토리에서 하면 안 됩니다. 위에서도 보면 알겠지만, 압축을 풀어 놓은 디렉토리가 아니라 상위 디렉토리에서 작업을 하고 있음을 알 수 있습니다. 만약 압축을 풀어 놓은 디렉토리에서 작업을 하게 되면 일단, Configure에서 에러가 발생하고 억지로 컴파일을 한다고 해도 컴파일 도중 에러가 발생합니다.

설정 옵션의 의미:
  • --host=LFS_TGT, --build=$(../glibc-2.16.0/scripts/config.guess): 이 두가지 스위치를 함께 사용하면 Glibc의 빌드 시스템은 /tools 안에 있는 크로스 컴파일러와 크로스 링커를 사용하여 크로스 컴파일을 하게 됩니다.
  • --disable-profile: 프로파일 정보 라이브러리들의 빌딩을 비활성화합니다. 당신이 프로파일을 만들 계획이라면 이 옵션을 빼세요.
  • --enable-add-ons=linuxthreads: threading라이브러리처럼 Linuxthreads add-on을 사용을 한다고 Glibc에게 알려줍니다.
  • --enable-kernel=2.6.25: Glibc에 컴파일하는 라이브러리는 커널 2.6.25이거나 이보다 최신 버전을 지원합니다. 만약 이보다 오래된 커널버전인경우는 컴파일이 불가능합니다.
  • --with-headers=/tools/include: Glibc에게 커널 헤더파일을 설치한 디렉토리 경로를 말해줍니다.
  • libc_cv_forced_unwind=yes: Binutils-2.22에서 크로스컴파일되었던 링커는 Glibc가 설치되기 전까지는 사용할 수가 없습니다. 이때문에 configure 테스트에서 force-unwind support 테스트과정에서 configure fail이 일어날 수 있습니다. 이 옵션은 fore-unwind support를 테스트 하지 않고 넘어가도록 해줍니다.
  • libc_cv_c_cleanup=yes: 위와 같은 이유로 configure script가 C cleanup handling support를 테스트하지 않고 넘어가도록 해줍니다.
  • libc_cv_ctors_header=yes: 위와 같은 이유로 configure script가 gcc constructor support를 테스트하지 않고 넘어가도록 해줍니다.
  • --with-binutils=/tools/bin and --with-headers=/tools/include: 이 부분은 절대 건드리지 말고 그대로 하세요. 이 부분을 건드리면 컴파일 자체가 안 되거나 된다 하더라도 나중에 100% 문제가 발생합니다.

configure 도중 다음과 같은 경고 메세지가 발생할 수도 있습니다:
configure: WARNING:
*** These auxiliary programs are missing or incompatible versions: msgfmt
*** some features will be disabled.
*** Check the INSTALL file for required versions.
잃어버리거나 호환성이 없는 msgfmt프로그램은 일반적으로 필요 없습니다, 하지만 가끔 test suite를 실행할때 문제를 일으킵니다.

패키지 컴파일:
make

이 패키지는 test suite와 같이 제공되지만 아직 C++ 컴파일러를 가지고 있지 않기 때문에 실행할 수 없습니다.

Note
test suite를 성공적으로 실행하기 위해서는 locale 데이터가 있어야 합니다. Locale data는 날짜, 시간, 현재 시스템 유틸리티에 의해 출력되거나 수용되는 데이터 포맷들에 대한 정보를 갖고 있습니다. 현재 test suite를 실행할 수 없는 이유는 아직 필요한 로케일을 설치하지 않았기 때문입니다. 적당한 로케일 설치는 다음 장에서 할 겁니다. 그래도 Glibc 로케일을 설치하고 싶으시면 다음장에 있는 Glibc-2.16.0 부분을 살펴보세요

make install

경고

새로운 toolchain의 기본기능(compiling and linking)을 설치하고 지우는 것이 중요한 일입니다. 다음과 같이 간단한 프로그램을 짜서 제대로 설치되었는지를 확인해 봅시다.

echo 'main(){}' > dummy.c
cc dummy.c
readelf -l a.out | grep ': /tools'

지금까지 모든 작업을 잘 따라 했다면 에러는 없을 것이고, 다음과 메세지를 볼 수 있을 것입니다.

Requesting program interpreter: /tools/lib/ld-linux.so.2

(다이나믹 링커 이름에 플랫폼의 특징이 나타나 있습니다.) 다이나믹 링커를 설치할 때 설치경로로써 /tools/lib 를 설정해 줘야 합니다.(prefix = /tools/lib) 위와 같은 메세지가 출력되지 않거나, 아무런 메세지가 없다면 어떤 것이 심각하게 잘못된 것입니다. 설치과정중에 어디에서 문제가 발생했는지 알아보고 조사하는것이 필요합니다. 설치과정이 완전히 종료되기 전까지는 위와 같은 상황이 발생해도 일일이 반응할 필요는 없습니다. 첫째, cc 대신에 gcc를 사용해서 sanity check를 반복해서 한다. 위와 같은 작업은 /tools/bin/cc의 symlink가 잘못 되어있다는 것을 의미합니다. GCC-3.3.2 - Pass 1 인스톨 에 다시 가서(참조해서) symlink를 수정해 주세요. 두번째, $PATH 환경변수가 제대로 지정되었는지 확인하자. $PATH 환경변수가 제대로 지정되었는지 확인하기 위해서 echo $PATH 를 입력해보자. echo $PATH를 입력했을때 나오는 리스트에 /tools/bin가 있으면 제대로 지정되었다고 볼 수 있다. 만약 $PATH환경변수가 잘못되었다면 lfs사용자로 로그인을 하지 않았거나 환경설정하기 장에서 무언가 실수를 했다는 의미이다. 세번째, 설정파일을 변경하고 나서 무엇가 문제가 생길 때도 있다. 그런경우에는 지난번에 추천한것처럼 cut-and-paste(원본에서 갖다붙이기)를 이용해서 설정파일을 다시 만들어라.

모든 작업이 만족스럽게 끝났다면, test files을 지우세요.
rm dummy.c a.out

자, self-contained toolchain의 설치가 완벽하게 끝났고, 이것들은 나머지 임시도구들을 build 하는데 사용될 것입니다.

4.10. Binutils-2.22 - Pass 2

빌드 시간: 1.1 SBU 필요 용량: 407 MB

4.10.1. Bintuils 설치하기

컴파일러 최적화시에 빌드 실패를 막기 위해 다음과 같이 패치를 적용합니다.
patch -Np1 -i ../binutils-2.22-build_fix-1.patch

소스 디렉토리 밖에서 새로운 빌드 디렉토리를 만듭니다.
mkdir -v ../binutils-build
cd ../binutils-build

Bintuils 컴파일을 준비합니다:
CC=$LFS_TGT-gcc 
AR=$LFS_TGT-ar  
RANLIB=$LFS_TGT-ranlib 
../binutils-2.22/configure 
   --prefix=/tools 
   --disable-nls   
   --with-lib-path=/tools/lib

새로운 configure 옵션들:
  • CC=$LFS_TGT-gcc AR=$LFS_TGT-ar RANLIB=$LFS_TGT-ranlib: 호스트 시스템에 있는 컴파일러 대신 크로스 컴파일러를 사용하도록 이런 변수들을 확실하게 정해주어야 합니다.
  • --with-lib-path=/tools/lib: 이것은 configure 스크립트가 라이브러리 검색 경로로 host시스템을 사용하지 않고 /tools/lib을 탐색하도록 합니다.

패키지를 컴파일합니다:
make

패키지를 설치합니다:
make install

이제 다음장의 "Re-adjusting" 부분을 위한 링커를 미리 준비해둡니다.
make -C ld clean
make -C ld LIB_PATH=/usr/lib:/lib
cp -v ld/ld-new /tools/bin

파라미터 설명:
  • -C ld clean: make 프로그램에게 "ld"라는 하위 디렉토리내에 컴파일된 모든 파일을 지우라고 말합니다.
  • -C ld LIB_PATH=/usr/lib:/lib: 이 옵션은 ld 하위 디렉토리 내에 있는 모든 것들을 다시 빌드하라는 것입니다. LIB_PATH라는 Makefile 변수를 지정해서 임시 툴을 설치하기 위해 변경했던 라이브러리 경로를 다시 원래의 디폴트값으로 되돌려놓습니다. 이러한 준비는 다음 장을 위해 필요한 과정입니다.

4.11. GCC-4.7.1 - Pass 2

예상 시간: 7.1 SBU 필요 용량: 1.8 GB

4.11.1. GCC 설치하기

우리가 처음 빌드했던 GCC에는 내부 시스템 헤더들이 몇개밖에 없었습니다. 그들 중 하나인 limits.h는 시스템 limits.h(/tools/include/limits.h) 헤더 안에 명시되어 있는 것들을 순서대로 include 합니다. 하지만 gcc가 처음 빌드될 당시에는 /tools/include/limits.h라는 파일이 존재하지 않았고 따라서 GCC가 설치되었다고 해도 해당 헤더파일들은 include되지 못하고 부분적으로만 설치될 수밖에 없었습니다. 이것은 임시적인 libc를 빌드하는데는 적합하지만 GCC를 빌드하기에는 헤더파일이 부족할 수 밖에 없습니다. 완전한 버전의 내부 헤더파일들을 갖기 위해서는 다음과 같이 해결할 수 있습니다:

cat gcc/limitx.h gcc/glimits.h gcc/limity.h > 
  `dirname $($LFS_TGT-gcc -print-libgcc-file-name)`/include-fixed/limits.h


x86 시스템에서는 GCC의 bootstrap 빌드는 -fomit-frame-pointer라는 컴파일러 플래그를 사용합니다. bootstrap이 없는 빌드에서는 생략되는게 기본이지만 bootstrap이 있다는 가정하에 컴파일러를 만들어내는게 목표이기 때문에 다음과 같이 sed명령으로 플래그를 사용하도록 하겠습니다:

cp -v gcc/Makefile.in{,.tmp}
sed 's/^T_CFLAGS =$/& -fomit-frame-pointer/' gcc/Makefile.in.tmp 
  > gcc/Makefile.in

다시한번 /tools에 설치된 링커를 사용하도록 GCC의 기본 동적 링커의 위치를 변경해줍니다:

for file in 
 $(find gcc/config -name linux64.h -o -name linux.h -o -name sysv4.h)
do
  cp -uv $file{,.orig}
  sed -e 's@/lib(64)?(32)?/ld@/tools&@g' 
  -e 's@/usr@/tools@g' $file.orig > $file
  echo '
#undef STANDARD_STARTFILE_PREFIX_1
#undef STANDARD_STARTFILE_PREFIX_2
#define STANDARD_STARTFILE_PREFIX_1 "/tools/lib/"
#define STANDARD_STARTFILE_PREFIX_2 ""' >> $file
  touch $file.orig
done

처음 GCC를 빌드했을때와 마찬가지로 GMP, MPFR, MPC 패키지가 필요합니다. 각각의 tarball을 풀고 빌드에 필요한 이름으로 바꿉니다:

tar -Jxf ../mpfr-3.1.1.tar.xz
mv -v mpfr-3.1.1 mpfr
tar -Jxf ../gmp-5.0.5.tar.xz
mv -v gmp-5.0.5 gmp
tar -zxf ../mpc-1.0.tar.gz
mv -v mpc-1.0 mpc

소스 디렉토리와 분리된 빌드 디렉토리를 만들어줍니다:
mkdir -v ../gcc-build
cd ../gcc-build

반드시 GCC를 빌드하기 전에 최적화에 관련된 플래그 설정했던 것을 확인하고 설정되어 있다면 다시 unset해주십시오.

이제 GCC 컴파일을 준비합니다:
CC=$LFS_TGT-gcc 
AR=$LFS_TGT-ar                  
RANLIB=$LFS_TGT-ranlib          
../gcc-4.7.1/configure          
    --prefix=/tools             
    --with-local-prefix=/tools  
    --with-native-system-header-dir=/tools/include 
    --enable-clocale=gnu        
    --enable-shared             
    --enable-threads=posix      
    --enable-__cxa_atexit       
    --enable-languages=c,c++    
    --disable-libstdcxx-pch     
    --disable-multilib          
    --disable-bootstrap         
    --disable-libgomp           
    --with-mpfr-include=$(pwd)/../gcc-4.7.1/mpfr/src 
    --with-mpfr-lib=$(pwd)/mpfr/src/.libs

각각의 컴파일 옵션에 대한 설명입니다:
--enable-clocale=gnu

이 옵션은 모든 시스템환경에서 C++ 라이브러리를 위해 올바른 locale 모델이 선택되도록 해줍니다. 만약 configure 스크립트가 de_DE 로케일이 설치된 것을 발견했다면 올바른 GNU 로케일 모델을 선택할 것입니다. 하지만 만약 de_DE 로케일이 설치되지 않은 상태라면 일반 로케일 모델이 선택되어 호환이 안되는 C++ 라이브러리로 Application Binary Interface(ABI)가 설치될 위험이 있습니다.

--enable-threads=posix

멀티쓰레드 코드에 대한 C++ 예외 처리를 가능하게 합니다.

--enable-__cxa_atexit

이 옵션은 C++ 디스트럭터(파괴자)를 지역 static이나 전역 오브젝트로 등록할 때에 atexit보다 __cxa_atexit를 사용하도록 만들어줍니다. 디스트럭터에 대해 표준-호환가능한 핸들러를 위해서 반드시 필요한 옵션입니다. 또한 이것은 C++ ABI, C++ 공유 라이브러리, C++ 프로그램 등에 영향을 끼칩니다.

enable-languages=c,c++

이 옵션은 C와 C++ 컴파일러가 빌드되도록 합니다.

disable-libstdcxx-pch

절대로 libstdc++를 빌드하는데 pre-compiled header(PCH)를 빌드하지 마십시오. 용량도 클 뿐더러 우리는 이것을 사용하지 않을 것입니다.

--disable-bootstrap

원래 GCC 빌드는 "bootstrap" 빌드를 기본으로 합니다. 이것은 한번 GCC를 빌드하는 것이 아니라 여러번 빌드를 합니다. 이는 결함없이 컴파일하기 위함인데 LFS 빌드밤법는 매번 bootstrap이 필요하지 않는 solid 컴파일러를 제공해야하기 때문에 이 옵션을 사용합니다.

패키지를 컴파일합니다:
make

패키지를 설치합니다.
make install

마지막으로 symlink를 생성합니다. 많은 프로그램이 gcc대신 cc를 사용합니다. 모든 UNIX 시스템에서 GCC가 설치된 것이 아니기 때문에 보통 스크립트나 프로그램에서는 cc를 일반적으로 사용합니다. 다음과 같이 gcc를 cc로 사용하도록 링크를 걸어줍니다.
ln -sv gcc /tools/bin/cc

4.12. Tcl-8.5.12

Tcl 패키지는 Tool Command Language를 포함합니다.

빌드 시간: 0.4 SBU 필요 용량: 33 MB

4.12.1. Tcl 설치하기

이 패키지는 이 다음에 설치될 Expect, DejaGNU, Check과 함께 test suite를 실행하는데 필요합니다.

Tcl 컴파일을 준비합니다
cd unix
./configure --prefix=/tools

패키지를 빌드합니다
make

이제 컴파일이 완료되었습니다. test suite는 임시 툴들을 빌드하는 이 장에서는 반드시 실행할 필요는 없습니다. 하지만 그래도 test suite를 실행해야겠다면 다음과 같이 하십시오:
TZ=UTC make test

Tcl test suite는 아마도 호스트 조건이 충분하지 않아 실패할 것입니다. 여기서 test suite를 실패해도 놀랄 필요는 없습니다. TZ=UTC라는 파라미터는 타임존을 test suite가 실행되는 동안에만 Coordinated Universal Time(UTC) 또는 Greenwich Mean Time(GMT)로 설정해줍니다.

패키지를 설치합니다:
make install

설치된 라이브러리가 쓰기가 가능하도록 권한을 설정해주어 디버깅 심볼이 나중에 지워질 수 있도록 합니다.
chmod -v u+w /tools/lib/libtcl8.5.so
Tcl의 헤더를 설치합니다.
make install-private-headers
이제 필요한 심볼릭 링크를 만들어줍니다.
ln -sv tclsh8.5 /tools/bin/tclsh

4.12.2. Contents of Tcl

설치되는 프로그램: tclsh(link to tclsh8.5), tclsh8.5 설치되는 라이브러리: libtcl8.5.so, libtclstub8.5a

4.13. Expect-5.45


Expect패키지는 다른 대화식 프로그램에서 대화를 스크립트하기위한 프로그램들을 포함합니다.

Approximate build time: 0.1 SBU Required disk space: 4.4 MB

Expect와 의존성 관계에 있는 프로그램들: Bash, Binutils, Coreutils, Diffutils, GCC, Glibc, Grep, Make, Sed, Tcl.

4.13.1. Expect 설치


먼저 Expect의 configure 스크립트가 /usr/local/bin/stty대신에 /bin/stty를 사용하도록 설정해줍니다.
cp -v configure{,.orig}
sed 's:/usr/local/bin:/bin:' configure.orig > configure

Expect 컴파일 준비하기:
./configure --prefix=/tools --with-tcl=/tools/lib 
  --with-tclinclude=/tools/include

configure options의 의미:
  • --with-tcl=/tools/lib: configure script가 Tcl이 설치된 임시디렉토리의 위치를 찾을 수 있게 지정해 줍니다.우리는 LFS시스템을 새로 구축하고 있기때문에 이미 호스트시템에 설치되어 있는 (배포판으로 설치해둔) Tcl을 찾는것을 원하지 않습니다.
  • --with-tclinclude=/tools/include: Tcl의 internal 헤더의 위치를 말해줍니다. configure시에 자동적으로 Tcl의 헤더위치를 발견하지 못할경우 실패할 경우를 대비해 설정해줍니다.

package 컴파일하기:
make

이전에 말한 것처럼 이 장에서 우리는 임시도구들을 위한 test suits들을 실행하는 것을 추천하지 않습니다. 하지만, Tcl test suits를 실행하기를 원한다면, 아래와 같은 명령을 실행하세요. 그러나 호스트의 상태(설정)에 따라서(that are not fully understood)Tcl test suits가 실패하는 경우도 있다는 것을 알아야 합니다. 여기서 test suits실패해도 놀라진 마세요( 신중하게 고려할 필요는 없다.)
make test

설치하기:
make SCRIPTS="" install
make parameter의 의미:
  • SCRIPTS="": 이옵션은 expect scripts중에서 불필요한 것들을 설치하는 것을 방지해 줍니다.

자, 이제 Tcl과 Expect 소스 디렉토리를 삭제해도 됩니다.

4.13.2. Expect 내용


설치된 프로그램: expect

설치된 라이브러리: libexpect-5.45.a

4.13.3. 요약


expect "talks" to other interactive programs according to a script.

4.14. DejaGnu-1.5 설치


DejaGnu패키지는 다른 프로그램들을 검증하기위한 framework를 포함합니다.

Approximate build time: <=0.1 SBU Required disk space: 4.1 MB

DejaGnu (1.5) 공식 다운로드 사이트: ftp://ftp.gnu.org/gnu/dejagnu/

DejaGnu(1.5)와 의존성 관계에 있는 프로그램들: Bash, Binutils, Coreutils, Diffutils, GCC, Glibc, Grep, Make, Sed.

4.14.1. DejaGnu 설치


DejaGnu 컴파일 준비하기:
./configure --prefix=/tools

팩키지 빌드하고 설치하기:
make install

4.14.2. DejaGnu 내용


설치된 프로그램: runtest

4.14.3. 요약


runtest is the wrapper script that finds the proper expect shell and then runs DejaGnu.

4.15. Check-0.9.8

빌드 시간: 0.1 SBU 필요 용량: 6.9 MB

4.15.1. Check 설치하기

Check 컴파일을 위해 준비합니다:
./configure --prefix=/tools

패키지를 빌드합니다:
make

이제 컴파일이 완료되었습니다. 예전에 얘기했던것처럼 여기서 test suite를 실행하는 것은 의무는 아닙니다만 확인하고 싶다면 다음과 같이 명령을 실행하십시오:
make check
test suite를 확인하는 것은 대략 4 SBU 정도 걸립니다.

패키지를 설치합니다
make install

4.15.2. Contents of Check

설치되는 라이브러리: libcheck.a, libcheck.so

4.16. Ncurses-5.9 설치


Approximate build time: 0.7 SBU Required disk space: 26 MB

Ncurses (5.9) 공식 다운로드 사이트: ftp://ftp.gnu.org/gnu/ncurses/

Ncurses와 의존성 관계에 있는 프로그램들: Bash, Binutils, Coreutils, Diffutils, Gawk, GCC, Glibc, Grep, Make, Sed.

4.16.1. Ncurses-5.9 설치


압축 풀기:
mkdir -p $LFS/build/ncurses_build
cd $LFS/build/ncurses_build
tar zxvf /mnt/source/ncurses-5.4.tar.gz -C ./
Ncurses 컴파일 준비하기
cd $LFS/build/ncurses_build/ncurses-5.4
./configure --prefix=/tools --with-shared 
    --without-debug --without-ada --enable-overwrite      
Configure option의 의미:
  • --without-ada: 이렇게 하면, HOST 시스템에 Ada compiler가 이미 설치되어 있더라도 Ncurses를 컴파일 할 때, Ada bindings을 하지 않게 한다. 일단 우리가 chroot환경변수로 들어 갔을 때 HOST시스템에 설치된 Ada를 사용할 수 없기 때문에 이 옵션은 꼭 주어야 한다.
  • --enable-overwrite: 다른 팩키지들이 Ncurses헤더 파일들을 참조할 수 있도록 /toos/include/ncurses 대신 /tools/include로 설치하도록 지정해 주는 역활을 한다.

프로그램과 라이브러리들을 컴파일하기:
make

Ncurses문서들과 프로그램들을 설치하기:
make install

패키지에 포함된 프로그램에 대해선the Section called Contents of Ncurses in Chapter 6 를 참조하세요.

4.17. Bash-4.2 설치


Approximate build time: 0.4 SBU Required disk space: 48 MB

Bash (2.05b)) 공식 다운로드 사이트: ftp://ftp.gnu.org/gnu/bash/


Bash와 의존성 관계에 있는 프로그램들: Binutils, Coreutils, Diffutils, Gawk, GCC, Glibc, Grep, Make, Ncurses, Sed.

4.17.1. Bash 설치


Bash 는 몇가지 버그들이 존재합니다. 이 버그들을 고치기 위해서 다음과 같은 패치를 하세요:
patch -Np1 -i ../bash-4.2-fixes-8.patch      

Bash 컴파일 준비하기:
cd $LFS/build/bash_build/bash-4.2
./configure --prefix=/tools --without-bash-malloc

configure 옵션 설명
--without-bash-malloc

이 옵션은 세그먼트 폴트를 일으키는 Bash의 메모리할당의 사용을 끄는 옵션입니다. 앞으로 bash에서는 안정성을 위해 Glibc에서 제공하는 malloc 함수를 사용할 것입니다.

컴파일 하기:
make

자, 이제 컴파일이 끝났습니다. 이전에 말한 것처럼 이 장에서 우리는 임시도구들을 위한 test suits들을 실행하는 것을 추천하지 않습니다. 만약에 당신이 정말 Bash test suits를 실행하기를 원한다면, 아래와 같은 명령을 실행하세요:
make tests

Bash의 문서들과 프로그램 설치하기:
make install

심볼릭 링크를 만들어 준다:
ln -sv bash /tools/bin/sh

패키지에 포함된 프로그램에 대해선 the Section called Contents of Bash in Chapter 6 를 참조하세요.

4.18. Bzip2-1.0.6 설치


Approximate build time: <=0.1 SBU Required disk space: 5.7 MB

GCC와 의존성 관계에 있는 프로그램들 : Bash, Binutils, Coreutils, Diffutils, GCC, Glibc, Make.

4.18.1. Bzip2 설치


다운로드 공식 사이트: [ftp]ftp://sources.redhat.com/pub/bzip2/

Bzip2팩키지는 configure script가 없습니다. option을 한줄로 써서 컴파일 하고 설치합니다.
make
make PREFIX=/tools install      
패키지에 포함된 프로그램에 대해선 the Section called Contents of Bzip2 in Chapter 6 를 참조하세요.

4.19. Coreutils-8.19 설치


Approximate build time: 0.7 SBU Required disk space: 126 MB

Coreutils-8.19 공식 다운로드 사이트: ftp://ftp.gnu.org/gnu/coreutils/

Coreutils 패치를 받을 수 있는 사이트: ftp://ftp.gnu.org/gnu/coreutils/

Coreutils와 의존성 관계에 있는 프로그램들: Bash, Binutils, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, Make, Perl, Sed.

4.19.1. Coreutils 설치


Coreutils has an issue when compiled against Glibc-2.3.3. 패치를 안했을때, Coreutils utilities(head, tail, sort etc)중 일부 프로그램은 지난 30년동안 사용되어왔던 전통적인 문법과 충돌이 생길것입니다. 오래된 syntax들은 Coreutils가 여러장소에서 update될때 없어지지 않고, 새로운 버전에서도 지원이 되어왔습니다. 세부사항들은 패치명령을 보면 알 수 있습니다. Use of this patch is by no means compulsory but opting not to use it means you'll have deal with the consequences yourself, i.e. patch the many software packages that use the old syntax.

Coreutils 컴파일 준비하기:
./configure --prefix=/tools --enable-install-program=hostname

--enable-install-program=hostname
기본값은 사용하지 않는 것이지만 Perl test suite를 실행할 때 필요하기 때문에 설정해 줍니다. 빌드하고 설치될 바이너리를 위한 hostname을 설정합니다.

package 컴파일하기:
make

자, 이제 컴파일이 끝났습니다. 이전에 말한 것처럼 이 장에서 우리는 임시도구들을 위한 test suits들을 실행하는 것을 추천하지 않습니다. 만약에 당신이 정 Coreutils test suits를 실행하기를 원한다면, 아래와 같은 명령을 실행하세요:
make RUN_EXPENSIVE_TESTS=yes check

make parameter의 의미:
  • RUN_EXPENSIVE_TESTS=yes: This tells the test suite to run several additional tests that are considered relatively expensive on some platforms, 그렇지만 리눅스에서는 문제가 되지 않는다.

팩키지 설치하기:
make install
패키지에 포함된 프로그램에 대해선 the Section called Contents of Coreutils in Chapter 6 를 참조하세요.

4.20. Diffutils-3.2 설치


Approximate build time: 0.2 SBU Required disk space: 8.5 MB

Diffutils (3.2)공식 다운로드 사이트: ftp://ftp.gnu.org/gnu/diffutils/

Diffutils와 의존성 관계에 있는 프로그램들: Bash, Binutils, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, Make, Sed.

4.20.1. Diffutils 설치

Glibc-2.16.0과의 호환성 개선을 위해 다음을 실행합니다:
sed -i -e '/gets is a/d' lib/stdio.in.h

Diffutils 컴파일 준비하기:
./configure --prefix=/tools      

package 컴파일하기:
make

설치하기:
make install

패키지에 포함된 프로그램에 대해선 the Section called Contents of Diffutils in Chapter 6 를 참조하세요.

4.21. File-5.11

파일에 대한 타입을 결정해주는 유틸리티입니다.

빌드 시간: 0.1 SBU 필요 용량: 12.4 MB

4.21.1. File 설치하기

컴파일을 준비합니다:
./configure --prefix=/tools

패키지를 컴파일합니다
make

컴파일이 이제 끝났습니다. test suite는 의무는 아니지만 테스트해야겠다면 다음을 실행하십시오:
make check

패키지를 설치합니다.
make install

4.22. Findutils-4.4.2 설치


Approximate build time: 0.2 SBU Required disk space: 27 MB

Findutils (4.4.2) 공식 다운로드 사이트: ftp://alpha.gnu.org/gnu/findutils/

Findutils와 의존성 관계에 있는 프로그램들: Bash, Binutils, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, Make, Sed.

4.22.1. Findutils 설치


Findutils 컴파일 준비하기:
mkdir -p $LFS/build/findutils_build
cd $LFS/build/findutils_build
tar zxvf /mnt/source/findutils-4.1.20.tar.gz -C ./
cd findutils-4.4.2
./configure --prefix=/tools      

package 컴파일하기:
make

자, 이제 컴파일이 끝났습니다. 이전에 말한 것처럼 이 장에서 우리는 임시도구들을 위한 test suits들을 실행하는 것을 추천하지 않습니다. 만약에 정말 Findutils test suits를 실행하기를 원한다면, 아래와 같은 명령을 실행하세요:
make check

설치하기:
make install

패키지에 포함된 프로그램에 대해선 the Section called Contents of Findutils in Chapter 6 를 참조하세요.

4.23. Gawk-4.0.1 설치


Approximate build time: 0.2 SBU Required disk space: 30 MB

Gawk-3.1.3 공식 다운로드 사이트: ftp://ftp.gnu.org/pub/gnu/gawk/

Gawk-3.1.3과 의존성 관계에 있는 프로그램들: Bash, Binutils, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, Make, Sed.

4.23.1. Gawk 설치


Gawk 컴파일 준비하기:
./configure --prefix=/tools

package 컴파일하기:
make

자, 이제 컴파일이 끝났습니다. 이전에 말한 것처럼 이 장에서 임시도구들을 위한 test suits들을 실행하는 것을 추천하지 않습니다. 하지만, Gawk test suits를 실행하기를 원한다면, 아래와 같은 명령을 실행하세요:
make check

설치하기:
make install

패키지에 포함된 프로그램에 대해선 6장 Gawk의 내용 를 참조하세요. .

4.24. Gettext-0.18.1.1 설치


Approximate build time: 0.6 SBU Required disk space: 101 MB

Gettext (0.14.1) 공식 다운로드 사이트: ftp://ftp.gnu.org/gnu/gettext/

Gettext와 의존성 관계에 있는 프로그램들: Bash, Binutils, Bison, Coreutils, Diffutils, Gawk, GCC, Glibc, Grep, Make, Sed.

4.24.1. Gettext 설치

임시 툴만이 필요하기 때문에 우리는 단지 Gettext 패키지로부터 하나의 바이너리 파일만 빌드하여 설치하기만 하면 됩니다.

먼저 Glibc-2.16.0과의 호환성 문제를 해결합니다:
sed -i -e '/gets is a/d' gettext-*/*/stdio.in.h

Gettext 컴파일 준비하기:
cd gettext-tools
EMACS="no" ./configure --prefix=/tools --disable-shared  

configure 옵션 설명:
EMACS="no"

이것은 configure script가 Emacs Lisp 파일을 설치했는지 확인하는 것을 막습니다.
--disable-shared

우리는 shared Gettext 라이브러리를 지금은 필요로 하지 않습니다. 빌드대상에서 해당 라이브러리는 제외합니다.

컴파일 하기:
make -C gnulib-lib
make -C src msgfmt

오직 하나의 바이너리 파일만 컴파일되기 때문에 test suite를 실행하는 것은 불가능합니다. 그래서 여기에서 test suite를 실행하는 것은 권장하지 않습니다.

마지막으로 msgfmt 바이너리를 설치합니다:
cp -v src/msgfmt /tools/bin

패키지에 포함된 프로그램에 대해선 the Section called Contents of Gettext in Chapter 6 를 참조하세요.

4.25. Grep-2.14 설치


Approximate build time: 0.2 SBU Required disk space: 21 MB

Grep (2.14) 공식 다운로드 사이트: ftp://ftp.gnu.org/gnu/grep/

Grep와 의존성 관계에 있는 프로그램들: Bash, Binutils, Coreutils, Diffutils, GCC, Gettext, Glibc, Make, Sed, Texinfo.

4.25.1. Grep 설치


Grep 컴파일 준비하기:
./configure --prefix=/tools
프로그램 컴파일하기:
make

자, 이제 컴파일이 끝났습니다. 이전에 말한 것처럼 이 장에서 우리는 임시도구들을 위한 test suits들을 실행하는 것을 추천하지 않습니다. 만약에 당신이 정말 grep test suits를 실행하기를 원한다면, 아래와 같은 명령을 실행하세요:
make check

이 팩키지의 문서들과 프로그램 설치하기:
make install

패키지에 포함된 프로그램에 대해선 the Section called Contents of Grep in Chapter 6 를 참조하세요.

4.26. Gzip-1.5


Approximate build time: 0.2 SBU Required disk space: 10 MB

Gzip (1.5)공식 다운로드 사이트:
ftp://alpha.gnu.org/gnu/gzip/

Gzip과 의존성 관계에 있는 프로그램들: Bash, Binutils, Coreutils, Diffutils, GCC, Glibc, Grep, Make, Sed.

4.26.1. Gzip 설치


Gzip 컴파일 준비하기:
./configure --prefix=/tools      
package 컴파일하기:
make

설치하기:
make install

패키지에 포함된 프로그램에 대해선 the Section called Contents of Gzip in Chapter 6 를 참조하세요.

4.27. M4-1.4.16

설명: M4 패키지는 macro 프로세서를 포함하고 있습니다.

빌드 시간: 0.2 SBU 필요 공간: 16.6 MB === M4 설치하기=== Glibc-2.16.0과의 문제를 패치합니다:
sed -i -e '/gets is a/d' lib/stdio.in.h

M4 컴파일을 준비합니다:
sed -i -e '/gets is a/d' lib/stdio.in.h

패키지를 컴파일합니다
make

test suite를 실행하고 싶으시면 more check를 실행하십시오.

생략하고 패키지를 설치하려면 다음을 실행하십시오:
make install

4.28. Make-3.82 설치


Approximate build time: 0.1 SBU Required disk space: 11.2 MB

Make (3.82) 공식 다운로드 사이트: ftp://ftp.gnu.org/gnu/make/

Make와 의존성 관계에 있는 프로그램들: Bash, Binutils, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, Sed.

4.28.1. Make 설치


Make 컴파일 준비하기:
./configure --prefix=/tools      
컴파일 하기:
make

자, 이제 컴파일이 끝났습니다. 이전에 말한 것처럼 이 장에서 우리는 임시도구들을 위한 test suits들을 실행하는 것을 추천하지 않습니다. 만약에 당신이 정말 make test suits를 실행하기를 원한다면, 아래와 같은 명령을 실행하세요:
make check

이 팩키지의 문서들과 프로그램 설치하기:
make install

패키지에 포함된 프로그램에 대해선 the Section called Contents of Make in Chapter 6 를 참조하세요.

4.29. Patch-2.6.1 설치


Approximate build time: 0.1 SBU Required disk space: 3.4 MB

Patch (2.6.1) 공식 다운로드 사이트: ftp://ftp.gnu.org/gnu/patch/

Patch와 의존성 관계에 있는 프로그램들: Bash, Binutils, Coreutils, Diffutils, GCC, Glibc, Grep, Make, Sed.

4.29.1. Patch 설치


Patch 컴파일 준비하기:
CPPFLAGS=-D_GNU_SOURCE ./configure --prefix=/tools      

전처리기 flag -D_GNU_SOURCE 는 Power PC 에서만 필요로 합니다. 다른 시스템에서는 필요없습니다.

컴파일하기:
make

Patch 문서들과 프로그램들을 설치하기:
make install

패키지에 포함된 프로그램에 대해선 the Section called Contents of Patch in Chapter 6 를 참조하세요.

4.30. Perl-5.16.1 설치


Approximate build time: 1.8 SBU Required disk space: 237 MB

Perl (5.16.1) 공식 다운로드 사이트: http://www.cpan.org/src/


Perl과 의존성 관계에 있는 프로그램들: Bash, Binutils, Coreutils, Diffutils, Gawk, GCC, Glibc, Grep, Make, Sed.

4.30.1. Perl 설치


hard-wired paths를 C 라이브러리에 맞도록 변경시키세요:
cd perl-5.8.3
patch -Np1 -i /mnt/source/perl-5.16.1-libc-2.patch

Perl 컴파일 준비하기:
sh Configure -des -Dprefix=/tools


주의 : 이 때 sh 가 참조하는 libtermcap.so.2가 없다면서 에러가 날 경우가 있습니다. 지금까지 설치 과정중에 무언가 잘못이 있었다는 뜻입니다. 아래와 같이 억지로 할 수는 있지만 추천은 안합니다.

--
RPATH=$PATH
PATH=/bin:/tools/bin:/usr/bin
export PATH
를 해서 경로를 바꾸어 주고 configure를 실행해 보세요.

설치까지 다 끝나면
PATH=$RPATH
export PATH
로 원상 복구 해 주세요. --


패키지를 빌드합니다:
make 

컴파일이 끝나면 라이브러리와 프로그램들을 복사하자:
cp -v perl cpan/podlators/pod2man /tools/bin
mkdir -pv /tools/lib/perl5/5.16.1
cp -Rv lib/* /tools/lib/perl5/5.16.1

패키지에 포함된 프로그램에 대해선 the Section called Contents of Perl in Chapter 6 를 참조하세요.

4.31. Sed-4.2.1 설치


Approximate build time: 0.1 SBU Required disk space: 10.5 MB

Sed (4.2.1) 공식 다운로드 사이트: ftp://ftp.gnu.org/gnu/sed/

Sed와 의존성 관계에 있는 프로그램들: Bash, Binutils, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, Make, Texinfo.

4.31.1. Sed 설치


Sed 컴파일 준비하기:
./configure --prefix=/tools

패키지 컴파일하기:
make

자, 이제 컴파일이 끝났습니다. 이전에 말한 것처럼 이 장에서 우리는 임시도구들을 위한 test suits들을 실행하는 것을 추천하지 않습니다. 만약에 당신이 정말 Sed test suits를 실행하기를 원한다면, 아래와 같은 명령을 실행하세요:
make check

이 팩키지의 문서들과 프로그램 설치하기:
make install

패키지에 포함된 프로그램에 대해선 the Section called Contents of Sed in Chapter 6 를 참조하세요.

4.32. Tar-1.26 설치


Approximate build time: 0.4 SBU Required disk space: 20.6 MB

Tar (1.26) 공식 다운로드 사이트: ftp://alpha.gnu.org/gnu/tar/

Tar와 의존성 관계에 있는 프로그램들: Bash, Binutils, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, Make, Sed.

4.32.1. Tar 설치

Glibc-2.16.0과의 호환문제를 해결합니다:
sed -i -e '/gets is a/d' gnu/stdio.in.h

Tar 컴파일 준비하기:
./configure --prefix=/tools      
컴파일하기:
make
자, 이제 컴파일이 끝났습니다. 이전에 말한 것처럼 이 장에서 우리는 임시도구들을 위한 test suits들을 실행하는 것을 추천하지 않습니다. 만약에 당신이 정말 Texinfo test suits를 실행하기를 원한다면, 아래와 같은 명령을 실행하세요:
make check

Tar 문서들과 프로그램들을 설치하기:
make install

패키지에 포함된 프로그램에 대해선 the Section called Contents of Tar in Chapter 6 를 참조하세요

4.33. Texinfo-4.13a 설치


Approximate build time: 0.2 SBU Required disk space: 24 MB

Texinfo (4.13a) 공식 다운로드 사이트: ftp://ftp.gnu.org/gnu/texinfo/

Texinfo와 의존성 관계에 있는 프로그램들: Bash, Binutils, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, Make, Ncurses, Sed.

4.33.1. Texinfo 설치


Texinfo 컴파일 준비하기 :
./configure --prefix=/tools      
컴파일 하기:
make

자, 이제 컴파일이 끝났습니다. 이전에 말한 것처럼 이 장에서 우리는 임시도구들을 위한 test suits들을 실행하는 것을 추천하지 않습니다. 만약에 당신이 정말 Texinfo test suits를 실행하기를 원한다면, 아래와 같은 명령을 실행하세요:
make check

Texinfo 문서들과 프로그램들을 설치하기:
make install

패키지에 포함된 프로그램에 대해선 the Section called Contents of Texinfo in Chapter 6 를 참조하세요

4.34. Xz-5.0.4

빌드 시간: 0.2 SBU 필요 공간: 16.3 MB

4.34.1. Xz-Utils 설치하기

Xz 컴파일을 준비합니다:
./configure --prefix=/tools

패키지를 컴파일 합니다
make

패키지를 설치합니다
make install

4.35. Stripping


이번 단계는 반드시 해줄 필요는 없고 필요한 경우에만 하세요. 만약 LFS파티션의 크기가 너무 작을 때, 불필요한 것들을 제거할 수 있다면 좀더 편하게 설치할 수 있을 것입니다. 실행파일과 라이브러리들은 약 70MB정도의 불필요한 debugging symbols을 포함하고 있습니다. 이것들을 지우려면 다음과 같/이 하세요:
strip --strip-debug /tools/lib/*
strip --strip-unneeded /tools/{,s}bin/*

The first of the above commands will skip some twenty files, reporting that it doesn't recognize their file format. Most of them are scripts instead of binaries.

지금 설치되어 있는 라이브러리들에 대해 --strip-unneeded옵션을 사용할때 너무 조심스레할 필요는 없습니다. 이것들은 어차피 삭제해야 하고 Glibc는 나중에 다시 설치하게 됩니다.

관련된 모든 문서들을 지우면 약 2MB정도를 아낄수 있다:
rm -rf /tools/{,share}/{info,man,doc}

LFS시스템을 설치하기 위해서는 약 850MB정도의 공간이 필요합니다. 만약 당신이 Glibc를 build하고 설치할 수 있다면 나머지 다른 모든 프로그램도 Build하고 설치할 수 있을 것입니다.

4.36. 소유권 바꾸기

Note
이 책의 나머지 명령어들은 전부 root 사용자로 로그인 되어있는 동안에 실행되어야 합니다. 또한 root 환경일 때 $LFS 환경 변수가 잘 설정되어 있는지 확인하십시오.

현재 $LFS/tools 디렉토리는 호스트 시스템에 존재하는 사용자인 lfs가 소유하고 있습니다. 만약 $LFS/tools 디렉토리가 이대로 유지된다면 파일들은 user ID에 맞는 계정이 없는 사용자가 소유하는 것으로 되게 됩니다. 나중에 사용자를 만들어서 user ID가 같은 사용자가 될 경우 치명적인 조작을 할 수 있기 때문에 이같은 환경은 위험합니다. 때문에 이러한 것을 방지하려면 새로운 LFS 시스템에 /etc/passwd 파일을 생성한 뒤 lfs 사용자를 추가하고 지금은 먼저 디렉토리를 root 사용자의 소유로 바꾸는 것이 좋습니다.

chown -R root:root $LFS/tools

비록 LFS 시스템이 완성되어서 $LFS/tools 디렉토리가 지워진다고 해도 추가적인 LFS 시스템을 빌드하기 위해 필요한 경우도 있습니다. 백업할지 말지는 본인들의 선택입니다.
엮인글 :
List of Articles
번호 제목 글쓴이 날짜 조회 수
369 APM mariadb download origin address LynX 2019-06-19 1989
368 APM What one can and should optimize LynX 2019-06-03 1415
367 CentOS mariadb install LynX 2019-05-31 1179
366 CentOS init mode change LynX 2019-05-30 1288
365 APM ext zip install LynX 2019-02-19 1612
364 APM ext ImageMagick install LynX 2019-02-19 511
363 3D Printer Pronterface(PrintRun) install file LynX 2018-09-13 753
362 CentOS Grub UUID change LynX 2018-08-08 867
361 Linux letsencrypt wildcard LynX 2018-07-26 798
360 Printer cura usb connection LynX 2018-07-06 666
359 CentOS cli 무선랜 LynX 2018-06-07 446
358 APM 윈도우에 APM 페키지 설치 file LynX 2018-05-04 586
357 APM MySQLTuner 설치 LynX 2018-04-27 544
356 CentOS CentOS7 커널 업데이트 LynX 2018-04-23 699
355 HTML Tag CSS 여러가지 모양 만들기 LynX 2018-02-08 771
354 Linux wkhtmltopdf wkhtmltoimage install LynX 2018-01-31 602
353 APM LZ4_LIBS Not Found (CentOS7, MariaDB 10.1.29) LynX 2018-01-03 485
352 APM mysql ./configure LynX 2017-12-15 804
351 APM PHP-7.2.0 LynX 2017-12-12 3157
350 Linux libiconv LynX 2017-12-08 558

XE Login