>  기사  >  운영 및 유지보수  >  리눅스는 왜 커널을 컴파일합니까?

리눅스는 왜 커널을 컴파일합니까?

青灯夜游
青灯夜游원래의
2023-03-30 14:03:542155검색

이유: 새 커널은 이전 커널의 버그를 수정하고 많은 새로운 기능을 추가했습니다. 사용자가 이러한 새로운 기능을 사용하거나 자신의 시스템에 따라 보다 효율적이고 안정적인 커널을 사용자 정의하려는 경우 Linux 커널을 사용하면 됩니다. 다시 컴파일해야 합니다. 일반적으로 최신 커널은 더 많은 하드웨어를 지원하고, 더 나은 프로세스 관리 기능을 갖추고, 더 빠르고 안정적으로 실행되며, 일반적으로 이전 버전에서 발견된 많은 취약점을 수정합니다. 이는 Linux 사용자에게 필요한 작업 내용입니다. .

리눅스는 왜 커널을 컴파일합니까?

이 튜토리얼의 운영 환경: Ubuntu 18.04 시스템, Dell G3 컴퓨터.

Linux 커널을 컴파일하는 이유는 무엇입니까?

새 커널은 이전 커널의 버그를 수정하고 많은 새로운 기능을 추가합니다. 사용자가 이러한 새로운 기능을 사용하거나 보다 효율적이고 안정적인 커널을 자신의 시스템에 맞게 조정하려면 Linux 커널을 다시 컴파일해야 합니다.

일반적으로 업데이트된 커널은 더 많은 하드웨어를 지원하고, 더 나은 프로세스 관리 기능을 갖추고, 더 빠르고 안정적으로 실행되며, 일반적으로 이전 버전에서 발견된 많은 취약점을 수정하므로 최신 커널로 자주 업그레이드하도록 선택하세요. Linux 사용자에게 필요한 운영 콘텐츠.

커널 컴파일 구성 옵션을 정확하고 합리적으로 설정하여 시스템에 필요한 기능에 대한 코드만 컴파일하려면 일반적으로 다음 네 가지 고려 사항이 있습니다.

  • (1) 사용자 정의된 컴파일된 커널이 실행됩니다. 더 빠릅니다(코드가 적음)

  • (2) 시스템에 더 많은 메모리가 있습니다(커널 부분은 가상 메모리로 교체되지 않습니다)

  • (3) 커널에 컴파일된 불필요한 기능은 시스템 위험을 증가시킬 수 있습니다 공격자가 악용하는 취약점

  • (4) 특정 기능을 모듈로 컴파일하는 것은 커널로 컴파일하는 것보다 느립니다.

이러한 유형의 컴파일 목적은 주로 컴파일 프로세스를 통해 Linux 커널 컴파일을 이해하는 것입니다. , 커널 작동 방식을 숙지하고 몇 가지 수정을 시도해 보세요.
컴파일은 소스 코드를 프로그램으로 컴파일하는 것뿐입니다. 현재 시스템을 대체하거나 현재 시스템의 작동에 영향을 미치지 않습니다.

커널 컴파일은 커널 크기 요구 사항 및 커널의 일부 사용되지 않는 부분 제거와 같은 특정 요구 사항으로 인해 발생할 수 있습니다. 이 시나리오는 임베디드 시스템에서 발생하는 경우가 많습니다.
또는 커널 코드의 일부를 직접 수정했으며 컴파일 후 기능을 확인해야 합니다.

모듈을 컴파일할 때 일부 기능 모듈은 .ko로 컴파일됩니다. insmod xxx.ko를 사용하면 커널을 다시 컴파일하지 않고도 시스템에서 작성된 코드 기능을 사용할 수 있습니다.
커널을 컴파일하면 현재 커널이 대체되지 않습니다. 컴파일된 새 커널은 대개 아래와 비슷한 디렉터리에 있으며 이름은 대부분 bzImage

/usr/src/kernels/3.xx.x-.x86_64/arch/x86/boot/

그런 다음 시스템의 grub 목록을 편집하여 사용할 최신 커널을 추가할 수 있습니다. it

새 커널이 통합되었습니다. Intel 코어 그래픽과 같은 새 드라이버: /lib/modules/`uname -r`/kernel/drivers/gpu/drm/i915/i915.ko

시스템은 여러 커널을 설치할 수 있습니다. 시작 파일과 같은 새 커널은 이전 커널을 덮어쓰지 않습니다:

/boot/vmlinuz-VERSION
/boot/initrd.img-VERSION

새 커널을 설치하는 동안 VirtualBox와 같은 일부 커널 모듈을 다시 컴파일해야 합니다:

/lib/modules/`uname -r`/updates/dkms/vboxdrv.ko

새 커널이 제대로 실행되지 않는 경우, GRUB 부팅에서 시작할 이전 커널을 선택할 수 있습니다.

다음과 같이 원래 커널로 다시 변경할 수도 있습니다.

ln -sf /boot/vmlinuz-VERSION /vmlinuz
ln -sf /boot/initrd.img-VERSION /initrd.img

여기서 VERSION은 원래 커널 버전입니다.

Linux 커널 컴파일‍

전체 커널 컴파일 프로세스는 매우 간단하지만 커널 컴파일에는 시간이 오래 걸립니다. 이는 주로 커널에 많은 코드가 있기 때문입니다. 물론 컴퓨터가 강력하다면 시간은 훨씬 단축될 것입니다. 또 한 가지 주의할 점은 시스템 문제를 일으킬 수 있는 오류를 방지하기 위해 가상머신 환경에서 컴파일하는 것을 권장한다는 점이다. 가상 머신에서 테스트하는 경우 시스템 파티션과 커널 소스 코드 파티션의 크기가 20GB보다 큰 것이 좋습니다.

1단계: 소스 코드 다운로드

1. Linux 커널 공식 웹사이트로 이동하여 최신 버전 또는 다른 버전의 커널 코드를 다운로드합니다. 다음은 소스 코드의 압축된 아카이브입니다.

리눅스는 왜 커널을 컴파일합니까?

2. 현재 Linux 운영 체제를 사용하고 있다고 가정합니다. 명령줄에 다음 명령을 입력하여 커널을 다운로드합니다.

wget 链接(由于链接会被认为是广告,本文省略链接,请自行复制)

다운로드가 진행되는 동안 다운로드 진행 상황을 확인할 수 있습니다. 다운로드가 완료된 후 정보는 대략 아래와 같습니다.

리눅스는 왜 커널을 컴파일합니까?

2단계: 소스 코드 압축 풀기

압축된 패키지를 다운로드한 후 tar 명령을 통해 압축을 풀 수 있습니다.

tar xvf linux-5.9.6.tar.xz

在解压的时候可以看到文件列表,这个会很多,可能需要等一会儿。

리눅스는 왜 커널을 컴파일합니까?

Step 3: 安装需要的软件包

安装编译工具以及其它一下依赖的软件包,在Ubuntu 18.04环境下执行如下命令。

sudo apt-get install git fakeroot build-essential ncurses-dev xz-utils libssl-dev bc flex libelf-dev bison

如果一切顺利,大概安装输出信息如下所示。

리눅스는 왜 커널을 컴파일합니까?

Step 4: 配置内核代码

在编译内核之前,我们可以对内核源代码进行配置。配置的目的主要是确定哪些模块会编译到内核当中。

1. 进入源代码目录

cd linux-5.9.6

2. 从当前机器的启动目录拷贝配置信息到源代码目录。这步操作的意思是我们编译内核的配置采用用当前环境一致的配置。

cp -v /boot/config-$(uname -r) .config
리눅스는 왜 커널을 컴파일합니까?

3. 可以通过如下命令启动配置界面

make menuconfig

该命令会运行一些脚本,然后打开一个配置界面

리눅스는 왜 커널을 컴파일합니까?

4. 下面是打开的配置界面。可以看出里面包含所有的内核组件,包括文件系统,网络,IO栈,虚拟化和设备驱动等等。如果你不熟悉,可以不做任何修改。

리눅스는 왜 커널을 컴파일합니까?

Step 5: 编译内核

1. 通过如下命令就可以编译内核了

make -j 10

上面参数是并发数量,通常可以是CPU的2倍。

리눅스는 왜 커널을 컴파일합니까?

2. 安装模块

sudo make modules_install
리눅스는 왜 커널을 컴파일합니까?

3. 安装内核

sudo make install

安装完成后会有如下提示信息。

리눅스는 왜 커널을 컴파일합니까?

Step 6: 重启,验证版本

当上述步骤都没有出错的情况下,我们重启一下计算机,然后运行如下命令。

uname -mrs

此时就可以看到内核版本已经是我们编译的版本了。

1리눅스는 왜 커널을 컴파일합니까?

结论‍

通过上面几步,我们可以很简单的编译一个内核。如果后面开发内核模块,也是要基于内核代码树的,因此这个是内核开发的基础。

可能遇到的问题‍

编译内核的时候可能会遇到这个问题:

没有规则可制作目标
debian/certs/debian-uefi-certs.pem,由certs/x509_certificate_list需求停止

在要编译的内核目录下编辑一下配置文件即可。简单的方式是执行如下命令

vim .config

然后找到
CONFIG_SYSTEM_TRUSTED_KEYS,将其设置为空,也就是下面这个样子。

CONFIG_SYSTEM_TRUSTED_KEYS=”

相关推荐:《Linux视频教程

위 내용은 리눅스는 왜 커널을 컴파일합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.