ニフティクラウド探検隊 お手軽ワンライナーでカーネルアップデートしてみた。【取扱注意!】
こんにちは、ちなつです。
本日は、ニフティの五月女の記事を連続でご紹介しております。こちらが二記事目!
(*本記事の最後に五月女のプロフィールを掲載しています)
*********************************************************************
こんにちは。
ニフティでインフラを守るお仕事をしている五月女です。
前回の記事では、ニフティクラウドで提供されるサーバの中身について独自に調査して紹介しました。
今回は、前回の記事の中で「ニフティクラウド標準提供OSのココに注意!」として紹介させていただいた、
「カーネルアップデートが出来ないよ!」という点について、その回避策を紹介しちゃいます(`・ω・´)
このブログの公開時点で、規約が改訂されてカーネルのアップデート行為が禁止事項から、外してもらえるそうです。
(`・ω・´;) b ビシッ!!
オイラ頑張った!!
=>【ニフティクラウド サービス仕様 =>禁止事項=>禁止行為】
一応上記を確認して、 「カーネルアップデート」が禁止事項にはないことを確認してください。
これから紹介するテクニックは失敗するとOSが起動しなくなりますので、その危険性を理解した上でご利用ください。
■ なぜカーネルアップデートが出来ないの?
そもそもなぜカーネルアップデートが難しいのでしょうか。
これは前回の記事にも書きましたが、ニフティクラウドがその基盤としてVMwareを使ってる事が影響していると考えられます。
通例として、VMware上に作成したサーバは、仮想化のオーバーヘッドを最小限にするために「準仮想化ドライバ」と呼ばれる、OSのインターフェースをVMwareに最適化するドライバを導入します。
一般的に仮想サーバは、通常の物理サーバに比べてネットワークやディスク等のI/O性能が悪くなりがちですが、準仮想化ドライバを導入する事で物理サーバに極めて近い性能を出す事が可能になります。
しかし、こうしたネットワークインターフェースカードやSCSIコントローラの「準仮想化ドライバ」は実行中のカーネルに対して適用しているため、普通にカーネルアップグレードをしてしまうとドライバが読み込まれなくなってしまい、それまで出来ていた通信やディスクへの読み書きが出来なくなってしまいます。
VMwareを自前で利用している場合は、カーネルアップデート後、コンソールやAPIを用いて新しいカーネルにドライバを再適用する事でこの問題を回避します。
しかし、ニフティクラウドの様に運用が高度に隠蔽されたクラウドな世界では、運用をまったく気にしなくて良い代償として、こうした細かなオペレーションを実施する事が難しくなっています。
しかし、カーネルアップデート出来ないと、新しい機能が使えなかったり、セキュリティの問題に対応出来ないなど、困った事が多々あります(´・ω・`)
そんな人のために、お手軽なワンライナーでカーネルアップデートする方法を紹介します。
######## 注意事項 #########
これから紹介するテクニックを実践してOSが起動しなくなっても復旧はいたしかねます。
サービス環境など、本番環境で実施する際には、バックアップを取得するなど細心の注意が必要です。可能なら、miniのサーバーを”従量制”で構築して、検証をしてから実行してください。
##########################
■ 事前準備
カーネルアップデートするサーバの状態を確認しましょう。
〇 vmware-toolsは動作している?
以下のコマンドをたたいて、確認してください。
# service vmware-tools status
vmtoolsd is running
〇 root権限が使えるか
sudo や su が使える状態になってます?
〇 外付けのディスクは取り外しているか(NFS等を含む)
ついていると困ったことになるので、外しておいてください。起動時に下記以外のディスクをマウントする設定が入っていないか
# cat /etc/fstab
LABEL=/ / ext3 defaults 1 1
LABEL=/boot /boot ext3 defaults 1 2
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
LABEL=SWAP-sda2 swap swap defaults 0 0
■ アップデート手順
○ サーバにログインして、状態を確認
対象サーバへログインしroot権限を取得
バージョンの確認(カーネルアップデート前)
# uname -a
Linux localhost.localdomain 2.6.18-128.el5 #1 SMP Wed Jan 21 10:41:14 EST 2009 x86_64
# cat /etc/redhat-release
CentOS release 5.3 (Final)
○ yum.confの設定変更(カーネルアップデートを許可する)
12行目の「 exclude=kernel.* 」を「 #exclude=kernel.* 」としてコメントアウトします。
# vi /etc/yum.conf
[main]
cachedir=/var/cache/yum
keepcache=0
debuglevel=2
logfile=/var/log/yum.log
distroverpkg=redhat-release
tolerant=1
exactarch=1
obsoletes=1
gpgcheck=1
plugins=1
#exclude=kernel.*
# Note: yum-RHN-plugin doesn't honor this.
metadata_expire=1h
installonly_limit = 5
# PUT YOUR REPOS HERE OR IN separate files named file.repo
# in /etc/yum.repos.d
○ yum updateの実行(カーネルを含むモジュールのアップデート)
通常のアップデートを実行
# yum update
Loaded plugins: fastestmirror
Determining fastest mirrors
* base: ftp.yz.yamagata-u.ac.jp
* epel: ftp.yz.yamagata-u.ac.jp
* extras: ftp.yz.yamagata-u.ac.jp
* updates: ftp.yz.yamagata-u.ac.jp
base | 2.1 kB 00:00
extras | 2.1 kB 00:00
extras/primary_db | 260 kB 00:01
updates | 1.9 kB 00:00
updates/primary_db | 625 kB 00:00
Excluding Packages in global exclude list
Finished
Setting up Update Process
Resolving Dependencies
--> Running transaction check
---> Package apr.x86_64 0:1.2.7-11.el5_6.5 set to be updated
Total download size: 368 M
Is this ok [y/N]:y ※yを押下
Downloading Packages:
※だーっと流れる いちいち y を押したくない人は -yとか・・・
Complete!
#
〇 vmware-toolsを新しいカーネルに再適用するお手軽ワンライナーを実行
※コピペすると、スペースが全角になったりスペースが2個になっちゃったりするので、リンクからtxtファイルを開いて実行して下さい。それから実行すると、サーバは再起動されます。
# cp -p /etc/rc.d/rc.local /etc/rc.d/rc.local.org && \ echo "/usr/sbin/vmware-tools-upgrader -p \"-d\" && \ /bin/mv /etc/rc.d/rc.local.org /etc/rc.d/rc.local && \ /sbin/shutdown -r now" >> /etc/rc.d/rc.local && date; shutdown -r
〇 再起動完了を待つ
※ 10分程度かかることもありますので、気長に待ちましょう。。。
■ アップデートが完了したかの確認
〇 サーバにログイン
対象サーバへログインしroot権限を取得
バージョンの確認(カーネルアップデート後) ※バージョン 2.6.18-238.9.1 となっているところは、そのとき提供されている最新版のバージョンによって異なります。
# uname -a
Linux localhost.localdomain 2.6.18-238.9.1.el5 #1 SMP Tue Apr 12 18:10:13 EDT 2011 x86_64 x86_64 x86_64 GNU/Linux
# cat /etc/redhat-release
CentOS release 5.6 (Final)
ドライバがロードされているかの確認
# modprobe -l | grep vm
/lib/modules/2.6.18-128.el5/kernel/drivers/isdn/hardware/avm/avm_cs.ko
/lib/modules/2.6.18-128.el5/kernel/drivers/isdn/hisax/avma1_cs.ko
/lib/modules/2.6.18-128.el5/kernel/drivers/isdn/hardware/avm/b1.ko
/lib/modules/2.6.18-128.el5/kernel/drivers/isdn/hardware/avm/b1dma.ko
/lib/modules/2.6.18-128.el5/kernel/drivers/isdn/hardware/avm/b1pci.ko
/lib/modules/2.6.18-128.el5/kernel/drivers/isdn/hardware/avm/b1pcmcia.ko
/lib/modules/2.6.18-128.el5/kernel/drivers/isdn/hardware/avm/c4.ko
/lib/modules/2.6.18-128.el5/kernel/drivers/usb/serial/navman.ko
/lib/modules/2.6.18-128.el5/kernel/drivers/isdn/hardware/avm/t1pci.ko
/lib/modules/2.6.18-128.el5/misc/vmblock.ko
/lib/modules/2.6.18-128.el5/misc/vmci.ko
/lib/modules/2.6.18-128.el5/misc/vmhgfs.ko
/lib/modules/2.6.18-128.el5/misc/vmmemctl.ko
/lib/modules/2.6.18-128.el5/misc/vmxnet.ko
/lib/modules/2.6.18-128.el5/misc/vmxnet3.ko
/lib/modules/2.6.18-128.el5/kernel/drivers/xenpv_hvm/balloon/xen-balloon.ko
/lib/modules/2.6.18-128.el5/kernel/drivers/xenpv_hvm/platform-pci/xen-platform-pci.ko
/lib/modules/2.6.18-128.el5/kernel/drivers/xenpv_hvm/blkfront/xen-vbd.ko
/lib/modules/2.6.18-128.el5/kernel/drivers/xenpv_hvm/netfront/xen-vnif.ko
※特に太字の部分があるかどうか確認してください。これが無い場合、ワンライナーの実行に失敗している可能性がありますので、もう一度実施してください。
〇 yum.confの設定変更(カーネルアップデートを不許可に戻す)
不意にカーネルアップデートしてしまう事故を防ぐためにカーネルアップデートを不許可状態に戻します。
今度は、12行目の「 #exclude=kernel.* 」を「 exclude=kernel.* 」としてコメントアウトを削除します。
# vi /etc/yum.conf
[main]
cachedir=/var/cache/yum
keepcache=0
debuglevel=2
logfile=/var/log/yum.log
distroverpkg=redhat-release
tolerant=1
exactarch=1
obsoletes=1
gpgcheck=1
plugins=1
exclude=kernel.*
# Note: yum-RHN-plugin doesn't honor this.
metadata_expire=1h
installonly_limit = 5
# PUT YOUR REPOS HERE OR IN separate files named file.repo
# in /etc/yum.repos.d
〇 カーネルアップデート完了!
お疲れ様でした。
■ ワンライナーの中身解説
ワンライナーの中でどんな事をやっているのか簡単に説明します。
(1)OSを起動した際に最初実行されるコマンド群「/etc/rc.d/rc.local」を「/etc/rc.d/rc.local.org」としてバックアップ
cp -p /etc/rc.d/rc.local /etc/rc.d/rc.local.org
(2)OS起動時に実行したいコマンドを設定
VMwareのドライバ等をカーネルに対してインストールするコマンド
オプションの -p “-d” は「デフォルト設定でインストール」を明示し、インストール中断を抑止するおまじない
/usr/sbin/vmware-tools-upgrader -p "-d"
(3)書き換えた rc.local をオリジナルに戻す
/bin/mv /etc/rc.d/rc.local.org /etc/rc.d/rc.local
(4)ドライバ適用のための再起動!
/sbin/shutdown -r now
上記の内容をrc.local に書きこむ
>> /etc/rc.d/rc.local
アップグレードしたカーネルを適用するために再起動
date; shutdown -r now
■ まとめ
いかがでしょうか。
意外と簡単にカーネルアップデートをする事が出来る事がお分かりいただけましたでしょうか。カーネルアップデートをする事で、EXT4やBtrfsといったより先進的で高速なファイルシステムやこうした準仮想化ドライバによって、安価で高速なサーバを利用する事が可能になっていますので、ぜひお試しください。
------------------------------------
プロフィール
ライターネーム:五月女 雄ー
Twitter
入社3年目になる新米エンジニアです。
ニフティでは「インフラを守る簡単な様で奥が深い
お仕事」をしています。
夢はインフラの気持ちが読めるエンジニアになること。
------------------------------------