개요
Linux From Scratch (이하, LFS)는 "소스코드에서 시작하여 여러분의 입맛에 맞는 Linux 시스템을 완성"하기 위한 단계별 절차를 제공하는 프로젝트입니다.
리눅스 시스템에 대한 이해를 높일 목적으로 이를 수행해 보았습니다.
이를 통해 얻게 된 지식은 다음과 같습니다.
- 소스코드를 사용한 Compile, Build, Install 절차
- 리눅스 시스템을 동작시키는 필요한 패키지
※ 과정 중 발생한 오류는 대부분 중간에 과정을 누락한 경우였습니다.
본문
개발환경 설정
Virtual Box에 리눅스(Ubuntu)를 설치한 후, 작업을 진행하였습니다.
cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04.2 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.2 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal
LFS에서 권장하는 도구의 설치 유무를 다음과 같이 스크립트를 사용하여 확인하였습니다.
bash version-check.sh
bash, version 5.0.17(1)-release
/bin/sh -> /usr/bin/bash
Binutils: (GNU Binutils for Ubuntu) 2.34
bison (GNU Bison) 3.5.1
/usr/bin/yacc -> /usr/bin/bison.yacc
bzip2, Version 1.0.8, 13-Jul-2019.
Coreutils: 8.30
diff (GNU diffutils) 3.7
find (GNU findutils) 4.7.0
GNU Awk 5.0.1, API: 2.0 (GNU MPFR 4.0.2, GNU MP 6.2.0)
/usr/bin/awk -> /usr/bin/gawk
gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0
g++ (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0
(Ubuntu GLIBC 2.31-0ubuntu9.2) 2.31
grep (GNU grep) 3.4
gzip 1.10
Linux version 5.4.0-66-generic (buildd@lgw01-amd64-039) (gcc version 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04)) #74-Ubuntu SMP Wed Jan 27 22:54:38 UTC 2021
m4 (GNU M4) 1.4.18
GNU Make 4.2.1
GNU patch 2.7.6
Perl version='5.30.0';
Python 3.8.5
sed (GNU sed) 4.7
tar (GNU tar) 1.30
texi2any (GNU texinfo) 6.7
xz (XZ Utils) 5.2.4
g++ compilation OK
아래 명령으로 /bin/dash
오류를 수정하였습니다.
# /bin/sh -> /bin/dash
# ERROR: /bin/sh does not point to bash
sudo ln -svf bash /bin/sh
LFS 작업을 진행할 별도의 드라이브를 추가하였습니다.
LFS 를 위한 패키지를 다운로드 합니다.
mkdir -v $LFS/sources
chmod -v a+wt $LFS/sources
wget http://www.linuxfromscratch.org/lfs/view/stable/md5sums -P $LFS/source
pushd $LFS/sources
md5sum -c md5sums
popd
임시 시스템 빌드
※ 오류에 대비하여 root
권한이 없는 lfs
로 작업합니다.
binutils
오브젝트 파일을 다루기 위한 링커, 어셈블러 및 기타 도구를 포함하고 있는 패키지 입니다.
cd $LFS/sources
tar -xf binutils-2.36.1.tar.xz
mv binutils-2.36.1 binutils
cd binutils
mkdir -v build && cd build
#wrap in time function to compute SBU
#this will be the only time we do this.
time { ../configure --prefix=$LFS/tools \
--with-lib-path=$LFS/tools/lib \
--with-sysroot=$LFS \
--target=$LFS_TGT \
--disable-nls \
--disable-werror && \
make -j$(nproc) && \
make install; }
#end time block
real 2m29.936s
user 2m1.837s
sys 0m17.389s
#step 8: cleanup
$ cd $LFS/sources && rm -rf binutils
# 확인
$lfs/tools/bin 폴더에 $LFS_TGT-linux-... 등의 파일이 생성됨
gcc
#step 1:
cd $LFS/sources
tar -xf gcc-10.2.0.tar.xz
cd gcc-10.2.0
#step 2: untar additional required packages
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
#step 3: point to 64-bit libs (verbatim LFS 5.5)
case $(uname -m) in
x86_64)
sed -e '/m64=/s/lib64/lib/' \
-i.orig gcc/config/i386/t-linux64
;;
esac
#step 4:
mkdir -v build
cd build
#step 5:
../configure \
--target=$LFS_TGT \
--prefix=$LFS/tools \
--with-glibc-version=2.11 \
--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++
#step 6:
make -j$(nproc)
#step 7:
make install
#step 8: cleanup
cd $LFS/sources && rm -rf gcc-10.2.0
Linux-5.10.17 API Headers
#step 1:
tar -xf linux-5.10.17.tar.xz && cd linux-5.10.17
#step 2: clean the directory
make mrproper
#step 3:
make headers
find usr/include -name '.*' -delete
rm usr/include/Makefile
cp -rv usr/include $LFS/usr
#step 4: clean up
cd $LFS/sources/ && rm -rf linux-5.10.17
Glibc-2.33
#step 1:
cd $LFS/sources
tar -xf glibc-2.33.tar.xz && cd glibc-2.33
#step 2: create a compatibility symbolic link for x86_64
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
#step 2
patch -Np1 -i ../glibc-2.33-fhs-1.patch
#step 3
mkdir -v build
cd build
#step 4
../configure \
--prefix=/usr \
--host=$LFS_TGT \
--build=$(../scripts/config.guess) \
--enable-kernel=3.2 \
--with-headers=$LFS/usr/include \
libc_cv_slibdir=/lib
#step 5
make -j$(nproc)
make DESTDIR=$LFS install
#step 6: clean up
cd $LFS/sources/ && rm -rf glibc-2.33
# /mnt/lfs/usr/lib/crtl.o 생성됨
중간점검
echo 'int main(){}' > dummy.c
$LFS_TGT-gcc dummy.c
readelf -l a.out | grep '/ld-linux'
오류가 발생하였습니다.
$LFS_TGT-gcc dummy.c
/mnt/lfs/tools/bin/../lib/gcc/x86_64-lfs-linux-gnu/10.2.0/../../../../x86_64-lfs-linux-gnu/bin/ld: cannot find crt1.o: No such file or directory
/mnt/lfs/tools/bin/../lib/gcc/x86_64-lfs-linux-gnu/10.2.0/../../../../x86_64-lfs-linux-gnu/bin/ld: cannot find crti.o: No such file or directory
재시도하여 해결, 진행중 무언가 도중에 오류를 냈던 것 같음.
$LFS/tools/libexec/gcc/$LFS_TGT/10.2.0/install-tools/mkheaders
Libstdc++
#step 1:
cd $LFS/sources
tar -xf gcc-10.2.0.tar.xz
cd gcc-10.2.0
#step 2: untar additional required packages
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
#step 3: point to 64-bit libs (verbatim LFS 5.5)
case $(uname -m) in
x86_64)
sed -e '/m64=/s/lib64/lib/' \
-i.orig gcc/config/i386/t-linux64
;;
esac
#step 4:
mkdir -v build
cd build
#step 5:
../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++/10.2.0
make -j$(nproc)
make DESTDIR=$LFS install
cd $LFS/sources && rm -rf gcc-10.2.0
M4-1.4.18
tar -xf m4-1.4.18.tar.xz
cd m4-1.4.18
sed -i 's/IO_ftrylockfile/IO_EOF_SEEN/' lib/*.c
echo "#define _IO_IN_BACKUP 0x100" >> lib/stdio-impl.h
./configure --prefix=/usr \
--host=$LFS_TGT \
--build=$(build-aux/config.guess)
make -j$(nproc)
make DESTDIR=$LFS install
cd $LFS/sources && rm -rf m4-1.4.18
Ncurses-6.2
tar -xf ncurses-6.2.tar.gz
cd ncurses-6.2
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 \
--enable-widec
make -j$(nproc)
make DESTDIR=$LFS TIC_PATH=$(pwd)/build/progs/tic install
echo "INPUT(-lncursesw)" > $LFS/usr/lib/libncurses.so
Bash-5.1 ~ 6.18. GCC-10.2.0
CoreUtils-8.32
# for aclocal-1.16: command not found
$sudo apt install libtools-bin automake
7.1 ~ 7.4
※ Section 7.4, “Entering the Chroot Environment” 전까지 제시된 명령어는 sudo
를 사용하여 root
권한에서 실행합니다.
시스템 패키지 빌드 & 설치
8.18 Binutils-2.36.1
오류
The system has no more ptys.
Ask your system administrator to create more.
7.3.2. Mounting and Populating /dev
의 내용을 sudo
를 붙여서 실행한 후 , chroot에 재진입하여 해결하였습니다.
참고
- Linux From Scratch - Version 10.1
- Building Linux From Scratch on a Google Cloud Virtual Machine - Part 1: The Build Environment
- Building Linux From Scratch on a Google Cloud Virtual Machine - Part 2: Building the Temporary System
- Building Linux From Scratch on a Google Cloud Virtual Machine - Part 3: Building and Installing System Packages
- Building Linux From Scratch on a Google Cloud Virtual Machine - Part 4: System Configuration and Kernel Popping
- KLSPWiki: Linux From Scratch
'운영체제' 카테고리의 다른 글
[Ubuntu] Offline package 설치 (1) | 2021.06.24 |
---|---|
[linux] Self-signed certificate 를 신뢰할 수 있는 인증서로 추가하기 (0) | 2021.06.18 |
[linux] 부팅가능 USB 드라이브 만들기 (0) | 2021.02.28 |
[WSL] 우분투 18.04를 20.04로 업그레이드 하기 (0) | 2020.12.15 |
[Ubuntu] Python3 최신 버전 설치하기 (0) | 2020.12.12 |