LFS 시스템 빌드를 위한 cross tool chain의 설정과정을 다룬다.
Techical note
LFS 시스템의 빌드 단계는 아래의 단계를 따른다
Stage | Build | Host | Target | Action |
---|---|---|---|---|
1 | pc | pc | lfs | Build cross-compiler cc1 using cc-pc on pc. |
2 | pc | lfs | lfs | Build compiler cc-lfs using cc1 on pc. |
3 | lfs | lfs | lfs | Rebuild and test cc-lfs using cc-lfs on lfs |
여기서 1단계와 2단계가 cross compiler를 구축하는 단계이고 3단계는 chroot와 cross compiler를 이용한 LFS 시스템을 만드는 단계이다. cross compiler를 만드는 단계가 2단계로 구분되어 있는 이유는 하기와 같이 설명하고 있다.
- C언어는 단순컴파일러가 아니라 표준 라이브러리(glib)도 정의하는데 이는 cc1으로 컴파일되어야 함
- 그런데 컴파일러는 내부 라이브러리 libgcc를 이용해 컴파일하는데 이는 glib에 연결되어 있어야함
- 이 상호 의존 문제를 해결하기 위해 먼저 cc1 및 libgcc(스레드,예외처리 일부 기능이 부족한)를 만들고 이를 이용해 glib을 만듬(glib은 성능저하 없음)
- 그 다음 2단계에서 cc1을 이용해 cc-lfs를 만드며 이때 libgcc 및 llibstdc++도 다시 만듬
그리고 3단계(chroot) 환경에서 기존에 만든 패키지가 있음에도 다시 모든 패키지를 빌드하는데 이는 LSF를 안정적으로 만들어 준다.(2단계에서 만든 패키지들이 몇가지 디펜던시가 부족하므로)
(이해하기 좀 빡세다…해보면 이해간다는데 해봐도 머리속이 클리어하지 않다.)
Compiling a Cross-Toolchain
위의 1단계, cc1을 빌드하고 glib을 만든다. 그리고 cc-lfs도 만들 수 있도록 libstdc++도 추출함
-
Binutils-2.40 - Pass 1
- linker, an assembler, and other tools for handling object files
- –prefix=$LFS/tools, –with-sysroot=$LFS 옵션으로 볼 때 host환경에서 쓴다는 것을 알 수 있다.
-
GCC-12.2.0 - Pass 1
- -prefix=$LFS/tools, –with-sysroot=$LFS 옵션으로 볼 때 host환경에서 사용
- –disable-shared에서 내부 라이브러리를 정적으로 쓰도록 함, 호스트의 동적 라이브러리로 인한 문제 차단
- –disable-libstdcxx 등 : 위에서 설명한 일부기능이 부족한 cc1이 됨
-
Linux-6.1.11 API Headers
- 리눅스 커널에서 Glibc에 쓰이는 커널 API인 리눅스 API 헤더를 추출
-
Glibc-2.37
- Glibc 패키지는 메인 C 라이브러리를 포함하고 있다. 이 라이브러리는 메모리 할당, 디렉토리 검색, 파일 열기 및 닫기, 파일 읽기 및 쓰기, 문자열 처리, 패턴 대조, 산술 등의 기본 루틴을 제공한다
- –prefix=/usr 로 볼때 빌드된 것이 LFS 시스템 상에서 사용됨을 알 수 있다.
- –host=$LFS_TGT, –build=$(../scripts/config.guess) 는 이전의 gcc와 binutil등을 이용해서 크로스 컴파일함
-
Libstdc++ from GCC-12.2.0
- c++을 설치하기 위해서 Libstdc++가 필요한데 Glibc에 디펜던시를 가지므로 gcc 설치 시 설치하지 않았다.
- Glibc와 같이 –prefix=/usr, –host=$LFS_TGT, –build=$(../scripts/config.guess) 구성을 사용
Cross Compiling Temporary Tools
위 기술노트의 2단계, cc-lfs를 구축한다.
- M4-1.4.19
- 매크로 처리기
- Ncurses-6.4
- 문자 화면의 터미널 독립적 처리를 위한 라이브러리를 포함(clear, tab 같은)
- Bash-5.2.15
- 배쉬 쉘
- Coreutils-9.1
- 기본적인 시스템 특성을 보여주고 설정하기 위한 유틸리티(cat, chmod, cp, dd 등등)
- Diffutils-3.9
- diff 유틸
- File-5.44
- file 명령어 util
- Findutils-4.9.0
- Findutils 패키지는 파일을 찾는 프로그램을 포함(find 등)
- Gawk-5.2.1
- 텍스트 편집에 최적화된 스크립트 언어
- Grep-3.8
- Gzip-1.12
- Make-4.4
- Patch-2.7.6
- Sed-4.9
- Tar-1.34
- Xz-5.4.1
- Binutils-2.40 - Pass 2
- GCC-12.2.0 - Pass 2
Entering Chroot and Building Additional Temporary Tools
위의 빌드를 위한 임시 시스템에서 필요한 몇가지 패키지를 chroot의 분리된 환경에서 설치한다.
- 상기 패키지를 host환경이 아닌 LFS 환경에서 설치하는 이유는 나와있지 않다.
- LFS ver9에서는 chroot로 LFS 환경으로 들어가기 이전에 모든 빌드 시스템 구축을 끝낸다.(이게 더 이해가 쉬운듯)
Entering Chroot env and make VFS
현재까지 만들어진 파일 시스템은 lfs 소유인데 이는 다른 유저가 파일을 조작할 권리를 얻을 수 있으므로 소유자를 root로 변환
|
|
/dev
등 필요한 가상 커널 파일 시스템을 생성한다.
|
|
chroot를 이용하여 LFS환경으로 진입한다
|
|
리눅스 표준 디렉토리 트리를 생성한다(리눅스 파일 시스템 계층 표준 기반)
|
|
리눅스는 마운트된 파일시스템의 리스트를 /etc/mtab
에 관리하고 이를 /proc
에 노출시키므로 이를 위한 심볼릭 링크를 생성
- mtab은 mount command에 의해 자동갱신됨, fstab은 부팅 시 마운트할 목록
|
|
host
파일과 /etc/passwd
. /etc/group
을 생성한다. 필요 시 테스트를 위한 테스트 그룹도 생성하고 재로그인 한다.
생성된 그룹은 어떤 표준에도 속하지 않는 Udev 구성의 요구사항에 의해 만들어진 그룹이다.
|
|
마지막으로 login, agetty 및 init 들은 로그파일이 존재하지 않으면 로그를 남기지 않으므로 파일을 미리 생성해준다.
|
|
Building Additional Temporary Tools
하기 패키지를 설치한다.
- Gettext-0.21.1
- 다국어화와 현지화를 위한 유틸리티가 포함, 프로그램을 현지 언어를 지원하도록 컴파일 할 수 있음
- Bison-3.8.2
- 파서 생성기가 포함(?)
- Perl-5.36.0
- Python-3.11.2
- Texinfo-7.0.2
- info 페이지를 읽고, 쓰고, 변환하는 프로그램(man보다 자세하다고 함)
- Util-linux-2.38.1
- 파일 시스템, 콘솔, 파티션 및 메시지를 처리하는 유틸리티가 포함된 패키지
Cleaning and Backup
툴체인 셋업이 완료되었으므로 필요하다면 현재구성을 백업하도록 하자. 상세 내용은 메뉴얼 참조