본문 바로가기
SW/Linux (Kernel)

Linux From Scratch 개발 노트 7 - 시스템 소프트웨어 설치

by FastBench 2024. 9. 17.
반응형

 

참고 

github : https://github.com/NuttyJamie/LinuxFromScratch-for-Korean

 

GitHub - NuttyJamie/LinuxFromScratch-for-Korean: Korean translation of the LFS project.

Korean translation of the LFS project. Contribute to NuttyJamie/LinuxFromScratch-for-Korean development by creating an account on GitHub.

github.com

 

html 문서 : https://rawcdn.githack.com/NuttyJamie/LinuxFromScratch-for-Korean/88bdabae8abf2fad511b497b0dc676e6ac95b965/9.1/BOOK/HTML/index.html

 

Linux From Scratch

 

rawcdn.githack.com

 

이 장에서는 빌드 구역에 들어가 LFS 시스템 구축을 본격적으로 시작한다. 즉 우리는 임시 미니 리눅스 시스템으로 chroot 하고 몇 가지 최종 준비를 한 다음 패키지 설치를 시작할 것이다.

 

가상 커널 파일 시스템 준비

가상 커널 파일 시스템이란?

가상 커널 파일 시스템은 커널이 관리하는 메모리 기반의 파일 시스템으로, 물리적 디스크가 아닌 메모리에 존재합니다. 이 파일 시스템들은 시스템 정보, 프로세스 상태, 하드웨어 정보 등을 사용자 공간에 노출하여, 응용 프로그램들이 커널 내부의 다양한 정보에 접근할 수 있도록 합니다.

주요 가상 커널 파일 시스템에는 다음이 포함됩니다:

  1. proc 파일 시스템 (/proc):
    • 역할: 프로세스와 시스템 정보를 제공합니다.
    • 특징: 현재 실행 중인 프로세스 정보, 시스템 메모리 사용량, 커널 매개변수 등을 확인할 수 있습니다.
  2. sysfs 파일 시스템 (/sys):
    • 역할: 커널 객체와 속성에 대한 정보를 제공합니다.
    • 특징: 시스템의 하드웨어 장치, 드라이버, 버스 등의 정보를 구조화된 형태로 제공합니다.
  3. devpts 파일 시스템 (/dev/pts):
    • 역할: 가상 터미널(PTY: Pseudo Terminal) 장치 노드를 관리합니다.
    • 특징: 멀티플렉싱된 터미널 세션(예: SSH, X 터미널)을 지원합니다.
  4. tmpfs 파일 시스템 (/run, /dev/shm 등):
    • 역할: 임시 파일 시스템으로, RAM을 사용하여 빠른 입출력을 제공합니다.
    • 특징: 시스템 재부팅 시 데이터가 사라집니다.

파일시스템할 마운트할 디렉토리 생성

mkdir -pv $LFS/{dev,proc,sys,run}

 

초기 장치 노드 생성

커널이 시스템을 부팅할 때, 몇개의 장치 노드 특히 console 과 null 장치가 있어야 한다. 이 장치노드은 udevd 가 시작되기 전에 리눅스가 init=bin/bash로 시작 될 때 사용할 수 있도록 하드디스크에 위치해야 한다.

 

udevd는 리눅스 시스템에서 장치 노드의 동적생성 및 관리를 당당하는 데몬인데, 초기 단계에서는 이를 실행하지 않기 때문에 최소한의 장치 노드를 수동으로 생성해야 한다.

그리고 리눅스커널은 부팅시 마지막 절차로 /init 이나 /sbin/init 등의  init 스크립트를 실행하는데, 초기 LFS에는 이가 구비되어 있지 않기 때문에 /bin/bash을 초기 프로세스로 실행하여 최소한의 쉘 환경을 제공한다.

 

장치노드 : /dev디렉토리에 위치한 특별할 파일로, 커널과 사용자 공간 프로그램 사이의 인터페이스 역할을 한다. 실제 하드웨어 장치나 가상장치에 대한 접근을 가능하게 하며, 프로그램들이 장치와 상호 작용할 수 있도록 한다.

 

  • /dev/console: 커널 메시지 출력 및 초기화 스크립트와의 상호 작용에 사용됩니다.
  • /dev/null: 데이터가 버려지는 "빈 공간"으로, 프로그램에서 불필요한 출력을 버릴 때 사용합니다.

 

mkomd -m 600 $LFS/dev/console c 5 1
mknod -m 666 $LFS/dev/null c 1

 

/dev 마운팅

/dev 디렉토리에 장치를 들이는 권장되는 방법은 /dev 디렉토리에 가상 파일 시스템(예: tmpfs)을 마운트하고, 장치가 감지되거나 액세스될 때 해당 가상 파일 시스템에 동적으로 생성되도록 하는 것이다. 장치 생성은 일반적으로 부팅 절차 중 Udev에 의해 이뤄진다. 지금 이 새로운 시스템은 아직 Udev가 없고 부팅되지도 않았기 때문에 수동으로 마운트를 하고 /dev를 채워야 한다. 이를 위해 호스트 시스템의 /dev 디렉토리를 바인딩한다.

바인드 마운트란 무엇인가?

  • 바인드 마운트는 기존의 디렉토리나 마운트 지점을 다른 위치에 연결하여 동일한 내용을 공유하는 특별한 마운트 방식입니다.
  • 즉, 한 디렉토리의 내용을 다른 경로에서 그대로 접근할 수 있게 합니다.
mount -v --bind /dev $LFS/dev

왜 필요한가?

  • LFS 빌드 과정에서 일부 프로그램이나 스크립트는 /dev 디렉토리에 접근하여 장치 노드를 필요로 합니다.
  • udev가 아직 설치되지 않았기 때문에, /dev에 필요한 장치 노드가 존재하지 않습니다.
  • 호스트의 /dev를 사용함으로써 이 문제를 해결하고, 빌드 과정이 원활하게 진행되도록 합니다.

가상 커널 파일 시스템 마운팅

mount -vt devpts devpts $LFS/dev/pts -o gid=5,mode=620
mount -vt proc proc $LFS/proc
mount -vt sysfs sysfs $LFS/sys
mount -vt tmpfs tmpfs $LFS/run

devpts에 대한 마운트 옵션들의 의미:

gid=5

devpts가 생성한 모드 장치 노드들을 그룹 ID 5가 소유한다. 이것은 우리가 나중에 tty 그룹에 사용할 ID이다. 호스트 시스템이 그 tty 그룹에 다른 ID를 사용할지도 모르기 때문에 이름 대신 그룹 ID를 사용한다.

mode=0620

devpts가 생성한 모든 장치 노드를 0620 모드(사용자는 읽기/쓰기 가능, 그룹은 쓰기 가능)로 설정한다. 위의 옵션과 함께, devpts가 grantpt()의 요구 사항을 만족하는 장치 노드를 생성하도록 한다. 다시말해 기본적으로 설치되지 않는 Glibc pt_chown helper 바이너리가 필요하지 않다는 의미이다.

 

어떤 호스트 시스템에서는, /dev/shm이 /run/shm에 대한 심볼릭 링크이다. /run tmpfs은 위에 마운트되었으므로 디렉토리만 작성하면 된다.

if [ -h $LFS/dev/shm ]; then
  mkdir -pv $LFS/$(readlink $LFS/dev/shm)
fi

 

findmnt 커맨드를 통해 마운트 상태를 확인할 수 있다.

|-/mnt/lfs                               /dev/nvme0n1p3   ext4      rw,relatime
| |-/mnt/lfs/dev                         udev             devtmpfs  rw,nosuid,relatime,size=7032776k,
| | `-/mnt/lfs/dev/pts                   devpts           devpts    rw,relatime,gid=5,mode=620,ptmxmo
| |-/mnt/lfs/proc                        proc             proc      rw,relatime
| |-/mnt/lfs/sys                         sysfs            sysfs     rw,relatime
| `-/mnt/lfs/run                         tmpfs            tmpfs     rw,relatime,inode64

 

반응형

댓글