CentOS6.5はカーネルを3.10.28にアップグレードします

この記事はCentOS6.4、CentOS 6.5に適用され、他のLinuxディストリビューションにも適用できると推定されています。

1. 準備オーケー#

カーネルとバージョン情報を確認してください###

[ root@hostname ~]# uname -r2.6.32-220.el6.x86_64
[ root@hostname ~]# cat /etc/centos-release CentOS release 6.5(Final)

ソフトウェアをインストールする###

開発環境と開発ライブラリに依存する新しいカーネルをコンパイルしてインストールします

# yum grouplist  //インストール済みおよびアンインストール済みのパッケージグループをチェックして、対応する開発環境と開発ライブラリがインストールされているかどうかを確認します。# yum groupinstall "Development Tools"  //通常、これら2つのパッケージグループをインストールします。これにより、コンパイルに必要なすべてのツールが確実に用意されます。# yum install ncurses-devel //あなたは作るためにこれをしなければなりません*configコマンドが正しく実行されている# yum install qt-devel //X環境がない場合は、これを省略できます# yum install hmaccalc zlib-devel binutils-devel elfutils-libelf-devel //CentOSを作成する-6コアに必要です

システムのインストールにソフトウェアワークステーションを選択した場合、上記のインストールパッケージのほとんどすべてが含まれています。

2. カーネル#をコンパイルします

カーネルソースコードを取得して解凍し、コンパイルされたアイテムを構成します###

Linuxカーネルバージョンには、安定バージョンと開発バージョンの2つがあります。Linuxカーネルバージョン番号は、rxyの3つの番号で構成されます。

[http://www.kernel.org](http://www.kernel.org/)のホームページにアクセスすると、安定版、長期版、その他のバージョンがあることがわかります。長期版は安定版よりも安定版であり、長期間更新されるため、3.10.58を選択します。

[ root@sean ~]#wget  https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.10.28.tar.xz
[ root@sean ~]# tar -xf linux-3.10.58.tar.xz -C /usr/src/[root@sean ~]# cd /usr/src/linux-3.10.58/[root@sean linux-3.10.58]# cp /boot/config-2.6.32-220.el6.x86_64 .config

システムの元のカーネル構成ファイルに基づいて新しいコンパイルオプションを作成するため、コピーを現在のディレクトリにコピーして、.configという名前を付けます。次に、構成を続行します。

[ root@sean linux-3.10.58]# sh -c 'yes "" | make oldconfig'
 HOSTCC  scripts/basic/fixdep  HOSTCC  scripts/kconfig/conf.o  SHIPPED scripts/kconfig/zconf.tab.c  SHIPPED scripts/kconfig/zconf.lex.c  SHIPPED scripts/kconfig/zconf.hash.c  HOSTCC  scripts/kconfig/zconf.tab.o  HOSTLD  scripts/kconfig/conf
scripts/kconfig/conf --oldconfig Kconfig.config:555:warning: symbol value 'm' invalid for PCCARD_NONSTATIC.config:2567:warning: symbol value 'm' invalid for MFD_WM8400.config:2568:warning: symbol value 'm' invalid for MFD_WM831X.config:2569:warning: symbol value 'm' invalid for MFD_WM8350.config:2582:warning: symbol value 'm' invalid for MFD_WM8350_I2C.config:2584:warning: symbol value 'm' invalid for AB3100_CORE.config:3502:warning: symbol value 'm' invalid for MMC_RICOH_MMC** Restart config...*** General setup
*...... XZ decompressor tester(XZ_DEC_TEST)[N/m/y/?](NEW) 
Averaging functions(AVERAGE)[Y/?](NEW) yCORDIC algorithm(CORDIC)[N/m/y/?](NEW) 
JEDEC DDR data(DDR)[N/y/?](NEW) 
## configuration written to .config

make oldconfigは、現在のディレクトリにある .configファイルを読み取り、 .configファイルにないオプションを入力するようにユーザーに求めます。次に、 .configファイルを .config.oldとしてバックアップし、新しいファイルを生成します。 .configファイル、[http://stackoverflow.com/questions/4178526/what-does-make-oldconfig-do-exactly-linux-kernel-makefile](http://stackoverflow.com/questions/4178526/what-does-make-oldconfig-do-exactly-linux-kernel-makefile)を参照

一部のドキュメントでは、必要に応じてモジュールをカスタマイズするmake memuconfigの使用法を紹介しています。同様のインターフェイスは次のとおりです:(ここでは不要)

###のコンパイルを開始します

[ root@sean linux-3.10.58]# make -j4 bzImage  //コアファイルを生成する[root@sean linux-3.10.58]# make -j4 modules  //モジュールのコンパイル[root@sean linux-3.10.58]# make -j4 modules_install  //モジュールをコンパイルしてインストールする

インストール###

[ root@sean linux-3.10.58]# make install
実際にこの手順を実行すると、「エラー:modinfo:モジュールvmware_balloonが見つかりませんでした」が表示されますが、カーネルのインストールには影響しません。vsphereに必要なモジュールはコンパイルされません。この問題を回避するには、作成する前に.configファイルを変更する必要があります。参加する
HYPERVISOR_GUEST=yCONFIG_VMWARE_BALLOON=m
(この部分は問題が発生しやすいので、以下の異常な部分を参照してください)

grubブートを変更し、再起動します###

インストールが完了したら、Grubのブートシーケンスを変更して、新しくインストールしたカーネルをデフォルトのカーネルにする必要があります。
grub.confファイルを編集します。

vi /etc/grub.conf#boot=/dev/sdadefault=0timeout=5splashp_w_picpath=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS(3.10.58)root(hd0,0)...

新しくインストールされたカーネルの場所を0から数えて、デフォルトをその数に設定します。通常、新しくインストールされたカーネルは最初の位置にあるため、default = 0に設定します。
rebootを再起動します:

カーネルバージョン###のタイミングを確認します

[ root@sean ~]# uname -r3.10.58

カーネルのアップグレードは成功しました!

3. 異常な#

コンパイルの失敗(依存パッケージの欠如など)###

最初にクリアしてから、再コンパイルできます。

# make mrproper         #終了したか、インストールプロセスが失敗した場合は、最後にコンパイルしたサイトをクリーンアップできます# make clean

vmware仮想マシンでコンパイルすると、次のようなエラーが表示されます###

[ root@sean linux-3.10.58]# make install sh /usr/src/linux-3.10.58/arch/x86/boot/install.sh 3.10.58 arch/x86/boot/bzImage \        System.map "/boot"ERROR: modinfo: could not find module vmware_balloon

あなたはそれを無視することができます、あなたが強迫観念障害を持っているならば、以下を試みてください:
vmwareにVMWARE_BALLOONをインストールするには、.configファイルを直接変更できますが、viが直接 CONFIG_VMWARE_BALLOON = mを追加した場合、 HYPERVISOR_GUEST = yに依存するため、効果はありません。この依存関係のレイヤーがわからない場合は、 make menuconfigを渡した後、[デバイスドライバー]-> [MISCデバイス]の下にVMwareBalloonDriverが見つかりません。 (このアイテムは、vi .configを使用してHYPERVISOR_GUESTを手動で変更した後に見つけることができます)。さらに、make menuconfigを使用する場合でも、直接vi .configを使用する場合でも、最終的に取得するには、 sh -c'yes" "| makeoldconfig'を1回実行する必要があります。コンパイラ構成オプション。
次に、このバージョンではvmware_balloonの名前がvmw_balloonに変更されている可能性があることを考慮して、安全のために次の方法を使用してください。

# cd /lib/modules/3.10.58/kernel/drivers/misc/# ln -s vmw_balloon.ko vmware_balloon.ko #ソフト接続を確立する

実際、[** Docker **](http://lib.csdn.net/base/4)がインストールされているカーネルコンパイル環境では、[sciurus](https://raw.githubusercontent.com/sciurus/docker-rhel-rpm/master/kernel-ml-aufs/config-3.10.11-x86_64)を使用して.configファイルを構成するのが最も賢明な選択です。
また、 make bzImageの前にスクリプト[check-config.sh](https://raw.githubusercontent.com/dotcloud/docker/master/contrib/check-config.sh)を実行して、dockerを実行している現在のカーネルの欠落しているモジュールを確認することをお勧めします。
NF_NAT_IPV4などの他のモジュールが欠落していることを示すプロンプトが表示された場合は、上記の方法で解決してから再コンパイルすることもできます。

4. いくつかの重要なLinuxカーネルファイルの紹介

ネットワークでは、多くのサーバーがLinuxシステムを使用しています。サーバーのパフォーマンスをさらに向上させるために、特定のハードウェアと要件に従ってLinuxカーネルを再コンパイルする必要がある場合があります。 Linuxカーネルのコンパイルは、所定の手順に従う必要があり、カーネルのコンパイルプロセスにはいくつかの重要なファイルが含まれます。たとえば、RedHat Linuxの場合、/ bootディレクトリにLinuxカーネルに関連するファイルがいくつかあります。/bootと入力して実行します:ls-l。 RedHat Linuxカーネルをコンパイルした人は、System.map、vmlinuz、およびinitrd-2.4.7-10.imgに感銘を受けるかもしれません。これは、カーネルをコンパイルするプロセスに、これらのファイルの確立などの操作が含まれるためです。では、これらのファイルはどのように生成されますか?効果は何ですか?

(1)vmlinuz

vmlinuzは、起動可能な圧縮カーネルです。 「Vm」は「仮想メモリ」の略です。 Linuxは、640KBのメモリ制限があるDOSなどの古いオペレーティングシステムとは異なり、仮想メモリをサポートします。 Linuxは、ハードディスク領域を仮想メモリとして使用できるため、「vm」という名前が付けられています。 vmlinuzは実行可能なLinuxカーネルであり、/ boot / vmlinuzにあり、通常はソフトリンクです。

vmlinuzを確立する方法は2つあります。

1つは、カーネルのコンパイル時に「make zImage」によって作成され、「cp /usr/src/linux-2.4/arch/i386/linux/boot/zImage / boot / vmlinuz」によって生成されます。 zImageは小さなカーネルに適しており、下位互換性のために存在します。

2つ目は、コンパイル時にコマンドmake bzImageを使用してカーネルを作成し、次に「cp /usr/src/linux-2.4/arch/i386/linux/boot/bzImage / boot / vmlinuz」を使用してカーネルを作成することです。

bzImageは圧縮されたカーネルイメージです。bzImageはbzip2で圧縮されていないことに注意してください。bzImageのbzは誤解されやすく、bzは「bigzImage」を表します。 bzImageのbは「大きい」を意味します。

zImage(vmlinuz)とbzImage(vmlinuz)の両方がgzipで圧縮されています。これらは圧縮ファイルであるだけでなく、gzip解凍コードが2つのファイルの先頭に埋め込まれています。したがって、gunzipまたはgzip-dcを使用してvmlinuzを解凍することはできません。

カーネルファイルには、カーネルを解凍して起動するための小さなgzipが含まれています。 2つの違いは、古いzImageがカーネルをローエンドメモリ(最初の640K)に解凍し、bzImageがカーネルをハイエンドメモリ(1M以上)に解凍することです。カーネルが比較的小さい場合は、zImageまたはbzImageのいずれかを使用できます。2つの方法で起動されたシステムの動作時間は同じです。大きなカーネルはbzImageを使用しますが、zImageは使用しません。

vmlinuxは非圧縮カーネルであり、vmlinuzはvmlinuxの圧縮ファイルです。

(2) initrd-x.x.x.img

initrdは「initialramdisk」の略です。 Initrdは通常、実際のカーネルvmlinuzが引き継いで起動を続行できる状態にハードウェアを一時的に起動するために使用されます。たとえば、scsiハードディスクが使用され、カーネルvmlinuzにこのscsiハードウェアのドライバーがない場合、カーネルはscsiモジュールをロードする前にルートファイルシステムをロードできませんが、scsiモジュールはルートファイルシステムの/ lib / modulesに格納されます。この問題を解決するには、実際のカーネルを読み取ることができるinitrdカーネルを起動し、initrdを使用してscsiブートの問題を修正します。 initrd-2.4.7-10.imgはgzipで圧縮されたファイルです。このファイルの内容を見てみましょう。

Initrdは、いくつかのモジュールのロードとファイルシステムのインストールを実現します。

initrdイメージファイルは、mkinitrdを使用して作成されます。 mkinitrdユーティリティは、initrdイメージファイルを作成できます。このコマンドはRedHat独自のものです。他のLinuxディストリビューションには、対応するコマンドがある場合があります。これは非常に便利なユーティリティです。詳細については、ヘルプを参照してください:man mkinitrd

次のコマンドは、initrdイメージファイルを作成します。

(3) System.map

System.mapは、特定のカーネルのカーネルシンボルテーブルです。これは、現在実行しているカーネルのSystem.mapへのリンクです。

カーネルシンボルテーブルはどのように作成されますか?System.mapは「nmvmlinux」によって生成され、無関係なシンボルは除外されます。この記事の例では、カーネルをコンパイルするときに、System.mapが/usr/src/linux-2.4/System.mapに作成されます。次のように:

nm /boot/vmlinux-2.4.7-10 > System.map

次の行は/usr/src/linux-2.4/Makefileからのものです。

nm vmlinux | grep -v '(compiled)|(.o

)|([* aUw*])|(..ng

)|( LASH[RL]DI)' | sort > System.map

次に、/ bootにコピーします。

cp /usr/src/linux/System.map /boot/System.map-2.4.7-10

プログラムの設計中に、変数名や関数名などのいくつかの記号に名前が付けられます。 Linuxカーネルは非常に複雑なコードブロックであり、多くのグローバルシンボルがあります。

Linuxカーネルはシンボリック名を使用しませんが、変数または関数のアドレスを使用して変数または関数名を識別します。たとえば、size_t BytesReadなどの記号を使用する代わりに、c0343f20などのこの変数を参照できます。

コンピューターを使用する人は、c0343f20のような名前ではなく、size_tBytesReadのような名前を使用することを好みます。カーネルは主にCで記述されているため、コンパイラ/リンカーを使用すると、コーディング時にシンボリック名を使用し、カーネルの実行時にアドレスを使用できます。

ただし、場合によっては、シンボルのアドレスを知っている必要があるか、アドレスに対応するシンボルを知る必要があります。これは、すべてのシンボルとそのアドレスのリストであるシンボルテーブルによって実行されます。 Linuxシンボルテーブルは、/ proc / ksymsとSystem.mapの2つのファイルを使用します。

/ proc / ksymsは、カーネルの起動時に作成される「procファイル」です。実際、これは実際にはファイルではなく、カーネルデータの単なる表現ですが、ファイルサイズが0であることがわかるように、ディスクファイルのように見せることができます。ただし、System.mapは、ファイルシステムに存在する実際のファイルです。新しいカーネルをコンパイルすると、各シンボル名のアドレスが変更され、古いSystem.mapのシンボル情報が正しくなくなります。カーネルがコンパイルされるたびに新しいSystem.mapが生成されるため、古いSystem.mapを新しいSystem.mapに置き換える必要があります。

カーネル自体は実際にはSystem.mapを使用しませんが、klogd、lsof、psなどの他のプログラムには正しいSystem.mapが必要です。 System.mapを間違って使用したり、使用しなかったりすると、klogdの出力の信頼性が低下し、トラブルシューティングが困難になります。 System.mapがないと、迷惑なメッセージが表示される場合があります。

さらに、いくつかのドライバーはシンボルを解決するためにSystem.mapを必要とし、現在実行している特定のカーネル用に作成されたSystem.mapがないと正しく機能しません。

名前とアドレスの解決を実行するには、LinuxカーネルログデーモンklogdがSystem.mapを使用する必要があります。 System.mapは、それを使用するソフトウェアが見つけることができる場所に配置する必要があります。実行:man klogdは、System.mapが可変の場所としてklogdに指定されていない場合、次の順序で3つの場所でSystem.mapを検索することを認識しています。

/boot/System.map

/System.map

/usr/src/linux/System.map

System.mapにはバージョン情報もあり、klogdは正しいマップファイルをインテリジェントに見つけることができます。

5. 参考文献#

この記事はインターネットから複製されています

Recommended Posts

CentOS6.5はカーネルを3.10.28にアップグレードします
Centos7アップグレードカーネル
CentOS7.5-1804システムカーネルのアップグレード
Centos 6.4 python2.6を2.7にアップグレード
Centos 6.4 python2.6を2.7にアップグレード
Centosカーネルバージョンのアップグレード
Centosのデフォルトのpython2.6のアップグレード
CentOSはpython2をpythにアップグレードします
CentOS7をCentOS8にアップグレードする方法(詳細な手順)
Linux:Centos7は元のカーネルをアップグレードします
Centos6.7には、へのpythonアップグレードが付属しています
セントス7カーネルのアップグレード事故を覚えておいてください
CentOS7アップグレードpython3
CentOS6.Xアップグレードカーネルカーネル
Centos6.5opensshアップグレード
centos6.9rabbitmq3.6.8アップグレード3.8.2
カーネルをアップグレードするためのubuntu16.04メソッドの手順
Centosカーネルコンパイル構成
Ubuntu20.04にアップグレードする方法
Centos7は役に立たないカーネルを削除します
CentOS5からCentOS5.8YUMソース
Ubuntu20.04にアップグレードする方法
Centosは冗長カーネルを削除します
Azure上のUbuntu18.04を18.10にアップグレードします
ububtu10.04,11.10ubuntu12.04LTSへのオンラインアップグレード
Centosでカーネルパニックをデバッグする
centos6.5:gccアップグレード(5.2.0)プロセスレコード
gccをcentosで6.4.0に更新します
Ubuntu 16.04LTSにアップグレードする方法
centOS7にjdk1.8をインストールする方法
CentOS8にMySQLをインストールする方法
CentOS8にMemcachedをインストールする方法
CentOS8にRをインストールする方法
CentOS8にFFmpegをインストールする方法
CentOS8にVirtualboxをインストールする方法
CentOS 8(2)
CentOS 6/7は、メールを送信するようにsendEmailを構成します
[redisの概要] Centosの下にredisをインストールします
Centos7でgcc4.9.xに更新する方法
CentOS8にTeamViewerをインストールする方法
CentOSにPerl5をインストールする方法
CentOS8にGitをインストールする方法
CentOSにPHP7.4をインストールする方法
CentOS8にElasticsearchをインストールする方法
CentOS8にJenkinsをインストールする方法
CentOS8にJavaをインストールする方法
CentOS8にGoをインストールする方法
CentOS8にGCCをインストールする方法
CentOS8にYarnをインストールする方法
Centos7アップグレードgitバージョン制御ツール
CentOS8にNginxをインストールする方法
CentOS7にAsteriskをインストールする方法
CentOS8にJenkinsをインストールする方法
Ubuntu14.04でPHP7にアップグレードする方法
CentOS8にVagrantをインストールする方法
CentOS8にPython3.8をインストールする方法
CentOS8にTomcat9をインストールする方法
CentOS8にWebminをインストールする方法
gitlabを構築するためのCentos6メソッドの手順
CentOS8にRubyをインストールする方法
CentOS8にSkypeをインストールする方法