この記事はCentOS6.4、CentOS 6.5に適用され、他のLinuxディストリビューションにも適用できると推定されています。
[ 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コアに必要です
システムのインストールにソフトウェアワークステーションを選択した場合、上記のインストールパッケージのほとんどすべてが含まれています。
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.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
カーネルのアップグレードは成功しました!
最初にクリアしてから、再コンパイルできます。
# make mrproper #終了したか、インストールプロセスが失敗した場合は、最後にコンパイルしたサイトをクリーンアップできます# make clean
[ 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などの他のモジュールが欠落していることを示すプロンプトが表示された場合は、上記の方法で解決してから再コンパイルすることもできます。
ネットワークでは、多くのサーバーがLinuxシステムを使用しています。サーバーのパフォーマンスをさらに向上させるために、特定のハードウェアと要件に従ってLinuxカーネルを再コンパイルする必要がある場合があります。 Linuxカーネルのコンパイルは、所定の手順に従う必要があり、カーネルのコンパイルプロセスにはいくつかの重要なファイルが含まれます。たとえば、RedHat Linuxの場合、/ bootディレクトリにLinuxカーネルに関連するファイルがいくつかあります。/bootと入力して実行します:ls-l。 RedHat Linuxカーネルをコンパイルした人は、System.map、vmlinuz、およびinitrd-2.4.7-10.imgに感銘を受けるかもしれません。これは、カーネルをコンパイルするプロセスに、これらのファイルの確立などの操作が含まれるためです。では、これらのファイルはどのように生成されますか?効果は何ですか?
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は正しいマップファイルをインテリジェントに見つけることができます。
この記事はインターネットから複製されています
Recommended Posts