이 장에서 우리는 기본적인 리눅스 시스템에 필요한 모든 소프트웨어를 설치할 것이다. 이 장이 끝나면 여러분은 완전하게 동작하는 리눅스 시스템을 갖게 된다. 나머지 장들은 네트워킹 설정이나 인터넷 서버 + 클라이언트 (telnet, ftp, http, email), 인터넷 설정, X 윈도우 시스템 같은 선택적인 주제들에 대해 다룰 것이다. 여러분은 재량껏 그 장들을 뛰어넘어도 된다. 예를 들어 LFS 시스템을 네트웍에 연결할 계획이 없다면 인터넷을 설정하는 것은 거의 필요치 않을 것이다.
모든 기본적인 시스템 소프트웨어를 설치하기 전에 미리 설치되어 있어야 할 많은 패키지들이 있다. 전형적인 설정 스크립트들은 rm 이나 grep, sed, mv, cat, cp, diff 같은 프로그램들을 필요로 한다. 여러분은 압축 파일을 tar 와 gzip 으로 묶인 파일을 풀어야 하며 오브젝트 파일로 컴파일한 후 프로그램을 링크시며야 한다. 이 모든 (몇개를 더 포함해서) 프고르매들은 다른 어떤 것을 설치할 수 있기 전에 사용할 수 있어야 한다. 이 프로그램들은 정적으로 링크될 것이다. 그 이유는 여러분의 기존의 리눅스 시스템이 LFS 시스템에 설치하려는 것과 다른 버전의 C 라이브러리를 가지고 있을 수 있기 때문이다. 이 장에서 설치하는 프로그램들은 기존의 리눅스 시스템의 C 라이브러리에 링크될 것이다. 이것은 이 프로그램들을 LFS 시스템에서 실행하는 경우 라이브러리 충돌을 일으킬 수 있다. 따라서 우리는 이 프로그램들을 정적으로 링크해야 한다. 기본적인 시스템 소프트웨어들을 설치하는 동안 우리는 정적으로 링크된 소프트웨어들을 다시 설치하여 LFS 시스템의 C 라이브러리에 동적으로 링크되도록 할 것이다.
모든 프로그램이나 바이너리는 기본적으로 디버깅 심볼을 포함하여 컴파일된다.
이는 여러분이 프로그램이나 라이브러리를 디버거를 통해 실행할 수 있으며
디버거의 출력물이 좀 더 사용자에게 편하게 된다는 것을 뜻한다. 이 디버깅
심볼들은 또한 프로그램이나 라이브러리의 크기를 매우 크게 한다. 이 문서는
디버깅 심볼 없이 소프트웨어를 설치하진 않는다 (많은 독자들이 디버깅
소프트웨어를 사용하는지 않하는지를 내가 알지 못하기 때문에). 대신에
여러분은 원할경우 strip
프로그램으로 그 심볼들을 직접 제거할 수
있다.
바이너리 (a.out 이나 ELF 바이너리여야 한다) 로부터 디버깅 심볼을 제거하기
위해선 strip --strip-debug filename
을 실행한다. 여러 파일들에서
디버깅 심볼을 제거하고 싶다면 와일드 카드 문자를 쓰면 된다 (strip
--strip-debug $LFS/usr/bin/*
와 같이).
여러분이 디버깅 심볼이 큰 차이를 만드는지 알고 싶다면 아래에 통계가 있다:
사용하는 컴파일러와 동적으로 프로그램을 링크시키기 위해 쓰이는 C 라이브러리의 버전에 따라 크기가 다를 수 있으나 디버깅 심볼을 포함한 것과 그렇지 않은 것을 비교한다면 여러분의 결과는 비슷할 것이다. 이 장을 끝내고 모든 LFS 바이너리들과 라이브러리들에서 디버깅 심볼을 제거한 후 나는 102MB 를 약간 넘은 디스크 공간을 다시 얻었다. 매우 차이가 크다. 그 차이는 모든 것을 설치하게 되는 이 문서의 마지막에 같은 일을 했을 때 더욱 커질 것이다.
./configure make -e LDFLAGS=-all-static make -e prefix=$LFS/usr install
make -e LDFLAGS=-static make -e PREFIX=$LFS/usr install cd $LFS/usr/bin mv bunzip2 bzip2 $LFS/bin
./configure make -e LDFLAGS=-static make -e prefix=$LFS/usr install
이 패키지는 특정 플랫폼에서 정적 링크에 문제를 일으킨다고 알려져 있다. 여러분이 이 패키지를 컴파일하는데 문제를 겪는다면 수정된 패키지를 http://www.linuxfromscratch.org/download/diffutils-2.7-fixed.tar.gz 에서 구할 수 있다.
./configure --disable-nls make -e LDFLAGS=-static make -e prefix=$LFS/usr install cd $LFS/usr/bin mv chgrp chmod chown cp dd df ln ls mkdir mknod mv rm rmdir sync $LFS/bin
Glibc-2.1.3을 컴파일하기 위해서는 gcc-2.95.2가 설치되어 있어야 한다. 2.8
이후의 어떤 버전이라도 가능하지만 2.95.2를 추천한다. 많은 glibc-2.1 기반의
시스템은 gcc-2.7.2.3이 설치되어 있으며 이 컴파일러로는 glibc-2.1을 컴파일할
수 없다. 따라서 우리는 기존의 시스템에도 gcc-2.95.2를 설치할 것이다. 그러나
기존의 컴파일러를 덮어씌우진 않을 것이다. gcc를 여러분의 시스템에 설치하기
전에 이것이 필요한지 확실히 결정해야 한다. 기존의 것의 버전 번호가 2.8
이상인지 보기 위해서 gcc --version
를 실행한다. 만약 그렇지 않다면
여러분은 gcc-2.95.2를 설치해야 한다. 후에 glibc를 컴파일하는데 어려움을
겪는다면 어쨋든 gcc-2.95.2를 설치하길 원하게 될 것이다.
mkdir $LFS/usr/src/gcc-build; cd $LFS/usr/src/gcc-build ../gcc-2.95.2/configure --prefix=/usr/gcc2952 \ --with-local-prefix=/usr/gcc2952 --with-gxx-include-dir=/usr/gcc2952/include/g++ \ --enable-shared --enable-languages=c,c++ make bootstrap; make install
mkdir $LFS/usr/src/gcc-build;cd $LFS/usr/src/gcc-build ../gcc-2.95.2/configure --enable-languages=c --disable-nls make -e LDFLAGS=-static bootstrap make -e prefix=$LFS/usr local_prefix=$LFS/usr install
모든 프로그램들이 컴파일러와 프리-프로세서를 찾을 수 있도록 하기 위해서 몇가지 심볼릭 링크가 필요하다. 몇몇 프로그램은 cc 프로그램을 실행하고 다른 것들은 gcc 프로그램을 실행하며, 몇몇 프로그램은 /lib (LFS 시스템에서의 /usr/lib) 에 cpp 프로그램이 있길 예상하지만 다른 것들은 /usr/bin 아래에 있길 예상한다.
cd $LFS/lib; ln -s ../usr/lib/gcc-lib/<host>/2.95.2/cpp cpp cd $LFS/usr/lib; ln -s gcc-lib/<host>/2.95.2/cpp cpp cd $LFS/usr/bin; ln -s gcc cc
<host>를 gcc-2.95.2 파일들이 설치된 디렉토리 (내 경우엔 i686-unknown-linux)로 대체한다. 여러분은 아마 두 개의 서로 다른 디렉토리를 발견할 것이다.
glibc-crypt 패키지에 대한 주의사항:
-*-*-*-*-*- 프랑스, 러시아 미국 등의 일부 국가들이 암호화 소프트웨어의 사용과 배포를 매우 엄격히 규제하고 있기 때문에 이 add-on은 GNU C 라이브러리의 주 배포판 안에 포함되지 않는다. 더 자세한 사항은 메뉴얼의 "Legal Problems" 부분을 읽기 바란다. 특별히, 미국은 이 소프트웨어를 라이센스 없이 미국 밖으로 유출하는 것을 - 인터넷을 통하는 것을 포함하여 - 허가하지 않는다. 따라서 여러분이 미국 밖에 있다면 이 add-on을 FSF의 공식 FTP 사이트인 ftp.gnu.org로부터 받지 말길 바란다. 이 소프트웨어는 완전히 미국 밖에서 개발되었다. -*-*-*-*-*-
"이 소프트웨어"는 ftp://ftp.gwdg.de/pub/linux/glibc/에 있는 glibc-crypt 패키지를 가리킨다. 이 법규는 단지 미국에 살지 않는 사람들에게만 적용된다. DES 소프트웨어를 가지고 들어오는 것이 규제되지는 않으므로 여러분이 미국 내에 살고 있다면 위의 독일 사이트로부터 이 소프트웨어를 구할 수 있다.
configparms
파일을 새로 만든다:
# Begin configparms slibdir=/lib sysconfdir=/etc # End configparms
mkdir $LFS/usr/src/glibc-build;cd $LFS/usr/src/glibc-build ../glibc-2.1.3/configure --enable-add-ons make; make install_root=$LFS install
mkdir $LFS/usr/src/glibc-build; cd $LFS/usr/src/glibc-build CC=/usr/gcc2952/bin/gcc ../glibc-2.1.3/configure --enable-add-ons make; make install_root=$LFS install
여러분의 기존 리눅스 시스템이 libc-2.0.x를 사용한다면 NSS 라이브러리
파일들을 LFS 파티션으로 복사해야 한다. 정적으로 링크된 프로그램들 중 일부는
여전히 NSS 라이브러리에 의존하며 username, userid 그리고 groupid를 찾는
프로그램들이 특히 그렇다. ls -l libc.so.*
를 실행하여 기존의 리눅스
시스템이 어떤 버전의 C 라이브러리를 사용하는지 볼 수 있다.
결과가 /lib/libc.so.6 -> libc-2.0.7.so 같은 것이라면 시스템은 glibc-2.0을 사용하는 것이다.
결과가 /lib/libc.so.6 -> libc-2.1.2.so 같은 것이라면 시스템은 glibc-2.1을 사용하는 것이다.
여러분의 시스템이 libc-2.0.x.so 파일 (x는 7 같은 마이크로 버전 번호) 을
가지고 있다면 cp -av /lib/*nss* $LFS/lib
를 실행하여 NSS
라이브러리 파일들을 복사한다.
./configure --disable-nls make -e LDFLAGS=-static make -e prefix=$LFS/usr install
이 패키지는 특정 플랫폼에서 정적 링크 에러를 낸다고 알려져 있다. 여러분이 이 패키지를 컴파일할 때 문제를 겪는다면 수정된 패키지를 http://www.linuxfromscratch.org/download/grep-2.4-fixed.tar.gz에서 구할 수 있다.
./configure make -e LDFLAGS=-static make -e prefix=$LFS/usr install cd $LFS/usr/bin mv gunzip gzip $LFS/bin
이 패키지는 특정 플랫폼에서 컴파일 문제를 일으킨다고 알려져 있다. 여러분이 이 패키지를 컴파일할 때 문제를 겪는다면 수정된 패키지를 http://www.linuxfromscratch.org/download/gzip-1.2.4-fixed.tar.gz에서 구할 수 있다.
./configure make -e LDFLAGS=-static make -e prefix=$LFS/usr install
./configure make -e LDFLAGS=-static make -e prefix=$LFS/usr install mv $LFS/usr/bin/sed $LFS/bin
이 패키지는 특정 플랫폼에서 정적 링크 문제를 일으킨다고 알려져 있다. 여러분이 이 패키지를 컴파일할 때 문제를 겪는다면 수정된 패키지를 http://www.linuxfromscratch.org/download/sed-3.02-fixed.tar.gz에서 구할 수 있다.
./configure --disable-nls make -e LDFLAGS=-static make -e prefix=$LFS/usr install cd $LFS/usr/bin mv date echo false pwd stty su true uname hostname $LFS/bin
./configure --disable-nls make -e LDFLAGS=-static make -e prefix=$LFS/usr install mv $LFS/usr/bin/tar $LFS/bin
./configure --disable-nls make -e LDFLAGS=-static make -e prefix=$LFS/usr install mv $LFS/usr/bin/cat $LFS/bin
./configure cd lib;make cd ../mount;make -e LDFLAGS=-static cp mount umount $LFS/bin cp swapon $LFS/sbin
모든 소프트웨어들의 설치는 매구 직관적이며 여러분은 각 패키지에 대한 일반적인 설치 방법을 설명하고 특정 패키지가 다른 설치 방법을 쓴다면 그 방법을 설명하는 것이 훨씬 쉽고 짧다고 생각할 것이다. 이 문제에 대해 나도 여러분의 의견에 찬성하지만 나는 모든 패키지에 완벽한 과정을 설명하는 것을 선택했다. 이것은 단순히 가능할 지도 모를 에러나 혼돈을 막기 위함이다. 이 문서를 더 진행해 가기 전에 여러분은 시스템을 재시작하여 LFS 시스템으로 부팅해야 한다. 그러나 그러기 전에 어떤 파티션이 스왑 파티션으로 사용되는지 알아야 한다. 이 정보는 일반적으로 /etc/fstab 파일에서 찾을 수 있다. /dev/hda6 none swap sw 0 0 과 비슷한 줄을 이 파일에 있는지 찾아본다.
그 줄의 4번째 필드는 만드시 'sw'여야 한다. 그 줄은 스왑 파티션을 나타낸다. 여러분이 기억해야할 것은 그 위치이다 (내 경우엔 /dev/hda6이지만 여러분의 시스템에선 다를 수 있다). 어떤 파티션이 스왑 파티션인지 알았으면 컴퓨터를 리부팅하여 여기부터 계속해 나가도 된다.
소프트웨어를 설치하기 전에 우리는 파티션을 읽고쓰기 모드로 다시 마운트해야 한다. 또한 규모가 큰 컴파일 과정 (gcc의 컴파일 처럼) 동안 메모리 부족 문제가 발생하지 않도록 스왑 파티션을 활성화해야 한다.
mount -o remount,rw / / /sbin/swapon <swap device>
mkdir $LFS/usr/src/gcc-build;cd $LFS/usr/src/gcc-build ../gcc-2.95.2/configure --with-gxx-include-dir=/usr/include/g++ \ --enable-shared --enable-languages=c,c++ make bootstrap; make install
./configure --datadir=/usr/share/bison make; make install
./configure make; make install cd /usr/bin; ln -s mawk awk
./configure make; make install
이 패키지는 컴파일 문제를 일으킨다고 알려져 있다. 여러분이 이 패키지를 컴파일할 때 문제를 겪는다면 수정된 패키지를 http://www.linuxfromscratch.org/download/findutils-4.1-fixed.tar.gz에서 구할 수 있다.
./configure make; make install
./configure --with-shared make; make install
./configure make; make install mv /usr/bin/less /bin
./Configure make; make install
우리는 'make test' 과정을 생략한다는 것을 주의한다. 이는 이 순간에 아직 시스템이 perl 테스트를 실행할 준비가 되지 않았기 때문이다. 지금은 우리는 perl 컴파일이 잘 되었다고 믿을 것이다.
./configure make; make install
./configure make; make install
./configure make; make install
./configure make install
./configure make; make install mv /usr/bin/bash /bin
./configure make; make install
./configure make; make install
make; make install cd /usr/bin; mv bunzip2 bzip2 /bin
./configure make; make install
./configure make; make install mv /usr/sbin/mklost+found /sbin
./configure make; make install
./configure make; make install cd /usr/bin mv chgrp chmod chown cp dd df ln ls mkdir mknod mv rm rmdir sync /bin
./configure make; make install
./configure make; make install
./configure make; make install cd /usr/bin; mv z* gunzip gzip /bin
cd util; make ldd ldconfig cp ldd /bin; cp ldconfig /sbin rm /usr/bin/ldd
./configure make; make install
cd as make; make install cd ../ld make ld86; make install
make; make install
./configure make; make install
./configure make; make install cd /usr/bin mv date echo false pwd stty su true uname hostname /bin
./configure make; make install cd etc cp limits login.access login.defs.linux shells suauth /etc mv /etc/login.defs.linux /etc/login.defs cd /usr/sbin mv chpasswd dpasswd groupadd groupdel groupmod logoutd mkpasswd \ newusers useradd userdel usermod grpck pwck vipw grpconv grpunconv \ pwconv pwunconv /sbin
./configure -default make all; make install
./configure make; make install
make; make install
gcc -O3 -Wall -Wno-unused -c watch.c make; make -e XSCPT="" install mv /usr/bin/kill /bin
make; make install
./configure make; make install mv /usr/bin/sed /bin
make start-stop-daemon cp start-stop-daemon /sbin cp start-stop-daemon.8 /usr/share/man/man8
make; make install
cd src make; make install
./configure make; make install mv /usr/bin/tar /bin
./configure make; make install mv /usr/bin/cat /bin
./configure make; make install
HAVE_PASSWD=yes HAVE_SLN=yes HAVE_TSORT=yes
groupadd -g 5 tty ./configure make; make install
여러분이 기존의 리눅스 시스템에서 LFS 시스템으로 NSS 라이브러리 파일들을 복사했었다면 (기존 시스템이 glibc-2.0을 쓰기 때문에) 이제 아래를 실행하여 그 파일들을 제거한다:
rm /lib/libnss*.so.1 /lib/libnss*2.0*
이제 모든 소트으웨어들이 설치되었고 몇몇 프로그램이 정상적으로 돌도록 하기 위해 우리가 해야할 것은 설정 파일들을 만드는 것 뿐이다.
/etc/nsswitch.conf 파일을 만들어야 한다. 이 파일이 없거나 잘못된 경우 glibc가 기본 값을 사용하긴 하지만 이 기본값은 이후 장에서 다룰 네트워킹과 잘 동작하지 않는다. 또한 우리의 타임존도 설정되어야 한다.
# Begin /etc/nsswitch.conf passwd: files group: files shadow: files hosts: files dns networks: files protocols: db files services: db files ethers: db files rpc: db files netgroup: db files # End /etc/nsswitch.conf
/etc/localtime or ln -s /usr/share/zoneinfo/Canada/Eastern /etc/localtime tzselect의 결과는 "EST5EDT"나 "Canada/Eastern" 같은 것이다. 그런 정보로 여러분이 만드는 심볼릭 링크는 ln -s /usr/share/zoneinfo/EST5EDT 이거나 ln -s /usr/share/zoneinfo/Canada/Eastern /etc/localtime 이다.
lilo의 설정 파일을 처음부터 만들지는 않고 기존의 리눅스 시스템의 파일을 사용할 것이다. 이 파일은 머신에 따라서 틀리며 따라서 내가 여기서 만들 수는 없다. 여러분은 기존의 리눅스 시스템에서 쓰던 것과 똑같은 lilo 옵션들을 쓰길 원할 것이므로 기존 시스템의 것과 똑같이 파일을 만든다.
cp /mnt/original/etc/lilo.conf /etc cp /mnt/original/boot/* /boot
기존의 리눅스 시스템이 커널 이미지들은 (어느 것도) /mnt/original/boot 안에 가지고 있지 않다면 그 파일들의 위치를 /etc/lilo.conf 파일에서 확인한 후 그 파일들을 /etc/lilo.conf가 찾을 수 있는 곳으로 복사한다. 혹은 여러분은 그 파일들을 /boot로 복사한 후 /etc/lilo.conf 파일을 수정하여 LFS 시스템에서 커널 이미지들이 있는 새 경로를 찾도록 할 수 있다. 어떤 것도 잘 동작하며 어떻게 할 것인가는 여러분에게 달렸다.
# Begin /etc/syslog.conf auth,authpriv.* -/var/log/auth.log *.*;auth,authpriv.none -/var/log/sys.log daemon.* -/var/log/daemon.log kern.* -/var/log/kern.log mail.* -/var/log/mail.log user.* -/var/log/user.log *.emerg * # End /etc/syslog.conf
이 패키지는 사용자의 암호를 바꾸고 새로운 사용자/그룹을 추가하고 사용자/그룹을 삭제하는 등의 일을 하기 위핸 유틸리티들을 포함하고 있다. 'password shadowing'이 무엇인지를 설명하진 않겠다. 여러분은 doc/HOWTO 파일 안에서 이에 대한 것을 모두 읽어볼 수 있다. 여러분이 명심할 것이 하나 있는데, shadow 지원 기능을 사용하기로 했다면 암호를 확인할 필요가 있는 프로그램들 (예를 들어 xdm이나 ftp 데몬, pop3d 등) 이 'shadow-compliant(섀도우 호완)'이어야 한는 것이다. 다시말해 그 프로그램들이 섀도우 패스워드와 잘 작동할 수 있어야 한다.
섀도우 패스워드를 사용하지 않기로 결정했더라도 (doc/HOWTO 문서를 읽은 후에) 여러분은 여전히 패키지를 사용하는데 그것은 이 패키지 안의 유틸리티들으 섀도우 패스워드를 사용하지 않는 시스템에서도 사용되기 때문이다. 이에 대한 모든 내용을 HOWTO에서 볼 수 있다. 또한 여러분이 원하는 때에 섀도우 패스워드의 사용 여부를 변경할 수 있다는 것을 명심한다.
지금이 doc/HOWTO 파일의 #5 부분을 읽을 매우 좋은 시기이다. 여러분은 섀도우 기능이 작동하는지 여부를 검사하는 방법과 기능을 정지시키는 방법을 알 수 있다. 만약 작동하지 않고 있으며 검사를 하지 않았었다면 여러분의 모든 콘솔에서 로그아웃 한 후 더이상 시스템을 사용할 수 없게 될 것이다. 이는 더이상 로긴을 할 수 없기 때문이다. 이 문제를 쉽게 해결하는 방법은 커널에 init=/sbin/sulogin 이라는 인자를 넘겨준 후 util-linux 압축파일을 풀고 login-utils 디렉토리로 이동하여 login 프로그램을 만든 후 /bin/login을 그것으로 바꿔 버리는 것이다. 일이 절망적으로 잘못되진 않겠지만 (적어도 Linux 상에서는) 알맞게 테스트를 하고 매뉴얼을 읽음으로써 어려움을 피할 수 있다 ;)
/etc/inittab 파일을 아래처럼 수정한 후 여러분은 이전처럼 로긴할 수 있다 (agetty와 login 프로그램을 사용하여). Sulogin은 일반적인 로긴에선 더이상 쓰이지 않을 것이다.
# Begin /etc/inittab id:2:initdefault: si::sysinit:/etc/init.d/rcS su:S:wait:/sbin/sulogin l0:0:wait:/etc/init.d/rc 0 l1:1:wait:/etc/init.d/rc 1 l2:2:wait:/etc/init.d/rc 2 l3:3:wait:/etc/init.d/rc 3 l4:4:wait:/etc/init.d/rc 4 l5:5:wait:/etc/init.d/rc 5 l6:6:wait:/etc/init.d/rc 6 ft:6:respawn:/sbin/sulogin ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now 1:2345:respawn:/sbin/agetty /dev/tty1 9600 2:2345:respawn:/sbin/agetty /dev/tty2 9600 3:2345:respawn:/sbin/agetty /dev/tty3 9600 4:2345:respawn:/sbin/agetty /dev/tty4 9600 5:2345:respawn:/sbin/agetty /dev/tty5 9600 6:2345:respawn:/sbin/agetty /dev/tty6 9600 # End /etc/inittab
login이나 shutdown 등의 프로그램들은 /var/run/utmp 파일에 무언가 쓰기를 원한다. 이 파일은 현재 로긴해 있는 사람들에 대한 정보를 담고 있다. 또한 컴퓨터가 마지막으로 셧다운 된 때에 대한 정보도 담고 있다.