ホームページ  >  記事  >  運用・保守  >  なぜ Linux はカーネルをコンパイルするのでしょうか?

なぜ Linux はカーネルをコンパイルするのでしょうか?

青灯夜游
青灯夜游オリジナル
2023-03-30 14:03:542157ブラウズ

理由: 新しいカーネルは古いカーネルのバグを修正し、多くの新機能を追加しました。ユーザーがこれらの新機能を使用したい場合、または独自のシステム カーネルに従ってより効率的で安定したシステムをカスタマイズしたい場合場合は、Linux カーネルを再コンパイルする必要があります。通常、新しいカーネルはより多くのハードウェアをサポートし、プロセス管理機能が向上し、より高速かつ安定して実行され、古いバージョンで見つかった多くの脆弱性が修正されるため、より新しいシステム カーネルへのアップグレードを選択することがよくあります。Linux ユーザーにとって必要な操作内容です。 。

なぜ Linux はカーネルをコンパイルするのでしょうか?

このチュートリアルの動作環境: Ubuntu 18.04 システム、Dell G3 コンピューター。

なぜ Linux カーネルをコンパイルする必要があるのでしょうか?

新しいカーネルは、古いカーネルのバグを修正し、多くの新機能を追加しました。ユーザーがこれらの新機能を使用したい場合、またはより効率的で安定したカーネルを自分のシステムに合わせて調整したい場合は、Linux カーネルを再コンパイルする必要があります。

通常、更新されたカーネルは、より多くのハードウェアをサポートし、より優れたプロセス管理機能を備え、より高速かつ安定して実行され、一般的に古いバージョンなどで見つかった多くの脆弱性が頻繁に修正されます。更新されたシステム カーネルをアップグレードすることを選択することは、 Linux ユーザーにとっては必要な操作です。

カーネル コンパイル構成オプションを正しく合理的に設定して、システムに必要な関数のコードのみをコンパイルするには、一般に次の 4 つの考慮事項があります。

  • (1) 独自にカスタムコンパイルしたカーネルはより高速に実行されます (コードが少なくなります)

  • (2) システムのメモリが増加します (カーネル部分は仮想カーネルにスワップされません)メモリ)

  • (3) 不要な関数をカーネルにコンパイルすると、システム攻撃者が悪用できる脆弱性が増加する可能性があります

  • (4)ある種の関数をモジュールにコンパイルすると、関数をカーネルにコンパイルするよりも時間がかかります。

このタイプのコンパイルの目的は、主に、コンパイルを通じて Linux カーネルのコンパイル プロセスを理解し、慣れることです。カーネルの原理に従って、いくつかの変更を加えることもできます。
コンパイルはソース コードをプログラムにコンパイルするだけであり、現在のシステムを置き換えたり、現在のシステムの動作に影響を与えたりするものではありません。

カーネルのコンパイルは、カーネル サイズ要件やカーネルの未使用部分の削除など、特定のニーズに起因する場合があります。このシナリオは多くの場合、組み込みシステムで発生します。
または、カーネル コードの一部を自分で変更した場合は、コンパイル後に機能を検証する必要があります。

モジュールをコンパイルすると、一部の機能モジュールが .ko にコンパイルされます。insmod xxx.ko を使用すると、カーネルを再コンパイルせずに、システム内で記述されたコード関数を使用できます。
カーネルをコンパイルした後、現在のカーネルは置き換えられません。コンパイルされた新しいカーネルは、多くの場合、次のようなディレクトリにあり、その名前はほとんどの場合 bzImage

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

です。その後、システムの grub を編集できます

新しいカーネルには、Intel コア ディスプレイなどの新しいドライバーが統合されています: /lib/modules/`uname -r`/kernel/drivers/gpu/drm/i915/ i915.ko

A システム スタートアップ ファイルなど、複数のカーネルをインストールできます。新しいカーネルは古いカーネルを上書きしません:

/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 カーネルをコンパイルする‍

カーネルのコンパイル プロセス全体は非常に簡単ですが、カーネルのコンパイルには時間がかかります。これは主に、カーネルに大量のコードがあることが原因です。もちろん、コンピューターの性能が高ければ、時間はさらに短くなります。もう 1 つの注意点は、システムの問題を引き起こす可能性のあるエラーを回避するために、仮想マシン環境でコンパイルすることをお勧めすることです。仮想マシンでテストする場合、システム パーティションとカーネル ソース コード パーティションのサイズは 20GB より大きいことが推奨されます。

ステップ 1: ソース コードをダウンロードします

1. Linux カーネルの公式 Web サイトにアクセスし、最新バージョンをダウンロードします。 、または他のバージョンのカーネル コード。こちらはソースコードの圧縮アーカイブです。

なぜ Linux はカーネルをコンパイルするのでしょうか?

#2. Linux オペレーティング システムを使用していると仮定して、コマンド ラインに次のコマンドを入力してカーネルをダウンロードします。

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

ダウンロード中はダウンロードの進行状況が確認でき、ダウンロード完了後はおおよそ以下のような情報が表示されます。

なぜ Linux はカーネルをコンパイルするのでしょうか?

#ステップ 2: ソース コードを解凍します

圧縮パッケージをダウンロードした後、tar コマンドを使用して解凍できます。

tar xvf linux-5.9.6.tar.xz

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

なぜ Linux はカーネルをコンパイルするのでしょうか?

Step 3: 安装需要的软件包

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

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

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

なぜ Linux はカーネルをコンパイルするのでしょうか?

Step 4: 配置内核代码

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

1. 进入源代码目录

cd linux-5.9.6

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

cp -v /boot/config-$(uname -r) .config
なぜ Linux はカーネルをコンパイルするのでしょうか?

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

make menuconfig

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

なぜ Linux はカーネルをコンパイルするのでしょうか?

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

なぜ Linux はカーネルをコンパイルするのでしょうか?

Step 5: 编译内核

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

make -j 10

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

なぜ Linux はカーネルをコンパイルするのでしょうか?

2. 安装模块

sudo make modules_install
なぜ Linux はカーネルをコンパイルするのでしょうか?

3. 安装内核

sudo make install

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

なぜ Linux はカーネルをコンパイルするのでしょうか?

Step 6: 重启,验证版本

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

uname -mrs

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

1なぜ Linux はカーネルをコンパイルするのでしょうか?

结论‍

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

可能遇到的问题‍

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

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

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

vim .config

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

CONFIG_SYSTEM_TRUSTED_KEYS=”

相关推荐:《Linux视频教程

以上がなぜ Linux はカーネルをコンパイルするのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。