ニフクラ ブログ

ニフクラやクラウドの技術について、エンジニアが語るブログです。

ニフティクラウド探検隊 お手軽ワンライナーでカーネルアップデートしてみた。【取扱注意!】

こんにちは。
ニフティでインフラを守るお仕事をしている五月女です。

Photo_2 「前回の記事」では、ニフティクラウドで提供されるサーバの中身について独自に調査して紹介しました。
今回は、前回の記事の中で「ニフティクラウド標準提供OSのココに注意!」として紹介した、「カーネルアップデートが出来ないよ!」という点について、その対応策を考えます。

まず、最大の障壁だったカーネルアップデート自体が禁止事項に含まれる点については、
なんと!このブログの公開時点で規約が改訂され、カーネルのアップデート行為が禁止事項から外してもらえるそうです。
=>【ニフティクラウド サービス仕様 =>禁止事項=>禁止行為

オイラ頑張った!! (`・ω・´;)bビシッ!!(何を?

あとはテクニックでなんとかなりそうですね。
そこで今回は、ニフティクラウドで「カーネルアップデートする方法」について紹介します。

※内容は、2011年07月現在時点の情報です。

■なぜ簡単にカーネルアップデート出来ないの?

<

そもそも、なぜカーネルアップデートが禁止事項に含まれてしまっていたのでしょうか?
これは前回の記事にも書きましたが、ニフティクラウドがその基盤としてVMwareを使ってる事が影響していると考えられます。
通例として、VMware上に作成したサーバは、仮想化のオーバーヘッドを最小限にするために「準仮想化ドライバ」と呼ばれる、OSのインターフェースをVMwareに最適化するドライバを導入します。
一般的に仮想サーバは、通常の物理サーバに比べてネットワークやディスク等のI/O性能が悪くなりがちですが、この「準仮想化ドライバ」を導入する事で物理サーバに極めて近い性能を出す事が可能になります。

しかし、こうしたネットワークインターフェースカードやSCSIコントローラの「準仮想化ドライバ」は実行中のカーネルに対して個別に適用しているため、普通にカーネルアップグレードをしてしまうと、新しいカーネルで「準仮想化ドライバ」が読み込まれないまま起動してしまい、通信やディスクへの読み書きが出来なくなってしまいます。

Photo_8

VMwareを自前で利用している場合は、カーネルアップデート後、コンソールやAPIを用いて新しいカーネルにドライバを再適用する事でこの問題を回避します。
しかし、ニフティクラウドの様に運用が高度に隠蔽されたクラウドな世界では、運用をまったく気にしなくて良い代償として、こうした細かなオペレーションを実施する事が難しくなっています。
こうした事から「禁止事項」に含まれていたのだと考えられます。

でも、カーネルアップデートが出来ないと、新しい機能が使えなかったり、セキュリティの問題に対応出来ないなど、困った事が多々あります(´・ω・`)

そこで今回は、ニフティクラウドでも使えるカーネルアップデート方法を紹介します。

注意事項
これから紹介するテクニックは失敗するとOSが起動しなくなりますので、その危険性を理解した上でご利用ください。
また、実行に失敗して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の設定変更(カーネルアップデートを許可する)

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:
 ※だーっと流れる
 
Complete!
#
vmware-toolsを新しいカーネルに再適用するお手軽ワンライナーを実行

下記のワンライナーを実行!※実行するとサーバが再起動されます。

# 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 && 
shutdown -r now

※コピー&ペーストすると、スペースが全角になったりする時がありますので、下記リンク先からtxtファイルを開いて実行する事をオススメします。
=>【「kernelUpdate.txt」をダウンロード

起動完了を待つ

※10分程度かかることもありますので、気長に待ちましょう。。。

Photo_8

■アップデート完了を確認

サーバの状態を確認

対象サーバへログイン。root権限を取得し、アップデート後のバージョンを確認

# 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)

※「2.6.18-238.9.1」や「5.6 (Final)」となっているところは、アップデート実行時に提供されているバージョンによって異なります。
基本的にアップデート前よりも数字が大きくなっていれば問題なし。

アップデート後のカーネルで「準仮想化ドライバ」が読み込まれているか確認

# modprobe -l | grep vm
/lib/modules/2.6.18-238.9.1.el5/kernel/drivers/isdn/hardware/avm/avm_cs.ko
/lib/modules/2.6.18-238.9.1.el5/kernel/drivers/isdn/hisax/avma1_cs.ko
/lib/modules/2.6.18-238.9.1.el5/kernel/drivers/isdn/hardware/avm/b1.ko
/lib/modules/2.6.18-238.9.1.el5/kernel/drivers/isdn/hardware/avm/b1dma.ko
/lib/modules/2.6.18-238.9.1.el5/kernel/drivers/isdn/hardware/avm/b1pci.ko
/lib/modules/2.6.18-238.9.1.el5/kernel/drivers/isdn/hardware/avm/b1pcmcia.ko
/lib/modules/2.6.18-238.9.1.el5/kernel/drivers/isdn/hardware/avm/c4.ko
/lib/modules/2.6.18-238.9.1.el5/kernel/drivers/usb/serial/navman.ko
/lib/modules/2.6.18-238.9.1.el5/kernel/drivers/isdn/hardware/avm/t1pci.ko
/lib/modules/2.6.18-238.9.1.el5/misc/vmblock.ko
/lib/modules/2.6.18-238.9.1.el5/misc/vmci.ko
/lib/modules/2.6.18-238.9.1.el5/misc/vmhgfs.ko
/lib/modules/2.6.18-238.9.1.el5/misc/vmmemctl.ko
/lib/modules/2.6.18-238.9.1.el5/misc/vmxnet.ko
/lib/modules/2.6.18-238.9.1.el5/misc/vmxnet3.ko
/lib/modules/2.6.18-238.9.1.el5/kernel/drivers/xenpv_hvm/balloon/xen-balloon.ko
/lib/modules/2.6.18-238.9.1.el5/kernel/drivers/xenpv_hvm/platform-pci/xen-platform-pci.ko
/lib/modules/2.6.18-238.9.1.el5/kernel/drivers/xenpv_hvm/blkfront/xen-vbd.ko
/lib/modules/2.6.18-238.9.1.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
    
  • (5)上記の内容をrc.local に書きこむ
  • >>   /etc/rc.d/rc.local
    
  • (6)アップグレードしたカーネルを適用するために再起動実行
  • shutdown -r now
    

■まとめ

いかがでしょうか。
駆け足で紹介しましたが、意外と簡単にカーネルアップデートをする事が出来る事がお分かりいただけたかと思います。
今回の手順を使ってカーネルアップデートをする事で、EXT4やBtrfsといったより先進的で高速なファイルシステムを安定利用する事や新しい機能を利用する事が可能になります。
また「準仮想化ドライバ」をキチンと適用する事で、カーネルアップデート後も安価で高速なサーバを利用する事が可能です。
ぜひお試しください。