리눅스/LFS

[LFS6] 리눅스 시스템의 기본 쉘 Bash 빌드

sik13579 2026. 2. 11. 00:10

 안녕하세요 이번 시간에는 Bash를 빌드해 보겠습니다. 
빌드하기 앞서 Bash의 역할과 구성에 대해 한번 알아보고 가보시죠

 

 

1. Bash의 역할

Bash(Bourne Again Shell)는 단순히 명령어를 입력받는 창이 아닌, 다음과 같은 중추적인 역할을 합니다.

  • 명령어 해석기(Command Interpreter) : 사용자가 ls, cd, make 같은 명령어를 치면, 해당 프로그램이 어디 있는지 찾아서 실행시키고 그 결과를 다시 화면에 보여줍니다.
  • 스크립트 언어(Scripting Language): 반복되는 작업을 자동화할 수 있는 프로그래밍 기능을 제공합니다. LFS 빌드할 때 쓰는 명령어 묶음들도 하나의 거대한 Bash 스크립트라고 볼 수 있습니다.
  • 환경 관리자(Environment Manager): $LFS, $PATH 같은 환경 변수를 기억하고 관리합니다. 어떤 도구를 어디서 가져다 쓸지 결정하는 지도를 들고 있는 셈입니다.

 

2. Bash의 구성

Bash 내부를 뜯어보면 크게 세 가지 단계로 작동하도록 구성되어 있습니다.

 

  1. 어휘 분석 및 파싱 (Lexical Analysis & Parsing)
    우리가 입력한 한 줄의 문장을 단어 단위로 쪼개고 의미를 분석합니다.
    예시 : ls -l /mnt/lfs → ls(실행할 놈), -l(옵션), /mnt/lfs(대상 경로)로 분류합니다.
  2. 내장 명령어 vs 외장 명령어(Built-ins vs External)
    모든 명령어가 별도 프로그램인 것은 아닙니다.
    Built-ins(내장):Bash 자체가 직접 처리하는 명령어들입니다.(예 : cd, echo, export, exit, pwd, source, eval) 빠르고 효율적입니다.
    External(외장):/usr/bin 등에 설치된 별도의 실행파일 들입니다.(예: ls, grep, cp, mv, rm , cat, awk, sed 등) Bash는 이들을 찾아서 실행해 달라고 커널에 요청합니다.
  3. 실행 엔진 (Execution Engine)
    파싱된 명령을 바탕으로 프로세스를 생성(fork)하고 실행(exec)합니다. 이때 파이프( | ), 리다이렉션( > ),
    백그라운드 실행( & ) 같은 복잡한 흐름을 제어합니다.

3. 왜 Bash를 지금 빌드할까?

지금 빌드할 Bash 5.3은 이제 우분투의 /bin/bash를 빌려 쓰는 게 아니라, 제가 만든 $LFS/usr/bin/bash를 쓰기 시작하겠다는 선언입니다. 또한 앞으로 빌드하게 될 Bash 5.3의 설정에서 --without-bash-malloc 을 넣게 될 텐데, Bash가 자기 멋대로 메모리를 관리하게 두지 않고, 앞서 공들여 만든 Glibc에게 메모리 관리를 맡기겠다는 뜻입니다. 그래야 시스템 전체의 메모리 관리가 꼬이지 않고 안정적이게 될 것입니다.

 

4. Bash-5.3 빌드

1. 소스 준비 및 이동

반드시 lfs 유저 계정에서 수행합시다.

cd $LFS/sources
tar -xvf bash-5.3.tar.gz 
cd bash-5.3

 

2. 설정

Bash는 소스 폴더 내에서 직접 빌드합니다.

./configure --prefix=/usr                      \
            --build=$(sh support/config.guess) \
            --host=$LFS_TGT                    \
            --without-bash-malloc

아까 3번에서 말했다시피 --without-bash-malloc 은 Bash 전용 메모리 할당자 대신 앞서 만든 Glibc의 할당자를 사용하도록 설정하는 것입니다. 이게 더 안정적이고 성능이 좋습니다.

 

3. 컴파일 및 설치

make
make DESTDIR=$LFS install

 

4. 필수 링크 생성 및 확인

리눅스 표준에 따라 /bin/sh가 bash를 가리키도록 연결해 줍니다. 많은 쉘 스크립트들이 이 경로를 기본으로 사용합니다.

# 1. 심볼릭 링크 생성
ln -sv bash $LFS/bin/sh

# 2. 설치 확인
ls -l $LFS/usr/bin/bash
ls -l $LFS/bin/sh

 

5. 뒷정리 및 스냅샷

여느 빌드와 마찬가지로 뒷정리를 한 뒤 스냅샷을 찍어 마무리합시다.

cd $LFS/sources
rm -rf bash-5.3

 

 

자~ 이것으로 Bash 빌드를 마쳤습니다. 
단순히 쉘을 설치한 것이 아니라, Glibc의 메모리 할당자를 직접 사용하도록 설정함으로써 호스트 시스템으로부터의 독립성과 안정성을 동시에 확보했습니다.

 

다음 포스팅에서는 리눅스의 가장 기본이 되는 도구 모음, Coreutils를 통해 시스템에 실제 기능을 채워 넣는 과정을 다뤄보겠습니다. 감사합니다.