사용자 정의 Linux 커널 구성, 컴파일 및 설치


38

다른 곳에서 또는 나에 의해 사용자 지정 된 배포판에서 제공하는 커널 이외의 커널을 사용하고 싶습니다. 어렵거나 위험한가요?

어디서부터 시작해야합니까?

답변:


51

현대 컴퓨터는 몇 분 만에 빌드를 할 수 있기 때문에, 대부분의 구성에서 - - 맞춤 커널을 구축하는 것은 많은 시간이 소요 될 수 있지만 특히 위험없는 경우 는 커널 작업, 현재를 유지하고 있음을 떠날 확인 부트 로더를 통한 옵션으로 사용하십시오 (아래 6 단계 참조). 이 방법으로 새 ​​것이 작동하지 않으면 이전 것을 재부팅하면됩니다.

다음 지시 사항에서 소스 트리 내의 경로는 형식을 취합니다 [src]/whatever. 여기서 [src]소스를 설치 한 디렉토리 는 다음과 같습니다 /usr/src/linux-3.13.3. su root소스 트리가 쓰기 권한 (루트가 소유해야 함) 측면에서 보안을 유지해야 하므로이 작업을 수행하려고합니다 .

일부 단계는 선택 사항이지만 나머지 프로세스를 이해하는 데 필요한 정보가 포함되어 있으므로 반드시 읽어야합니다.

  1. 소스 타르볼을 다운로드하여 압축을 풉니 다.

    이것들은 kernel.org 에서 구할 수 있습니다 . 최신 정보는 첫 페이지에 나열되어 있지만 /pub/디렉토리 내부를 살펴보면 1.0 버전으로 돌아가는 아카이브가 있습니다. 특별한 이유가 없으면 "최신 안정"을 선택하는 것이 가장 좋습니다. 이 문서를 작성할 당시에는 74MB tar.xz파일입니다.

    tarball이 다운로드되면 어딘가에 압축을 풀어야합니다. 정상적인 장소는입니다 /usr/src. 파일을 거기에 놓고 :

    tar -xJf linux-X.X.X.tar.xz
    

    개별 배포판에서는 일반적으로 바닐라 트리 대신 소스 패키지 중 하나를 사용하는 것이 좋습니다. 여기에는 배포판 특정 패치가 포함되어 있으며 중요하거나 중요하지 않을 수 있습니다. 또한 일부 사용자 공간 도구를 컴파일하는 데 사용되는 커널 포함 헤더와 일치하지만 어쨌든 동일합니다.

    15 년 이상 커스텀 커널 (주로 Fedora / Debian / Ubuntu에서)을 빌드 한 후에는 바닐라 1 소스를 사용하는 데 아무런 문제가 없었습니다 . 그러나 그렇게한다고해서 절대 최신 커널을 원한다면 배포판이 아직 패키지하지 않았다는 사실 외에는 큰 차이가 없습니다. 따라서 가장 안전한 경로는 여전히 배포 패키지를 사용하는 것 /usr/src입니다. 나는 최신 안정을 선호하므로 기니피그로 배포되기 전에 기니피그로 행동 할 수 있습니다. :)

  2. 기본 구성으로 시작하십시오 [선택 사항].

    이 작업을 수행 할 필요는 없습니다. 바로 뛰어 들어 처음부터 구성을 만들 수 있습니다. 그러나 이전에 해본 적이 없다면 많은 시행 착오를 기대 하십시오 . 이것은 또한 대부분의 옵션을 읽어야한다는 것을 의미합니다 (수백 개가 있음). 가능한 경우 기존 구성을 사용하는 것이 좋습니다. 배포판 소스 패키지를 사용한 경우 이미 [src]/.config파일 이 포함되어 있으므로 사용할 수 있습니다. 그렇지 않으면를 확인하십시오 /proc/config.gz. 2.6 커널에 추가 된 선택적 기능입니다. 존재하는 경우이를 소스 트리의 최상위 레벨 및에 복사하십시오 gunzip -c config.gz > .config.

존재하지 않는 경우이 옵션이 모듈로 구성 되었기 때문일 수 있습니다. 를 시도한 sudo modprobe configs다음 /proc디렉토리를 config.gz다시 확인 하십시오.

distro 구성은 거의 모든 가능한 하드웨어 드라이버를 포함한다는 점에서 그리 이상적이지 않습니다. 커널 모듈의 기능은 그다지 중요하지 않습니다. 모듈이기 때문에 대부분 사용되지는 않지만 빌드에 필요한 시간이 크게 늘어납니다. 또한 initramfs에 특정 핵심 모듈이 포함되어 있어야한다는 점에서 어색합니다 (아래 4 단계 참조). 그러나 기본값보다 더 나은 시작점이 될 것입니다.

구성 옵션은 한 커널 버전에서 다음 커널 버전으로 이동 및 변경되며, make config아래 프로그램 중 하나를 실행 .config하면 먼저 새 버전과 일치하도록 구문 분석 및 업데이트됩니다. 구성이 매우 오래된 버전 인 경우 이상한 결과가 발생할 수 있으므로 구성을 수행 할 때주의하십시오. AFAIK는 다른 방식으로 작동하지 않습니다 (최신 버전의 구성 사용).

  1. .config배뇨를 만듭니다 .

    [src]/.config커널을 구성하는 데 사용되는 텍스트 파일입니다. 이 파일을 직접 편집하지 마십시오 . 옵션을 변경하면 종종 교체하는 간단한 문제가 아니다 YN, 등; 일반적으로 상호 의존성 및 분기 가능성이 있습니다. 대신 커널 makefile에서 구성 대상 중 하나를 사용하려고합니다 (즉, make _____최상위 소스 디렉토리에서 명령 행에 입력 ).

    • make config가장 기본적인 것이지만 아마도 대부분의 사람들의 취향에는 맞지 않습니다. 그것은 일련의 질문 이며 많은 질문입니다. 마음이 바뀌면 다시 시작해야합니다.

    • make oldconfig같다 make config제외하고는 이미이있는 경우, .config이전 버전에서, 새로운 옵션에 관한 제외한 질문을 건너 뜁니다. 여전히 많은 것들이있을 수 있으며 대부분은 다시 당신과 관련이 없으므로 권장하지 않습니다.

    • make menuconfig내 (그리고 대부분의 다른 사람들이 선호하는) 방법입니다. TUI 인터페이스 (터미널에서 작동하는 컬러 메뉴)를 빌드하고 실행합니다. 이를 위해서는 -devncurses 용 패키지가 설치되어 있어야합니다. 를 통해 접근 할 수있는 seach를 제외하고는 상당히 설명이 필요합니다 /. F1 "도움말"은 현재 옵션에 대한 설명을 제공합니다. make nconfigF2 "syminfo"는 menuconfig의 F1과 같습니다. 몇 가지 추가 기능 이있는 대체 버전이 있습니다 .

    • make xconfig완전한 GUI 인터페이스입니다. 이 필요 qmake하고, -dev이 컴파일 및 빌드 된 프로그램, Qt를위한 패키지로 다시 설치. 이전에 이것을 사용하지 않았다면 상당한 다운로드가 될 수 있습니다. menuconfigGUI 버전을 선호하는 이유 는 옵션 계층이 전자의 연속 화면을 사용하지만 후자의 경우 열린 아코디언과 같은 방식으로 표시되기 때문입니다.

    가장 먼저해야 할 일 중 하나는 " 일반 버전"아래 "로컬 버전"문자열을 추가하는 것 입니다. 이에 대한 이유는 아래 # 5에 언급되어 있습니다.

    "Labyrinthine"은 옵션 계층을 설명하는 좋은 방법이며,이를 자세히 설명하는 것은 이와 같은 Q & A의 범위를 벗어납니다. 앉아서 모든 것을 통과하려면 시간을 따로 설정하십시오 . Greg Kroah-Hartman (리눅스 커널의 오랜 리드 개발자)은 2006 년에 작성되었지만 구성관한 장 을 포함 하는 커널에 대한 무료 온라인 서적 (아래 참조 참조)을 가지고 있습니다 . 제 충고는 합리적인 근거로 시작하는 것입니다 현재 배포판 커널 (# 2에 따라)로 이동 한 다음 필요없는 모든 내용을 선택 해제합니다. 또한 "모듈"옵션 중 일부를 "내장"으로 변경하여 다음 단계로 넘어 가고 싶을 것입니다.

  2. 소개 initramfs[선택]

    "initramfs"는 커널에 내장 및 / 또는 부팅시로드되는 압축 파일 시스템입니다. 주요 목적은 커널이 /lib/modules루트 파일 시스템에있는 모듈에 액세스하기 전에 필요한 모듈을 포함하는 것입니다 ( 예 : 해당 파일 시스템을 포함하는 장치의 드라이버). 배포판은 드라이버가 서로 호환되지 않기 때문에 항상 부분적으로 사용하므로 커널에 모두 내장 할 수는 없습니다. 대신 현재 시스템에 적합한 것을 시스템 내부에서 선택합니다 initramfs.

    이것은 잘 작동하며 어떤 종류의 단점도 나타내지 않지만 자신의 커널을 만들 때 불필요한 합병증 일 수 있습니다. 2 캐치 (catit)는 initramfs를 사용하지 않는 경우 루트 파일 시스템 (및 그 장치)의 드라이버가 커널에 내장되어 있는지 확인해야합니다. 에서 (= 모듈) 옵션과 (= 내장 ) 옵션 menuconfig의 차이점 입니다. 이 권한을 얻지 못하면 부팅 프로세스 초기에 시스템이 실패합니다. 예를 들어, SATA 하드 디스크와 ext4 루트 파일 시스템이있는 경우 내장 된 드라이버가 필요합니다. [누군가가해야 할 다른 것을 생각할 수 있다면, 의견을 남겨주세요.M*

    를 사용하려면 일반 설정initramfs 에서 적절한 옵션을 선택해야합니다 . 에 커널내장 된 것을 만들기위한 기본 안내서가 있지만 배포판에서는이 작업을 수행하지 않습니다. 외부 gzipped cpio 파일을 사용합니다. 그러나 해당 문서에는 무엇이 들어가야하는지에 대한 논의가 포함되어 있습니다 ( "initramfs의 내용"참조).[src]/Documentation/filesystems/ramfs-rootfs-initramfs.txtinitramfs

  3. 커널을 빌드하고 설치하십시오.

    다음 단계는 쉽습니다. 커널을 만들려면 디렉토리 make에서 실행 하십시오 [src]. 당신이 멀티 코어 시스템에있는 경우, 당신은 추가 할 수있는 -j N곳, 속도에 물건을 N더 없다 당신이 + 1을 할애 할 코어의 수 test또는 check. 완료되면 할 수 있습니다 make modules. 빠른 상자에서는이 모든 것이 10 분 미만이 소요됩니다.

    모든 것이 잘되면 make INSTALL_MOD_STRIP=1 modules_install. 이렇게하면 /lib/modules커널의 버전 번호와 3 단계에서 언급 한 "로컬 버전"문자열 ( 있는 경우)이 일치 하는 디렉토리가 만들어 집니다. "로컬 버전"문자열을 사용하지 않은 경우, 의존하는 것과 동일한 버전의 커널이 이미있는 경우주의 하십시오. 이러한 모듈이이를 대체하기 때문입니다. 3 INSTALL_MOD_STRIP=1 은 선택 사항입니다. 의미 는 여기를 참조하십시오 .

    그런 다음 make install커널을 기본 위치에 설치할 수 있습니다 . 그러나 내 권장 사항은 기존 파일을 덮어 쓰지 않도록 직접하는 것입니다. 에 봐 [src]/arch/[ARCH]/boot라는 이름의 파일에 대해 bzImage4 , [ARCH]이다 x86당신은 x86 또는 x86-64에 기계 (그리고 다른 것을 다른 뭔가에있는 경우)에있는 경우. /boot그것을 복사 하여 더 구체적이고 유익한 이름으로 바꾸십시오 (무엇이 중요하지는 않습니다). 와 동일한 작업을 수행 [src]/System.map하지만 다음 구성표에 따라 이름을 바꿉니다.

    System.map-[VERSION]
    

    여기 [VERSION]입니다 정확히 같은 에서 디렉토리의 이름 /lib/modules에 의해 만들어진make modules_install , 예를 들어 "로컬 버전"문자열을 포함합니다 System.map-3.13.3-mykernel.

  4. GRUB 2 부트 로더를 구성하십시오.

    사용하지 않는 경우 grub(대부분의 Linux 데스크톱 사용자), 이것은 당신에게 적용되지 않습니다. /etc/grub.d/40_custom파일이 많지 않은 파일이 있어야 합니다. 그렇지 않은 경우 루트 소유로 작성하고 chmod 755실행 가능해야합니다. 그에 추가하십시오 :

    menuentry 'My new kernel, or whatever' {
        set root='hd0,1'
        linux /boot/[name-of-kernel] root=/dev/sda1 [other kernel options]
    }
    

    initramfs를 사용하는 경우 마지막 줄도 있어야합니다 initrd /path/to/initramfs. set root=라인을 조심하십시오 . 이 예에서는 grub이 첫 번째 하드 드라이브 (hd0,1)의 첫 번째 파티션에 설치되었다고 가정합니다. 드라이브가 여러 개인 경우 파티션 UUID를 대신 사용하여 해당 행을 다음과 같이 바꾸십시오.

        search --no-floppy --fs-uuid --set=root [the UUID of the partition]
    

    애벌레는 루트 파일 시스템에 있지 않는 한,이 또한 일치해야합니다 root=상의 지침 linux루트 파일 시스템 (함께 한 표시 줄 /sbin/init/lib/modules). 해당 UUID 버전은입니다 root=UUID=[the UUID].

    기존 /boot/grub2/grub.cfg의 장치 이름에 대한 힌트를 찾을 수 있습니다 . 다음 은 grub 2에 대한 간단한 안내서입니다 . 일단 만족하면 실행하십시오 grub2-mkconfig -o /boot/grub2/grub.cfg(그러나 현재를 grub.cfg먼저 백업하십시오 ). 그런 다음 해당 파일을 편집하고 항목을 맨 위로 옮길 수 있습니다. 아직 이전 (실행) 커널 목록을 포함해야하고,이 발견되었다 때문에 배포판 (자동으로 새 커널에 대한 항목을 복제하는 메커니즘을 가질 수있다 /boot, 페도라 따라서,이 작업을 수행하는 별개의 제목을 사용하여 menuentryA는 좋은 생각). 모두 잘 진행되면 나중에 제거 할 수 있습니다.

    또한 단지를 삽입 할 수 있습니다 menuentrygrub.cfg직접하지만, 자신의 커널 (사용하는 반면 업데이트 될 때 일부 배포판이 덮어 씁니다 /etc/grub.d/이 통합 유지됩니다).

    그게 다야. 지금 당신이해야 할 모든 재부팅입니다. 작동하지 않으면 화면 출력에서 ​​문제를 추론하고 이전 커널을 선택하여 재부팅 한 다음 3 단계로 돌아가십시오 ( .config이미 사용했던 것을 제외하고 는 조정 하지 마십시오 ). 시도간에 make clean(또는 make mrproper) 하는 것이 좋지만 먼저 백업에 복사해야합니다 [src]/.config. 이는 빌드 프로세스에 사용 된 오브젝트가 오래되지 않도록하는 데 도움이됩니다.

  5. 커널 헤더와 관련하여 알.

    symlink ( ln -s -i) /lib/modules/X.X.X/source와 소스 트리가 /lib/modules/X.X.X/build있는 /usr/src디렉토리 (그것을 유지)로해야 할 것입니다. 이는 일부 사용자 공간 도구 (및 타사 드라이버 설치 프로그램)가 실행중인 커널의 소스에 액세스 할 수 있도록하기 위해 필요합니다.

    이와 관련된 문제는의 .h파일 /usr/include등입니다. 이러한 파일은 매우 점진적으로 변경되며 이전 버전과 호환됩니다 . 두 가지 선택이 있습니다.

    • 배포판에 사용 된 것을 그대로 두십시오. 전체 시스템을 정기적으로 업데이트하면 배포판은 새로운 시스템을 정기적으로 설치하므로 "최소의 번거 로움"옵션입니다.

    • 사용하십시오 make headers_install.

    이전 버전과 호환되므로 ( "이전 커널 헤더를 사용하여 C 라이브러리에 대해 작성된 프로그램은 최신 커널에서 실행해야 함") 이에 대해 너무 까다로울 필요는 없습니다. 사용자 정의 커널을 구축하고 배포판이에 "커널 헤더"패키지를 업데이트하는 동안 잠시, 그것을 유지하는 경우 유일한 잠재적 인 문제가 될 새로운 커널을 구축하는 데 사용보다 버전을, 그리고 몇 가지가있을 밝혀 비 호환성 (이후 소스에서 컴파일 된 소프트웨어에만 적용됨).

참고 문헌

다음은 몇 가지 리소스입니다.

  • [src]/README 구축 및 설치에 대한 간단한 안내서가 포함되어 있습니다.

  • [src]/Documentation디렉토리 구성에 도움이 될 수있는 정보를 많이 포함되어 있습니다.

  • Greg KH의 저서 인 Linux Kernel (많은 PDF로 무료로 제공됨)은 커널 빌드와 관련이 있습니다.

  • Grub 2에는 온라인 설명서가 있습니다 .


1. "Vanilla"는 kernel.org에서 찾을 수있는 원래의 공식적인 출처를 말합니다. 대부분의 배포판은이 바닐라 소스를 가져 와서 약간의 사용자 정의를 추가합니다.

2. 루트 파일 시스템을 마운트하기 위해 일부 사용자 공간이 필요하기 때문에 initramfs가 필요한 상황이 있습니다 (예 : 암호화되었거나 복잡한 RAID 어레이에 분산 된 경우).

3. 빌드하지 않은 경우 이미 존재하는 모듈은 제거되지 않습니다. 즉, 구성을 수정하고 make modules_install다시 실행하여 나중에 모듈을 추가 할 수 있습니다 . 일부 모듈을 빌드하려면 커널 자체를 변경해야 할 수도 있으며,이 경우 커널도 교체해야합니다. modprobe모듈을 삽입하는 데 사용하려고 할 때 알 수 있습니다 .

4. 비표준 압축 옵션을 사용한 경우이 파일의 이름이 다를 수 있습니다. 모든 가능성이 무엇인지 잘 모르겠습니다.


3
공감. 스크립트 localmodconfig와 같은 도구 및 언급을 추가 할 수 있습니다 streamline_config.pl. 기존 설정에서 작업하는 데 유용한 방법 ...
jasonwryan

1
이것은 아마도 @terdon의 이니셔티브 당 정식 유형 질문이 될 정도로 상세 할 것입니다. 메타에 대한 그의 질문에 대한 답변을 제공하십시오. 원하는 경우 또는 할 수 있습니다. 어쨌든 질문을했기 때문에 이것이 의도 한 것 같습니다. 바이너리 꾸러미를 만들기위한 배포 방법을 포함시키는 것도 도움이 될 것이라고 생각합니다.
Faheem Mitha

1
참고 : initramfs거의 항상 사용되어야합니다. 예를 들어, LVM + RAID에서 rootfs를 설정하려면 종종 rootfs가 필요합니다. 암호화 된 루트는 확실히합니다. 상당히 복잡한 RAID 설정도 가능합니다. 사소한 배열의 커널 내부 자동 어셈블리는 실제로 더 이상 사용되지 않습니다 ...
derobert

2
@derobert : "거의 항상"리눅스가 엔터프라이즈 서버를 실행하는 데 사용되고 있다는 의문이 생깁니다. 내 요점은 initramfs당신 이 그것을 사용할 필요 가 없다면 , 당신이 필요하지 않으며 이것이 프로세스를 단순화한다는 것입니다. 어쨌든, 난 등 암호화 된 루트 파일에 대해 각주를 추가 한
금발 미녀

EFI 및 Linux의 efi-stub 기능에 대한 세부 사항을 포함하십시오.
IW16
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.