기존 배포판을 참조해서 새로운 배포판을 만드는 방법은 잘 알려져 있습니다. 이런 방법의 한계점 중 하나는 기존 배포판에서 환경을 참조하기 때문에 결과도 거의 비슷한 환경을 제공하는 것입니다.
하지만, 기존에 참조할 만한 배포판이 없을 경우에는 처음부터 환경을 구축해야 합니다. 이 방법 중 하나가 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
- sudo mkdir -v $LFS/sources
- sudo chmod -v a+wt $LFS/sources
- wget https://www.linuxfromscratch.org/lfs/view/stable-systemd/wget-list
- wget --input-file=wget-list --continue --directory-prefix=$LFS/sources
-
pushd $LFS/sources wget https://www.linuxfromscratch.org/lfs/view/stable-systemd/md5sums md5sum -c md5sums popd
이때, 다운로드가 되지 않은 파일이 표시될 수 있습니다. 수동으로 해당 파일을 받아서 이 디렉토리로 옮겨야 합니다.
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.
컴파일에서 다음 사항을 유의해야 합니다:
|
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
이제, 지금까지 작업이 잘 되었는지 확인할 필요가 있습니다.
|
- $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 환경를 벗어났으면, 가상 환경이 여전히 마운트되어 있는지 반드시 확인하십시오.
|
압축하는데 상당한 시간이 걸리며, 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가 있지만, 안 해도 될 것으로 보입니다.