Linux From Scratch Gerard Beekmans Version 2.2, April 3rd, 2000 정하녕 버전 2.2, 2000년 5월 5일 이 문서는 필요한 소프트웨어의 소스코드만을 사용하여 이미 설치되어 있는 리눅스 배포본으로부터 여러분만의 리눅스 시스템을 완전히 새로 만드는 과정에 대해 설명하고 있다. ______________________________________________________________________ 목차 1. 소개 1.1 이것들은 다 뭣하는 것인가? 1.2 새 버전 1.3 버전 역사 1.4 메일링리스트 1.4.1 가입하기 1.4.2 탈퇴하기 1.5 연락처 1.6 번역자의 변 2. 이 문서에서 쓰이는 관례 2.1 $LFS에 대해서 2.2 소프트웨어를 받는 방법 2.3 소프트웨어를 설치하는 방법 3. 다운받을 패키지들 3.1 필수 소프트웨어 3.2 선택 가능한 소프트웨어 4. 새 시스템의 준비 4.1 일을 해나가는 방법 4.2 새 파티션의 생성 4.3 새 파티션 위에 ext2 파일 시스템 만들기 4.4 새 파티션 마운트하기 4.5 디렉토리의 생성 4.6 /dev 디렉토리의 복사 5. LFS 시스템을 부팅 가능하도록 만들기 5.1 Sysvinit의 설치 5.2 Sysvinit 설정 5.3 passwd 와 group 파일의 생성 5.4 Bash 쉘의 설치 5.5 LILO에 엔트리 추가 5.6 시스템 검사 6. 커널 설치 6.1 ftp.kernel.org에 대한 주의사항 6.2 커널 설정 6.3 LILO의 갱신 6.4 시스템의 검사 7. 기본적인 시스템 소프트웨어의 설치 7.1 디버깅 심볼에 대하여 7.2 기본적인 시스템 소프트웨어 설치를 위한 LFS 시스템의 준비 7.2.1 Binutils의 설치 7.2.2 Bzip2의 설치 7.2.3 Diffutils의 설치 7.2.4 Fileutils의 설치 7.2.5 필요한 경우 기존의 시스템에 GCC 설치하기 7.2.6 LFS 시스템에 GCC를 설치하기 7.2.6.1 필요한 심볼릭 링크들의 생성 7.2.7 Glibc의 설치 7.2.7.1 이전의 NSS 라이브러리 파일들의 복사 7.2.8 grep의 설치 7.2.9 gzip의 설치 7.2.10 Make의 설치 7.2.11 Sed의 설치 7.2.12 Sh-utils의 설치 7.2.13 Tar의 설치 7.2.14 Textutils의 설치 7.2.15 Util-linux의 설치 7.3 기본적인 시스템 소프트웨어의 설치 7.3.1 파티션을 재마운트하고 스왑 활성화하기 7.3.2 GCC의 설치 7.3.3 Bison의 설치 7.3.4 Mawk의 설치 7.3.5 Findutils의 설치 7.3.6 Termcap의 설치 7.3.7 Ncurses의 설치 7.3.8 Less의 설치 7.3.9 Perl의 설치 7.3.10 M4의 설치 7.3.11 Texinfo의 설치 7.3.12 Autoconf의 설치 7.3.13 Automake의 설치 7.3.14 Installing Bash Bash의 설치 7.3.15 Installing Flex Flex의 설치 7.3.16 Binutils의 설치 7.3.17 Bzip2의 설치 7.3.18 Diffutils의 설치 7.3.19 E2fsprogs의 설치 7.3.20 File의 설치 7.3.21 Fileutils의 설치 7.3.22 Grep의 설치 7.3.23 Groff의 설치 7.3.24 Gzip의 설치 7.3.25 Ld.so의 설치 7.3.26 Libtool의 설치 7.3.27 Linux86의 설치 7.3.28 Lilo의 설치 7.3.29 Make의 설치 7.3.30 Sh-Utils의 설치 7.3.31 Shadow Password Suite의 설치 7.3.32 Man의 설치 7.3.33 Modutils의 설치 7.3.34 Procinfo의 설치 7.3.35 Procps의 설치 7.3.36 Psmisc의 설치 7.3.37 Sed의 설치 7.3.38 start-stop-daemon의 설치 7.3.39 Sysklogd의 설치 7.3.40 Sysvinit의 설치 7.3.41 Tar의 설치 7.3.42 Textutils의 설치 7.3.43 Vim의 설치 7.3.44 Util-linux의 설치 7.4 예전의 NSS 라이브러리 파일들의 제거 7.5 소프트웨어의 설정 7.5.1 Glib의 설정 7.5.2 LILO의 설정 7.5.3 Sysklogd의 설정 7.5.4 Shadow Password Suite의 설정 7.5.5 Sysvinit의 설정 7.5.6 /var/run/utmp 파일의 생성 8. 시스템 부트 스크립트의 생성 8.1 디렉토리와 마스터 파일의 준비 8.2 reboot 스크립트 만들기 8.3 halt 스크립트 생성 8.4 mountfs 스크립트의 생성 8.5 umountfs 스크립트의 생성 8.6 sendsignals 스크립트의 생성 8.7 checkroot 부트 스크립트의 생성 8.8 Sysklogd 부트 스크립트의 생성 8.9 심볼릭 링크와 권한 설정 8.10 /etc/fstab 파일의 생성 9. 기본적인 네트워킹의 설정 9.1 Netkit-base 설치하기 9.2 Net-tools의 설치 9.2.1 /etc/init.d/localnet 부트스크립트 만들기 9.2.2 권한과 심볼릭 링크의 설정 9.2.3 /etc/hostname 파일 만들기 9.2.4 /etc/hosts 파일의 생성 9.2.5 /etc/init.d/ethnet 파일의 생성 9.2.6 /etc/init.d/ethnet의 권한과 심볼릭 링크를 설정한다. 9.2.7 네트웍 설정의 시험 9.3 시스템 검사 10. 네트웍 데몬의 설치 10.1 SMTP 설정하기 10.1.1 group과 user의 생성 10.1.2 디렉토리 생성 10.1.3 Sendmail의 설치 10.1.4 Sendmail의 설정 10.1.5 Procmail의 설치 10.1.6 /etc/init.d/sendmail 부트스크립트의 작성 10.1.7 권한과 심볼릭 링크들을 설정한다. 10.2 FTP의 설정 10.2.1 user와 group의 생성 10.2.2 Proftpd의 설치 10.2.3 /etc/init.d/proftpd 부트스크립트의 작성 10.2.4 권한과 심볼릭 링크의 설정 10.3 HTTP의 설정 10.3.1 Apache의 설치 10.3.2 Apache의 설정 10.3.3 /etc/init.d/apache 부트스크립트의 생성 10.3.4 권한과 심볼릭 링크의 설정 10.4 Telnet의 설정 10.4.1 telnet 데몬과 클라이언트의 설치 10.4.2 /etc/inetd.conf 설정파일을 만든다. 10.4.3 /etc/init.d/inetd 부트스크립트의 생성 10.4.4 권한과 심볼릭 링크의 설정 10.5 PPP의 설정 10.5.1 커널 설정하기 10.5.2 group의 생성 10.5.3 PPP의 설치 10.5.4 /etc/resolv.conf 생성 10.5.5 /etc/ppp/peers/provider 파일 만들기 10.5.6 /etc/chatscripts/provider 만들기 10.5.7 암호 인증에서 주의할 사항 11. 네트웍 클라이언트의 설치 11.1 Email 클라이언트 설치하기 11.1.1 Mailx의 설치 11.1.2 Mutt의 설치 11.1.3 Fetchmail의 설치 11.1.4 email 시스템의 검사 11.2 FTP 클라이언트의 설치 11.2.1 Netkit-ftp의 설치 11.2.2 FTP 시스템의 검사 11.3 HTTP 클라이언트의 설치 11.3.1 Zlib의 설치 11.3.2 Lynx의 설치 11.3.3 HTTP 시스템의 검사 11.4 텔넷 클라이언트의 설치 11.4.1 텔넷 시스템의 검사 11.5 PPP 클라이언트의 설치 11.5.1 연결 스크립트 작성하기 11.5.2 연결 종료 스크립트 작성하기 11.5.3 PPP 시스템의 검사 12. X 윈도우 시스템의 설치 12.1 X의 설치 12.2 /etc/ld.so.conf 만들기 12.3 /usr/include/X11 심볼릭 링크의 생성 12.4 Creating the /usr/X11 symlink /usr/X11 심볼릭 링크의 생성 12.5 /usr/X11/bin을 $PATH 환경 변수에 추가하기 12.6 X의 설정 12.7 X의 테스트 12.8 Window Maker의 설치 12.9 Window Maker 설치를 위한 시스템의 준비 12.9.1 libPropList의 설치 12.9.2 libXpm의 설치 12.9.3 libpng의 설치 12.9.4 libtiff의 설치 12.9.5 libjpeg의 설치 12.9.6 libungif의 설치 12.9.7 WindowMaker의 설치 12.10 동적 로더 캐쉬의 갱신 12.11 WindowMaker의 설정 12.12 WindowMaker의 검사 13. 자료들 13.1 책 13.2 하우투 문서들 13.3 기타 14. 맺음말 15. Copyright & Licensing Information ______________________________________________________________________ 1. 소개 1.1. 이것들은 다 뭣하는 것인가? 많은 리눅스 배포본들을 써왔지만 나는 그 중 어떤 것에도 완벽히 만족하지 못했다. 부트 스크립트들이 정돈되 있는 방식이나 특정 프로그램들이 기본으로 설정되어 있는 방식 따위가 마음에 들지 않았다. 내가 리눅스 시스템에 완벽히 흡족해 하고자 했을 때 나는 처음부터 나만의 리눅스 시스템을 만들어야 한다는 것을 깨닫게 되었다. 이상적으로는 소스 코드만을 사용하여서. 어떤 종류의 이미 컴파일된 패키지도 없이. 몇몇 기본적인 유틸리티를 설치하는 cdrom이나 부트디스크의 도움도 없이. 여러분은 현재 리눅스 시스템을 사용하고 있을 것이며 여러분만의 리눅스 시스템을 만들기 위해 그것을 사용할 것이다. 예전에는 이 무모한 생각이 매우 어렵고 때론 거의 불가능해 보였다. 대부분의 문제에 대한 이유는 특정 프로그램과 작동과정에 대한 내 지식의 부족이었다. 모든 종류의 의존성 문제와 컴파일 문제 등을 해결한 후에 리눅스 시스템이 손수 만들어졌으며 완벽히 작동하였다. 나는 이 시스템을 LinuxFromScratch를 나타내는 LFS 시스템이라 칭했다. 1.2. 새 버전 http://www.linuxfromscratch.org 에서 이 문서의 최신 버전을 언제라도 구할 수 있다. 1.3. 버전 역사 2.1.5 - March 26th, 2000 2.1.5 - 2000년 3월 26일 아래는 수정 사항의 전체 목록은 아니다. v2.0은 변경사항이 많이 적용된 판이므로 중요한 변화만 언급되었고 그렇지 않은 것은 생략되었다. o 디렉토리 구조가 수정되었다 - 이제 LFS는 FHS를 준수한다. 비록 100% 는 아닐지라도 근접하고 있다. o 새로운 Glibc 설치 방법 o 새로운 GCC 설치 방법 o 미리 컴파일된 데비안 패키지가 필요없게 되었다. o 완전히 개정된 소프트웨어 설치 방법 - 6.1장 이전에서 정적으로 링크된 패키지들이 더이상 필요없게 되었다. o 소프트웨어 설치시의 많은 버그가 수정되었다. o util-linux 패키지에서 좀 더 많은 프로그램들을 설치했다. o Bzip2 프로그램의 설치가 추가되었다. o $LFS가 무엇인지에 대해 더욱 자세히 설명하였다 - 이를 쓰는 방법과 쓰지 않는 방법. o 5장에서 9.1장까지의 모든 패키지들의 설치 과정을 간소화하였다. o 불필요한 별도의 장을 갖는 대신 Glibc와 GCC의 설치를 7장으로 이동하였다. o 인터넷 서버 관련 장을 수정하였다: Network Daemon 관련 부분과 Network Clients 관련 부분. 인터넷 관련 장은 이 새 두 부분들과 합쳐졌다. o 13장과 14장(X와 인터넷)을 바꾸었고 X와 Window Maker에 관한 장을 14장으로 통합하였다. o 우리는 새로운 Man 프로그램을 사용한다. 이는 우리가 이전에 쓰던 man- db 프로그램보다 설정과 사용이 더 쉽다. 두 버전은 거의 같은 일을 한다. o 13장을 추가하였다: 자원들. 이 장은 여러분이 LFS 시스템을 설치하는 동안이나 설치 후에 읽을 많은 유용한 책들과 HOWTO들을 담고 있다. o 3장: bzip2 링크 오류 수정 o 7.2.42장: Util-Linux 설치 방법의 간소화 o 3.1장: procps의 위치 변경 o 7.2장: Vim과 Util-Linux의 설치 순서를 바꿈 (Util-Linux를 설치하는 동안 우리는 에디터가 필요하기 때문이다) o 7.3.33장: procps 설치 오류 수정 o 5.2장: 부트시에 파일이 없다는 경고가 뜨지 않도록 inittab 파일을 제거했다. o 6장: 커널 설치부분 재작성 o 10.3장: 아파치 부트스크립트의 오류 수정 o 10.3.2장: httpd.conf 파일을 고치는 것에 대한 부분을 제거하였다. 더이상 필요하지 않다. /usr/apache/man을 /usr/share/misc/man.conf에 추가한다는 것을 넣었다. o 11.1장: 설치 과정을 간소화하기 위해서 잘 동작하는 Makefile 파일이 들어있도록 수정된 mailx 패키지를 제공하였다. o 11.3.1장: Zlib가 정적이 아니라 동적 라이브러리로 설치되도록 configure에 --share 스위치를 추가하였다. o 11.6장: Lynx가 Slang 대신 Ncurses 라이브러리에 링크되도록 하였다. o 12장: 새로운 man-db는 이미 man_db.config 파일에 X11/man 디렉토리를 가지고 있다. 2.2 - April 3rd, 2000 2.2 - 2000년 4월 3일 o 이제 linuxfromscratch.org와 linuxfromscratch.com 도메인이 작동한다. huizen.dds.nl/~glb와 tts.ookhoi.dds.nl에 대한 이전의 모든 링크들이 www.linuxfromscratch.org의 알맞은 링크로 대체되었다. o 7.3장에서 리부팅 이후에 우리가 소프트웨어의 컴파일을 시작하기 전에 스왑 파티션이 액티브 모드로 된다. 1.4. 메일링리스트 여러분이 참가할 수 있는 메일링리스트가 두 개 있다. lfs-discuss와 lfs- announce 리스트. 전자는 제한이 없이 열러진 것이며 이 문서와 관련된 어떤 것들이라도 토론할 수 있다. 후자는 제한이 있는 메일링리스트이다. 누구나 참가할 순 있지만 이 리스트에 글을 쓸 수는 없다 (오직 중재자만이 쓸 수 있다). 이 리스트는 주로 이 문서의 새 버전에 대해 알릴 때 사용된다. 만약 여러분이 lfs-discuss 리스트에 가입한다면 lfs-announce 리스트에도 가입할 필욘 없다. lfs-announce 리스트로 가는 모든 글은 lfs-discuss 리스트로도 보내진다. 1.4.1. 가입하기 리스트에 가입하기 위해서는 본문에 subscribe lfs-discuss 나 subscribe lfs-announce 라고 쓴 email을 majordomo@fist.org로 보내면 된다. Majordomo가 여러분에게 확인 요청 email을 보낼 것이다. 이 email은 인증 코드를 담고 있다. 여러분이 이 email을 Majordomo에게 돌려 보내면 (방법은 email 안에 나와있다) 가입이 완료될 것이다. 1.4.2. 탈퇴하기 리스트에서 탈퇴하기 위해서는 본문에 unsubscribe lfs-discuss 이나 unsubscribe lfs-announce 이라 쓴 email을 majordomo@fist.org 로 보내면 된다. 1.5. 연락처 여러분의 모든 질문은 가능하면 메일링 리스트로 올려주기 바란다. 만약 내게 개인적으로 연락해야 한다면 gerard@linuxfromscratch.org로 메일을 보내면 된다. 기타 번역의 오타나 오역에 대해선 alita@kldp.org로 메일을 주기 바란다. 1.6. 번역자의 변 LFS를 하나 하나 실제로 실행해 가면서 번역을 하고자 했던 계획이 밤 늦게 퇴근하는 직장인이라는 핑계로 수포로 돌아가면서 단순 번역으로 되었습니다.:( 그다지 특별하게 까다로운 번역은 없으나 이 v2.2 문서 자체에 버그가 상당량 내포되어 있기 때문에 - 덕분에 lfs-discuss mailing list 에는 무수한 메일들이 쏟아집니다 - 아직은 따라만 해서 완벽할 수 있다는 보장은 못할 것 같습니다. 각종 버그들에 대해선 가능하면 lfs- discuss 를 참조하시길 바라며, 현재 v2.3이 진행중입니다. v2.2 부터는 버전 번호가 kernel 버전 번호 부여 방법과 같이 가고 있으니 v2.4가 안정 버전이 될 것 같습니다.:) 2. 이 문서에서 쓰이는 관례 2.1. $LFS에 대해서 다음을 주의깊게 읽기 바란다: 이 문서 전체에 걸쳐서 여러분은 $LFS 라는 변수를 자주 보게 될 것이다. $LFS는 항상 LFS 시스템을 포함하는 파티션이 마운트되는 디렉토리로 대체되어야 한다. 파티션을 만드는 방법과 마운트할 곳에 대해선 후의 4장에서 자세히 설명될 것이다. 내 경우 LFS 파티션은 /mnt/hda5에 마운트된다. 만약 내가 이 문서를 읽다가 어딘가에서 $LFS를 본다면 /mnt/hda5라고 읽은 것으로 간주할 것이다. 만약 cp inittab $LFS/etc 라는 명령을 실행해야 한다는 것을 읽는다면 나는 실제로는 cp inittab /mnt/hda5/etc 라고 실행할 것이다. 중요한 것은 여러분이 프롬프트 상에서 실행하는 명령이던 편집하거나 새로 만드는 파일 안이던 여러분이 읽는 모든 곳에서 이 일을 해야 한다는 것이다. 여러분이 원한다면 LFS 라는 환경 변수를 선언할 수 있다. 이런 방식으로 /mnt/hda5 같은 것으로 대체하는 대신 $LFS를 직접 쓸 수 있다. 다음과 같이 하면 된다: export LFS=/mnt/hda5 만약 cp inittab $LFS/etc 라는 문장을 읽는다면 cp inittab $LFS/etc 라고 직접 칠 수 있으며 쉘이 이 명령을 cp inittab /mnt/hda5/etc 로 자동으로 변환해 줄 것이다. 항상 LFS 변수가 설정되어 있도록 하는 것을 잊으면 안된다. 만약 이 변수를 설정하지 않고 명령문 안에서 이를 사용한다면 $LFS는 무시되고 나머지만 실행될 것이다. LFS 변수가 설정되지 않은 상태의 cp inittab $LFS/etc 명령은 inittab 파일을 /etc 디렉토리로 복사하여 여러분의 기존의 시스템의 inittab 을 덮어씌울 것이다. inittab같은 파일은 쉽게 복구될 수 있기 때문에 큰 문제는 아니지만 C 라이브러리의 설치 도중에 실수를 한다면 여러분의 시스템을 심각하게 손상을 입힐 수 있으며 복구하는 방법을 모를 경우 다시 설치해야할 것이다. 따라서 나는 LFS 변수를 사용하지 말것을 강력히 권유한다. 여러분 스스로가 $LFS를 직접 /mnt/hda5 등으로 대체하는 것이 바람직하다. /mnt/hda5를 입력하는 동안 오타를 입력했을 경우 생길 수 있는 최악의 경우는 "no such file or directory" 라는 에러가 발생하는 것일 뿐 여러분의 시스템을 해치진 않을 것이다. 내가 여러분에게 경고를 하지 않았다고는 말하지 말길 바란다 ;) 2.2. 소프트웨어를 받는 방법 이 문서 전반에 걸쳐서 나는 여러분이 다운 받은 모든 패키지들을 $LFS/usr/src 의 서브디렉토리 아래에 저장하고 있다고 가정할 것이다. 나 스스로는 $LFS/usr/src/sources 디렉토리를 사용하였다. sources 안에서 여러분은 0에서 9까지의 디렉토리와 a에서 z까지의 디렉토리를 발견할 것이다. sysvinit-2.78.tar.gz 같은 패키지는 $LFS/usr/src/sources/s/ 아래에 저장된다. bash-3.02.tar.gz 같은 패키지는 $LFS/usr/src/sources/b/ 아래에 저장되며 나머지도 이와 같다. 물로 여러분이 이런 방식을 따를 필요는 없으며 나는 단지 예제를 주었을 뿐이다. 패키지들을 $LFS/usr/src 밖에 보관하고 서브디렉토리로 이동하는 것이 좋다. 이렇게 하면 우리가 패키지를 풀어서 작업을 하는 $LFS/usr/src 디렉토리를 깨끗이 유지할 수 있다. 다음 장은 여러분이 다운받아야 할 모든 패키지들의 목록을 담고 있다. 그러나 아직 우리의 LFS 시스템을 담을 파티션을 만들지 않았으므로 임시로 여러분이 원하는 다른 곳에 보관해야 하며 4장이 끝나면 이것들을 $LFS/usr/src/로 복사하는 것을 잊으면 안된다. 2.3. 소프트웨어를 설치하는 방법 패키지를 가지고 실제로 무언가를 하기 전에 그것을 먼저 풀어야(unpack) 한다. 흔히 패키지 파일이 tar로 묶이고 gzip으로 압축된 것을 볼 것이다 (이는 .tar.gz나 .tgz의 확장자로부터 알 수 있다). 나는 ungzip과 untar 방법에 대해 매번 설명하지는 않겠다. 이 단락에서 그 방법에 대해 한 번만 얘기를 할 것이다. 여러분은 .tar.bz2 파일을 받을 수도 있다. 이 파일은 tar로 묶인 후 bzip2 프로그램으로 압축된 것이다. bzip2는 흔히 쓰이는 gzip보다 더 좋은 압축 성능을 가지고 있다. bz2 파일을 사용하기 위해선 bzip2 프로그램이 설치되어 있어야 한다. 전부는 아니지만 대부분의 배포본이 이 프로그램을 포함하고 있으며 따라서 이미 여러분의 시스템에 설치되엉 있을 가능성이 높다. 만약 그렇지 않다면 여러분의 배포본의 설치 툴을 사용하여 설치한다. o 패키지를 여러분이 보관하고 있던 디렉토리에서 $LFS/usr/src 디렉토리로 복사하는 것으로 시작한다. o tar와 gzip으로 묶인 파일을 가지고 있다면 다음을 실행하여 이를 푼다: tar xvzf filename.tar.gz; rm filename.tar.gz 혹은 tar xvzf filename.tgz; rm filename.tgz o tar와 bzip2로 묶인 파일을 가지고 있다면 다음을 실행하여 이를 푼다: tar --use-compress-prog=bzip2 -xvf filename.tar.bz2;rm filename.tar.bz2 o tar로만 묶인 파일을 가지고 있다면 tar xvf filename.tar; rm filename.tar를 실행하여 이를 푼다. 여러분이 파일을 풀고 바로 그 파일이 더이상 필요없기 때문에 지웠다는 것을 주의하라. 이것이 그 파일을 이동이 아닌 복사를 해야 하는 이유다. 만약 이동을 시키고 지워버렸다면 이 패키지가 또 필요할 경우 다시 다운로드를 해야 할 것이다. 패키지 압축파일이 풀리면 현재 디렉토리 아래에 새로운 디렉토리가 만들어질 것이다 (그리고 이 문서는 여러분이 파일을 $LFS/usr/src 디렉토리 아래에서 풀었다고 가정한다). 설치 과정을 계속하기 전에 새 디렉토리로 이동해야 한다. 위의 모든 과정은 'xxx 압축파일을 푼다' 로 요약된다. 따라서 이러한 것을 읽게 되면 패키지를 $LFS/usr/src로 복사하고 tar 프로그램과 gzip/bzip2를 사용하여 압축을 푼 후 새로 만들어진 디렉토리로 이동한 후에 다음 설치 과정을 읽어야 한다. 패키지를 설치한 후 이를 가지고 두 가지 일을 할 수 있다. 소스가 들어있는 디렉토리를 지우거나 그냥 둘 수 있다. 그냥 두기로 했다면 내겐 좋다. 그러나 이후의 장에서 같은 패키지가 필요하게 된다면 (7.2장 까지의 모든 소프트웨어는 7.3장에서 재설치될 것이다) 이를 다시 쓰기 전에 디렉토리를 먼저 지워야 한다. 그렇지 않으면 이전 설정값들 (여러분의 기존의 리눅스 시스템에는 적용되지만 LFS 시스템으로 컴퓨터를 재시작한 후엔 더이상 적용되지 않는 설정값들) 이 쓰여서 문제가 될 수 있다.단순히 make clean을 하는 것이 소스 트리를 완벽히 깨끗하게 한다고 보장할 순 없다. 설정 스크립트는 make clean 과정에 의해 제거되지 않는 다양한 서브디렉토리 안에도 파일을 생성한다. 3. 다운받을 패키지들 아래는 여러분이 이 문서에서 사용하기 위해 다운받아야 할 모든 소프트웨어들의 목록이다. 나는 소프트웨어를 받을 수 있는 사이트와 디렉토리를 표기했지만 최신의 소스 파일을 받는 것은 여러분의 몫이다. 버전 번호는 이 문서가 기반하고 있으며 작동한다고 알려진 버전을 나타낸다. 스스로 해결할 수 없는 문제를 겪게 된다면 이 문서에서 쓰이는 버전을 받는다 (더 새 버전을 받았을 경우에). 3.1. 필수 소프트웨어 Sysvinit (2.78) : ftp://ftp.cistron.nl/pub/people/miquels/sysvinit/ Bash (2.03) : ftp://ftp.gnu.org/gnu/bash/ Linux Kernel (2.2.14) : ftp://ftp.kernel.org/pub/linux/kernel/ Binutils (2.9.1) : ftp://ftp.gnu.org/gnu/binutils/ Bzip2 (0.9.5d) : http://sourceware.cygnus.com/bzip2/ Diff Utils (2.7) : ftp://ftp.gnu.org/gnu/diffutils/ File Utils (4.0) : ftp://ftp.gnu.org/gnu/fileutils/ GCC (2.95.2) : ftp://ftp.gnu.org/gnu/gcc/ Glibc (2.1.3) : ftp://ftp.gnu.org/gnu/glibc/ Glibc-crypt (2.1.2) : ftp://ftp.gwdg.de/pub/linux/glibc/ Glibc-linuxthreads (2.1.3) : ftp://ftp.gnu.org/gnu/glibc/ Grep (2.4) : ftp://ftp.gnu.org/gnu/grep/ Gzip (1.2.4) : ftp://ftp.gnu.org/gnu/gzip/ Make (3.78.1) : ftp://ftp.gnu.org/gnu/make/ Sed (3.02) : ftp://ftp.gnu.org/gnu/sed/ Shell Utils (2.0) : ftp://ftp.gnu.org/gnu/sh-utils/ Tar (1.13) : ftp://ftp.gnu.org/gnu/tar/ Text Utils (2.0) : ftp://ftp.gnu.org/gnu/textutils/ Util Linux (2.10f) : ftp://ftp.win.tue.nl/pub/linux/utils/util-linux/ Bison (1.28) : ftp://ftp.gnu.org/gnu/bison/ Mawk (1.3.3) : ftp://ftp.whidbey.net/pub/brennan/ Find Utils (4.1) : ftp://ftp.gnu.org/gnu/findutils/ Ncurses (5.0) : ftp://ftp.gnu.org/gnu/ncurses/ Less (340) : ftp://ftp.gnu.org/gnu/less/ Perl (5.005_03) : ftp://ftp.gnu.org/gnu/perl/ M4 (1.4) : ftp://ftp.gnu.org/gnu/m4/ Texinfo (4.0) : ftp://ftp.gnu.org/gnu/texinfo/ Autoconf (2.13) : ftp://ftp.gnu.org/gnu/autoconf/ Automake (1.4) : ftp://ftp.gnu.org/gnu/automake/ Flex (2.5.4a) : ftp://ftp.gnu.org/gnu/flex/ E2fsprogs (1.18) : ftp://tsx-11.mit.edu/pub/linux/packages/ext2fs/ File (3.26) : http://www.linuxfromscratch.org/download/file-3.26-lfs.tar.gz Groff (1.15) : ftp://ftp.gnu.org/gnu/groff/ Ld.so (1.9.9) : ftp://tsx-11.mit.edu/pub/linux/packages/GCC/ Libtool (1.3.4) : ftp://ftp.gnu.org/gnu/libtool/ Linux86 (0.14.3) : http://www.linuxfromscratch.org/download/linux86-0.14.3-lfs.tar.gz Lilo (21) : ftp://sunsite.unc.edu/pub/Linux/system/boot/lilo/ Shadow Password Suite (19990827) : ftp://piast.t19.ds.pwr.wroc.pl/pub/linux/shadow/ Man (1.5h1) : ftp://ftp.win.tue.nl/pub/linux-local/utils/man/ Modutils (2.3.9) : ftp://ftp.ocs.com.au/pub/modutils/ Termcap (1.3) : ftp://ftp.gnu.org/gnu/termcap/ Procinfo (17) : ftp://ftp.cistron.nl/pub/people/svm/ Procps (2.0.6) : ftp://people.redhat.com/johnsonm/procps/ Psmisc (19) : ftp://lrcftp.epfl.ch/pub/linux/local/psmisc/ Start-stop-daemon (0.4.1) : http://www.linuxfromscratch.org/download/ssd-0.4.1-lfs.tar.gz Sysklogd (1.3.31) : ftp://sunsite.unc.edu/pub/Linux/system/daemons/ Vim (5.6) : ftp://ftp.vim.org/pub/editors/vim/unix/ 3.2. 선택 가능한 소프트웨어 이하 모든 소프트웨어는 9장과 그 이후 장에서 사용되며 반드시 필요한 것은 아니다. 특정 패키지를 설치할 것인지는 여러분 스스로 결정해야 한다. 예를 들어 LFS 시스템을 온라인에 연결할 계획이 없다면 email 이나 telnet, ftp, www 등의 유틸리티들을 설치하길 원치 않을 것이다. Netkit-base (0.17) : ftp://ftp.uk.linux.org/pub/linux/Networking/netkit-devel/ Net-tools (1.54) : http://www.tazenda.demon.co.uk/phil/net-tools/ Procmail (3.14) : ftp://ftp.procmail.org/pub/procmail/ Sendmail (8.9.3) : ftp://ftp.sendmail.org/pub/sendmail/ Mailx (8.1.1) : http://www.linuxfromscratch.org/download/mailx-8.1.1-fixed.tar.gz Mutt (1.0i) : ftp://ftp.mutt.org/pub/mutt/ Fetchmail (5.2.0) : http://www.tuxedo.org/~esr/fetchmail/ Netkit-telnet (0.17) : ftp://ftp.uk.linux.org/pub/linux/Networking/netkit-devel/ Proftpd (1.2.0pre9) : ftp://ftp.tos.net/pub/proftpd/ Netkit-ftp (0.17) : ftp://ftp.uk.linux.org/pub/linux/Networking/netkit-devel/ Apache (1.3.11) : http://www.apache.org/dist/ Zlib Library (1.1.3) : http://www.cdrom.com/pub/infozip/zlib/ Lynx (2.8.2) : http://www.slcc.edu/lynx/release/ PPP (2.3.11) : ftp://cs.anu.edu.au/pub/software/ppp/ Xfree86 (3.3.5) : ftp://ftp.xfree86.org/pub/XFree86/ libPropList (0.9.1) : ftp://ftp.windowmaker.org/pub/libs/ libXpm (4.7) : ftp://sunsite.unc.edu/pub/Linux/libs/X/ libpng (1.0.3) : http://www.cdrom.com/pub/png/ libtiff (3.4) : ftp://ftp.sgi.com/graphics/tiff/ libjpeg (6b) : http://www.ijg.org/ libungif (4.1.0) : ftp://prtr-13.ucsc.edu/pub/libungif/ WindowMaker (0.61.1) : ftp://ftp.windowmaker.org/pub/release/ 4. 새 시스템의 준비 4.1. 일을 해나가는 방법 우리는 Debian 이나 SuSe, Slackware, Mandrake, RedHat 등의 이미 설치되어 있는 리눅스 배포본을 사용하여 LFS 시스템을 만들 것이다. 여러분은 어떤 류의 부트 디스켓도 필요치 않다. 우리는 기존의 리눅스 시스템을 사용할 것이다 (우리가 컴파일러나 링커, 텍스트 에디터 등의 툴들이 필요하기 때문이다). 만약 여러분이 아직 리눅스를 설치하지 않았다면 이 문서를 당장은 사용할 수 없다. 우선 리눅스 배포본을 설치할 것은 권한다. 어떤 것을 설치하던지 관계는 없다. 또한 최신 버전일 필요도 없지만 그렇다고 너무 오래된 것이어선 안된다. 일년 이내의 것이라면 괜찮을 것이다. 여러분의 기존 시스템이 glibc-2.0 이나 그 이후의 것을 쓴다면 별 문제가 없다. libc5 는 몇몇 문제를 야기할 수 있으며 내가 더이상 그런 머신을 쓰지 않기 때문에 이 문서에서도 지원되지 않는다. 4.2. 새 파티션의 생성 새 리눅스 시스템을 만들기 전에 우리는 비어있는 리눅스 파티션이 필요하다. 나는 적어도 500MB 이상의 크기를 갖는 파티션을 권장한다. 부가 기능들 (email 이나 네트웍, 인터넷, X 윈도우 시스템 등) 이 없는 기본적인 시스템은 약 250MB 로도 가능하다. 이미 여러분이 리눅스 Native 파티션이 있다면 이 부분은 뛰어넘어도 된다. 적당한 하드디스크 (새 파티션을 프라이머리 마스터 IDE 디스크 위에 만들고 싶은 경우 /dev/hda 처럼) 를 옵션으로 하여 fdisk 프로그램 (혹은 여러분이 선호하는 fdisk 같은 프로그램) 을 실행한다. 리눅스 Native 파티션을 만들고 파티션 테이블을 쓴 후 fdisk 프로그램을 나온다. 파티션 테이블을 갱신시키기 위해 시스템을 리부팅 하라는 메시지를 받았다면 계속하기 전에 지금 리부팅하기 바란다. 여러분의 새 파티션 이름을 기억해 두도록 한다. (나와 같은 경우엔) hda5 같은 것일 수 있다. 이 새로 생성된 파티션은 이 문서에서 LFS 파티션 이라고 불려질 것이다. 4.3. 새 파티션 위에 ext2 파일 시스템 만들기 일단 파티션이 만들어졌으면 그 파티션 위에 새로이 ext2 파일 시스템을 만들어야 한다. ext2 파일 시스템을 만들기 위해 우리는 mke2fs 명령을 사용할 것이다. 새 파티션을 유일한 옵션으로 주고 실행하면 파일 시스템이 생성된다. 만약 여러분의 파티션이 hda5라면 mke2fs /dev/hda5 같은 명령을 실행하면 된다. 4.4. 새 파티션 마운트하기 ext2 파일 시스템을 만들고나면 사용할 수 있게 된 것이다. 이 파일 시스템을 사용하기 위해 (읽거나 쓰기 위해) 우리가 해야 할 것은 단지 그것을 마운트하는 것이다. 여러분이 이 파일 시스템을 /mnt/hda5 아래에 마운트한다면 /mnt/hda5 디렉토리로 가서 이 파티션을 사용할 수 있으며 이후 원하는 것을 무엇이던 할 수 잇다. 어떤 서브디렉토리를 여러분이 선택하는가는 중요치 않다 (심지어 여러분은 마운트 지점으로 /mnt 디렉토리를 사용할 수도 있다). 그러나 좋은 습관은 파티션과 같은 이름을 갖는 디렉토리를 만드는 것이다. 내 경우에 LFS 파티션은 hda5라 불리며 따라서 나는 이 파티션을 /mnt/hda5에 마운트 하였다. o 아직 없다면 /mnt 디렉토리를 만든다. o /mnt/xxx 디렉토리를 만든다. xxx는 LFS 파티션의 이름으로 대체된다. o mount /dev/xxx /mnt/xxx 명령을 실행하여 LFS 파티션을 마운트한다. xxx는 LFS 파티션의 이름으로 대체된다. 이 디렉토리(/mnt/xxx)는 여러분이 이전에 봤던 $LFS 이다. 따라서 만약 어디선가 "cp inittab $LFS/etc" 라는 것을 본다면 실제로는 "cp inittab /mnt/xxx/etc" 라고 쳐야 하며 xxx는 여러분의 파티션 이름으로 바뀐다. 4.5. 디렉토리의 생성 http://www.pathname.com/fhs/ 에서 찾을 수 있는 FHS 표준에 따라서 LFS 파티션 위에 디렉토리 트리를 만든다. 아래의 명령들을 실행하면 필요한 디렉토리들이 생성될 것이다. cd $LFS mkdir bin boot dev etc home lib mnt proc root sbin tmp usr var cd $LFS/usr mkdir bin include lib sbin share src ln -s share/man man ln -s share/doc doc ln -s . local ln -s ../etc etc ln -s ../var var cd $LFS/usr/share mkdir dict doc info locale man nls misc terminfo zoneinfo cd $LFS/usr/share/man mkdir man1 man2 man3 man4 man5 man6 man7 man8 cd $LFS/var mkdir lock log run spool tmp 이제 디렉토리가 생성되었으면 3장에서 다운로드 받았던 소스 파일들을 $LFS/usr/src (이 서브디렉토리를 스스로 만들어야 한다) 아래의 임의의 서브디렉토리로 복사해야 한다. 4.6. /dev 디렉토리의 복사 mknod 명령을 사용하여 $LFS/dev 디렉토리 안에 있어야 할 파일들을 개별적으로 만들 수 있지만 시간이 많이 걸린다. 나는 현재의 /dev 디렉토리를 $LFS 파티션으로 단순히 복사하는 것을 택했다. 기존의 권한과 심볼릭 링크, 소유권을 유지하기 위하며 디렉토리를 복사하기 위해선 다음의 명령을 사용한다: cp -av /dev $LFS chown root.root $LFS/dev/* 5. LFS 시스템을 부팅 가능하도록 만들기 5.1. Sysvinit의 설치 일반적인 환경 하에선 커널이 로드되어 여러 시스템 구성 요소들을 초기화한 후 시스템의 부팅 프로세스를 마무리할 init 라 불리는 프로그램을 로드한다. 전부 다는 아닐 지라도 거의 대부분의 리눅스 시스템에 들어있는 패키지는 Sysvinit이며 이것이 우리가 LFS 시스템에 설치하려는 프로그램이다. o Sysvinit의 압출파일을 푼다. o src 디렉토리로 이동한다. o Makefile 파일을 수정한다. o 이 파일의 all: 규칙 이전의 어느 곳에라도 ROOT = $LFS 라는 줄을 첨가한다. o 이 파일의 마지막 네 줄의 모든 /dev 앞에 각각 $(ROOT) 를 붙인다. 마지막 네 줄에 $(ROOT) 부분을 첨가한 후엔 아래와 같이 보일 것이다: @if [! -p $(ROOT)/dev/initctl ]; then \ echo "Creating $(ROOT)/dev/initctl"; \ rm -f $(ROOT)/dev/initctl; \ mknod -m 600 $(ROOT)/dev/initctl p; fi o 다음을 실행하여 패키지를 설치한다: make -e LDFLAGS=-static; make install 5.2. Sysvinit 설정 Sysvinit가 동작하기 위해서 우리는 설정 파일을 만들어야 한다. 다음을 포함하도록 $LFS/etc/inittab 파일을 만든다: # Begin /etc/inittab id:2:initdefault: ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now 1:2345:respawn:/sbin/sulogin # End /etc/inittab 5.3. passwd 와 group 파일의 생성 여러분이 inittab 파일에서 보는 것처럼 우리가 시스템을 부팅하면 init 가 sulogin 프로그램을 실행시키며 sulogin은 여러분에게 root의 패스워드를 물어볼 것이다. 이는 우리가 LFS 시스템 상에 적어도 passwd 파일은 가지고 있어야 한다는 것을 의미한다. o 다음을 포함하도록 $LFS/etc/passwd 파일을 생성한다: root:s394ul1Bkvmq2:0:0:root:/root:/bin/bash o 다음을 포함하도록 $LFS/etc/group 파일을 생성한다: root::0: 위의 인코딩된 패스워드 문자열은 lfs123 이다. 여러분의 LFS 시스템에 로그온 할 때 root의 패스워드를 물어온다면 lfs123을 입력하면 된다. 5.4. Bash 쉘의 설치 sulogin 이 root 패스워드를 물어오고 여러분이 패스워드를 입력했다면 쉘이 시작되야 한다. 흔히 bash 쉘이 시작된다. 그러나 아직 설치된 라이브러리가 전혀 없기 때문에 우리는 Sysvinit 에서와 같이 bash 를 정적으로 링크해야 한다. o Bash의 압축파일을 푼다. o 다음을 실행하여 Bash를 설치한다: ./configure --enable-static-link make; make -e prefix=$LFS/usr install mv $LFS/usr/bin/bash $LFS/bin cd $LFS/bin; ln -s bash sh 5.5. LILO에 엔트리 추가 이 파티션으로부터 부팅이 가능하기 위해선 우리는 /etc/lilo.conf 파일을 수정해야 한다. 다음 줄들을 lilo.conf 에 추가한다: image= label=