IT/Linux

Gentoo 리눅스(6): 빌드지옥의 강력한 구원자 (2)

잼니크 2025. 4. 5. 15:14
반응형

안녕하세요. 잼니크입니다. 

지난 글에 이어 Gentoo 빌드 지옥을 구원(?) 해줄 겸 한번 설치도 해 볼 겸 해서 가상머신에 젠투를 설치하고 있습니다.

 

지난 글에서 Gentoo를 위한 디스크를 준비했습니다. 그리고 stage3을 이용해서 기본 시스템을 얹고, 패키지 업데이트까지 수행했습니다. 

그러면서... emerge world로 낚았지....

 

이제 Gentoo를 위한 디스크와 기본 시스템의 준비가 다 끝났습니다. 이제는 커널과 부트로더 등 부팅에 관련된 사항을 설정 하겠습니다.

 

이제 다시 젠투 핸드북으로 돌아가겠습니다. 지금의 내용은 7번째 챕터인 Configuring the Linux kernel의 내용입니다.

 

 

먼저 커널을 시작하기 전, 펌웨어들부터 준비를 합니다. 

emerge --ask sys-kernel/linux-firmware

그런데... 진행이 되지 않습니다!?

진행이 되지 않는 이유는 라이선스 제약

잘 읽어보면 패키지가 MASKED(가려졌음)이고, 그 이유가 배포 라이선스와 키워드가 없음(missing Keyworld)라고 적혀 있습니다. 

 

이게 무슨 말이냐면... 장치가 동작하기 위한 디바이스 펌웨어는 오픈소스 같은 공개된 라이선스로 배포하는 것이 아닌, 다른 형태로 배포가 됩니다. 패키지 저장소에서 (예를 들면) 독점으로 제공하는 펌웨어 등을 사용하기 위해 패키지에 허용할 라이선스를 명시해 줘야 합니다. (portage는 그렇게 구성되어 있습니다)

 

뭐... 결론은 다른 라이선스를 사용하는 소프트웨어를 설치할 수 있도록 설정을 바꾸면 되는 거 아니야?라고 생각하실 텐데... 맞습니다. (예지력 상승 1)

 

젠투 핸드북에 6번째 챕터인 Installing base system을 보면 라이선스에 대한 내용이 나옵니다. 참고해서 빠르게 적용해 봅시다. 위치를 다루는 문단은 여기입니다. 

https://wiki.gentoo.org/wiki/Handbook:AMD64/Installation/Base#Optional:_Configure_the_ACCEPT_LICENSE_variable

 

Installing the Gentoo base system - Gentoo Wiki

Chrooting Copy DNS info One thing still remains to be done before entering the new environment and that is copying over the DNS information in /etc/resolv.conf. This needs to be done to ensure that networking still works even after entering the new environ

wiki.gentoo.org

허용할 11개의 라이선스 항목 중에 (벌써 머리 아파) 잘 읽어보면 하나의 라이선스가 여러 개의 라이선스를 포함하는 항목이 있습니다. 이것을 이전에 설정한 make.conf 파일에 설정해야 합니다. 저는 모두 다 선택하는 걸로 정했습니다. 

 

아래와 같이 make.conf 파일을 수정해 줍시다. 

vi /etc/portage/make.conf
# 아래와 같이 파일 내용을 수정
COMMON_FLAGS="-march=native -O2 -pipe"
CFLAGS="${COMMON_FLAGS}"
CXXFLAGS="${COMMON_FLAGS}"
FCFLAGS="${COMMON_FLAGS}"
FFLAGS="${COMMON_FLAGS}"
RUSTFLAGS="${RUSTFLAGS} -C target-cpu=native"

LC_MESSAGES=C.utf8

MAKEOPTS="-j7"

# 이 항목이 추가되었습니다
ACCEPT_LICENSE="@EULA @BINARY-REDISTRIBUTABLE @FSF-APPROVED-OTHER @FREE-SOFTWARE @GPL-COMPATIBLE"

자! 이제 허용할 라이선스를 추가했으니... 다시 펌웨어 패키지 설치를 진행해 봅시다!

(사실 이걸 설치한다고 해서 100% 동작을 하는 건 아닌데...)

# 쉘에서 실행
emerge --ask sys-kernel/linux-firmware

설치 할지 말지 물어봅니다

설치할 수 있게 되었네요! 설치를 진행합니다. 

그다음, 마이크로 코드를 위한 패키지도 설치해 줍니다. 사실 매뉴얼에는 AMD CPU를 쓴다면, 방금 설치한 firmware 패키지에 포함되어 있지만, Intel의 CPU를 쓴다면 따로 설치해야 한다고 적혀 있습니다. 일단은 모른다는 가정하게 (있으나 없으나 설치하는 데는 무방하므로) 설치해 주겠습니다. 

# 쉘에서 실행 
emerge --ask sys-kernel/linux-firmware sys-firmware/intel-microcode

이렇게 한 번에 설치하는 방법도 있습니다 

 

끝나면 커널을 설치해 봅시다!

그렇게 커널설치가 간단한 일이 아닙니다?!

 

Gentoo 리눅스 커널을 준비해봅시다!

먼저, 커널을 설치하기 위한 도구인 sys-kernel/installkernel를 설치하고 설정합니다. 이건 커널과 장치드라이버, 펌웨어와 부트로더 등의 설정을 자동화하기 위한 도구입니다. 이걸 통해 설정 지옥을 어느 정도 도움을 줍니다. 

 

먼저 부트로더를 위한 installkernel 설정을 해봅시다. 부트로더가 뭔지는 여기 링크의 문서를 읽어보세요.

https://en.wikipedia.org/wiki/Bootloader

 

Bootloader - Wikipedia

From Wikipedia, the free encyclopedia Software responsible for starting the computer GNU GRUB, a popular open source bootloader Windows Boot Manager A bootloader, also spelled as boot loader[1][2] or called bootstrap loader, is a computer program that is r

en.wikipedia.org

보통 리눅스에서는 grub을 씁니다. 그래서 일단은 저도 grub을 쓰는 걸로 해 보겠습니다. 

그다음은 init 시스템인데... 요즘 대부분의 배포판이 사용하는 Systemd를 쓰던지, OpenRC를 쓰던지 할 수 있는데... 저는 일단 젠투 기본인 OpenRC를 쓰겠습니다. 

 

그럼 작업에 착수해 봅시다!

# 쉘에서 실행
nano /etc/portage/package.use/installkernel
# 아래 내용을 추가
sys-kernel/installkernel grub dracut

 

내용을 추가하면 sys-kernel/installkernel를 설치합니다!

# 쉘에서 실행
emerge --ask sys-kernel/installkernel

sys-kernel/installkernel 를 설치

설치를 진행합니다. (달리 옵션이 없지 않나요?!)

설치하는 동안 젠투 핸드북 문서를 또 읽어봅시다. 

 

그 다음은 바로 커널에 대한 내용입니다. 문서에서는 3가지 방법을 소개하고 있는데... 저는 이게 목적이 아니므로... 최대한 자동화되는 Distribution Kernel(배포 커널)을 바이너리로 설치하겠습니다.

# nano /etc/portage/make.conf
# 이 내용을 추가 수정 
USE="dist-kernel"

# 쉘에서 실행
emerge --ask sys-kernel/gentoo-kernel-bin sys-kernel/gentoo-sources

 

커널 바이너리를 설치

자 이제... 커널이 준비되었으니 부팅 설정을 해 봅시다. 

여기서부터는 젠투 핸드북의 8번째 챕터(https://wiki.gentoo.org/wiki/Handbook:AMD64/Installation/System)의 내용입니다. 

 

파일시스템의 UUID(Universally Unique Identifier)를 확인해 봅시다. UUID에 대한 설명은 여기를 참고하세요.

https://en.wikipedia.org/wiki/Universally_unique_identifier

 

Universally unique identifier - Wikipedia

From Wikipedia, the free encyclopedia Label used for information in computer systems A Universally Unique Identifier (UUID) is a 128-bit label used to uniquely identify objects in computer systems. The term Globally Unique Identifier (GUID) is also used, m

en.wikipedia.org

 

이전 글에서 만든 파티션의 장치 이름을 fstab에 입력합니다. 이제 fstab을 열어줍니다. 

# 쉘에서 실행
nano /etc/fstab
# 아래와 같이 입력
/dev/sda1               /boot           xfs             defaults        0 2
/dev/sda2               none            swap            sw              0 0
/dev/sda3               /               xfs             defaults,noatime 0 1

 

그다음 네트워크 설정도 해 줍니다. 

저는 호스트 이름을 gentooSaver(작명센스 참...)라고 하겠습니다. 당연히 DHCP도 사용할 수 있도록 dhcpd를 설치합니다.

# 쉘에서 실행
emerge --ask net-misc/dhcpcd

echo gentooSaver > /etc/hostname
rc-update add dhcpcd default
rc-service dhcpcd start

이제는 센스 맞게 빌드 실행해 놓고, 설정 파일을 수정합니다! (시간 절약차원에서요... 슬슬 지루해질 타임이 되었거든요)

위 그림에서 실패가 나는 건 이미 dhcpd가 동작하고 있기 때문입니다. 

설치를 처음 시작했을 때 설치 이미지에서 net-setup 명령을 했을 때 dhcpd가 동작했습니다. 

 

그다음 hosts 파일도 수정해 줍니다. 역시나 이름은 gentoosaver 입니다. 

# 쉘에서 실행
nano /etc/hosts
# 아래 내용처럼 수정
127.0.0.1       localhost gentoosaver
::1             localhost gentoosaver

 

그다음 root 사용자 암호를 만들어 줍니다. 이제 거희 끝나가는군요...

# 쉘에서 실행
passwd root

 

그 다음 시스템에서 사용할 sysklogd와 cron을 설치해 줍니다. 각각이 무엇인지는 아래 글을 참고해 주세요 

https://wiki.gentoo.org/wiki/Sysklogd

 

Sysklogd - Gentoo Wiki

syslogd — log systems messages, utility that reads and logs messages to the system console, logs files, other machines and/or users as specified by its configuration file. Syslogd supports RFC5424 and RFC3164 style log messages for both local and remote

wiki.gentoo.org

 

https://en.wikipedia.org/wiki/Cron

 

cron - Wikipedia

From Wikipedia, the free encyclopedia Job scheduler for Unix-like operating systems The cron command-line utility is a job scheduler on Unix-like operating systems. Users who set up and maintain software environments use cron to schedule jobs[1] (commands

en.wikipedia.org

 

이 둘을 설치해 봅시다. 

서비스로 등록할 때, 이 둘을 등록하면서 SSH 서버도 같이 서비스로 등록해 줍시다. 

# 쉘에서 실행
emerge --ask app-admin/sysklogd sys-process/cronie

rc-update add sysklogd default
rc-update add cronie default
rc-update add sshd default

 

그다음은, bash 자동 완성, 시간동기화를 위한 chrony, 파일 시스템을 위한 지원 도구를 같이 설치하겠습니다. 

(이제는 살짝 지루해서요)

# 쉘에서 실행
emerge --ask app-shells/bash-completion net-misc/chrony sys-fs/xfsprogs sys-block/io-scheduler-udev-rules

rc-update add chronyd default

지겹기 시작하네요... 거희 끝나갑니다.

부트로더 설정을 하겠습니다.

처음에 grub을 쓰기로 했으니... 먼저 설치부터 해 줍시다.

# 쉘에서 실행
emerge --ask --verbose sys-boot/grub
# grub을 설치 
grub-install /dev/sda
grub-mkconfig -o /boot/grub/grub.cfg

 

grub-install 명령에 뒤에는 디스크의 장치 경로를 적어주면 됩니다.

GRUB 설정의 끝!

자 이제... 설치가 끝났습니다. 

모든 것의 설정이 맞는지 확인을 재부팅하면 알게 됩니다. 

아래와 같이 차례차례 입력해서 재부팅을 합니다. 

중간에 있는 umout 명령을 하지 않으면 재 부팅이 되지 않아 강제로 껐다켜야하므로... 그대로 실행합시다!

# 쉘에서 실행
exit

cd
umount -l /mnt/gentoo/dev{/shm,/pts,}
umount -R /mnt/gentoo
reboot

두근두근...

과연... 두둥!

 

재부팅 완료

일단은 오류 없이 재 부팅 되었네요. 혹시 모르니 로그인을 해봅시다. 

음!? 비밀번호 바꿨던 거 같은데... 아닌가 보네요 

뭐... 이럴 경우에는 비밀번호를 바꿔주면 될 것 같습니다.

 

일단은 설치가 끝났으므로... 이 글은 여기서 마무리하고, 다음 글에서 이어지도록 하겠습니다.

 

혹시 이거 말고도 문제가 있을 수 있는데, 답글 주시면 아는 데로 최대한 답 드리겠습니다.

감사합니다!

 

반응형