배포본을 사용않고 만드는 리눅스 시스템

Gerard Beekmans December 16th, 1999
譯 윤봉환, <el@linuxlab.co.kr>

 

     

    이 글은 배포판을 전혀 사용하지 않고 필요한 소프트웨어 소스를 직접 가져와서, 여러분 자신만의 리눅스 시스템을 구성하는 절차를 설명한다.

    차례

    1. Introduction

        1.1 What’s this all about?
        1.2 New versions
        1.3 Version history
        1.4 Contact info

    2. Software packages you need to download

    3. Preparing a new partition

        3.1 Creating a new partition
        3.2 Creating an ext2 file system on the new partition
        3.3 Adding an entry to LILO
        3.4 Creating directories
        3.5 Copying the /dev directory

    4. Installing Sysvinit

        4.1 Preparing Sysvinit
        4.2 Configuring Sysvinit
        4.3 Copying passwd & group files
        4.4 Installing a root shell
        4.5 Testing the system

    5. Installing a kernel

        5.1 Note on ftp.kernel.org
        5.2 Configuring the kernel
        5.3 Updating LILO
        5.4 Copying the new kernel source tree to $LFS
        5.5 Updating sysmlinks
        5.6 Testing the system

    6. Installing the GNU C Library

        6.1 Preparing the system for the GNU C Library installation
        6.2 Installing the GNU C Library

    7. Installing the GNU CC compilers

        7.1 Installing GCC 2.95.2
        7.2 Installing GCC 2.7.2.3

    8. Installing login utilities

        8.1 Installing agetty + login
        8.2 Modifying $LFS/etc/inittab
        8.3 Creating the UTMP record file
        8.4 Testing the system

    9. Installing Vim 

        9.1 Preparing the system for the Vim installation
        9.2 Installing Vim

    10. Creating initial boot scripts

        10.1 Preparing the directories and master files
        10.2 Creating the reboot script
        10.3 Creating the halt script
        10.4 Creating the mountfs script
        10.5 Creating the umountfs script
        10.6 Creating the sendsignals script  
        10.7 Set file permissions and create symlinks
        10.8 Creating the /etc/fstab file
        10.9 Testing the system

    11. Reinstalling statically linked software

        11.1 Installing the Termcap library
        11.2 Installing the Readline library
        11.3 Reinstalling Bash
        11.4 Reinstalling Sysvinit
        11.5 Reinstalling Make
        11.6 Reinstalling Sed
        11.7 Reinstalling Shell Utils
        11.8 Reinstalling File Utils
        11.9 Reinstalling + Installing Util Linux
        11.10 Reinstalling Text Utils
        11.11 Reinstalling Tar
        11.12 Reinstalling Gzip
        11.13 Reinstalling Bison
        11.14 Installing Flex
        11.15 Reinstalling Binutils
        11.16 Reinstalling Grep
        11.17 Reinstalling Mawk
        11.18 Reinstalling Find Utils
        11.19 Reinstalling Diff Utils
        11.20 Installing Less
        11.21 Reinstalling Perl
        11.22 Reinstalling M4
        11.23 Reinstalling Texinfo

    12. Installing the rest of the basic system software

        12.1 Installing E2fsprogs
        12.2 Installing File
        12.3 Installing Libtool
        12.4 Installing Modutils
        12.5 Installing Linux86
        12.6 Installing Lilo
        12.7 Installing DPKG
        12.8 Installing Sysklogd
        12.9 Installing Groff
        12.10 Installing Man-db
        12.11 Installing Procps
        12.12 Installing Procinfo
        12.13 Installing Procmisc
        12.14 Installing Shadow Password
        12.15 Installing GNU C++ Library

    13. Setting up basic networking

        13.1 Installing Netkit-base
        13.2 Installing Net-tools

    14. Setting up Email sub system

        14.1 Preparing system for Email sub system
        14.2 Installing Procmail
        14.3 Installing Sendmail
        14.4 Installing Mailx
        14.5 Creating /etc/init.d/sendmail bootscript
        14.6 Setting up permissions and symlinks
        14.7 Installing Mutt
        14.8 Installing Fetchmail
        14.9 Testing the Email sub system

    15. Installing Internet Servers

        15.1 Installing telnet daemon + client
        15.2 Installing Proftpd
        15.3 Installing Netkit-ftp
        15.4 Installing Apache
        15.5 Installing Slang Library
        15.6 Installing Zlib
        15.7 Installing Lynx
        15.8 Configuring the daemons
        15.9 Configuring telnetd
        15.10 Configuring proftpd
        15.11 Configuring apache
        15.12 Testing the daemons

    16. Installing X Window System

        16.1 Creating missing symlink
        16.2 Installing X
        16.3 Creating /etc/ld.so.conf
        16.4 Modifying /etc/man_db.config
        16.5 Creating the /usr/include/X11 symlink
        16.6 Creating the /usr/X11 symlink
        16.7 Adding /usr/X11/bin to the $PATH environment variable
        16.8 Configuring X
        16.9 Testing X

    17. Installing Window Maker

        17.1 Preparing the system for the Window Maker installation
        17.2 Updating dynamic loader cache
        17.3 Configuring WindowMaker
        17.4 Testing WindowMaker

    18. Configuring system for Internet

    19. Copyright & Licensing Information

     

------------------------------------------------------------------------

1. Introduction

    1.1 What’s this all about?

    내가 이 글을 쓰기 시작한 것은 여섯 달 전이다. 내가 그리 많은 리눅스 배포판을 사용한 것은 아니지만, 마음에 꼭 드는 배포판은 좀처럼 만날 수가 없었다. 모든 배포판이 각각 장점과 단점이 있지만, 나는 내가 사용해본 어떤 배포판에도 결코 만족할 수가 없었다.(비록 Debian처럼 내가 원하는 것에 매우 가까운 것도 있지만..)  

    결국 나는 다른 배포판을 전혀 사용하지 않고, 프로그램의 소스코드만을 모아 내 자신만의 리눅스 배포판을 만드는 방법들을 탐구하기로 마음 먹었다. 내가 발견한 것은 매우 복잡한 작업의 작은 일부였지만, 무척 신나는 일이고, 여러분도 시스템의 모든 구성요소를 설정하는 작업을 통해 정말 많은 것을 배우게 될 것이다.  이 일은 여러분이 다양한 소프트웨어들을 설정하기 위해, 아주 많은 매뉴얼을 읽도록 만든다.  그리고, 여러분 시스템의 모든 것을 다룰 수 있게 되는 멋진 선물을 받게 될 것이다. (물론, 생각은 그렇다) 여러분 자신의 리눅스 시스템을 구성하는 동안 여러분은 소프트웨어를 인스톨하는 과정과, 그 환경이 어떻게 설정되며 어떤 곳에 설정파일들이 놓이는지 정확하게 알아야 하기 때문이다.

     

    1.2 New versions

    이 글의 최근 버전은 항상 http://huizen.dds.nl/~glb/에서 찾을 수 있다.

     

    1.3 Version history

    1.0 (December 16th, 1999) - Initial release.

     

    1.4 Contact info

    내게 연락하고 싶다면 tts-sol@dds.nl로 메일을 보내면 된다.  Gerard Beekmans,

     

------------------------------------------------------------------------

2. Software packages you need to download

------------------------------------------------------------------------

3. Preparing a new partition

     

    3.1 Creating a new partition

    새로운 리눅스 시스템을 구성하기 전에, 우리는 먼저 새로운 시스템을 구성할 수 있도록 비어있는 리눅스 파티션을 만들어야 한다. 여러분 시스템에 이미 리눅스 네이티브 파티션(Linux Native partition)이 있다면 이 섹션을 건너뛰어도 좋다.

    리눅스 파티션을 설정할 하드디스크이름을 옵션으로(여러분이 첫 번째 IDE 하드디스크에 새로운 파티션을 구성할 계획이라면 /dev/hda, 두 번째 하드디스크라면 /dev/hdb를 사용한다) fdisk 프로그램을 시작한다(또는 cfdisk 프로그램이 있다면 그것을 사용하는 것이 낫다.)

    리눅스 네이티브 파티션을 만들었으면 파티션 테이블에 그 정보를 쓰고 (c)fdisk 프로그램을 끝낸다.(‘w’명령을 사용한다) 파티션 테이블이 업데이트되었고, 그것을 확실히 시스템에 인식시키기 위해 여러분의 시스템을 리부트해야 한다는 메시지를 만난다면, 작업을 계속하기 전에 시키는 대로 시스템을 리부트한다.

     

    3.2 Creating an ext2 file system on the new partition

    파티션이 만들어졌으면, 그 파티션에 새로운 ext2 파일시스템을 구성해야 한다. 이제부터는 새로 만들어진 이 파티션을 $LFS라 부르겠다. 여러분이 /dev/hda4에 파티션을 만들었고, /mnt/hda4 디렉토리에 그 파티션을 마운트했다면, 이 문서에서 $LFS/usr/bin에 파일을 복사하라고 말할 때 여러분은 /mnt/hda4/usr/bin에 복사하면 된다.

    새로운 ext2 파일시스템을 만들기 위해 우리는 mke2fs 명령을 사용한다. mke2fs 명령의 옵션으로 $LFS만 주면 파일시스템이 만들어질 것이다.

     

    3.3 Adding an entry to LILO

    다음에 컴퓨터를 켤 때 이 파티션으로 부트할 수 있도록 /etc/lilo.conf 파일을 업데이트해야 한다. 다음과 같은 줄을 lilo.conf 파일에 추가한다.
     

      image=<image>
        label=<label>
         root=$LFS
        read-only


    <image> 자리에는 이미 존재하는 커널 이미지를 써넣는다.  당분간(새로운 커널을 설치할 때까지), 지금 여러분의 리눅스 시스템에서 사용하고 있는 커널 이미지를 사용해야 한다. <lable> 자리에는 여러분이 원하는 대로, 어떤 것이라도 써넣을 수 있다. 나는 레이블을 “lfs”라고 붙였는데, 컴퓨터가 켜질 때 LILO 프롬프트에서 원하는 레이블(부트 메뉴)를 선택할 수 있다.

    /etc/lilo.conf 파일 편집이 끝나면 lilo를 실행해 설정정보를 업데이트 한다.

     

    3.4 Creating directories

    $LFS 파티션에 최소한의 디렉토리 트리를 만들자.  

    다음 명령들을 따라하면 필요한 디렉토리들이 만들어질 것이다. 여러분은 디렉토리들을 만들기 전에 $LFS 파티션을 먼저 마운트해야 한다.
     

    cd $LFS
    mkdir boot etc home lib mnt proc root tmp var
    mkdir -p bin sbin usr/bin usr/sbin usr/src usr/man
    cd usr/man
    mkdir man1 man2 man3 man4 man5 man6 man7 man8
    cd ..
    ln -s . local
    ln -s /etc etc
    ln -s /var var


    보다시피, LFS 시스템에서 /usr/local 디렉토리는 /usr 디렉토리의 링크이다. 나는 이것이 FHS(File Hierarchy Standard - http://www.pathname.com/fhs)을 위반한다는 것을 알고 있지만, 내 생각에 모든 소프트웨어 패키지는 어쨌든 지역적으로(local) 설치되는 것이고, 벤더들의 CD-ROM이나 그와 비슷한 것들에 의해 설치된 부분이 아니므로, /usr/local 디렉토리는 완벽한 self-built 시스템에 그다지 적합한 것이 아니라고 여겨진다.  

    그리고, /usr/etc와 /usr/var는 /etc와 /var 디렉토리의 링크이다.  이 것은 단지 내 개인적인 취향이다.

     

    3.5 Copying the /dev directory

    우리는 mknod 명령을 사용해서 $LFS/dev 디렉토리 아래에 필요한 모든 개별적인 파일을 만들 수 있지만, 그런 일들은 매우 오랜 시간이 걸린다.  나는 간단하게, 현재 리눅스 시스템의 /dev 디렉토리를 카피해서 $LFS 파티션에 넣는 방법을 선택했다.  원래 속성, 권한, 심볼릭 링크, 그리고 소유권을 보호하기 위해 다음 명령을 사용해서 카피한다.
     

    cp -av /dev $LFS


    여러분에게 꼭 필요한 것들을 제외하고, $LFS/dev 디렉토리는 마음대로 가지고 놀아도 된다.

 

------------------------------------------------------------------------

4. Installing Sysvinit

    4.1 Preparing Sysvinit

    일반적인 경우, 커널 로딩이 끝나고 다양한 시스템 구성요소들을 초기화한 후에 시스템 부트의 마지막 과정으로서 init 프로그램을 로드한다. 대부분의 리눅스 시스템에서 이 프로그램은 Sysvinit(System V 스타일의 init)이 쓰이는데, 바로 우리 LFS 시스템에 설치할 프로그램이다.

    Sysvinit 압축을 푼다.
    소스 디렉토리로 이동한다.
    Makefile을 편집한다.
    이 파일 어딘가에(규칙을 정하는 블록보다는 앞에 있어야 한다.) ROOT = $LFS 변수를 넣는다.
    이 파일의 마지막 네 줄에서 /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


    ‘make LDFLAGS=-satic’ 명령을 실행해 패키지를 컴파일한다.
    ‘make install’ 명령으로 패키지를 인스톨한다.

     

    4.2 Configuring Sysvinit

    Sysvinit이 작동하기 위해서는, 환경설정 파일을 만들어야 한다.  아래 내용들을 담고 있는 $LFS/etc/inittab 파일을 만든다:
     

    # Begin /etc/inittab

    id:2:initdefault:

    si::sysinit:/etc/init.d/rcS

    ~~: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
    z6:6:wait:/sbin/sulogin

    ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now

    1:2345:respawn:/sbin/sulogin

    # End /etc/inittab


     

    4.3 Copying passwd & group files

    여러분이 inittab 파일에서 보듯이, 시스템이 부트될 때 init은 sulogin 프로그램을 시작하고, sulogin은 여러분에게 루트 패스워드를 물어볼 것이다.  이것은 LFS 시스템에 패스워드 파일이 있어야 한다는 것을 의미한다.  우리는 지금 사용 중인 리눅스 시스템의 패스워드와 그룹파일을 가져다 사용할 것이다.  패스워드는 암호화되어(encoded) 있으므로 지금 사용중인 passwd 파일을 카피해서 그것을 사용하는 것이 더 쉽다.  암호화된 패스워드를 다시 타이핑하는 대신 그대로 가져다 쓰면 된다.  이 방법을 사용하면 실수를 유발할 수 있는 불필요한 작업을 피할 수 있도록 해준다.

     /etc/passwd와 /etc/group 파일을 $LFS/etc/에 복사해 넣는다.
     $LFS/etc/passwd 파일을 편집기로 열어 root 사용자를 제외한 모든 라인을 지운다.
     $LFS/etc/group 파일을 편집기로 열어 root 그룹을 제외한 모든 라인을 지운다.

     

    4.4 Installing a root shell

    sulogin이 여러분에게 루트 패스워드를 물어보고 여러분이 패스워드를 입력하면, 이제부터는 셸(shell)이 필요한 단계이다. 이 과정에서 대개는 bash 셸이 쓰인다. 아직 어떤 라이브러리도 설치되어 있지 않으므로, 우리는 Sysvinit에서 그랬던 것처럼 bash를 정적으로 링크해야 한다.

    Bash 패키지 압축을 풀어놓는다.
    ‘configure --enable-static-link’ 명령을 수행해 Bash 패키지 환경을 설정한다.
    ‘make’ 명령으로 패키지를 컴파일한다.
    bash 바이너리를 $LFS/bin에 복사해 넣는다.
    $LFS/bin/bash 바이너리를 $LFS/bin/sh라는 이름으로 심볼릭 링크를 만든다.

     

    4.5 Testing the system

    이 섹션을 무사히 마쳤으면, 시스템을 테스트하고 로그온 할 수 있는지 확인해야 한다. 여러분은 init 프로그램이 rcS와 rc 스크립트를 실행할 수 없다는 에러 메시지를 만나게 되겠지만 심각한 것은 아니다. 우리는 다음 단계에서 이 스크립트들을 설치할 것이다.

    또 하나 주의할 것은 여러분이 시스템을 셧다운 할 수 없다는 것이다.  shutdown 프로그램은 Sysvinit 패키지에서 제공되지만 다음과 같은 에러 메시지를 보여줄 것이다: “You don’t exist. Go away.” 이 메시지는 시스템이 패스워드 파일을 찾을 수 없다는 것을 나타낸다. shutdown 프로그램이 필요한 라이브러리에 정적으로 링크되어 있더라도, 여전히 우리가 다음 과정에 설치할 GNU C 라이브러리 가운데 일부인 nss 라이브러리 (Name Server Switch)에 의존성을 가진다.  NSS 라이브러리는 (상황에 따라) 어디서 passwd 파일을 찾을 수 있는지 정보를 제공한다.

    지금은 reboot -f 명령으로 시스템을 재부트할 수 있다. 이 명령은 shutdown 프로그램을 사용해서 셧다운 하고, 바로 다시 부트한다. 파일시스템이 read-only로 마운트되어 있으므로 이렇게 해도 시스템에는 어떤 손상도 입히지 않는다.(그렇기는 해도, 다음에 시스템을 마운트하려 할 때, 이전에 마운트 정보가 정리되지 않은 채 시스템을 꺼버렸으므로(‘not unmounted cleanly’), 파일 시스템을 안전하게 사용하려면 e2fsck 프로그램을 실행해서 정리해야 한다는 경고 메시지를 만나게 될 지도 모르겠다.)

     

------------------------------------------------------------------------

5. Installing a kernel

     

    5.1 Note on ftp.kernel.org

    위 섹션 2에서 나는 여러분이 ftp://ftp.kernel.org/에서 새로운 커널을 다운로드할 수 있다고 설명했지만, 이 사이트는 대개 너무 많은 접속자가 물려 있고, 이 사이트 관리자도 여러분 근처 사이트에서 커널을 다운로드하는 편이 나을 거라고 권고한다. 여러분은 ftp://ftp.<country code>.kernel.org/ (예를 들어 ftp.ca.kernel.org처럼)라는 주소로 미러 사이트에 접속할 수 있을 것이다.

     

    5.2 Configuring the kernel

    커널 패키지 압축을 푼다.

    커널 환경을 설정하는 방법 하나를 선택하고(설정방법에 대해 더 자세한 정보를 알고 싶으면 README 파일을 읽는다) 옵션을 설정하는데, 이 단계에서는 어떤 것도 모듈로 설정해서는 안된다. 당분간은 커널 모듈을 로드할 수 있는 소프트웨어가 없기 때문이다.

    커널 환경설정이 끝나면 ‘make dep’ 명령을 실행한다.
    ‘make bzImage’ 명령으로 커널을 컴파일한다.
    arch/<cpu>/boot/bzImage(예를 들어 arch/i386/boot/bzImage) 파일을 /boot 디렉토리에 복사해 넣는다. (또는, 여러분의 리눅스 시스템에서 다른 형태로 커널 이미지를 다룬다면 그 방법을 따른다.)
    /boot/bzImage 파일의 이름은 여러분 마음대로 정할 수 있다.  예를 들어 /boot/lfskernel 등.

     

    5.3 Updating LILO

    /etc/lilo.conf 파일을 편집기로 열어 LFS 섹션으로 간다. (”3ㆍ3”에서 만든 부분)
     image 이름을 lfskernel로 바꾸고 (또는 여러분이 정한 이름이나, 바꾸지 않았다면 원래 이름인 bzImage를 그대로) lilo를 실행해 부트로더 설정을 업데이트 한다.

     

    5.4 Copying the new kernel source tree to $LFS

    새로운 커널 소스 전체 트리를 $LFS/usr/src 아래 복사한다. ‘cp -av <kernel directory> $LFS/usr/src’ 명령으로 쉽게 복사된다.

     

    5.5 Updating sysmlinks

    대개 /usr/local/include/linux 디렉토리는 /usr/src/linux 디렉토리에 심볼릭 링크되어 있고, /usr/src/linux 디렉토리는 /usr/src/<kernel version>에 심볼릭 링크되어 있다. /usr/src/linux 디렉토리는 여러분이 이 장의 첫 부분에서 소스 패키지를 풀어놓은 디렉토리를 가리키고 있어야 한다.

    /usr/include/linux가 /usr/src/linux 디렉토리를 가리키게 할 수도 있다. - 이 방법은 여러분이 사용하는 배포판에 의존한다.

    LFS 시스템에서 아래 명령들을 실행해서 적당한 심볼릭링크들을 생성한다.
     

    cd $LFS/usr/include
    ln -s ../src/linux/include/asm asm
    ln -s ../src/linux/include/linux linux


    만약 여러분이 (배포판으로부터 설치해서 지금 사용하는) normal Linux 시스템에서 사용할 수 있도록 소프트웨어를 컴파일하려면 커널 헤더가 필요하고, 새 커널을 로드하지 않는다면 심볼릭 링크를 헤더의 진짜 위치로 돌려놓는 것이 바람직하다. lfskernel을 LFS 시스템과 nomal Linux 시스템 어느 쪽에서 사용해도  안전하다.

     

    5.6 Testing the system

    시스템을 재부트해서 LFS 시스템을 시작한다.  새로 인스톨한 커널이 이상 동작을 보이지 않는지 검사한다.(crashing 같은)

     

------------------------------------------------------------------------

6. Installing the GNU C Library

     

    6.1 Preparing the system for the GNU C Library installation

    이 섹션에서 우리는 Glibc를 설치할 것이다. 그렇지만 이들 라이브러리를 설치하려면 먼저, 다른 소프트웨어들을 LFS 시스템에 설치해야 한다. 이것은 임시 작업 가운데 매우 작은 한 부분을 뜻하는데, Glibc와 GNU CC 컴파일러가 인스톨 된 다음 먼저 설치된 프로그램들이 동적으로 라이브러리에 링크되므로 이 후에 프로그램 모두를 다시 설치할 것이다.  먼저 모든 소프트웨어를 정적으로 구성하고 다시 그들을 동적으로 재구성하는 복잡한 과정을 거치지 않고도 이 작업을 할 수 있는 더 좋은 방법을 알고 있다면 부디 내게도 알려주기 바란다.

    나는 다른 방법을 하나 더 아는데 전처리된 바이너리를 이용해 Glibc를 설치하는 것이다. 그렇지만 그 방법은 우리가 지금 하는 작업(소스만으로 리눅스 시스템을 구성하는)에 어울리지 않는다. 그러므로 그 방법은 선택하지 않겠다.

    이 섹션에서 설치되는 모든 소프트웨어는 우리가 지금 작업중인 normal Linux 리눅스 시스템에서 컴파일되고 다시 LFS 시스템으로 복사될 것이다.

    여러분은 이런 소프트웨어 설치가 대개의 경우 매우 쉽다는 것을 알게 될 것이다.  나는 또, 이런 소프트웨어는 모두 일상적인 것들로, 각각 어떤 일을 하는지 굳이 설명하지 않을 것이므로, 만약 어떤 곳에 쓰이는 프로그램인지 모른다면 그 때마다 여러분 스스로 README 파일과 다른 문서들(/usr/doc 또는 http://kldp.org/에서 제공하는 문서들)을 읽는 것이 좋겠다.

      Installing Make

      Make 패키지의 압축을 푼다.
      configure 를 실행해 패키지 환경을 설정한다.
      ‘make LDFLAGS=-static’ 명령을 실행해 패키지를 컴파일한다.
      make 바이너리를 $LFS/usr/bin 디렉토리에 카피한다.

      Installing Sed

      sed 패키지의 압축을 푼다.
      configure 를 실행해 패키지 환경을 설정한다.
      ‘make LDFLAGS=-static’ 명령을 실행해 패키지를 컴파일한다.
      sed 바이너리를 $LFS/usr/bin 디렉토리에 카피한다.

      Installing Shell Utils

      Shell Utils 패키지의 압축을 푼다.
      configure를 실행해 패키지 환경을 설정한다.
      ‘make LDFLAGS=-static’ 명령을 실행해 패키지를 컴파일한다.
      src디렉토리에 만들어진 다음 바이너리들을 $LFS/bin디렉토리에 카피한다:
      date echo false pwd sleep stty su true uname
      src 디렉토리에 만들어진 다음 바이너리를 $LFS/sbin 디렉토리에 카피한다: chroot

      Installing File Utils

      File Utils 패키지의 압축을 푼다.
      configure를 실행해 패키지 환경을 설정한다.
      ‘make LDFLAGS=-static’ 명령을 실행해 패키지를 컴파일한다.
      다음 바이너리들을 $LFS/bin 디렉토리에 카피한다: chgrp chmod chown cp dd df dir dircolors du ln ls mkdir mkfifo mknod rm rmdir sync touch vdir
      다음 바이너리들을 $LFS/usr/bin 디렉토리에 카피한다: ginstall
      $LFS/usr/bin/ginstall 파일 이름을 $LFS/usr/bin/install 로 바꾼다.

      Installing Util Linux

      Installing Utils 패키지의 압축을 푼다.
      configure를 실행해 패키지 환경을 설정한다.
      lib 디렉토리로 가서 ‘make’ 명령으로 파일들을 컴파일한다.
      mount 디렉토리로 가서 ‘make LDFLAGS=-static’ 명령을 실행해서 프로그램들을 컴파일한다.
      다음 바이너리들을 $LFS/sbin 디렉토리에 카피한다: losetup mount swapon umount
      $LFS/sbin/swapon을 $LFS/sbin/swapoff란 이름으로 심볼릭 링크한다.

      Installing Text Utils

      Text Utils 패키지의 압축을 푼다.
      configure를 실행해 패키지 환경을 설정한다.
      ‘make LDFLAGS=-static’ 명령을 실행해 패키지를 컴파일한다.
      src 디렉토리에서 다음 바이너리를 $LFS/bin 디렉토리에 카피한다: cat
      src 디렉토리에서 다음 바이너리들을 $LFS/usr/bin 디렉토리에 카피한다:
      cksum comm csplit cut expand fmt fold head join md5sum nl od paste pr sort split sum tac tail tr unexpand uniq wc

      Installing Tar

      Tar 패키지의 압축을 푼다.
      configure를 실행해 패키지 환경을 설정한다.
      ‘make LDFLAGS=-static’ 명령을 실행해 패키지를 컴파일한다.
      프로그램들을 컴파일하면 src 디렉토리에 프로그램이 두 개 생긴다: tar와 rmt.
      Tar는 잘 아는 프로그램이고. Rmt는 ReMote Tapesever를 뜻한다. 여러분에게 이 프로그램이 필요 없다면 (예를 들어 여러분 네트워크나 머신에 테이프 스트리머-tape streamer가 없다면) 이 프로그램은 카피할 필요 없다.
      src/tar 바이너리를 $LFS/bin에 카피한다.
      src/rmt 바이너리를 $LFS/bin에 (여러분에게 필요하다면) 카피한다.

      Installing Gzip

      Gzip 패키지의 압축을 푼다.
      configure를 실행해 패키지 환경을 설정한다.
      ‘make LDFLAGS=-static’ 명령을 실행해 패키지를 컴파일한다.

      나는 Gzip 버전 1.2.4를 사용하는데 컴파일 작업을 진행하는 동안 에러 메시지를 만났다: basename에 설정된 자료형이 상충된다는 것이다. 여러분에게도 이 에러에 의한 문제가 생긴다면, 다음 과정을 통해 바로잡을 수 있다:

      gzip.h 파일을 편집기로 열어 다음 줄을 찾는다:
      extern char *basename OF((char *fname));  

      이 줄을 다음과 같이 바꾼다: extern char *basename2
      OF((char *fname));

      util.c 파일을 열어 다음 줄을 찾는다:
      char *basename(fname)
      이 줄을 다음과 같이 바꾼다: char *basename2(fname)

      이제 패키지를 다시 컴파일 해보면(make LDFLAGS=-static 명령을 다시 실행한다.) 에러가 고쳐졌을 것이다.

      뭐가 잘못되었을까? 내 시스템에서 표준 시스템 헤더 파일 가운데 하나가 ‘basename’이란 이름을 가진 함수였다.(내가 생각하기에 string.h였던 것 같은데 더 이상은 잘 모르겠다) Gzip 프로그램은 그 자체에 이 함수를 가지고 있고, 또 basename이란 이름을 똑같이 사용하므로 아마 여러분에게도 그런 문제가 생길 것이다. Gzip 소스에서 basename 함수를 basename2라는 이름으로 바꾸면 문제가 해결된다.

      .in이라는 꼬리(extension)를 가진 다음 파일들을 지운다: gzexe.in zdiff.in zforce.in zgrep.in zmore.in znew.in

      다음 파일들을 $LFS/bin 디렉토리에 카피한다:  
      gunzip gzexe gzip zcat zdiff zforce zgrep zmore znew

      Installing Binutils

      BinUtils 패키지의 압축을 푼다.
      configure를 실행해 패키지 환경을 설정한다.
      ‘make LDFLAGS=-static’ 명령을 실행해서 프로그램들을 컴파일한다.
      gas 디렉토리에서 다음 바이너리들을 $LFS/usr/bin 디렉토리에 카피한다: as-new gasp-new
      그 파일들 이름을$LFS/usr/bin/as와 $LFS/usr/bin/gasp로 바꾼다.
      ld 디렉토리에서 다음 바이너리들을 $LFS/usr/bin 디렉토리에 카피한다: ld-new
      그 파일을 $LFS/usr/bin/ld란 이름으로 바꾼다.
      binutils 디렉토리에서 다음 바이너리들을 $LFS/usr/bin 디렉토리에 카피한다: addr2line ar c++filt nm-new objcopy objdump ranlib size strings strip-new
      $LFS/usr/bin/nm-new 파일을 $LFS/usr/bin/nm란 이름으로 바꾼다.
      $LFS/usr/bin/strip-new 파일을 $LFS/usr/bin/strip란 이름으로 바꾼다.

      Installing Grep

      Grep 패키지의 압축을 푼다.
      /configure를 실행해 패키지 환경을 설정한다.
      ‘make LDFLAGS=-static’ 명령을 실행해서 프로그램들을 컴파일한다.
      src 디렉토리에서 다음 바이너리들을 $LFS/usr/bin
      디렉토리에 카피한다: egrep fgrep grep

      Installing Bison

      Bison 패키지의 압축을 푼다.
      configure를 실행해 패키지 환경을 설정한다.  
      ‘make LDFLAGS=-static’ 명령을 실행해서 프로그램들을 컴파일한다.
      다음 바이너리를 $LFS/usr/bin 디렉토리에 카피한다: bison
      다음 바이너리들을 $LFS/usr/share 디렉토리에 카피한다: bison.hairy bison.simple

      Installing Mawk

      Mawk 패키지의 압축을 푼다.
      configure를 실행해 패키지 환경을 설정한다.
      make CFLAGS=”-O -static” 명령을 실행해서 프로그램들을 컴파일한다.
      다음 바이너리를 $LFS/usr/bin 디렉토리에 카피한다: mawk
      $LFS/usr/bin/awk란 이름으로 $LFS/usr/bin/mawk 파일을 심볼릭 링크한다.

      Installing Find Utils

      Utils 패키지의 압축을 푼다.
      configure를 실행해 패키지 환경을 설정한다.
      make CFLAGS=-static 명령을 실행해서 프로그램들을 컴파일한다.

      나는 Find Utils 4.1 버전을 사용하는데 컴파일을 진행하는 동안 에러를 만나게 되었다. 치명적인 에러(fatal error)이기는 하지만 에러가 발생했을 때 컴파일 작업이 멈추지는 않았다. 여러분이 다음 에러를 만난다면 컴파일 과정에서 출력되는 정보들을 주의 깊게 살펴볼 필요가 있다: defs.h304: 역시 basename 자료형이 상충하는 것이다.

      그런 에러 때문에 문제가 생긴다면 다음 과정을 통해 바로잡을 수 있다:

      find/Makefile 파일을 편집기로 열어 다음 변수를 찾는다: CFLAGS
      이 변수에 -D_GNU_SOURCE 라는 값을 추가한다.
      find/defs.h 파일을 편집기로 열어 다음 줄을 찾는다:
      char *basename P_((char *fname));  

      그 줄을 다음과 같이 바꾼다:
       char *basename2 P_((char *fname));
       find/util.c 파일을 편집기로 열어 다음 줄을 찾는다:
       char *basename (fname)

      이 줄은 두 줄로 분리된다 (“char *”가 첫 번째 줄이고 두 번째 줄은 “basename (fname)”이다)

      그 줄을 다음과 같이 바꾼다:
      char *basename2 (fname)

      굳이 두 줄로 계속 두지 않아도 되지만, 꼭 그렇게 하고 싶다면 여러분이 원하는 대로 두어도 상관없다.  여러분이 보기에 더 맘에 드는 것으로 정한다.

      이제 패키지를 다시 컴파일 해보면(make LDFLAGS=-static 명령을 다시 실행한다.) 에러가 고쳐졌을 것이다. find 디렉토리에서 다음 파일을 $LFS/usr/bin 디렉토리로 복사한다: find

      Installing Diff Utils

      Diff 패키지의 압축을 푼다.
      configure를 실행해 패키지 환경을 설정한다.
      make LDFLAGS=-static 명령을 실행해서 프로그램들을 컴파일한다.
      다음 바이너리들을 $LFS/usr/bin 디렉토리에 카피한다: diff diff3 sdiff

      Installing Ld.so

      Ld.so 패키지의 압축을 푼다.
      util 디렉토리로 간다.
      make ldd 명령으로 ldd를 컴파일한다.
      make ldconfig 명령으로 ldconfig를 컴파일한다.
      다음 바이너리를 $LFS/usr/bin 디렉토리에 카피한다: ldd
      다음 바이너리를 $LFS/usr/sbin 디렉토리에 카피한다: ldconfig

      Installing Perl

      Perl 패키지의 압축을 푼다.
      configure를 실행해 패키지 환경을 설정한다.

      여러분은 아래 질문들을 제외하고, 모든 질문에 대해 기본 값을 그대로 두어도 된다.
       

      What is the file extension used for shared libraries? [so]

      Answer with: none

      Any additional ld flags (NOT including libraries)? [-L/usr/local/lib]

      Answer with: -L/usr/local/lib -static

      Do you wish to use dynamic loading? [y]

      Answer with: n


      make 명령을 실행해 패키지를 컴파일한다.
      다음 바이너리를 $LFS/usr/bin 디렉토리에 카피한다: perl

      Installing M4

      M4 패키지의 압축을 푼다.
      configure를 실행해 패키지 환경을 설정한다.
      make LDFLAGS=-static 명령을 실행해서 프로그램들을 컴파일한다.
      src 디렉토리에서 다음 바이너리를 $LFS/usr/bin 디렉토리에 카피한다: m4

      Installing Texinfo

      Texinfo 패키지의 압축을 푼다.
      configure를 실행해 패키지 환경을 설정한다.
      make LDFLAGS=-static 명령을 실행해서 프로그램들을 컴파일한다.
      makeinfo 디렉토리에서 다음 바이너리를 $LFS/usr/bin 디렉토리에 카피한다: makeinfo

      Installing Automake

      automake 패키지의 압축을 푼다.
      configure를 실행해 패키지 환경을 설정한다.
      다음 스크립트들을 $LFS/usr/bin 디렉토리에 카피한다: automake aclocal
      다음 디렉토리를 만든다: $LFS/usr/share/automake
      다음 파일들을 $LFS/usr/share/automake 디렉토리에 카피한다:
      config.guess config.sub install-sh mdate-sh missing mkinstalldirs elisp-comp ylwrap acinstall

      다음 파일들을 $LFS/usr/share/automake 디렉토리에 카피한다: All *.am files

      다음 디렉토리를 만든다:
      $LFS/usr/share/aclocal m4 디렉토리로부터 다음 파일들을 $LFS/usr/shar- e/aclocal디렉토리에 카피한다: all *.m4 files

      Installing Autoconf

      Autoconf 패키지의 압축을 푼다.
      configure를 실행해 패키지 환경을 설정한다.
      make 명령을 실행해서 패키지를 컴파일한다.
      다음 파일들을 $LFS/usr/bin 디렉토리에 카피한다: autoconf autoheader autoreconf autoscan autoupdate ifnames
      다음 디렉토리를 만든다: $LFS/usr/share/autoconf
      다음 파일들을 $LFS/usr/share/autoconf 디렉토리에 카피한다:
      acconfig.h acfunctions acheaders acidentifiers acprograms acmakevars

     

    6.2 Installing the GNU C Library

    우리는 최근 Glibc 버전인, 2.1.2를 설치하지 않고 이전 버전 2.0.7pre6을 사용할 것이다. 그 까닭은 glibc 2.1.2 버전이 최소한 gcc 2.8(또는 egcs 1.1)버전 이상을 요구하기 때문이다. 내 시스템에는 gcc 2.7.2.3 버전이 설치되어 있으므로 나는 glibc 2.1.2 라이브러리를 컴파일 할 수 없다. 그리고 또, 나는 지금 사용중인 리눅스 시스템을 gcc 2.95.2 버전으로 업그레이드할 생각도 없다.(gcc 2.95.2는 이 글을 쓰는 동안 가장 최근 버전이다.) 컴파일러를 업그레이드하는 것이 말처럼 그렇게 쉬운 일도 아니고 나는 내 시스템이 어쩌다 망가지는 것을 결코 바라지 않는다.

    그러므로 나는 glibc 2.0.7pre6 버전을 설치해야 한다.  그렇지만, 우리는 gcc 2.95.2 컴파일러는 설치하게 될 것이다. 그리고, 어떤 소프트웨어는 gcc 2.95.2 버전에서는 컴파일되지 않는 것도 있으므로, 그런 것들을 위해 gcc 2.7.2.3 컴파일러도 설치해야 한다. (진짜 버그가 아닌데도 프로그램 상의 버그 때문에, gcc 2.95.2 컴파일러는 버그라고 판단한다. 그렇다고 컴파일러 버그는 아니고, C 표준이 바뀐 것이다(내가 제대로 이해하고 있다면 아마..)

    아래는 glibc-crypt 패키지상의 노트이다. 아래는 ftp://ftp.gnu.org/gnu/glibc에서 구한 glibc-crypt-README 파일로부터 인용한 글이다:
     

    프랑스, 러시아 등 어떤 정부들, -특히 US는 라이선스 없이 인터넷을 통해 암호화와 관련된 소프트웨어가 해외로 반출되는 것을 허용하지 않으므로, 여러분이 US가 아닌 곳에 살고 있다면 이것들을 ftp.gnu.org에 있는 주 FSF FTP 사이트에서 받으면 안되며, 이 소프트웨어는 US와 전혀 상관없는 곳에서 개발되었다는 그런 뜻을 담고 있다.

     

    -------------------------생략--------------------------
    In particular, the US does not allow export of this software without a
    license, including via the Internet. So please do not download it from the
    main FSF FTP site at ftp.gnu.org if you are outside of the US. This software
    was completely developed outside the US.


    위에서 “이 소프트웨어”란 ftp://ftp.gwdg.de/pub/lin-
    ux/glibc/2.0.7pre6/로부터 가져온 glibc-crypt 패키지를 말한다. 이 법규는 US 안에 살지 않는 사람들에게만 적용된다. 그리고, DES 소프트웨어를 들여오는 것은 막지 않으므로, 여러분이 US 안에 살고 있다면 독일 사이트로부터 들여오는 것은 가능하다.

    Glibc 패키지의 압축을 푼다.
    glibc-crypt와 glibc-linuxthreads 패키지를 풀어놓은
    glibc 디렉토리로 옮긴다.
    glibc-crypt와 glibc-linuxthreads 패키지 압축을 그 곳에 푼다.
    ‘./configure  --with-gnu-binutils  --enable-shared  --enable-add-ons=linuxthreads,crypt’ 명령을 실행해 패키지 환경을 설정한다.(glibc 최상위 디렉토리에서)

    다음 내용을 넣어서 configparms 파일을 새로 만든다.
     

    # Begin configparms
    prefix=/usr
    slibdir=/lib
    sysconfdir=/etc
    # End configparms


    make 명령을 실행해서 패키지를 컴파일한다.
    LFS 시스템으로 컴퓨터를 재부트한다.
    LFS 파티션을 read-write 모드로 다시 마운트한다.
    Glibc 소스 파일들이 들어 있는 파티션을 마운트한다.
    만약 이 파티션이 일상적으로 마운트하는 여러분의 /usr 디렉토리와 다르다면 그 파티션도 마운트한다.
    일반적인 리눅스 시스템에서 usr/lib/gcc-lib 디렉토리를 /usr/lib/gcc-lib란 이름으로 심볼릭 링크를 만든다.
    Glibc 소스 디렉토리로 간다.
    make install 명령으로 패키지를 인스톨 한다.
    /usr/lib/gcc-lib 심볼릭 링크를 삭제한다.

    여러분의 normal Linux 파티션 bin 디렉토리에 있는 ls 프로그램을 실행해서 새로 설치한 라이브러리를 간단하게 테스트할 수 있다.  여러분이 어떤 에러도 만나지 않고 이 프로그램을 실행할 수 있다면 GNU C 라이브러리는 제대로 인스톨 된 것이라고 보면 된다.

 

------------------------------------------------------------------------

7. Installing the GNU CC compilers

    여러분은 gcc 컴파일러를 컴파일하기 위해 시스템을 다시 시작해서 normal Linux으로 돌아가야 한다.

     

    7.1 Installing GCC 2.95.2

    GCC 설치 노트는 오브젝트 파일을 별도의 디렉토리에 둘 것을 권한다.  이것은 gcc 소스가 놓인 디렉토리와, 컴파일된 파일들이 놓일 또 다른 디렉토리가 만들어져야 한다는 것을 뜻한다.  예를 들어 gcc 패키지를 /usr/src/gcc-2.95.2 디렉토리에 풀어놓고, /usr/src/gcc-install 이란 이름으로 다른 디렉토리를 만들 수도 있다.

    GCC 패키지의 압축을 푼다.
    gcc-install 디렉토리로 간다.
    ‘../gcc-2.95.2/configure --prefix=/usr --enable-
    shared’ 명령을 실행해 패키지 환경을 설정한다.
    make bootstrap 명령을 실행해서 패키지를 컴파일한다.
    다음 내용을 담아 $LFS/root/test.c 파일을 만든다.
     

       // Begin test.c
       #include <stdio.h>
       int main() {
          printf(“Hello World!\n”);
          return 0;
       }
       // End test.c


    다음 내용을 담아 $LFS/root/test2.c 파일을 만든다.
     

      // Begin test2.c
       #include <iostream.h>
       int main() {
          cout << “Hello World!” << endl;
          return 0;
       }
       // End test2.c


    컴퓨터를 LFS 시스템으로 다시 부트한다.
    LFS 파티션을 read-write 모드로 다시 마운트한다.
    gcc-2.95.2와 gcc-install 디렉토리를 포함하고 있는 파티션을 마운트한다.
    gcc 소스 파일들을 담고 있는 usr/src/gcc-2.95.2 디렉토리를 /usr/src/gcc-2.95.2라는 이름으로 심볼릭  링크를 만든다.
    gcc-install 디렉토리로 간다.
    make install 명령을 실행해 패키지를 설치한다.
    /root 디렉토리로 간다.
    gcc test.c -o test 명령을 실행해서 test.c를 Compile+link한다.
    g++ test2.c -o test2 명령을 실행해서 test2.c를 Compile+link한다.
    두 프로그램을 실행한다
    두 프로그램 모두 에러없이 동작하거나 멈춰버리면 /usr/src/gcc-2.95.2 심볼릭 링크를 지워도 컴파일러와 링커가 동작할 것이다.

     

    7.2 Installing GCC 2.7.2.3

      gcc-2.7.2.3 패키지의 압축을 푼다.

      configure --prefix=/usr/gcc2723 --enable-shared

    명령을 실행해 패키지 환경을 설정한다.
    환경을 설정하는 스크립트가 시스템 타입을 결정하지 못하겠다고 말하면, configure --host=<cpu>-linux-gnu --prefix=/usr/gcc2723 --enable-shared 명령으로 패키지 환경을 설정한다.

    <cpu> 자리에는 여러분 시스템에 맞는 값을 넣는다.  여러분이 Pentium 시스템을 가지고 있다면 i586을 입력한다. 여러분이 PII 또는 그 이상의 시스템을 가지고 있다면 i686을 넣는다. 만약 여러분이 Intel 기반의 플랫폼을 가지고 있지 않다면, 무엇을 넣어야 할지 스스로 판단해야 한다.
    (내가 인텔 기반의 플랫폼만 사용해 보았으므로 다른 플랫폼에 대한 조언은 할 수 없다.  슬프게도, 나는 알파(alpha)나 스팍(sparc) 또는 그 밖의 시스템을 살만큼 넉넉하지가 못하다.)

     아래 명령들을 순서대로 실행해서 컴파일러를 만든다:
     

     make LANGUAGES=c
     make stage1 (ignore errors about files not found)
     make CC=”stage1/xgcc -Bstage1/” CFLAGS=”-g -O2”
     make stage2
     make CC=”stage2/xgcc -Bstage2/” CFLAGS=”-g -O2”
     make compare


    만약 make compare 명령이 이상한 것들을 보고 하지 않는다면 컴파일러가 성공적으로 만들어진 것이다.

      make install CC=”stage2/xgcc -Bstage2/” CFLAGS=”-g -O2”

    명령을 실행해서 패키지를 인스톨한다.

 

------------------------------------------------------------------------

8. Installing login utilities

     

    8.1 Installing agetty + login

    이 장에서는 텍스트 에디터가 필요하므로 normal Linux 시스템을 사용해서 모든 작업을 한다. 이 장에서 여러분에게는 Util Linux 패키지가 필요하다.  만약 Util Linux 소스 디렉토리를 아직 지우지 않고 있다면, 여러분은 처음 두 단계를 거치지 않아도 좋다.

    Util 리눅스 패키지의 압축을 푼다.(만약 여러분이 지난번에 사용했던 Util 리눅스 패키지를 지웠다면)/configure를 실행해 패키지 환경을 설정한다.
    login-utils 디렉토리로 간다.
    make agetty login 명령으로 agetty와 login을 컴파일한다.
    다음 바이너리를 $LFS/sbin 디렉토리에 카피한다: agetty
    다음 바이너리를 $LFS/bin 디렉토리에 카피한다: login

     

    8.2 Modifying $LFS/etc/inittab

    다음 단계는 우리가 시스템을 켤 때마다 agetty가 가상 콘솔상에서 시작될 수 있도록 $LFS/etc/inittab 파일을 편집하는 것이다.  이렇게 해서 모든 리눅스 시스템은 아니라도 거의 다 작동한다.

    $LFS/etc/inittab 파일을 편집기로 연다.
    다음 줄을 찾아서 지운다:
    1:2345:respawn:/sbin/sulogin
    앞서 지운 줄 에 다음 줄들을 넣는다:
     

    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


     

    8.3 Creating the UTMP record file

    여러분이 리눅스 시스템에 로그온 할 때마다, /var/run/utmp 파일이 고쳐진다. 이 파일이 없을 때에는, agetty와 login을 비롯한 매우 많은 프로그램들이 투덜거리기 시작한다. 그러므로 우리는 비어 있는 $LFS/var/run/utmp 파일을 만들어서 그런 프로그램들이 더 이상 투덜거리지 않게 만들어야 한다.

    $LFS/var/run 디렉토리를 만든다.
    touch $LFS/var/run/utmp 명령을 실행해서 비어있는 utmp 파일을 만든다.

     

    8.4 Testing the system

    여러분이 만약 지금 시스템을 테스트하려 한다면 시스템을 다시 시작해서 LFS 시스템으로 부트한다.  커널과 sysvinit이 로드된 다음, agetty가 시작되고, username과 함께 부트과정이 끝났음을 여러분에게 알린다. 현재 root 사용자 하나만 있으므로 여러분은 root로 로그인한다.

 

------------------------------------------------------------------------

9. Installing Vim

    Vim이 설치된 다음부터는, 우리는 LFS 시스템을 “꾸미는 데(dress up)” 더 이상 normal Linux을 사용할 필요가 없다.  이 것은 여러분이 지금부터 오래지 않아 normal Linux 시스템을 재부트해서 우리의 LFS 시스템으로 돌아가야 한다는 것을 뜻한다.

     

    9.1 Preparing the system for the Vim installation

    Installing Ncurses

    Vim을 설치하기 위해 ncurses 라이브러리를 설치할 차례이다.

    Ncurses 패키지의 압축을 푼다.
    ‘./configure --with-shared 명령을 실행해 패키지환경을 설정한다.

    Ncurses는 최근 버전의 C 표준을 100% 정확하게 따르지 않으므로, gcc2723으로 컴파일할 필요가 있다.

     make CC=/usr/gcc2723/bin/gcc 명령을 실행해서 프로그램들을 컴파일한다.
     make install.data 명령으로 terminfo 파일들을 설치한다.
     test 디렉토리로 가서 라이브러리들이 동작하는지 검사하는 몇 가지 프로그램을 실행한다.
     make install 명령으로 라이브러리들을 설치한다.

     

    9.2 Installing Vim

    Vim은 두 부분으로 되어 있는데 src 패키지와 rt (run-time)패키지이다. 여러분은 vim을 설치하기 위해 두 패키지 모두 가져와야 한다.  여러분이 만약 두 패키지를 모두 한 디렉토리에 넣었다면, 여러분이 처음 압축을 풀 때 생긴 디렉토리에 두 패키지로부터 풀어놓은 파일들이 같이 있을 것이다.(어떤 것을 먼저 풀어놓는가는 문제되지 않는다)

      Vim-src와 Vim-rt 패키지의 압축을 푼다.
      configure를 실행해 패키지 환경을 설정한다.

    Vim도 역시 gcc 2.95.2에서 컴파일되지 않으므로 잘 수행되는 gcc 2.7.2.3에서 컴파일해야 한다.

     make CC=/usr/gcc2723/bin/gcc 명령을 실행해서 프로그램들을 컴파일한다.
     make install 명령을 실행해서 패키지를 설치한다.

 

------------------------------------------------------------------------

10. Creating initial boot scripts

     

    10.1 Preparing the directories and master files

    이 섹션에서 설명하는 프로그램을 설치하려면 Sysvi-nit 패키지가 필요하다.

    다음 명령을 수행해서 필요한 디렉토리들을 만든다:
     

    cd /etc
    mkdir rc0.d rc1.d rc2.d rc3.d rc4.d rc5.d rc6.d init.d rcS.d


    Sysvinit 소스가 설치된 디렉토리로 간다.
    debian/etc/init.d/rc 파일을 다음 파일로 복사한다:    
    /etc/init.d
    /etc/init.d 디렉토리로 간다.
    다음 내용을 담아 새로운 rcS 파일을 만든다:
     

       #!/bin/sh
       # Begin /etc/init.d/rcS

       runlevel=S
       prelevel=N
       umask 022
       export runlevel prevlevel

       trap “:” INT QUIT TSTP

       for i in /etc/rcS.d/S??*
       do
          if [ ! -f  “$i” ] && continue
          $i start
       done

       # End /etc/init.d/rcS 


     

    10.2 Creating the reboot script

    다음 내용을 담아 새로운 reboot 파일을 만든다:
     

       #!/bin/sh
       # Begin /etc/init.d/reboot 

       echo -n “System reboot in progress...”

       /sbin/reboot -d -f -i 

       # End /etc/init.d/reboot


     

    10.3 Creating the halt script

      다음 내용을 담아 새로운 halt 파일을 만든다:
     

       #!/bin/sh
       # Begin /etc/init.d/halt 

       /sbin/halt -d -f -i -p

       # End /etc/init.d/halt


     

    10.4 Creating the mountfs script

    다음 내용을 담아 새로운 mountfs 파일을 만든다:
     

    #!/bin/sh
    # Begin /etc/init.d/mountfs 

    check_status()
    {
      if [ $? = 0 ]
      then
        echo “OK”
      else
        echo “FAILED”
      fi
    }

    echo -n “Remounting root file system in read-write mode...”
    /sbin/mount -n -o remount,rw /
    check_status

    > /etc/mtab
    /sbin/mount -f -o remount,rw /

    echo -n “Mounting proc file system...”
    /sbin/mount proc
    check_status

    # End /etc/init.d/mountfs


       

    10.5 Creating the umountfs script

    다음 내용을 담아 새로운 umountfs 파일을 만든다:
     

     #!/bin/sh
     # Begin /etc/init.d/umountfs

     check_status()
     {
       if [ $? = 0 ]
       then
         echo “OK”
       else
         echo “FAILED”
       fi
     }
     echo -n “Unmounting file systems...”
     /sbin/umount -a -r
     check_status

     echo -n “Remounting root file system in read-only  
     mode...”
     /sbin/mount -o remount,ro /
     check_status

     # End /etc/init.d/umountfs


     

    10.6 Creating the sendsignals script

    다음 내용을 담아 새로운 sendsignals 파일을 만든다:
     

    #!/bin/sh
    # Begin /etc/init.d/sendsignals

    check_status()
    {
      if [ $? = 0 ]
      then
        echo “OK”
      else
        echo “FAILED”
      fi
    }
    echo -n “Sending all processes the TERM signal...”
    /sbin/killall5 -15
    check_status

    echo -n “Sending all processes the KILL signal...”
    /sbin/killall5 -9
    check_status


       

    10.7 Set file permissions and create symlinks

    chmod 755 reboot halt mountfs umountfs sendsignals 명령으로 적당한 파일 퍼미션을 설정한다.
    다음 명령들을 실행해 필요한 심볼릭 링크들을 만든다:
     

    cd ../rc6.d; ln -s ../init.d/umountfs S90umountfs
    ln -s ../init.d/reboot S99reboot
    ln -s ../init.d/sendsignals S80sendsignals

    cd ../rc0.d; ln -s ../init.d/umountfs S90umountfs
    ln -s ../init.d/halt S99halt
    ln -s ../init.d/sendsignals S80sendsignals

    cd ../rcS.d; ln -s ../init.d/mountfs S10mountfs


       

    10.8 Creating the /etc/fstab file

      다음 내용을 담아 /etc/fstab 파일을 만든다:
     

    /dev/<LFS-partition device>   /       ext2   defaults  0 1
    /dev/<swap-partition device> none swap     sw      0 0
    proc                                     /proc proc  defaults  0 0


       

    10.9 Testing the system

    여러분의 컴퓨터를 다시 시작하고 LFS로 부트해서 시스템을 테스트한다. 에러 메시지들이 지나가고 여러분의 루트 파티션이 read-write 모드로 자동으로 마운트 될 것이다.

    이제는 shutdown -r now 등 명령으로 여러분의 컴퓨터를 재시작할 수 있다.

     

    -------------------------------------------------------

    이 글의 남은 부분(11장∼19장)은 다음 달에 다룬다.




▲ top

home으로...