Linux From Scratch - Version 12.1-systemd | ||
---|---|---|
Chapter 10. Making the LFS System Bootable | ||
이전 | 위로 / 처음으로 | 다음 |
/etc/fstab 파일 생성 | GRUB를 사용한 부팅 설정 |
10.3. Linux-6.7.4
Linux 패키지에는 Linux 커널이 포함되어 있습니다.
대략적인 빌드 시간: 0.6 - 20.4 SBU(일반적으로 약 1.4 SBU)
필요한 디스크 공간: 1.8 - 10.6GB(일반적으로 약 2GB)
10.3.1. 커널 설치
커널을 빌드하려면 구성, 컴파일 및 설치의 몇 가지 단계가 필요합니다. 이 책에서 커널을 구성하는 방법에 대한 대체 방법은 커널 소스 트리의 README 파일을 참조하세요.
중요
Linux 커널을 처음 빌드하는 것은 LFS에서 가장 까다로운 작업 중 하나입니다. 올바른 설정은 대상 시스템의 특정 하드웨어와 사용자의 특정 요구 사항에 따라 달라집니다. 커널에 사용할 수 있는 구성 항목은 거의 12,000개에 달하지만 대부분의 컴퓨터에는 이 중 약 1/3만 필요합니다. LFS 편집자는 이 프로세스에 익숙하지 않은 사용자는 아래 절차를 매우 면밀히 따를 것을 권장합니다. 이 절차의 목적은 나중에 11.3장 "시스템 재부팅하기"에서 재부팅할 때 명령줄에서 로그인할 수 있는 초기 시스템을 만드는 것입니다. 이 시점에서 최적화 및 사용자 설정은 목표가 아닙니다.
커널 구성에 대한 일반적인 정보는 간략하게 알아보는 커널을 참조하세요. 커널 구성 및 빌드에 대한 추가 정보는 커널 개요에서 확인할 수 있습니다. 이러한 참조 자료는 다소 오래되었지만 여전히 프로세스에 대한 합리적인 개요를 제공합니다.
다른 모든 방법이 실패하면 lfs-support 메일링 리스트에서 도움을 요청할 수 있습니다. 스팸을 방지하려면 메일링 리스트에 가입해야 한다는 점에 유의하세요.
다음 명령을 실행하여 컴파일을 준비합니다.
make mrproper
이렇게 하면 커널 트리가 완전히 깨끗해집니다. 커널 팀은 각 커널 컴파일 전에 이 명령을 실행할 것을 권장합니다. 압축을 푼 후 소스 트리가 깨끗해졌다고 안심하지 마세요.
커널 옵션을 구성하는 방법에는 여러 가지가 있습니다. 일반적으로 메뉴 중심 인터페이스를 통해 구성하는 경우가 많습니다.
make menuconfig
선택적 make 환경 변수의 의미는 다음과 같습니다:
- LANG=<host_LANG_value> LC_ALL= \\이렇게 하면 호스트에서 사용되는 로캘 설정이 설정됩니다. 이는 UTF-8 리눅스 텍스트 콘솔에서 적절한 메뉴 구성 ncurses 인터페이스 선 그리기를 위해 필요할 수 있습니다. \\이 옵션을 사용하는 경우 <host_LANG_value>를 호스트의 $LANG 변수 값으로 바꿔야 합니다. 또는 호스트의 $LC_ALL 또는 $LC_CTYPE 값을 대신 사용할 수도 있습니다.
- make menuconfig
ncurses 메뉴 기반 인터페이스를 시작합니다. 다른 (그래픽) 인터페이스의 경우 make help를 입력합니다.
참고
커널 구성을 설정하기 위한 좋은 시작점은 make defconfig를 실행하는 것입니다. 이렇게 하면 현재 시스템 아키텍처를 고려한 기본 구성이 기본적인 상태로 설정됩니다.
다음 기능을 활성화/비활성화/설정하지 않으면 시스템이 제대로 작동하지 않거나 아예 부팅되지 않을 수 있습니다.
General setup --->
[ ] Compile the kernel with warnings as errors [WERROR]
[ ] Auditing support [AUDIT]
CPU/Task time and stats accounting --->
[*] Pressure stall information tracking [PSI]
[ ] Require boot parameter to enable pressure stall information tracking
... [PSI_DEFAULT_DISABLED]
< > Enable kernel headers through /sys/kernel/kheaders.tar.xz [IKHEADERS]
[*] Control Group support ---> [CGROUPS]
[*] Memory controller [MEMCG]
[ ] Configure standard kernel features (expert users) ---> [EXPERT]
Processor type and features --->
[*] Build a relocatable kernel [RELOCATABLE]
[*] Randomize the address of the kernel image (KASLR) [RANDOMIZE_BASE]
General architecture-dependent options --->
[*] Stack Protector buffer overflow detection [STACKPROTECTOR]
[*] Strong Stack Protector [STACKPROTECTOR_STRONG]
[*] Networking support ---> [NET]
Networking options --->
[*] TCP/IP networking [INET]
<*> The IPv6 protocol ---> [IPV6]
Device Drivers --->
Generic Driver Options --->
[ ] Support for uevent helper [UEVENT_HELPER]
[*] Maintain a devtmpfs filesystem to mount at /dev [DEVTMPFS]
[*] Automount devtmpfs at /dev, after the kernel mounted the rootfs
... [DEVTMPFS_MOUNT]
Firmware loader --->
< /*> Firmware loading facility [FW_LOADER]
[ ] Enable the firmware sysfs fallback mechanism
... [FW_LOADER_USER_HELPER]
Firmware Drivers --->
[*] Export DMI identification via sysfs to userspace [DMIID]
Graphics support --->
< /*/M> Direct Rendering Manager (XFree86 4.1.0 and higher DRI support) --->
... [DRM]
# If [DRM] is selected as * or M, this must be selected.
[ /*] Enable legacy fbdev support for your modesetting driver
... [DRM_FBDEV_EMULATION]
Console display driver support --->
# If [DRM] is selected as * or M, this must be selected.
[ /*] Framebuffer Console support [FRAMEBUFFER_CONSOLE]
File systems --->
[*] Inotify support for userspace [INOTIFY_USER]
Pseudo filesystems --->
[*] Tmpfs virtual memory file system support (former shm fs) [TMPFS]
[*] Tmpfs POSIX Access Control Lists [TMPFS_POSIX_ACL]
64비트 시스템을 구축하는 경우 몇 가지 추가 기능을 활성화합니다. 메뉴 구성을 사용하는 경우 옵션은 종속성이 선택된 후에만 표시되므로 CONFIG_PCI_MSI, CONFIG_IRQ_REMAP, 마지막 CONFIG_X86_X2APIC의 순서로 활성화하세요.
Processor type and features --->
[*] Support x2apic [X86_X2APIC]
Device Drivers --->
[*] PCI support ---> [PCI]
[*] Message Signaled Interrupts (MSI and MSI-X) [PCI_MSI]
[*] IOMMU Hardware Support ---> [IOMMU_SUPPORT]
[*] Support for Interrupt Remapping [IRQ_REMAP]
RAM이 4GB를 초과하는 하드웨어에서 실행되는 32비트 시스템을 구축하는 경우 커널이 최대 64GB의 물리적 RAM을 사용할 수 있도록 구성을 조정하세요.
Processor type and features --->
High Memory Support --->
(X) 64GB [HIGHMEM64G]
LFS 시스템의 파티션이 NVME SSD에 있는 경우(즉, 파티션의 장치 노드가 /dev/sd*가 아닌 /dev/nvme*인 경우) NVME 지원을 활성화하지 않으면 LFS 시스템이 부팅되지 않습니다.
Device Drivers --->
NVME Support --->
<*> NVM Express block device [BLK_DEV_NVME]
참고 “IPv6 프로토콜”이 반드시 필요한 것은 아니지만, 시스템 개발자는 이를 적극 권장합니다.
시스템 요구 사항에 따라 몇 가지 다른 옵션이 필요할 수 있습니다. BLFS 패키지에 필요한 옵션 목록은 BLFS 커널 설정 색인을 참조하세요.
*참고*
호스트 하드웨어가 UEFI를 사용 중이고 이를 통해 LFS 시스템을 부팅하려는 경우 호스트 배포판의 UEFI 부트로더를 사용하더라도 BLFS 페이지에 따라 일부 커널 구성을 조정해야 합니다.
위의 구성 항목에 대한 근거는 다음과 같습니다:
- Randomize the address of the kernel image (KASLR)
- 커널 이미지에 대해 ASLR을 활성화하여 커널의 민감한 데이터 또는 코드의 고정 주소를 기반으로 하는 일부 공격을 완화합니다.
- Compile the kernel with warnings as errors
- 컴파일러 및/또는 구성이 커널 개발자의 설정과 다른 경우 빌드 실패가 발생할 수 있습니다.
- Enable kernel headers through /sys/kernel/kheaders.tar.xz
- 이를 위해서는 커널 빌드에
cpio
가 필요합니다.cpio
는 LFS에서 설치되지 않습니다.
- Configure standard kernel features (expert users)
- 이렇게 하면 구성 인터페이스에 일부 옵션이 표시되지만 이러한 옵션을 변경하면 위험할 수 있습니다. 이 기능을 잘 모르는 경우 사용하지 마세요.
- Strong Stack Protector
- 커널에 SSP를 사용 설정합니다. GCC를 구성하는 –enable-default-ssp를 사용하여 전체 사용자 공간에 대해 활성화했지만 커널은 SSP에 대해 GCC 기본 설정을 사용하지 않습니다. 여기에서 명시적으로 활성화합니다.
- Support for uevent helper
- 이 옵션을 설정하면 Udev를 사용할 때 장치 관리할때 인터페이스를 설정 가능합니다.
- Maintain a devtmpfs
- 이 옵션을 선택하면 Udev가 실행되지 않아도 커널에 의해 채워지는 자동화된 디바이스 노드가 생성됩니다. 그런 다음 Udev가 이 위에서 실행되어 권한을 관리하고 심볼릭 링크를 추가합니다. 이 구성 항목은 Udev의 모든 사용자에게 필요합니다.
- Automount devtmpfs at /dev
- 초기화를 시작하기 직전에 루트 파일 시스템으로 전환할 때 장치의 커널 보기를 /dev에 마운트합니다.
- Enable legacy fbdev support for your modesetting driver and Framebuffer Console support
- 이는 DRI(직접 렌더링 인프라) 드라이버로 구동되는 GPU에서 Linux 콘솔을 표시하는 데 필요합니다. CONFIG_DRM(다이렉트 렌더링 관리자)이 활성화된 경우 이 두 옵션도 활성화해야 하며, 그렇지 않으면 DRI 드라이버가 로드된 후 빈 화면이 표시됩니다.
- Support x2apic
- x2APIC 모드에서 64비트 x86 프로세서의 인터럽트 컨트롤러 실행을 지원합니다. 64비트 x86 시스템에서 펌웨어로 x2APIC을 활성화할 수 있으며, 이 옵션을 활성화하지 않은 커널은 펌웨어로 x2APIC을 활성화하면 부팅 시 패닉에 빠집니다. 이 옵션은 효과가 없지만 펌웨어에 의해 x2APIC이 비활성화되어 있는 경우에도 아무런 해가 없습니다.
또는 일부 상황에서는 make oldconfig
가 더 적합할 수 있습니다. 자세한 내용은 README
파일을 참조하세요.
원하는 경우 커널 구성 파일인 .config를 호스트 시스템(사용 가능하다고 가정)에서 압축을 푼 리눅스-6.7.4 디렉터리로 복사하여 커널 구성을 건너뛸 수 있습니다. 그러나 이 옵션은 권장하지 않습니다. 모든 구성 메뉴를 탐색하고 커널 구성을 처음부터 새로 만드는 것이 더 나은 경우가 많습니다.
커널 이미지와 모듈을 컴파일합니다.
make
커널 모듈을 사용하는 경우 /etc/modprobe.d에서 모듈 구성이 필요할 수 있습니다. 모듈 및 커널 구성과 관련된 정보는 섹션 9.3, "장치 및 모듈 처리 개요"와 리눅스-6.7.4/Documentation
디렉터리의 커널 설명서에 나와 있습니다. 또한 modprobe.d(5)도 관심을 가질 수 있습니다.
커널 구성에서 모듈 지원을 비활성화하지 않았다면 다음과 같이 모듈을 설치하세요.
make modules_install
커널 컴파일이 완료되면 설치를 완료하기 위해 추가 단계가 필요합니다. 일부 파일을 /boot
디렉터리에 복사해야 합니다.
주의
LFS 시스템에 별도의 /boot 파티션을 사용하기로 결정한 경우(호스트 배포판과 /boot 파티션을 공유할 수도 있음) 아래에 복사한 파일은 이 파티션으로 이동해야 합니다. 가장 쉬운 방법은 먼저 /etc/fstab
에 /boot
항목을 만든 다음(자세한 내용은 이전 섹션 참조), 루트 환경에서 루트 사용자로 다음 명령을 실행하는 것입니다.
mount /boot
장치 노드 경로는 마운트에서 /etc/fstab
에서 읽을 수 있으므로 명령에서 생략합니다.
커널 이미지 경로는 사용 중인 플랫폼에 따라 다를 수 있습니다. 아래 파일 이름은 사용자의 취향에 맞게 변경할 수 있지만, 다음 섹션에서 설명하는 부팅 프로세스의 자동 설정과 호환되려면 파일 이름의 줄기는 vmlinuz여야 합니다. 다음 명령은 x86 아키텍처를 가정합니다.
cp -iv arch/x86/boot/bzImage /boot/vmlinuz-6.7.4-lfs-12.1-systemd
System.map
은 커널의 심볼 파일입니다. 이 파일은 커널 API의 모든 함수의 함수 진입점과 실행 중인 커널의 커널 데이터 구조 주소를 매핑합니다. 커널 문제를 조사할 때 리소스로 사용됩니다. 다음 명령을 실행하여 맵 파일을 설치합니다.
cp -iv System.map /boot/System.map-6.7.4
위의 make menuconfig
단계에서 생성된 커널 구성 파일 .config
에는 방금 컴파일한 커널에 대한 모든 구성 선택 사항이 포함되어 있습니다. 나중에 참조할 수 있도록 이 파일을 보관해 두는 것이 좋습니다.
cp -iv .config /boot/config-6.7.4
Linux 커널에 대한 설명서를 설치합니다.
cp -r Documentation -T /usr/share/doc/linux-6.7.4
커널 소스 디렉터리의 파일을 루트가 소유하지 않았다는 점에 유의하세요. 패키지가 사용자 루트로 압축 해제될 때마다(chroot 내부에서 했던 것처럼) 파일은 패키지의 컴퓨터에서 무엇이든 사용자 및 그룹 ID를 갖습니다. 이는 일반적으로 설치 후 소스 트리가 제거되므로 다른 패키지를 설치할 때는 문제가 되지 않습니다. 하지만 Linux 소스 트리는 오랫동안 유지되는 경우가 많습니다. 이 때문에 패키저가 사용한 사용자 ID가 컴퓨터의 누군가에게 할당될 가능성이 있습니다. 그러면 해당 사용자가 커널 소스에 대한 쓰기 권한을 갖게 됩니다.
참고
대부분의 경우 나중에 BLFS에서 설치될 패키지에 대해 커널 구성을 업데이트해야 합니다. 다른 패키지와 달리 새로 빌드된 커널을 설치한 후에는 커널 소스 트리를 제거할 필요가 없습니다.
커널 소스 트리를 유지하려면 linux-6.7.4
디렉터리에서 chown -R 0:0
을 실행하여 모든 파일이 사용자 루트에 의해 소유되는지 확인합니다.
경고
일부 커널 문서에서는 커널 소스 디렉터리를 가리키는 심볼릭 링크를 /usr/src/linux에서 만들 것을 권장합니다. 이는 2.6 시리즈 이전의 커널에만 해당되며 기본 LFS 시스템이 완료된 후 빌드하려는 패키지에 문제를 일으킬 수 있으므로 LFS 시스템에서 생성해서는 안 됩니다.
경고
시스템의 include 디렉토리(/usr/include)에 있는 헤더는 항상 Glibc가 컴파일된 헤더, 즉 섹션 5.4, “Linux-6.7.4 API 헤더”에 설치된 위생 처리된 헤더를 사용해야 합니다. 따라서 원시 커널 헤더나 다른 커널 위생 처리된 헤더로 대체해서는 안 됩니다.
10.3.2. Linux 모듈 로드 순서 구성하기
대부분의 경우 Linux 모듈은 자동으로 로드되지만 때로는 특정 지시가 필요한 경우가 있습니다. 모듈을 로드하는 프로그램인 modprobe
또는 insmod
는 이를 위해 /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
10.3.3. Linux 패키지 구성
설치된 파일: config-6.7.4, vmlinuz-6.7.4-lfs-12.1-systemd 및 System.map-6.7.4 설치된 디렉터리: /lib/modules, /usr/share/doc/linux-6.7.4
간략한 설명
- config-6.7.4 \\커널에 대한 모든 구성 선택 사항을 포함합니다.
- vmlinuz-6.7.4-lfs-12.1-systemd \\리눅스 시스템의 엔진. 컴퓨터를 켤 때 커널은 운영 체제에서 가장 먼저 로드되는 부분입니다. 커널은 컴퓨터 하드웨어의 모든 구성 요소를 감지하고 초기화한 다음 이러한 구성 요소를 소프트웨어에 파일 트리로 제공하고 단일 CPU를 여러 프로그램을 동시에 실행할 수 있는 멀티태스킹 머신으로 전환합니다.
- System.map-6.7.4 \\주소 및 기호 목록; 커널의 모든 함수와 데이터 구조의 진입점과 주소를 매핑합니다.