본문 바로가기
리눅스

Build Your Own Linux

by 다움위키 2023. 12. 9.

기존 배포판을 참조해서 새로운 배포판을 만드는 방법은 잘 알려져 있습니다. 이런 방법의 한계점 중 하나는 기존 배포판에서 환경을 참조하기 때문에 결과도 거의 비슷한 환경을 제공하는 것입니다.

하지만, 기존에 참조할 만한 배포판이 없을 경우에는 처음부터 환경을 구축해야 합니다. 이 방법 중 하나가 Linux From Scratch입니다.

여기서는 LFS에 따라 새로운 배포판을 만드는 과정을 기록해 두려고 합니다. 이 과정은 QEMU/KVM에서 진행할 것이기 때문에, 실제와 다를 수 있습니다.

Why?

이 과정은 진행하기에 크게 어렵지는 않습니다. 운영 시스템의 지식이 조금 있는 사람들은 매뉴얼에서 제공하는 순서에 따라 단지 컴파일을 하면 됩니다. 아무런 지식이 없을 경우에 부팅하는데 상당한 시간을 소모할 수 있습니다!!

그러나, 그게 끝입니다!!

다른 목적없이 단지 데스크탑 리눅스를 사용할 목적으로 이런 과정을 진행하는 것은 매우 피곤한 일이고, 이 문서에서 나아가서 더 많은 과정을 거쳐야 다른 보통의 리눅스에서 처럼 데스트탑을 사용할 수 있을 것입니다.

따라서, 학문적으로 또는 사업적으로 등의 목적없이 이 과정을 진행하는 것은 결과적으로 아무런 이득이 없을 수 있기 때문에 바람직해 보이지는 않습니다.

일반 사용자의 입장에서는 단지 시간이 남아서 새로운 재미 거리를 찾을 때 도전해 볼 수는 있습니다.

When working on

아마도 이 모든 작업을 한꺼번에 할 수 없어서, 특정 부분에서 계속할 수도 있습니다. 다음 과정을 확인하십시오.

Mount

  • sudo su
  • export LFS=/mnt/lfs
  • echo $LFS
  • sudo mount -v -t ext4 /dev/vdb2 $LFS
  • ls $LFS
  • sudo swapon -v /dev/vdb3
  • free

Chroot

  • mount -v --bind /dev $LFS/dev
  • mount -v --bind /dev/pts $LFS/dev/pts
  • mount -vt proc proc $LFS/proc
  • mount -vt sysfs sysfs $LFS/sys
  • mount -vt tmpfs tmpfs $LFS/run
  • if [ -h $LFS/dev/shm ]; then
      mkdir -pv $LFS/$(readlink $LFS/dev/shm)
    fi
    
  • chroot "$LFS" /usr/bin/env -i   \
       HOME=/root                  \
       TERM="$TERM"                \
       PS1='(lfs chroot) \u:\w\$ ' \
       PATH=/usr/bin:/usr/sbin     \
       /bin/bash --login
    

Prerequisites: Build System Specifications

이미 QEMU/KVM 아래에 설치된 데비안 11에서 이 과정을 진행할 것입니다. 먼저, 설치할 디스크를 만듭니다.

  • Virtual Machine Manager에서 데비안을 엽니다.
  • View->Details를 누르고,
  • 왼쪽 맨 아래의 Add Hardware를 누릅니다.
  • Storage에서 기본값으로 Finish를 누릅니다.

왼쪽에 VirtIO Disk 2가 만들어졌으면, 정상적으로 수행된 것입니다.

이제 데비안으로 부팅합니다.

빌드에 필요한 패키지를 설치합니다:

  • sudo apt install build-essential
  • sudo apt install texinfo

다음 패키지와 그것을 최소 버전이 설치되어 있고 맞는지 확인하십시오:

  • bash-3.2, binutils-2.13.1, bison-2.7, coreutils-6.9, diffutils-2.8.1, findutils-4.2.31, gawk-4.0.1, gcc-4.8, grep-2.5.1a, gzip-1.3.12, Linux kernel-3.2, m4-1.4.10, make-4.0, patch-2.5.4, perl-5.8.8, python-3.4, sed-4.1.5, tar-1.22, texinfo-4.7, xz-5.0.0

Destination disk

새로 만들어진 vdb 디스크를 다음과 같이 파티션하고 파일시스템을 만듭니다.

  • sudo parted --script /dev/vdb mklabel gpt mkpart primary 1MiB 100MiB mkpart primary 100MiB 19.3GB mkpart primary 19.3GB 100%
  • sudo parted --script /dev/vdb set 1 bios_grub on
  • sudo mkfs.vfat /dev/vdb1
  • sudo mkfs.ext4 /dev/vdb2
  • sudo mkswap /dev/vdb3

Mount Point

  • export LFS=/mnt/lfs
  • echo $LFS
  • sudo mkdir -v $LFS
  • sudo mount -v -t ext4 /dev/vdb2 $LFS
  • sudo swapon -v /dev/vdb3

Packages and Patches

이때, 다운로드가 되지 않은 파일이 표시될 수 있습니다. 수동으로 해당 파일을 받아서 이 디렉토리로 옮겨야 합니다.

Final Preparations

  • sudo mkdir -pv $LFS/{etc,var} $LFS/usr/{bin,lib,sbin}

명령어에 권한을 주는 것이 귀찮아서

  • sudo su
  • export LFS=/mnt/lfs
  • for i in bin lib sbin; do
    ln -sv usr/$i $LFS/$i
    done
    
  • case $(uname -m) in
    x86_64) mkdir -pv $LFS/lib64 ;;
    esac
    
  • mkdir -pv $LFS/tools

Adding the LFS User

  • groupadd lfs
  • useradd -s /bin/bash -g lfs -m -k /dev/null lfs
  • passwd lfs
  • chown -v lfs $LFS/{usr{,/*},lib,var,etc,bin,sbin,tools}
  • case $(uname -m) in
      x86_64) chown -v lfs $LFS/lib64 ;;
    esac
    
  • chown -v lfs $LFS/sources
  • su - lfs

Setting Up the Environment

  • cat > ~/.bash_profile << "EOF"
    exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash
    EOF
    
  • cat > ~/.bashrc << "EOF"
    set +h
    umask 022
    LFS=/mnt/lfs
    LC_ALL=POSIX
    LFS_TGT=$(uname -m)-lfs-linux-gnu
    PATH=/usr/bin
    if [ ! -L /bin ]; then PATH=/bin:$PATH; fi
    PATH=$LFS/tools/bin:$PATH
    CONFIG_SITE=$LFS/usr/share/config.site
    export LFS LC_ALL LFS_TGT PATH CONFIG_SITE
    EOF
    

다른 터미널을 열어서

  • sudo su
  • [ ! -e /etc/bash.bashrc ] || mv -v /etc/bash.bashrc /etc/bash.bashrc.NOUSE

작업 터미널로 돌아옵니다.

  • source ~/.bash_profile

About SBUs

  • export MAKEFLAGS='-j4'

숫자 4는 스레드의 개수를 적어줍니다.

Compiling a Cross-Toolchain

General Compilation Instructions

  • echo $LFS

/mnt/lfs

다음을 참고해야 하지만, 현대 리눅스 배포판은 문제되는 것이 없을 것입니다.
  • bash is the shell in use.
  • sh is a symbolic link to bash.
  • /usr/bin/awk is a symbolic link to gawk.
  • /usr/bin/yacc is a symbolic link to bison or a small script that executes bison.
  컴파일에서 다음 사항을 유의해야 합니다:
  • 소스 디렉토리 /mnt/lft/sources/로 이동합니다.
  • 각 패키지를 tar로 푸는데, 이 후에 따르는 과정을 위해 사용자가 ufs여야 합니다.
  • 해당 디렉토리로 이동해서 각 프로그램에서 지시한 데로 컴파일을 진행하십시오.
  • 소스 디렉토리로 다시 이동합니다.
  • 풀었던 각 패키지 디렉토리를, 달리 지침에서 언급하지 않는 한, 제거합니다.

Binutils-2.38 - Pass 1

  • cd /mnt/lfs/sources/
  • tar xvf binutils-2.38.tar.gz
  • cd binutils-2.38
  • patch -p1 < ../binutils-2.38-lto_fix-1.patch
  • mkdir -p build
  • cd build
  • ../configure --prefix=$LFS/tools --with-sysroot=$LFS --target=$LFS_TGT --disable-nls --disable-werro
  • make
  • make install
  • cd ../..
  • rm -rf binutils-2.38

GCC-11.2.0 - Pass 1

  • tar xvf gcc-11.2.0.tar.gz
  • cd gcc-11.2.0
  • tar -xf ../mpfr-4.1.0.tar.xz
  • mv -v mpfr-4.1.0 mpfr
  • tar -xf ../gmp-6.2.1.tar.xz
  • mv -v gmp-6.2.1 gmp
  • tar -xf ../mpc-1.2.1.tar.gz
  • mv -v mpc-1.2.1 mpc
  • case $(uname -m) in
    x86_64)
       sed -e '/m64=/s/lib64/lib/' \
           -i.orig gcc/config/i386/t-linux64
    ;;
    esac
    
  • mkdir -v build
  • cd build
  • ../configure                \
      --target=$LFS_TGT         \
      --prefix=$LFS/tools       \
      --with-glibc-version=2.35 \
      --with-sysroot=$LFS       \
      --with-newlib             \
      --without-headers         \
      --enable-initfini-array   \
      --disable-nls             \
      --disable-shared          \
      --disable-multilib        \
      --disable-decimal-float   \
      --disable-threads         \
      --disable-libatomic       \
      --disable-libgomp         \
      --disable-libquadmath     \
      --disable-libssp          \
      --disable-libvtv          \
      --disable-libstdcxx       \
      --enable-languages=c,c++
    
  • make
  • make install
  • cd ..
  • cat gcc/limitx.h gcc/glimits.h gcc/limity.h > \
     `dirname $($LFS_TGT-gcc -print-libgcc-file-name)`/install-tools/include/limits.h
    
  • rm -rf build
  • cd ..

gcc는 아래의 libstdc++ 컴파일에 사용되기 때문에 지우지 않습니다.

Linux-5.16.9 API Headers

  • tar xvf linux-5.16.9.tar.gz
  • cd linux-5.16.9
  • make mrproper
  • make headers
  • find usr/include -name '.*' -delete
  • rm usr/include/Makefile
  • cp -rv usr/include $LFS/usr
  • cd ..
  • rm -rf linux-5.16.9

Glibc-2.35

  • case $(uname -m) in
       i?86)   ln -sfv ld-linux.so.2 $LFS/lib/ld-lsb.so.3
       ;;
       x86_64) ln -sfv ../lib/ld-linux-x86-64.so.2 $LFS/lib64
               ln -sfv ../lib/ld-linux-x86-64.so.2 $LFS/lib64/ld-lsb-x86-64.so.3
       ;;
    esac
    
  • tar xvf glibc-2.35.tar.gz
  • cd glibc-2.35
  • patch -Np1 -i ../glibc-2.35-fhs-1.patch
  • mkdir -p build
  • cd build
  • echo "rootsbindir=/usr/sbin" > configparms
  • ../configure                           \
         --prefix=/usr                      \
         --host=$LFS_TGT                    \
         --build=$(../scripts/config.guess) \
         --enable-kernel=3.2                \
         --with-headers=$LFS/usr/include    \
         libc_cv_slibdir=/usr/lib
    
  • make
  • make DESTDIR=$LFS install
  • sed '/RTLDLIST=/s@/usr@@g' -i $LFS/usr/bin/ldd
  • cd ../..
  • rm -rf glibc-2.35
  이제, 지금까지 작업이 잘 되었는지 확인할 필요가 있습니다.
  • echo 'int main(){}' > dummy.c
  • $LFS_TGT-gcc dummy.c
  • readelf -l a.out | grep '/ld-linux'
[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]어떤 오류가 발생하지 않아야 하고, 마지막에 위와 같이 출력이 나오면 잘 컴파일된 것입니다.
  • rm -v dummy.c a.out
  • $LFS/tools/libexec/gcc/$LFS_TGT/11.2.0/install-tools/mkheaders

Libstdc++ from GCC-11.2.0, Pass 1

  • cd gcc-11.2.0
  • mkdir -v build
  • cd build
  • ../libstdc++-v3/configure         \
       --host=$LFS_TGT                 \
       --build=$(../config.guess)      \
       --prefix=/usr                   \
       --disable-multilib              \
       --disable-nls                   \
       --disable-libstdcxx-pch         \
       --with-gxx-include-dir=/tools/$LFS_TGT/include/c++/11.2.0
    
  • make
  • make DESTDIR=$LFS install
  • cd ../..
  • rm -rf gcc-11.2.0

Cross Compiling Temporary Tools

M4-1.4.19

  • tar xvf m4-1.4.19.tar.gz
  • cd m4-1.4.19
  • ./configure --prefix=/usr   \
                 --host=$LFS_TGT \
                 --build=$(build-aux/config.guess)
    
  • make
  • make DESTDIR=$LFS install
  • cd ..
  • rm -rf m4-1.4.19

Ncurses-6.3

  • tar xvf ncurses-6.3.tar.gz
  • cd ncurses-6.3
  • sed -i s/mawk// configure
  • mkdir build
  • pushd build
     ../configure
     make -C include
     make -C progs tic
    popd
    
  • ./configure --prefix=/usr              \
               --host=$LFS_TGT              \
               --build=$(./config.guess)    \
               --mandir=/usr/share/man      \
               --with-manpage-format=normal \
               --with-shared                \
               --without-debug              \
               --without-ada                \
               --without-normal             \
               --disable-stripping          \
               --enable-widec
    
  • make
  • make DESTDIR=$LFS TIC_PATH=$(pwd)/build/progs/tic install
  • echo "INPUT(-lncursesw)" > $LFS/usr/lib/libncurses.so
  • cd ..
  • rm -rf ncurses-6.3

Bash-5.1.16

  • tar xvf bash-5.1.16.tar.gz
  • cd bash-5.1.16
  • ./configure --prefix=/usr                 \
               --build=$(support/config.guess) \
               --host=$LFS_TGT                 \
               --without-bash-malloc
    
  • make
  • make DESTDIR=$LFS install
  • ln -sv bash $LFS/bin/sh
  • cd ..
  • rm -rf bash-5.1.16

Coreutils-9.0

  • tar xvf coreutils-9.0.tar.gz
  • cd coreutils-9.0
  • patch -p1 -i ../coreutils-9.0-chmod_fix-1.patch
  • patch -p1 -i ../coreutils-9.0-i18n-1.patch
  • ./configure --prefix=/usr                   \
               --host=$LFS_TGT                   \
               --build=$(build-aux/config.guess) \
               --enable-install-program=hostname \
               --enable-no-install-program=kill,uptime
    
  • make
  • make DESTDIR=$LFS install
  • mv -v $LFS/usr/bin/chroot $LFS/usr/sbin
  • mkdir -pv $LFS/usr/share/man/man8
  • mv -v $LFS/usr/share/man/man1/chroot.1 $LFS/usr/share/man/man8/chroot.8
  • sed -i 's/"1"/"8"/' $LFS/usr/share/man/man8/chroot.8
  • cd ..
  • rm -rf coreutils-9.0

Diffutils-3.8

  • tar xvf diffutils-3.8.tar.gz
  • cd diffutils-3.8
  • ./configure --prefix=/usr --host=$LFS_TGT
  • make
  • make DESTDIR=$LFS install
  • cd ..
  • rm -rf diffutils-3.8

File-5.41

  • tar xvf file-5.41.tar.gz
  • cd file-5.41
  • mkdir build
  • pushd build
     ../configure --disable-bzlib      \
                 --disable-libseccomp \
                 --disable-xzlib      \
                 --disable-zlib
     make
    popd
    
  • ./configure --prefix=/usr --host=$LFS_TGT --build=$(./config.guess)
  • make FILE_COMPILE=$(pwd)/build/src/file
  • make DESTDIR=$LFS install
  • cd ..
  • rm -rf file-5.41

Findutils-4.9.0

  • tar xvf findutils-4.9.0.tar.gz
  • cd findutils-4.9.0
  • ./configure --prefix=/usr                   \
               --localstatedir=/var/lib/locate \
               --host=$LFS_TGT                 \
               --build=$(build-aux/config.guess)
    
  • make
  • make DESTDIR=$LFS install
  • cd ..
  • rm -rf findutils-4.9.0

Gawk-5.1.1

  • tar xvf gawk-5.1.1.tar.gz
  • cd gawk-5.1.1
  • sed -i 's/extras//' Makefile.in
  • ./configure --prefix=/usr   \
               --host=$LFS_TGT \
               --build=$(build-aux/config.guess)
    
  • make
  • make DESTDIR=$LFS install
  • cd ..
  • rm -rf gawk-5.1.1

Grep-3.7

  • tar xvf grep-3.7.tar.gz
  • cd grep-3.7
  • ./configure --prefix=/usr --host=$LFS_TGT
  • make
  • make DESTDIR=$LFS install
  • cd ..
  • rm -rf grep-3.7

Gzip-1.11

  • tar xvf gzip-1.11.tar.gz
  • cd gzip-1.11
  • ./configure --prefix=/usr --host=$LFS_TGT
  • make
  • make DESTDIR=$LFS install
  • cd ..
  • rm -rf gzip-1.11

Make-4.3

  • tar xvf make-4.3.tar.gz
  • cd make-4.3
  • ./configure --prefix=/usr   \
               --without-guile \
               --host=$LFS_TGT \
               --build=$(build-aux/config.guess)
    
  • make
  • make DESTDIR=$LFS install
  • cd ..
  • rm -rf make-4.3

Patch-2.7.6

  • tar xvf patch-2.7.6.tar.gz
  • cd patch-2.7.6
  • ./configure --prefix=/usr   \
               --host=$LFS_TGT \
               --build=$(build-aux/config.guess)
    
  • make
  • make DESTDIR=$LFS install
  • cd ..
  • rm -rf patch-2.7.6

Sed-4.8

  • tar xvf sed-4.8.tar.gz
  • cd sed-4.8
  • ./configure --prefix=/usr --host=$LFS_TGT
  • make
  • make DESTDIR=$LFS install
  • cd ..
  • rm -rf sed-4.8

Tar-1.34

  • tar xvf tar-1.34.tar.gz
  • cd tar-1.34
  • ./configure --prefix=/usr                     \
               --host=$LFS_TGT                   \
               --build=$(build-aux/config.guess)
    
  • make
  • make DESTDIR=$LFS install
  • cd ..
  • rm -rf tar-1.34

Xz-5.2.5

  • tar xvf xz-5.2.5.tar.gz
  • cd xz-5.2.5
  • ./configure --prefix=/usr                     \
               --host=$LFS_TGT                   \
               --build=$(build-aux/config.guess) \
               --disable-static                  \
               --docdir=/usr/share/doc/xz-5.2.5
    
  • make
  • make DESTDIR=$LFS install
  • cd ..
  • rm -rf xz-5.2.5

Binutils-2.38 - Pass 2

  • tar xvf binutils-2.38.tar.gz
  • cd binutils-2.38
  • patch -p1 -i ../binutils-2.38-lto_fix-1.patch
  • sed '6009s/$add_dir//' -i ltmain.sh
  • mkdir -v build
  • cd build
  • ../configure                   \
       --prefix=/usr              \
       --build=$(../config.guess) \
       --host=$LFS_TGT            \
       --disable-nls              \
       --enable-shared            \
       --disable-werror           \
       --enable-64-bit-bfd
    
  • make
  • make DESTDIR=$LFS install
  • cd ../..
  • rm -rf binutils-2.38

GCC-11.2.0 - Pass 2

  • tar xvf gcc-11.2.0.tar.gz
  • cd gcc-11.2.0
  • tar -xf ../mpfr-4.1.0.tar.xz
  • mv -v mpfr-4.1.0 mpfr
  • tar -xf ../gmp-6.2.1.tar.xz
  • mv -v gmp-6.2.1 gmp
  • tar -xf ../mpc-1.2.1.tar.gz
  • mv -v mpc-1.2.1 mpc
  • case $(uname -m) in
      x86_64)
        sed -e '/m64=/s/lib64/lib/' -i.orig gcc/config/i386/t-linux64
      ;;
    esac
    
  • mkdir -v build
  • cd build
  • mkdir -pv $LFS_TGT/libgcc
  • ln -s ../../../libgcc/gthr-posix.h $LFS_TGT/libgcc/gthr-default.h
  • ../configure                                       \
       --build=$(../config.guess)                     \
       --host=$LFS_TGT                                \
       --prefix=/usr                                  \
       CC_FOR_TARGET=$LFS_TGT-gcc                     \
       --with-build-sysroot=$LFS                      \
       --enable-initfini-array                        \
       --disable-nls                                  \
       --disable-multilib                             \
       --disable-decimal-float                        \
       --disable-libatomic                            \
       --disable-libgomp                              \
       --disable-libquadmath                          \
       --disable-libssp                               \
       --disable-libvtv                               \
       --disable-libstdcxx                            \
       --enable-languages=c,c++
    
  • make
  • make DESTDIR=$LFS install
  • ln -sv gcc $LFS/usr/bin/cc
  • cd ../..
  • rm -rf gcc-11.2.0

Entering Chroot and Building Additional Temporary Tools

Changing Ownership

  • exit

아마도 이전의 sudo su로 root 권한을 갖고 있을 것입니다:

  • chown -R root:root $LFS/{usr,lib,var,etc,bin,sbin,tools}
  • case $(uname -m) in
     x86_64) chown -R root:root $LFS/lib64 ;;
    esac
    

Preparing Virtual Kernel File Systems

  • mkdir -pv $LFS/{dev,proc,sys,run}
  • mknod -m 600 $LFS/dev/console c 5 1
  • mknod -m 666 $LFS/dev/null c 1 3
  • mount -v --bind /dev $LFS/dev
  • mount -v --bind /dev/pts $LFS/dev/pts
  • mount -vt proc proc $LFS/proc
  • mount -vt sysfs sysfs $LFS/sys
  • mount -vt tmpfs tmpfs $LFS/run
  • if [ -h $LFS/dev/shm ]; then
      mkdir -pv $LFS/$(readlink $LFS/dev/shm)
    fi
    

Entering the Chroot Environment

  • chroot "$LFS" /usr/bin/env -i   \
       HOME=/root                  \
       TERM="$TERM"                \
       PS1='(lfs chroot) \u:\w\$ ' \
       PATH=/usr/bin:/usr/sbin     \
       /bin/bash --login
    

Creating Directories

  • mkdir -pv /{boot,home,mnt,opt,srv}
  • mkdir -pv /etc/{opt,sysconfig}
  • mkdir -pv /lib/firmware
  • mkdir -pv /media/{floppy,cdrom}
  • mkdir -pv /usr/{,local/}{include,src}
  • mkdir -pv /usr/local/{bin,lib,sbin}
  • mkdir -pv /usr/{,local/}share/{color,dict,doc,info,locale,man}
  • mkdir -pv /usr/{,local/}share/{misc,terminfo,zoneinfo}
  • mkdir -pv /usr/{,local/}share/man/man{1..8}
  • mkdir -pv /var/{cache,local,log,mail,opt,spool}
  • mkdir -pv /var/lib/{color,misc,locate}
  • ln -sfv /run /var/run
  • ln -sfv /run/lock /var/lock
  • install -dv -m 0750 /root
  • install -dv -m 1777 /tmp /var/tmp

Creating Essential Files and Symlinks

  • ln -sv /proc/self/mounts /etc/mtab
  • cat > /etc/hosts << EOF
    127.0.0.1  localhost $(hostname)
    ::1        localhost
    EOF
    
  • cat > /etc/passwd << "EOF"
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/dev/null:/usr/bin/false
    daemon:x:6:6:Daemon User:/dev/null:/usr/bin/false
    messagebus:x:18:18:D-Bus Message Daemon User:/run/dbus:/usr/bin/false
    systemd-journal-gateway:x:73:73:systemd Journal Gateway:/:/usr/bin/false
    systemd-journal-remote:x:74:74:systemd Journal Remote:/:/usr/bin/false
    systemd-journal-upload:x:75:75:systemd Journal Upload:/:/usr/bin/false
    systemd-network:x:76:76:systemd Network Management:/:/usr/bin/false
    systemd-resolve:x:77:77:systemd Resolver:/:/usr/bin/false
    systemd-timesync:x:78:78:systemd Time Synchronization:/:/usr/bin/false
    systemd-coredump:x:79:79:systemd Core Dumper:/:/usr/bin/false
    uuidd:x:80:80:UUID Generation Daemon User:/dev/null:/usr/bin/false
    systemd-oom:x:81:81:systemd Out Of Memory Daemon:/:/usr/bin/false
    nobody:x:99:99:Unprivileged User:/dev/null:/usr/bin/false
    EOF
    
  • cat > /etc/group << "EOF"
    root:x:0:
    bin:x:1:daemon
    sys:x:2:
    kmem:x:3:
    tape:x:4:
    tty:x:5:
    daemon:x:6:
    floppy:x:7:
    disk:x:8:
    lp:x:9:
    dialout:x:10:
    audio:x:11:
    video:x:12:
    utmp:x:13:
    usb:x:14:
    cdrom:x:15:
    adm:x:16:
    messagebus:x:18:
    systemd-journal:x:23:
    input:x:24:
    mail:x:34:
    kvm:x:61:
    systemd-journal-gateway:x:73:
    systemd-journal-remote:x:74:
    systemd-journal-upload:x:75:
    systemd-network:x:76:
    systemd-resolve:x:77:
    systemd-timesync:x:78:
    systemd-coredump:x:79:
    uuidd:x:80:
    systemd-oom:x:81:
    wheel:x:97:
    nogroup:x:99:
    users:x:999:
    EOF
    
  • echo "tester:x:101:101::/home/tester:/bin/bash" >> /etc/passwd
  • echo "tester:x:101:" >> /etc/group
  • install -o tester -d /home/tester
  • exec /usr/bin/bash --login
  • touch /var/log/{btmp,lastlog,faillog,wtmp}
  • chgrp -v utmp /var/log/lastlog
  • chmod -v 664 /var/log/lastlog
  • chmod -v 600 /var/log/btmp

Libstdc++ from GCC-11.2.0, Pass 2

  • cd sources
  • tar xvf gcc-11.2.0.tar.gz
  • cd gcc-11.2.0
  • ln -s gthr-posix.h libgcc/gthr-default.h
  • mkdir -v build
  • cd build
  • ../libstdc++-v3/configure            \
        CXXFLAGS="-g -O2 -D_GNU_SOURCE"  \
        --prefix=/usr                    \
        --disable-multilib               \
        --disable-nls                    \
        --host=$(uname -m)-lfs-linux-gnu \
        --disable-libstdcxx-pch
    
  • make
  • make install
  • cd ../..
  • rm -rf gcc-11.2.0

Gettext-0.21

  • tar xvf gettext-0.21.tar.gz
  • cd gettext-0.21
  • ./configure --disable-shared
  • make
  • cp -v gettext-tools/src/{msgfmt,msgmerge,xgettext} /usr/bin
  • cd ..
  • rm -rf gettext-0.21

Bison-3.8.2

  • tar xvf bison-3.8.2.tar.gz
  • cd bison-3.8.2
  • ./configure --prefix=/usr --docdir=/usr/share/doc/bison-3.8.2
  • make
  • make install
  • cd ..
  • rm -rf bison-3.8.2

Perl-5.34.0

  • tar xvf perl-5.34.0.tar.gz
  • cd perl-5.34.0
  • patch -p1 -i ../perl-5.34.0-upstream_fixes-1.patch
  • sh Configure -des                                        \
                 -Dprefix=/usr                               \
                 -Dvendorprefix=/usr                         \
                 -Dprivlib=/usr/lib/perl5/5.34/core_perl     \
                 -Darchlib=/usr/lib/perl5/5.34/core_perl     \
                 -Dsitelib=/usr/lib/perl5/5.34/site_perl     \
                 -Dsitearch=/usr/lib/perl5/5.34/site_perl    \
                 -Dvendorlib=/usr/lib/perl5/5.34/vendor_perl \
                 -Dvendorarch=/usr/lib/perl5/5.34/vendor_perl
    
  • make
  • make install
  • cd ..
  • rm -rfv perl-5.34.0

Python-3.10.2

  • tar xvf Python-3.10.2.tar.gz
  • cd Python-3.10.2
  • ./configure --prefix=/usr --enable-shared --without-ensurepip
  • make
  • make install
  • cd ..
  • rm -rfv Python-3.10.2

Texinfo-6.8

  • tar xvf texinfo-6.8.tar.gz
  • cd texinfo-6.8
  • sed -e 's/__attribute_nonnull__/__nonnull/' \
        -i gnulib/lib/malloc/dynarray-skeleton.c
    
  • ./configure --prefix=/usr
  • make
  • make install
  • cd ..
  • rm -rfv texinfo-6.8

Util-linux-2.37.4

  • tar xvf util-linux-2.37.4.tar.gz
  • cd util-linu-2.37.4
  • mkdir -pv /var/lib/hwclock
  • ./configure ADJTIME_PATH=/var/lib/hwclock/adjtime    \
                --libdir=/usr/lib    \
                --docdir=/usr/share/doc/util-linux-2.37.4 \
                --disable-chfn-chsh  \
                --disable-login      \
                --disable-nologin    \
                --disable-su         \
                --disable-setpriv    \
                --disable-runuser    \
                --disable-pylibmount \
                --disable-static     \
                --without-python     \
                runstatedir=/run
    
  • make
  • make install
  • cd ..
  • rm -rfv util-linu-2.37.4

Cleaning up and Saving the Temporary System

  • rm -rf /usr/share/{info,man,doc}/*
  • find /usr/{lib,libexec} -name \*.la -delete
  • rm -rf /tools
  • exit

BACKUP 아래 명령은 root 권한으로 이루어지기 때문에 주의가 필요합니다. 환경 변수를 반드시 확인하고, 설정되어 있지 않으면, export로 환경 변수를 설정하십시오:

  • echo $LFS
  • umount $LFS/dev/pts
  • umount $LFS/{sys,proc,run,dev}
  • echo $HOME

/root

  • cd $LFS
  • tar -cJpf $HOME/lfs-temp-tools-11.1-systemd.tar.xz .

Restore 필요에 의해, 이후 과정에서 문제가 발생하면, 이 지점으로 돌아와서 복원할 필요가 있습니다. 그럴 때에는 sudo su로 root 권한하고, export로 환경 변수를 설정하고, 모든 환경 변수를 확인한 후에 진행하십시오:

  • cd $LFS
  • rm -rf ./*
  • tar -xpf $HOME/lfs-temp-tools-11.1.tar.xz
  백업을 생성하기 위해 또는 복원을 사용하여 빌드를 다시 하기 위해 chroot 환경를 벗어났으면, 가상 환경이 여전히 마운트되어 있는지 반드시 확인하십시오.
  • findmnt| grep $LFS
만약 마운트되어 있지 않으면, 위의 과정에서 다시 마운트를 하고, 다른 작업을 하기 전에 chroot 환경으로 들어가십시오.

압축하는데 상당한 시간이 걸리며, 840M 정도의 파일이 만들어지지만, sources 디렉토리가 471M 정도가 됩니다.

Installing Basic System Software

  • mount -v --bind /dev $LFS/dev
  • mount -v --bind /dev/pts $LFS/dev/pts
  • mount -vt proc proc $LFS/proc
  • mount -vt sysfs sysfs $LFS/sys
  • mount -vt tmpfs tmpfs $LFS/run
  • if [ -h $LFS/dev/shm ]; then
      mkdir -pv $LFS/$(readlink $LFS/dev/shm)
    fi
    
  • chroot "$LFS" /usr/bin/env -i   \
       HOME=/root                  \
       TERM="$TERM"                \
       PS1='(lfs chroot) \u:\w\$ ' \
       PATH=/usr/bin:/usr/sbin     \
       /bin/bash --login
    

Man-pages-5.13

  • cd sources
  • tar xvf man-pages-5.13.tar.gz
  • cd man-pages-5.13
  • make prefix=/usr install
  • cd ..
  • rm -rfv man-pages-5.13

Iana-Etc-20220207

  • tar xvf iana-etc-20220207.tar.gz
  • cd iana-etc-20220207
  • cp services protocols /etc
  • cd ..
  • rm -rfv iana-etc-20220207

Glibc-2.35

  • tar xvf glibc-2.35.tar.gz
  • cd glibc-2.35
  • patch -Np1 -i ../glibc-2.35-fhs-1.patch
  • mkdir -v build
  • cd build
  • echo "rootsbindir=/usr/sbin" > configparms
  • ../configure --prefix=/usr                            \
                 --disable-werror                         \
                 --enable-kernel=3.2                      \
                 --enable-stack-protector=strong          \
                 --with-headers=/usr/include              \
                 libc_cv_slibdir=/usr/lib
    
  • make
  • make check

여기서 일부 false가 발생할 수 있으며, 무시할 수 있는 사항은 원본 문서를 확인하십시오.

  • Summary of test results:
          2 FAIL
       4994 PASS
        117 UNSUPPORTED
         16 XFAIL
          6 XPASS
    make[1]: *** [Makefile:646: tests] Error 1
    make[1]: Leaving directory '/sources/glibc-2.35'
    make: *** [Makefile:9: check] Error 2
    
  • touch /etc/ld.so.conf
  • sed '/test-installation/s@$(PERL)@echo not running@' -i ../Makefile
  • make install
  • sed '/RTLDLIST=/s@/usr@@g' -i /usr/bin/ldd
  • cp -v ../nscd/nscd.conf /etc/nscd.conf
  • mkdir -pv /var/cache/nscd
  • install -v -Dm644 ../nscd/nscd.tmpfiles /usr/lib/tmpfiles.d/nscd.conf
  • install -v -Dm644 ../nscd/nscd.service /usr/lib/systemd/system/nscd.service
  • mkdir -pv /usr/lib/locale
  • localedef -i POSIX -f UTF-8 C.UTF-8 2> /dev/null || true
  • localedef -i en_US -f ISO-8859-1 en_US
  • localedef -i en_US -f UTF-8 en_US.UTF-8
  • localedef -i ko_KR -f EUC-KR ko_KR
  • localedef -i ko_KR -f UTF-8 ko_KR.UTF-8

Adding nsswitch.conf

  • cat > /etc/nsswitch.conf << "EOF"
    # Begin /etc/nsswitch.conf
    
    passwd: files
    group: files
    shadow: files
    
    hosts: files dns
    networks: files
    
    protocols: files
    services: files
    ethers: files
    rpc: files
    
    # End /etc/nsswitch.conf
    EOF
    

Adding time zone data

  • tar -xf ../../tzdata2021e.tar.gz
  • ZONEINFO=/usr/share/zoneinfo
  • mkdir -pv $ZONEINFO/{posix,right}
  • for tz in etcetera southamerica northamerica europe africa antarctica  \
              asia australasia backward; do
        zic -L /dev/null   -d $ZONEINFO       ${tz}
        zic -L /dev/null   -d $ZONEINFO/posix ${tz}
        zic -L leapseconds -d $ZONEINFO/right ${tz}
    done
    
  • cp -v zone.tab zone1970.tab iso3166.tab $ZONEINFO
  • zic -d $ZONEINFO -p Asia/Seoul
  • unset ZONEINFO
  • tzselect
  • ln -sfv /usr/share/zoneinfo/Asia/Seoul /etc/localtime

Configuring the Dynamic Loader

  • cat > /etc/ld.so.conf << "EOF"
    # Begin /etc/ld.so.conf
    /usr/local/lib
    /opt/lib
    
    EOF
    
  • cat >> /etc/ld.so.conf << "EOF"
    # Add an include directory
    include /etc/ld.so.conf.d/*.conf
    
    EOF
    
  • mkdir -pv /etc/ld.so.conf.d
  • cd ../..
  • rm -rfv glibc-2.35

Zlib-1.2.11

  • tar xvf zlib-1.2.11.tar.gz
  • cd zlib-1.2.11
  • ./configure --prefix=/usr
  • make
  • make check
  • make install
  • rm -fv /usr/lib/libz.a
  • cd ..
  • rm -rfv zlib-1.2.11

Bzip2-1.0.8

  • tar xvf bzip2-1.0.8.tar.gz
  • cd bzip2-1.0.8
  • patch -p1 -i ../bzip2-1.0.8-install_docs-1.patch
  • sed -i 's@\(ln -s -f \)$(PREFIX)/bin/@\1@' Makefile
  • sed -i "s@(PREFIX)/man@(PREFIX)/share/man@g" Makefile
  • make -f Makefile-libbz2_so
  • make clean
  • make
  • make PREFIX=/usr install
  • cp -av libbz2.so.* /usr/lib
  • ln -sv libbz2.so.1.0.8 /usr/lib/libbz2.so
  • cp -v bzip2-shared /usr/bin/bzip2
  • for i in /usr/bin/{bzcat,bunzip2}; do
      ln -sfv bzip2 $i
    done
    
  • rm -fv /usr/lib/libbz2.a
  • cd ..
  • rm -rfv bzip2-1.0.8

Xz-5.2.5

  • tar xvf xz-5.2.5.tar.gz
  • cd xz-5.2.5
  • ./configure --prefix=/usr --disable-static --docdir=/usr/share/doc/xz-5.2.5
  • make
  • make check
  • make install
  • cd ..
  • rm -rfv xz-5.2.5

Zstd-1.5.2

  • tar xvf zstd-1.5.2.tar.gz
  • cd zstd-1.5.2
  • make
  • make check
  • make prefix=/usr install
  • rm -v /usr/lib/libzstd.a
  • cd ..
  • rm -rf zstd-1.5.2

File-5.41

  • tar xvf file-5.41.tar.gz
  • cd file-5.41
  • ./configure --prefix=/usr
  • make
  • make check
  • make install
  • cd ..
  • rm -rfv file-5.41

Readline-8.1.2

  • tar xvf readline-8.1.2.tar.gz
  • cd readline-8.1.2
  • sed -i '/MV.*old/d' Makefile.in
  • sed -i '/{OLDSUFF}/c:' support/shlib-install
  • ./configure --prefix=/usr    \
                --disable-static \
                --with-curses    \
                --docdir=/usr/share/doc/readline-8.1.2
    
  • make SHLIB_LIBS="-lncursesw"
  • make SHLIB_LIBS="-lncursesw" install
  • install -v -m644 doc/*.{ps,pdf,html,dvi} /usr/share/doc/readline-8.1.2
  • cd ..
  • rm -rfv readline-8.1.2

M4-1.4.19

  • tar xvf m4-1.4.19.tar.gz
  • cd m4-1.4.19
  • ./configure --prefix=/usr
  • make
  • make check
  • make install
  • cd ..
  • rm -rfv m4-1.4.19

Bc-5.2.2

  • tar xvf bc-5.2.2.tar.gz
  • cd bc-5.2.2
  • CC=gcc ./configure --prefix=/usr -G -O3
  • make
  • make test
  • make install
  • cd ..
  • rm -rfv bc-5.2.2

Flex-2.6.4

  • tar xvf flex-2.6.4.tar.gz
  • cd flex-2.6.4
  • ./configure --prefix=/usr --docdir=/usr/share/doc/flex-2.6.4 --disable-static
  • make
  • make check
  • make install
  • ln -sv flex /usr/bin/lex
  • cd ..
  • rm -rfv flex-2.6.4

Tcl-8.6.12

  • tar xvf tcl8.6.12-src.tar.gz
  • cd tcl8.6.12
  • tar -xf ../tcl8.6.12-html.tar.gz --strip-components=1
  • SRCDIR=$(pwd)
  • cd unix
  • ./configure --prefix=/usr           \
                --mandir=/usr/share/man \
                $([ "$(uname -m)" = x86_64 ] && echo --enable-64bit)
    
  • make
  • sed -e "s|$SRCDIR/unix|/usr/lib|" \
        -e "s|$SRCDIR|/usr/include|"  \
        -i tclConfig.sh
    
  • sed -e "s|$SRCDIR/unix/pkgs/tdbc1.1.3|/usr/lib/tdbc1.1.3|" \
        -e "s|$SRCDIR/pkgs/tdbc1.1.3/generic|/usr/include|"    \
        -e "s|$SRCDIR/pkgs/tdbc1.1.3/library|/usr/lib/tcl8.6|" \
        -e "s|$SRCDIR/pkgs/tdbc1.1.3|/usr/include|"            \
        -i pkgs/tdbc1.1.3/tdbcConfig.sh
    
  • sed -e "s|$SRCDIR/unix/pkgs/itcl4.2.2|/usr/lib/itcl4.2.2|" \
        -e "s|$SRCDIR/pkgs/itcl4.2.2/generic|/usr/include|"    \
        -e "s|$SRCDIR/pkgs/itcl4.2.2|/usr/include|"            \
        -i pkgs/itcl4.2.2/itclConfig.sh
    
  • unset SRCDIR
  • make test
  • make install
  • chmod -v u+w /usr/lib/libtcl8.6.so
  • make install-private-headers
  • ln -sfv tclsh8.6 /usr/bin/tclsh
  • mv /usr/share/man/man3/{Thread,Tcl_Thread}.3
  • mkdir -v -p /usr/share/doc/tcl-8.6.12
  • cp -v -r ../html/* /usr/share/doc/tcl-8.6.12
  • cd ../..
  • rm -rfv tcl8.6.12

Expect-5.45.4

  • tar xvf expect5.45.4.tar.gz
  • cd expect5.45.4
  • ./configure --prefix=/usr           \
                --with-tcl=/usr/lib     \
                --enable-shared         \
                --mandir=/usr/share/man \
                --with-tclinclude=/usr/include
    
  • make
  • make test
  • make install
  • ln -svf expect5.45.4/libexpect5.45.4.so /usr/lib
  • cd ..
  • rm -rfv expect5.45.4

DejaGNU-1.6.3

  • tar xvf dejegun-1.6.3.tar.gz
  • cd dejegun-1.6.3
  • mkdir -v build
  • cd build
  • ../configure --prefix=/usr
  • makeinfo --html --no-split -o doc/dejagnu.html ../doc/dejagnu.texi
  • makeinfo --plaintext -o doc/dejagnu.txt ../doc/dejagnu.texi
  • make install
  • install -v -dm755 /usr/share/doc/dejagnu-1.6.3
  • install -v -m644 doc/dejagnu.{html,txt} /usr/share/doc/dejagnu-1.6.3
  • make check
  • cd ../..
  • rm -rf dejegun-1.6.3

Binutils-2.38

  • tar xvf binutils-2.38.tar.gz
  • cd binutils-2.38
  • expect -c "spawn ls"
spawn ls

다른 메시지가 나오면 원본 문서를 참조하십시오.

  • patch -Np1 -i ../binutils-2.38-lto_fix-1.patch
  • sed -e '/R_386_TLS_LE /i \   || (TYPE) == R_386_TLS_IE \\' \
        -i ./bfd/elfxx-x86.h
    
  • mkdir -v build
  • cd build
  • ../configure --prefix=/usr       \
                 --enable-gold       \
                 --enable-ld=default \
                 --enable-plugins    \
                 --enable-shared     \
                 --disable-werror    \
                 --enable-64-bit-bfd \
                 --with-system-zlib
    
  • make tooldir=/usr
  • make -k check

이 과정을 반드시 실행하세요!!

  • make tooldir=/usr install
  • rm -fv /usr/lib/lib{bfd,ctf,ctf-nobfd,opcodes}.a
  • cd ../..
  • rm -rfv binutils-2.38

GMP-6.2.1

  • tar xvf gmp-6.2.1.tar.gz
  • cd gmp-6.2.1
  • ./configure --prefix=/usr    \
                --enable-cxx     \
                --disable-static \
                --docdir=/usr/share/doc/gmp-6.2.1
    
  • make
  • make html
  • make check 2>&1 | tee gmp-check-log

이 과정은 반드시 수행하십시오. 결과를 확인하시고 메시지에 따라 새롭게 빌드해야 할 수 있습니다. 원본 문서를 참조하십시오

  • awk '/# PASS:/{total+=$3} ; END{print total}' gmp-check-log

197 숫자가 다르면 원본 문서를 참조하십시오

  • make install
  • make install-html
  • cd ..
  • rm -rfv gmp-6.2.1

MPFR-4.1.0

  • tar xvf mpfr-4.1.0.tar.xz
  • cd mpfr-4.1.0
  • ./configure --prefix=/usr        \
                --disable-static     \
                --enable-thread-safe \
                --docdir=/usr/share/doc/mpfr-4.1.0
    
  • make
  • make html
  • make check

이 과정을 반드시 수행하십시오

  • make install
  • make install-html
  • cd ..
  • rm -rfv mpfr-4.1.0

MPC-1.2.1

  • tar xvf mpc-1.2.1.tar.gz
  • cd mpc-1.2.1
  • ./configure --prefix=/usr    \
                --disable-static \
                --docdir=/usr/share/doc/mpc-1.2.1
    
  • make
  • make html
  • make check
  • make install
  • make install-html
  • cd ..
  • rm -rfv mpc-1.2.1

Attr-2.5.1

  • tar xvf attr-2.5.1.tar.gz
  • cd attr-2.5.1
  • ./configure --prefix=/usr     \
                --disable-static  \
                --sysconfdir=/etc \
                --docdir=/usr/share/doc/attr-2.5.1
    
  • make
  • make check
  • make install
  • cd ..
  • rm -rfv attr-2.5.1

Acl-2.3.1

  • tar xvf acl-2.3.1.tar.gz
  • cd acl-2.3.1
  • ./configure --prefix=/usr         \
                --disable-static      \
                --docdir=/usr/share/doc/acl-2.3.1
    
  • make
  • make install
  • cd ..
  • rm -rfv acl-2.3.1

Libcap-2.63

  • tar xvf libcap-2.63.tar.gz
  • cd libcap-2.63
  • sed -i '/install -m.*STA/d' libcap/Makefile
  • make prefix=/usr lib=lib
  • make test
  • make prefix=/usr lib=lib install
  • cd ..
  • rm -rfv libcap-2.63

Shadow-4.11.1

  • tar xvf shadow-4.11.1.tar.gz
  • cd shadow-4.11.1
  • sed -i 's/groups$(EXEEXT) //' src/Makefile.in
  • find man -name Makefile.in -exec sed -i 's/groups\.1 / /' {} \;
  • find man -name Makefile.in -exec sed -i 's/getspnam\.3 / /' {} \;
  • find man -name Makefile.in -exec sed -i 's/passwd\.5 / /' {} \;
  • sed -e 's:#ENCRYPT_METHOD DES:ENCRYPT_METHOD SHA512:' \
        -e 's:/var/spool/mail:/var/mail:'                 \
        -e '/PATH=/{s@/sbin:@@;s@/bin:@@}'                \
        -i etc/login.defs
    
  • touch /usr/bin/passwd
  • ./configure --sysconfdir=/etc \
                --disable-static  \
                --with-group-name-max-length=32
    
  • make
  • make exec_prefix=/usr install
  • make -C man install-man

Configuring Shadow

  • pwconv
  • grpconv
  • mkdir -p /etc/default
  • useradd -D --gid 999
  • sed -i '/MAIL/s/yes/no/' /etc/default/useradd

Setting the root password

  • passwd root

admin

  • cd ..
  • rm -rfv shadow-4.11.1

GCC-11.2.0

  • tar xvf gcc-11.2.0.tar.gz
  • cd gcc-11.2.0
  • sed -e '/static.*SIGSTKSZ/d' \
        -e 's/return kAltStackSize/return SIGSTKSZ * 4/' \
        -i libsanitizer/sanitizer_common/sanitizer_posix_libcdep.cpp
    
  • case $(uname -m) in
      x86_64)
        sed -e '/m64=/s/lib64/lib/' \
            -i.orig gcc/config/i386/t-linux64
      ;;
    esac
    
  • mkdir -v build
  • cd build
  • ../configure --prefix=/usr            \
                 LD=ld                    \
                 --enable-languages=c,c++ \
                 --disable-multilib       \
                 --disable-bootstrap      \
                 --with-system-zlib
    
  • make

아래 과정은 시간 소모적이지만 반드시 수행하십시오.

  • ulimit -s 32768
  • chown -Rv tester .
  • su tester -c "PATH=$PATH make -k check"
  • ../contrib/test_summary

또는

  • ../contrib/test_summary | grep -A7 Summ

분석기와 관련된 8 개의 테스트가 실패할 것입니다.

  • make install
  • rm -rf /usr/lib/gcc/$(gcc -dumpmachine)/11.2.0/include-fixed/bits/
  • chown -v -R root:root /usr/lib/gcc/*linux-gnu/11.2.0/include{,-fixed}
  • ln -svr /usr/bin/cpp /usr/lib
  • ln -sfv ../../libexec/gcc/$(gcc -dumpmachine)/11.2.0/liblto_plugin.so /usr/lib/bfd-plugins/
  • echo 'int main(){}' > dummy.c
  • cc dummy.c -v -Wl,--verbose &> dummy.log
  • readelf -l a.out | grep ': /lib'

[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2] 다른 출력일 경우에 원본 문서를 참조하십시오

  • grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log
/usr/lib/gcc/x86_64-pc-linux-gnu/11.2.0/../../../../lib/crt1.o succeeded
/usr/lib/gcc/x86_64-pc-linux-gnu/11.2.0/../../../../lib/crti.o succeeded
/usr/lib/gcc/x86_64-pc-linux-gnu/11.2.0/../../../../lib/crtn.o succeeded

다른 출력일 경우에 원본 문서를 참조하십시오

  • grep -B4 '^ /usr/include' dummy.log
#include <...> search starts here:
 /usr/lib/gcc/x86_64-pc-linux-gnu/11.2.0/include
 /usr/local/include
 /usr/lib/gcc/x86_64-pc-linux-gnu/11.2.0/include-fixed
 /usr/include

다른 출력일 경우에 원본 문서를 참조하십시오

  • grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'
SEARCH_DIR("/usr/x86_64-pc-linux-gnu/lib64")
SEARCH_DIR("/usr/local/lib64")
SEARCH_DIR("/lib64")
SEARCH_DIR("/usr/lib64")
SEARCH_DIR("/usr/x86_64-pc-linux-gnu/lib")
SEARCH_DIR("/usr/local/lib")
SEARCH_DIR("/lib")
SEARCH_DIR("/usr/lib");

다른 출력일 경우에 원본 문서를 참조하십시오

  • grep "/lib.*/libc.so.6 " dummy.log
attempt to open /usr/lib/libc.so.6 succeeded

다른 출력일 경우에 원본 문서를 참조하십시오

  • grep found dummy.log
found ld-linux-x86-64.so.2 at /usr/lib/ld-linux-x86-64.so.2

다른 출력일 경우에 원본 문서를 참조하십시오

  • rm -v dummy.c a.out dummy.log
  • mkdir -pv /usr/share/gdb/auto-load/usr/lib
  • mv -v /usr/lib/*gdb.py /usr/share/gdb/auto-load/usr/lib
  • cd ../..
  • rm -rfv gcc-11.2.0

Pkg-config-0.29.2

  • tar xvf pkg-config-0.29.2.tar.gz
  • cd pkg-config-0.29.2
  • ./configure --prefix=/usr              \
                --with-internal-glib       \
                --disable-host-tool        \
                --docdir=/usr/share/doc/pkg-config-0.29.2
    
  • make
  • make check
  • make install
  • cd ..
  • rm -rfv pkg-config-0.29.2

Ncurses-6.3

  • tar xvf ncurses-6.3.tar.gz
  • cd ncurses-6.3
  • ./configure --prefix=/usr           \
                --mandir=/usr/share/man \
                --with-shared           \
                --without-debug         \
                --without-normal        \
                --enable-pc-files       \
                --enable-widec          \
                --with-pkg-config-libdir=/usr/lib/pkgconfig
    
  • make
  • make DESTDIR=$PWD/dest install
  • install -vm755 dest/usr/lib/libncursesw.so.6.3 /usr/lib
  • rm -v dest/usr/lib/{libncursesw.so.6.3,libncurses++w.a}
  • cp -av dest/* /
  • for lib in ncurses form panel menu ; do
        rm -vf                    /usr/lib/lib${lib}.so
        echo "INPUT(-l${lib}w)" > /usr/lib/lib${lib}.so
        ln -sfv ${lib}w.pc        /usr/lib/pkgconfig/${lib}.pc
    done
    
  • rm -vf /usr/lib/libcursesw.so
  • echo "INPUT(-lncursesw)" > /usr/lib/libcursesw.so
  • ln -sfv libncurses.so /usr/lib/libcurses.so
  • mkdir -pv /usr/share/doc/ncurses-6.3
  • cp -v -R doc/* /usr/share/doc/ncurses-6.3

데비안에 파일이 존재해서 다음 추가적인 컴파일도 수행.

  • make distclean
  • ./configure --prefix=/usr    \
                --with-shared    \
                --without-normal \
                --without-debug  \
                --without-cxx-binding \
                --with-abi-version=5
    
  • make sources libs
  • cp -av lib/lib*.so.5* /usr/lib
  • cd ..
  • rm -rfv ncurses-6.3

Sed-4.8

  • tar xvf sed-4.8.tar.gz
  • cd sed-4.8
  • ./configure --prefix=/usr
  • make
  • make html
  • chown -Rv tester .
  • su tester -c "PATH=$PATH make check"
  • make install
  • install -d -m755 /usr/share/doc/sed-4.8
  • install -m644 doc/sed.html /usr/share/doc/sed-4.8
  • cd ..
  • rm -rf sed-4.8

Psmisc-23.4

  • tar xvf psmisc-23.4.tar.gz
  • cd psmisc-23.4
  • ./configure --prefix=/usr
  • make
  • make install
  • cd ..
  • rm -rfv psmisc-23.4

Gettext-0.21

  • tar xvf gettext-0.21.tar.gz
  • cd gettext-0.21
  • ./configure --prefix=/usr --disable-static --docdir=/usr/share/doc/gettext-0.21
  • make
  • make check
  • make install
  • chmod -v 0755 /usr/lib/preloadable_libintl.so

Bison-3.8.2

  • tar xvf bison-3.8.2.tar.gz
  • cd bison-3.8.2
  • ./configure --prefix=/usr --docdir=/usr/share/doc/bison-3.8.2
  • make
  • make check
  • make install

Grep-3.7

  • tar xvf grep-3.7.tar.gz
  • cd grep-3.7
  • ./configure --prefix=/usr
  • make
  • make check
  • make install

Bash-5.1.16

  • tar xvf bash-5.1.16.tar.gz
  • cd bash-5.1.16
  • ./configure --prefix=/usr                      \
                --docdir=/usr/share/doc/bash-5.1.16 \
                --without-bash-malloc              \
                --with-installed-readline
    
  • make
  • chown -Rv tester .
  • su -s /usr/bin/expect tester << EOF
    set timeout -1
    spawn make tests
    expect eof
    lassign [wait] _ _ _ value
    exit $value
    EOF
    
  • make install
  • exec /usr/bin/bash --login

Libtool-2.4.6

  • tar xvf libtool-2.4.6.tar.gz
  • cd libtool-2.4.6
  • ./configure --prefix=/usr
  • make
  • make check
  • make install
  • rm -fv /usr/lib/libltdl.a

GDBM-1.23

  • tar xvf gdbm-1.23.tar.gz
  • cd gdbm-1.23
  • ./configure --prefix=/usr --disable-static --enable-libgdbm-compat
  • make
  • make check
  • make install

Gperf-3.1

  • tar xvf gperf-3.1.tar.gz
  • cd gperf-3.1
  • ./configure --prefix=/usr --docdir=/usr/share/doc/gperf-3.1
  • make
  • make -j1 check
  • make install

Expat-2.4.6

  • tar xvf expat-2.4.6.tar.gz
  • cd expat-2.4.6
  • ./configure --prefix=/usr --disable-static --docdir=/usr/share/doc/expat-2.4.6
  • make
  • make check
  • make install
  • install -v -m644 doc/*.{html,css} /usr/share/doc/expat-2.4.6

Inetutils-2.2

  • tar xvf inetutils-2.2.tar.gz
  • cd inetutils-2.2
  • ./configure --prefix=/usr        \
                --bindir=/usr/bin    \
                --localstatedir=/var \
                --disable-logger     \
                --disable-whois      \
                --disable-rcp        \
                --disable-rexec      \
                --disable-rlogin     \
                --disable-rsh        \
                --disable-servers
    
  • make
  • make check
  • make install
  • mv -v /usr/{,s}bin/ifconfig

Less-590

  • tar xvf less-590.tar.gz
  • cd less-590
  • ./configure --prefix=/usr --sysconfdir=/etc
  • make
  • make install

Perl-5.34.0

  • tar xvf perl-5.34.0.tar.gz
  • cd perl-5.34.0
  • patch -Np1 -i ../perl-5.34.0-upstream_fixes-1.patch
  • export BUILD_ZLIB=False
  • export BUILD_BZIP2=0
  • sh Configure -des                                         \
                 -Dprefix=/usr                                \
                 -Dvendorprefix=/usr                          \
                 -Dprivlib=/usr/lib/perl5/5.34/core_perl      \
                 -Darchlib=/usr/lib/perl5/5.34/core_perl      \
                 -Dsitelib=/usr/lib/perl5/5.34/site_perl      \
                 -Dsitearch=/usr/lib/perl5/5.34/site_perl     \
                 -Dvendorlib=/usr/lib/perl5/5.34/vendor_perl  \
                 -Dvendorarch=/usr/lib/perl5/5.34/vendor_perl \
                 -Dman1dir=/usr/share/man/man1                \
                 -Dman3dir=/usr/share/man/man3                \
                 -Dpager="/usr/bin/less -isR"                 \
                 -Duseshrplib                                 \
                 -Dusethreads
    
  • make
  • make test
  • make install
  • unset BUILD_ZLIB BUILD_BZIP2

XML::Parser-2.46

  • tar XML-Parser-2.46.tar.gz
  • cd XML-Parser-2.46
  • perl Makefile.PL
  • make
  • make test
  • make install

Intltool-0.51.0

  • tar xvf intltool-0.51.0.tar.gz
  • cd intl-0.51.0
  • sed -i 's:\\\${:\\\$\\{:' intltool-update.in
  • ./configure --prefix=/usr
  • make
  • make check
  • make install
  • install -v -Dm644 doc/I18N-HOWTO /usr/share/doc/intltool-0.51.0/I18N-HOWTO

Autoconf-2.71

  • tar xvf autoconf-2.71.tar.gz
  • cd autoconf-2.71
  • ./configure --prefix=/usr
  • make
  • make check
  • make install

Automake-1.16.5

  • tar xvf automake-1.16.5.tar.gz
  • cd automake-1.16.5
  • ./configure --prefix=/usr --docdir=/usr/share/doc/automake-1.16.5
  • make
  • make -j4 check
  • make install

OpenSSL-3.0.1

  • tar xvf openssl-3.0.1.tar.gz
  • cd openssl-3.0.1
  • ./config --prefix=/usr         \
             --openssldir=/etc/ssl \
             --libdir=lib          \
             shared                \
             zlib-dynamic
    
  • make
  • make test
  • sed -i '/INSTALL_LIBS/s/libcrypto.a libssl.a//' Makefile
  • make MANSUFFIX=ssl install
  • mv -v /usr/share/doc/openssl /usr/share/doc/openssl-3.0.1
  • cp -vfr doc/* /usr/share/doc/openssl-3.0.1

Kmod-29

  • ./configure --prefix=/usr          \
                --sysconfdir=/etc      \
                --with-openssl         \
                --with-xz              \
                --with-zstd            \
                --with-zlib
    
  • make
  • make install
  • for target in depmod insmod modinfo modprobe rmmod; do
      ln -sfv ../bin/kmod /usr/sbin/$target
    done
    
  • ln -sfv kmod /usr/bin/lsmod

Libelf from Elfutils-0.186

  • tar xvf elfutils-0.186.tar.bz2
  • cd elfutils-0.186
  • ./configure --prefix=/usr --disable-debuginfod --enable-libdebuginfod=dummy
  • make
  • make check
  • make -C libelf install
  • install -vm644 config/libelf.pc /usr/lib/pkgconfig
  • rm /usr/lib/libelf.a

Libffi-3.4.2

  • ./configure --prefix=/usr          \
                --disable-static       \
                --with-gcc-arch=native \
                --disable-exec-static-tramp
    
  • make
  • make check
  • make install

Python-3.10.2

  • ./configure --prefix=/usr        \
                --enable-shared      \
                --with-system-expat  \
                --with-system-ffi    \
                --with-ensurepip=yes \
                --enable-optimizations
    
  • make
  • make install
  • install -v -dm755 /usr/share/doc/python-3.10.2/html
  • tar --strip-components=1  \
        --no-same-owner       \
        --no-same-permissions \
        -C /usr/share/doc/python-3.10.2/html \
        -xvf ../python-3.10.2-docs-html.tar.bz2
    

Ninja-1.10.2

  • export NINJAJOBS=4
  • sed -i '/int Guess/a \
      int   j = 0;\
      char* jobs = getenv( "NINJAJOBS" );\
      if ( jobs != NULL ) j = atoi( jobs );\
      if ( j > 0 ) return j;\
    ' src/ninja.cc
    
  • python3 configure.py --bootstrap
  • ./ninja ninja_test
  • ./ninja_test --gtest_filter=-SubprocessTest.SetWithLots
  • install -vm755 ninja /usr/bin/
  • install -vDm644 misc/bash-completion /usr/share/bash-completion/completions/ninja
  • install -vDm644 misc/zsh-completion /usr/share/zsh/site-functions/_ninja

Meson-0.61.1

  • python3 setup.py build
  • python3 setup.py install --root=dest
  • cp -rv dest/* /
  • install -vDm644 data/shell-completions/bash/meson /usr/share/bash-completion/completions/meson
  • install -vDm644 data/shell-completions/zsh/_meson /usr/share/zsh/site-functions/_meson

Coreutils-9.0

  • patch -Np1 -i ../coreutils-9.0-i18n-1.patch
  • patch -Np1 -i ../coreutils-9.0-chmod_fix-1.patch
  • autoreconf -fiv
  • FORCE_UNSAFE_CONFIGURE=1 ./configure \
                --prefix=/usr            \
                --enable-no-install-program=kill,uptime
    
  • make
  • make NON_ROOT_USERNAME=tester check-root
  • echo "dummy:x:102:tester" >> /etc/group
  • chown -Rv tester .
  • su tester -c "PATH=$PATH make RUN_EXPENSIVE_TESTS=yes check"
  • sed -i '/dummy/d' /etc/group
  • make install
  • mv -v /usr/bin/chroot /usr/sbin
  • mv -v /usr/share/man/man1/chroot.1 /usr/share/man/man8/chroot.8
  • sed -i 's/"1"/"8"/' /usr/share/man/man8/chroot.8

Check-0.15.2

  • ./configure --prefix=/usr --disable-static
  • make
  • make check
  • make docdir=/usr/share/doc/check-0.15.2 install

Diffutils-3.8

  • ./configure --prefix=/usr
  • make
  • make check
  • make install

Gawk-5.1.1

  • sed -i 's/extras//' Makefile.in
  • ./configure --prefix=/usr
  • make
  • make check
  • make install
  • mkdir -pv /usr/share/doc/gawk-5.1.1
  • cp -v doc/{awkforai.txt,*.{eps,pdf,jpg}} /usr/share/doc/gawk-5.1.1

Findutils-4.9.0

  • case $(uname -m) in
        i?86)   TIME_T_32_BIT_OK=yes ./configure --prefix=/usr --localstatedir=/var/lib/locate ;;
        x86_64) ./configure --prefix=/usr --localstatedir=/var/lib/locate ;;
    esac
    
  • make
  • chown -Rv tester .
  • su tester -c "PATH=$PATH make check"
  • make install

Groff-1.22.4

  • cat /etc/papersize

a4

  • PAGE=A4 ./configure --prefix=/usr
  • make -j1
  • make install

GRUB-2.06

  • ./configure --prefix=/usr          \
                --sysconfdir=/etc      \
                --disable-efiemu       \
                --disable-werror
    
  • make
  • make install
  • mv -v /etc/bash_completion.d/grub /usr/share/bash-completion/completions

Gzip-1.11

  • ./configure --prefix=/usr
  • make
  • make check
  • make install

IPRoute2-5.16.0

  • sed -i /ARPD/d Makefile
  • rm -fv man/man8/arpd.8
  • make
  • make SBINDIR=/usr/sbin install
  • mkdir -pv /usr/share/doc/iproute2-5.16.0
  • cp -v COPYING README* /usr/share/doc/iproute2-5.16.0

Kbd-2.4.0

  • patch -Np1 -i ../kbd-2.4.0-backspace-1.patch
  • sed -i '/RESIZECONS_PROGS=/s/yes/no/' configure
  • sed -i 's/resizecons.8 //' docs/man/man8/Makefile.in
  • ./configure --prefix=/usr --disable-vlock
  • make
  • make check
  • make install
  • mkdir -pv /usr/share/doc/kbd-2.4.0
  • cp -R -v docs/doc/* /usr/share/doc/kbd-2.4.0

Libpipeline-1.5.5

  • ./configure --prefix=/usr
  • make
  • make check
  • make install

Make-4.3

  • ./configure --prefix=/usr
  • make
  • make check
  • make install

Patch-2.7.6

  • ./configure --prefix=/usr
  • make
  • make check
  • make install

Tar-1.34

  • FORCE_UNSAFE_CONFIGURE=1 ./configure --prefix=/usr
  • make
  • make check
  • make install
  • make -C doc install-html docdir=/usr/share/doc/tar-1.34

Texinfo-6.8

  • ./configure --prefix=/usr
  • sed -e 's/__attribute_nonnull__/__nonnull/' -i gnulib/lib/malloc/dynarray-skeleton.c
  • make
  • make check
  • make install
  • make TEXMF=/usr/share/texmf install-tex
  • pushd /usr/share/info
      rm -v dir
      for f in *
        do install-info $f dir 2>/dev/null
      done
    popd
    

Vim-8.2.4383

  • echo '#define SYS_VIMRC_FILE "/etc/vimrc"' >> src/feature.h
  • ./configure --prefix=/usr
  • make
  • chown -Rv tester .
  • su tester -c "LANG=en_US.UTF-8 make -j1 test" &> vim-test.log
  • make install
  • ln -sv vim /usr/bin/vi
  • for L in  /usr/share/man/{,*/}man1/vim.1; do
        ln -sv vim.1 $(dirname $L)/vi.1
    done
    
  • ln -sv ../vim/vim82/doc /usr/share/doc/vim-8.2.4383

Configuring Vim

  • cat > /etc/vimrc << "EOF"
    " Begin /etc/vimrc
    
    " Ensure defaults are set before customizing settings, not after
    source $VIMRUNTIME/defaults.vim
    let skip_defaults_vim=1
    
    set nocompatible
    set backspace=2
    set mouse=
    syntax on
    if (&term == "xterm") || (&term == "putty")
      set background=dark
    endif
    
    " End /etc/vimrc
    EOF
    

Eudev-3.2.11

  • ./configure --prefix=/usr           \
                --bindir=/usr/sbin      \
                --sysconfdir=/etc       \
                --enable-manpages       \
                --disable-static
    
  • make
  • mkdir -pv /usr/lib/udev/rules.d
  • mkdir -pv /etc/udev/rules.d
  • make check
  • make install
  • tar -xvf ../udev-lfs-20171102.tar.xz
  • make -f udev-lfs-20171102/Makefile.lfs install
  • udevadm hwdb --update

Man-DB-2.10.1

  • ./configure --prefix=/usr                         \
                --docdir=/usr/share/doc/man-db-2.10.1 \
                --sysconfdir=/etc                     \
                --disable-setuid                      \
                --enable-cache-owner=bin              \
                --with-browser=/usr/bin/lynx          \
                --with-vgrind=/usr/bin/vgrind         \
                --with-grap=/usr/bin/grap             \
                --with-systemdtmpfilesdir=            \
                --with-systemdsystemunitdir=
    
  • make
  • make check
  • make install

Procps-ng-3.3.17

  • ./configure --prefix=/usr                            \
                --docdir=/usr/share/doc/procps-ng-3.3.17 \
                --disable-static                         \
                --disable-kill
    
  • make
  • make check
  • make install

Util-linux-2.37.4

  • ./configure ADJTIME_PATH=/var/lib/hwclock/adjtime   \
                --bindir=/usr/bin    \
                --libdir=/usr/lib    \
                --sbindir=/usr/sbin  \
                --docdir=/usr/share/doc/util-linux-2.37.4 \
                --disable-chfn-chsh  \
                --disable-login      \
                --disable-nologin    \
                --disable-su         \
                --disable-setpriv    \
                --disable-runuser    \
                --disable-pylibmount \
                --disable-static     \
                --without-python     \
                --without-systemd    \
                --without-systemdsystemunitdir
    
  • make
  • rm tests/ts/lsns/ioctl_ns
  • chown -Rv tester .
  • su tester -c "make -k check"
  • make install

E2fsprogs-1.46.5

  • mkdir -v build
  • cd build
  • ../configure --prefix=/usr           \
                 --sysconfdir=/etc       \
                 --enable-elf-shlibs     \
                 --disable-libblkid      \
                 --disable-libuuid       \
                 --disable-uuidd         \
                 --disable-fsck
    
  • make
  • make check
  • make install
  • rm -fv /usr/lib/{libcom_err,libe2p,libext2fs,libss}.a
  • gunzip -v /usr/share/info/libext2fs.info.gz
  • install-info --dir-file=/usr/share/info/dir /usr/share/info/libext2fs.info
  • makeinfo -o doc/com_err.info ../lib/et/com_err.texinfo
  • install -v -m644 doc/com_err.info /usr/share/info
  • install-info --dir-file=/usr/share/info/dir /usr/share/info/com_err.info

Sysklogd-1.5.1

  • sed -i '/Error loading kernel symbols/{n;n;d}' ksym_mod.c
  • sed -i 's/union wait/int/' syslogd.c
  • make
  • make BINDIR=/sbin install

Sysvint-3.01

  • patch -Np1 -i ../sysvinit-3.01-consolidated-1.patch
  • make
  • make install

Stripping

데비안 bash와 파일 크기가 상당히 달라서, 이 과정을 수행해 보고자 합니다.

BACKUP-before-stripping 아래 명령은 root 권한으로 이루어지기 때문에 주의가 필요합니다. 환경 변수를 반드시 확인하고, 설정되어 있지 않으면, export로 환경 변수를 설정하십시오:

  • exit
  • echo $LFS
  • umount $LFS/dev/pts
  • umount $LFS/{sys,proc,run,dev}
  • echo $HOME

/root

  • cd $LFS
  • tar -cJpf $HOME/lfs-temp-tools-11.1-systemd-before-stripping.tar.xz .

Mount & Chroot

  • mount -v --bind /dev $LFS/dev
  • mount -v --bind /dev/pts $LFS/dev/pts
  • mount -vt proc proc $LFS/proc
  • mount -vt sysfs sysfs $LFS/sys
  • mount -vt tmpfs tmpfs $LFS/run
  • if [ -h $LFS/dev/shm ]; then
      mkdir -pv $LFS/$(readlink $LFS/dev/shm)
    fi
    
  • chroot "$LFS" /usr/bin/env -i   \
       HOME=/root                  \
       TERM="$TERM"                \
       PS1='(lfs chroot) \u:\w\$ ' \
       PATH=/usr/bin:/usr/sbin     \
       /bin/bash --login
    

Stripping

  • save_usrlib="$(cd /usr/lib; ls ld-linux*)
                 libc.so.6
                 libthread_db.so.1
                 libquadmath.so.0.0.0
                 libstdc++.so.6.0.29
                 libitm.so.1.0.0
                 libatomic.so.1.2.0"
    
    cd /usr/lib
    
    for LIB in $save_usrlib; do
        objcopy --only-keep-debug $LIB $LIB.dbg
        cp $LIB /tmp/$LIB
        strip --strip-unneeded /tmp/$LIB
        objcopy --add-gnu-debuglink=$LIB.dbg /tmp/$LIB
        install -vm755 /tmp/$LIB /usr/lib
        rm /tmp/$LIB
    done
    
    online_usrbin="bash find strip"
    online_usrlib="libbfd-2.38.so
                   libhistory.so.8.1
                   libncursesw.so.6.3
                   libm.so.6
                   libreadline.so.8.1
                   libz.so.1.2.11
                   $(cd /usr/lib; find libnss*.so* -type f)"
    
    for BIN in $online_usrbin; do
        cp /usr/bin/$BIN /tmp/$BIN
        strip --strip-unneeded /tmp/$BIN
        install -vm755 /tmp/$BIN /usr/bin
        rm /tmp/$BIN
    done
    
    for LIB in $online_usrlib; do
        cp /usr/lib/$LIB /tmp/$LIB
        strip --strip-unneeded /tmp/$LIB
        install -vm755 /tmp/$LIB /usr/lib
        rm /tmp/$LIB
    done
    
    for i in $(find /usr/lib -type f -name \*.so* ! -name \*dbg) \
             $(find /usr/lib -type f -name \*.a)                 \
             $(find /usr/{bin,sbin,libexec} -type f); do
        case "$online_usrbin $online_usrlib $save_usrlib" in
            *$(basename $i)* )
                ;;
            * ) strip --strip-unneeded $i
                ;;
        esac
    done
    
    unset BIN LIB save_usrlib online_usrbin online_usrlib
    

Cleaning Up

  • rm -rf /tmp/*
  • find /usr/lib /usr/libexec -name \*.la -delete
  • find /usr -depth -name $(uname -m)-lfs-linux-gnu\* | xargs rm -rf
  • userdel -r tester

System Configuration

LFS-Bootscripts-20210608

  • make install

General Network Configuration

  • cd /etc/sysconfig/
  • cat > ifconfig.eth0 << "EOF"
    ONBOOT=yes
    IFACE=eth0
    SERVICE=ipv4-static
    IP=192.168.122.246
    GATEWAY=192.168.122.1
    PREFIX=24
    BROADCAST=192.168.122.255
    EOF

호스트의 정보를 그대로 활용해서 만들었습니다. Creating the /etc/resolv.conf File

  • cat > /etc/resolv.conf << "EOF"
    # Begin /etc/resolv.conf
    
    nameserver 192.168.122.1
    nameserver 8.8.8.8
    nameserver 8.8.4.4
    
    # End /etc/resolv.conf
    EOF

Configuring the system hostname

  • echo "Dawoum-lfs" > /etc/hostname

Customizing the /etc/hosts File

  • cat > /etc/hosts << "EOF"
    # Begin /etc/hosts
    
    127.0.0.1 localhost.localdomain localhost
    127.0.1.1 Dawoum-lfs
    ::1       localhost ip6-localhost ip6-loopback
    ff02::1   ip6-allnodes
    ff02::2   ip6-allrouters
    
    # End /etc/hosts
    EOF

System V Bootscript Usage and Configuration

Configuring Sysvinit

  • cat > /etc/inittab << "EOF"
    # Begin /etc/inittab
    
    id:3:initdefault:
    
    si::sysinit:/etc/rc.d/init.d/rc S
    
    l0:0:wait:/etc/rc.d/init.d/rc 0
    l1:S1:wait:/etc/rc.d/init.d/rc 1
    l2:2:wait:/etc/rc.d/init.d/rc 2
    l3:3:wait:/etc/rc.d/init.d/rc 3
    l4:4:wait:/etc/rc.d/init.d/rc 4
    l5:5:wait:/etc/rc.d/init.d/rc 5
    l6:6:wait:/etc/rc.d/init.d/rc 6
    
    ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now
    
    su:S016:once:/sbin/sulogin
    
    1:2345:respawn:/sbin/agetty --noclear tty1 9600
    2:2345:respawn:/sbin/agetty tty2 9600
    3:2345:respawn:/sbin/agetty tty3 9600
    4:2345:respawn:/sbin/agetty tty4 9600
    5:2345:respawn:/sbin/agetty tty5 9600
    6:2345:respawn:/sbin/agetty tty6 9600
    
    # End /etc/inittab
    EOF

Configuring the System Clock

  • cat > /etc/sysconfig/clock << "EOF"
    # Begin /etc/sysconfig/clock
    
    UTC=0
    
    # Set this to any options you might need to give to hwclock,
    # such as machine hardware clock type for Alphas.
    CLOCKPARAMS=
    
    # End /etc/sysconfig/clock
    EOF

Configuring the Linux Console

  • cat > /etc/sysconfig/console << "EOF"
    # Begin /etc/sysconfig/console
    KEYMAP="us"
    
    # End /etc/sysconfig/console
    EOF

The Bash Shell Startup Files

  • cat > /etc/profile << "EOF"
    # Begin /etc/profile
    
    export LANG=en_US.UTF-8
    
    # End /etc/profile
    EOF

Creating the /etc/inputrc File

  • cat > /etc/inputrc << "EOF"
    # Begin /etc/inputrc
    # Modified by Chris Lynn <roryo@roryo.dynup.net>
    
    # Allow the command prompt to wrap to the next line
    set horizontal-scroll-mode Off
    
    # Enable 8bit input
    set meta-flag On
    set input-meta On
    
    # Turns off 8th bit stripping
    set convert-meta Off
    
    # Keep the 8th bit for display
    set output-meta On
    
    # none, visible or audible
    set bell-style none
    
    # All of the following map the escape sequence of the value
    # contained in the 1st argument to the readline specific functions
    "\eOd": backward-word
    "\eOc": forward-word
    
    # for linux console
    "\e[1~": beginning-of-line
    "\e[4~": end-of-line
    "\e[5~": beginning-of-history
    "\e[6~": end-of-history
    "\e[3~": delete-char
    "\e[2~": quoted-insert
    
    # for xterm
    "\eOH": beginning-of-line
    "\eOF": end-of-line
    
    # for Konsole
    "\e[H": beginning-of-line
    "\e[F": end-of-line
    
    # End /etc/inputrc
    EOF

Creating the /etc/shells File

  • cat > /etc/shells << "EOF"
    # Begin /etc/shells
    
    /bin/sh
    /bin/bash
    
    # End /etc/shells
    EOF

Making the LFS System Bootable

Creating the /etc/fstab File

다음 명령을 내려서 마운트된 디바이스를 확인합니다:

  • mount
  • cat > /etc/fstab << "EOF"
    # Begin /etc/fstab
    
    # file system  mount-point  type     options             dump  fsck
    #                                                              order
    
    /dev/vdb2     /             ext4     defaults            0     1
    /dev/vdb3     swap          swap     pri=1               0     0
    proc           /proc        proc     nosuid,noexec,nodev 0     0
    sysfs          /sys         sysfs    nosuid,noexec,nodev 0     0
    devpts         /dev/pts     devpts   gid=5,mode=620      0     0
    tmpfs          /run         tmpfs    defaults            0     0
    devtmpfs       /dev         devtmpfs mode=0755,nosuid    0     0
    
    # End /etc/fstab
    EOF

Linux-5.19.3

  • 커널 소스에서 최신 커널을 받아서, /mnt/lfs/sources/로 복사합니다:
  • cd /sources/
  • tar xvf linux-5.16.9.tar.gz
  • cd linux-5.16.9
  • make clean
  • make mproper
  • make menuconfig

문서에서 제공하는 설정을 따르고, VIRTIO_BLK=y, VIRTIO_NET=y로 바꿉니다.

  • time make -j12

14분 정도 걸립니다:

  • make modules_install

이전과 다르게 많은 모듈이 설치됩니다:

  • cp -iv arch/x86/boot/bzImage /boot/vmlinuz-5.19.3
  • cp -iv System.map /boot/System.map-5.19.3
  • cp -iv .config /boot/config-5.19.3

Configuring Linux Module Load Order

  • install -v -m755 -d /etc/modprobe.d
  • cat > /etc/modprobe.d/usb.conf << "EOF"
    # Begin /etc/modprobe.d/usb.conf
    
    install ohci_hcd /sbin/modprobe ehci_hcd ; /sbin/modprobe -i ohci_hcd ; true
    install uhci_hcd /sbin/modprobe ehci_hcd ; /sbin/modprobe -i uhci_hcd ; true
    
    # End /etc/modprobe.d/usb.conf
    EOF

Using GRUB to Set Up the Boot Process

  • grub-install /dev/vdb
  • cat > /boot/grub/grub.cfg << "EOF"
    # Begin /boot/grub/grub.cfg
    set default=0
    set timeout=5
    
    insmod ext2
    set root=(hd0,2)
    
    menuentry "GNU/Linux, Linux 5.19.3" {
            linux   /boot/vmlinuz-5.19.3 root=/dev/vdb2 ro
    }
    EOF

The End

Os information

  • echo 11.1 > /etc/lfs-release
  • cat > /etc/lsb-release << "EOF"
    DISTRIB_ID="Linux From Scratch"
    DISTRIB_RELEASE="11.1"
    DISTRIB_CODENAME="DawoumLFS"
    DISTRIB_DESCRIPTION="Linux From Scratch"
    EOF
  • cat > /etc/os-release << "EOF"
    NAME="Linux From Scratch"
    VERSION="11.1"
    ID=lfs
    PRETTY_NAME="Linux From Scratch 11.1"
    VERSION_CODENAME="DowoumLFS"
    EOF

Rebooting the System

  • exit
  • umount -v $LFS/dev/pts
  • umount -v $LFS/dev
  • umount -v $LFS/run
  • umount -v $LFS/proc
  • umount -v $LFS/sys
  • umount -v $LFS
  • exit

Troubleshootings

커널 컴파일 kernel/kheaders_data.tar.xz에서 오류 발생할 수 있으며, IKHEADERS를 제거하십시오. 부팅 문제 커널 컴파일 문제로 확인되었습니다. 커널은 5.19.3 버전을 사용했고, 이미 갖고 있는 설정을 그대로 사용했습니다. 단지, make clean을 수행했고, VIRTIO_BLK=y, VIRTIO_NET=y로 바꾸었습니다. 네트워크 (Systemd) Name=enp1s0와 같이 적어야 하며, Name=/dev/enp1s0와 같이 적어서는 안 됩니다.

Information

두 버전 (Sysvinit, Systemd) 모두 이제 정상적으로 부팅이 됩니다 이전에 부팅 관련 오류는 커널 컴파일에 문제가 있었습니다. 구축 시간 작업 시간은 코어 4개로 24시간 이상 걸릴 것으로 보입니다. 전체 크기 System V init 후의 정보입니다:

  • du /mnt/lfs : 5482588
  • du /mnt/lfs/sources : 4440676

Systemd 후의 정보입니다:

  • du /mnt/lfs : 6271232
  • du /mnt/lfs/sources : 4820416

Check or test 프로그램 컴파일 후에 check 또는 test가 있지만, 안 해도 될 것으로 보입니다.

External Resources