8.3. 리눅스-5.5.3

이 리눅스 패키지는 리눅스 커널을 포함하고 있다.

예상 빌드 시간: 4.4 - 66.0 SBU (일반적으로 약 6 SBU)
필요 디스크 공간: 960 - 4250 MB (일반적으로 약 1100 MB)

8.3.1. 커널의 설치

커널 빌드는 설정, 컴파일, 설치 등 몇 단계를 거쳐야 한다. 이 책의 커널을 구성하는 다른 방법은 커널 소스 트리의 README 파일을 참고하라.

다음 명령을 실행하여 컴파일을 준비한다:

make mrproper

이는 기존 컴파일 설정을 제거하여 커널 트리를 완전히 깨끗하게 한다. 커널 팀은 커널 컴파일 전에 매번 이 명령을 실행할 것을 권장한다. tar 아카이브를 이제 막 해제했다고 해서 깨끗한 상태인 것으로 믿어선 안 된다.

메뉴 기반 인터페이스를 통해 커널을 구성하라. 커널 구성에 대한 일반적인 정보는 http://www.linuxfromscratch.org/hints/downloads/files/kernel-configuration.txt를 참고하라. BLFS는 http://www.linuxfromscratch.org/blfs/view/9.1/longindex.html#kernel-config-index에서 LFS 외부 패키지의 특정 커널 구성 요구 사항에 대한 정보를 제공한다. 커널 구성 및 빌드에 대한 추가 정보는 http://www.kroah.com/lkn/에서 찾을 수 있다.

[참고]

참고

make defconfig를 실행하여 커널 구성을 시작하는 것이 좋다. 이렇게 하면 기본 구성이 현재 시스템 아키텍쳐를 고려해서 양호한 상태로 설정된다.

다음 기능을 활성화/비활성화/설정하라. 그렇지 않으면 시스템이 제대로 작동하지 않거나 전혀 부팅되지 않을 수 있다:

Device Drivers  --->
  Generic Driver Options  --->
   [ ] Support for uevent helper [CONFIG_UEVENT_HELPER]
   [*] Maintain a devtmpfs filesystem to mount at /dev [CONFIG_DEVTMPFS]

Kernel hacking  --->
       Choose kernel unwinder (Frame pointer unwinder)  ---> [CONFIG_UNWINDER_FRAME_POINTER]

시스템 요건에 따라 몇 가지 다른 옵션이 필요할 수도 있다. BLFS 패키지에 필요한 옵션 목록은 BLFS Index of Kernel Settings (http://www.linuxfromscratch.org/blfs/view/9.1/longindex.html#kernel-config-index)를 참고하라.

[참고]

참고

호스트 컴퓨터가 UEFI를 사용 중이라면, 위의 'make defconfig'는 일부 EFI 관련 커널 옵션을 자동으로 추가할 것이다.

호스트의 UEFI 부팅 환경 내에서 LFS 커널을 부팅하려면 커널에 다음 옵션이 선택되어 있어야 한다:

Processor type and features  --->
   [*]   EFI stub support  [CONFIG_EFI_STUB]

LFS 내에서 UEFI 환경을 관리을 관리하는 법에 관한 더 자세한 설명은 http://www.linuxfromscratch.org/hints/downloads/files/lfs-uefi.txt의 lfs-uefi.txt에서 다룬다.

위 설정 항목에 대한 해석:

support for uevent helper

Udev/Eudev을 사용할 때 이 옵션을 설정하면 장치 관리에 방해가 될 수 있다.

Maintain a devtmpfs

이렇게 하면 Udev 실행 없이도 커널에 의해 설정되는 자동화된 장치 노드가 생성된다. 그러면 Udev는 이 위에서 실행되어 권한을 관리하고 심볼릭 링크를 추가한다. 이 설정은 모든 Udev/Eudev 사용자에게 필요하다.

make menuconfig

선택적 make 환경 변수들의 의미:

LANG=<host_LANG_value> LC_ALL=

로케일을 호스트와 동일하게 설정한다. 이는 UTF-8 리눅스 텍스트 콘솔에서 적절한 menuconfig ncurses 인터페이스 행을 출력하는 데에 필요할 수 있다.

사용할 경우, 반드시 <host_LANG_value>를 호스트의 $LANG 변수의 값으로 대체하라. 또는 호스트의 $LC_ALL이나 $LC_CTYPE 값을 대신 사용할 수도 있다.

또 어떤 상황에서는 make oldconfig가 더 적절할 수 있다. 자세한 정보는 README 파일을 참고하라.

원한다면 커널 구성 파일인 .config를 호스트 시스템(해당 파일이 호스트에 존재한다고 가정한다)에서 압축 해제된 linux-5.5.3 디렉토리로 복사하여 커널 설정을 건너 뛰어도 좋다. 그러나 이 옵션은 권장하지는 않는다. 모든 설정 메뉴를 탐색하고 처음부터 커널 구성을 만드는 것이 더 좋다.

커널 이미지와 모듈들을 컴파일한다:

make

커널 모듈을 사용한다면, /etc/modprobe.d의 모듈 설정이 필요하다. 모듈 및 커널 설정에 관련된 정보는 7.3절. “장치 및 모듈 핸들링 개요”linux-5.5.3/Documentation 디렉토리의 커널 문서에 수록되어 있다. 또 modprobe.d(5)도 유용할 것이다.

커널 설정에서 모듈 지원이 비활성화되지 않았다면 다음과 같이 모듈을 설치하라:

make modules_install

커널 컴파일이 완료된 후, 설치를 완료하기 위해선 추가 절차가 필요하다. 일부 파일을 /boot 디렉토리에 복사해야 한다.

[경고]

경고

호스트 시스템에 별도의 /boot 파티션이 있다면 아래 지침에서 복사할 파일을 그 곳에 넣어야 한다. 가장 쉬운 방법은 호스트(chroot 외부)에서 /boot를 /mnt/lfs/boot에 바인딩하는 것이다. 호스트 시스템에서 root 유저로 다음을 실행하라:

mount --bind /boot /mnt/lfs/boot

커널 이미지의 경로는 사용 중인 플랫폼에 따라 달라질 수 있다. 아래 파일 이름은 취향껏 변경할 수 있지만, 파일 이름의 어근은 다음 절에서 설명할 부팅 절차의 자동 설정과 호환되도록 vmlinuz여야 한다. 다음 명령은 x86 아키텍쳐를 가정한다:

cp -iv arch/x86/boot/bzImage /boot/vmlinuz-5.5.3-lfs-9.1

System.map은 커널을 위한 심볼 파일이다. 실행 중인 커널에 대한 커널 데이터 구조의 주소뿐만 아니라 커널 API에 있는 모든 함수의 엔트리 포인트를 매핑한다. 이는 커널 문제를 조사할 때 자료로 사용된다. 다음 명령을 실행하여 맵 파일을 설치하라:

cp -iv System.map /boot/System.map-5.5.3

위의 make menuconfig 단계에서 생성된 커널 설정 파일 .config에는 방금 컴파일된 커널에 대한 모든 설정 사항이 포함되어 있다. 나중에 참고할 수 있도록 이 파일을 보관하는 것이 좋다:

cp -iv .config /boot/config-5.5.3

리눅스 커널에 대한 문서를 설치한다:

install -d /usr/share/doc/linux-5.5.3
cp -r Documentation/* /usr/share/doc/linux-5.5.3

커널 소스 디렉토리의 파일은 root에 의해 소유되지 않는다는 점에 주의해야 한다. 패키지가 root 유저에 의해 압축 해제될 때는(우리가 chroot 안에서 그랬듯이), 그 파일들은 패키지를 압축한 사람의 컴퓨터에 있던 사용자 및 그룹 ID를 갖는다. 이는 다른 모든 패키지들에 대해선 설치 후 소스 트리가 제거되기 때문에 문제가 되지 않지만, 리눅스 소스 트리는 보통 오랫동안 보존한다. 때문에 패키징을 한 사용자의 ID 번호가 시스템의 누군가에게 할당 될 가능성이 있다. 그러면 그 사람은 커널 소스에 대한 쓰기 권한을 갖게 된다.

[참고]

참고

대부분의 경우 나중에 BLFS에서 설치될 패키지에 맞게 커널 구성을 업데이트해야 한다. 다른 패키지와 달리 새로 빌드된 커널을 설치한 후에는 커널 소스 트리를 제거할 필요가 없다.

커널 소스 트리를 보존하려면 linux-5.5.3 디렉토리에서 chown -R 0:0을 실행하여 모든 파일이 root 유저에 의해 소유되도록 하라.

[주의]

주의

일부 커널 문서에서는 /usr/src/linux에 커널 소스 디렉토리를 가리키는 심볼릭 링크를 생성할 것을 권장한다. 이는 2.6 버전 이전의 커널에 한정되며, 기본 LFS 시스템이 완성되면 구축하고자 하는 패키지에 문제를 일으킬 수 있으므로 LFS 시스템에서 생성해서는 안 된다.

[주의]

주의

시스템의 include 디렉토리(/usr/include)의 헤더들은 항상 Glibc가 컴파일된 헤더, 즉 6.7절. “리눅스-5.5.3 API 헤더”에서 설치된 수정 헤더(the sanitised headers)여야 한다. 따라서 원시 커널 헤더나 다른 커널 수정 헤더로 대체해서는 안 된다.

8.3.2. 리눅스 모듈 로드 순서 설정

리눅스 모듈은 대부분 자동으로 로드되지만, 때로는 특별한 방법이 필요할 때도 있다. modprobeinsmod와 같이 모듈을 로드하는 프로그램들은 /etc/modprobe.d/usb.conf를 이러한 목적으로 사용한다. USB 드라이버 (ehci_hcd, ohci_hcd 및 uhci_hcd)가 모듈로 빌드된 경우 올바른 순서로 로드되도록 하기 위해선 이 파일을 생성해야 한다; 부팅 시 경고 출력을 피하려면 ehci_hcd가 ohci_hcd와 uhci_hcd보다 먼저 로드되어야 한다.

다음을 실행하여 새 /etc/modprobe.d/usb.conf 파일을 생성하라:

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

8.3.3. 리눅스의 내용

설치된 파일들: config-5.5.3, vmlinuz-5.5.3-lfs-9.1, System.map-5.5.3
설치된 디렉토리들: /lib/modules, /usr/share/doc/linux-5.5.3

요약

config-5.5.3

커널에 대한 모든 구성 선택 사항 포함

vmlinuz-5.5.3-lfs-9.1

리눅스 시스템의 엔진. 컴퓨터를 켤 때, 로딩되는 운영 체제의 첫 번째 부분이 이 커널이다. 컴퓨터 하드웨어의 모든 요소를 감지하고 초기화한 다음, 이러한 부품들을 소프트웨어의 파일 트리로 사용할 수 있게 하며 단일 CPU로 하여금 겉보기에 동시에 여러 프로그램을 실행하는 멀티 태스킹이 가능하도록 한다.

System.map-5.5.3

주소 및 심볼 목록. 커널에 있는 모든 함수와 데이터 구조의 엔트리 포인트와 주소를 매핑한다.