2011-09-04

Ubuntu 11.04でeSATA外付けHDにソフトウェアRAID 5を構築する

今回入手したHP Z800に、今度はeSATA接続で大容量の外付けHDを接続し、ソフトウェアRAID 5で運用してNASその他として利用することを考える。用意したものは以下の通り。

まずeSATAボードPEX-PE30SをPCIeスロットにセットする。HD × 5は裸族のインテリジェントビルCRIB535EUFに詰め込むだけ。CRIB535EUFはRAID機能を内蔵しているが、今回はそれは使わないのでRAID無しモードに裏面のディップスイッチをセットする。

両者を接続して起動すると、以前RAID 1を構築した内蔵HDが/dev/sdf, /dev/sdgとなり、今回接続したHDが/dev/sdasdeと認識された。このようなことがあるために、/etc/fstabなどでは/dev/sdaなどと直接指定するのでなく、ファイルシステムのUUIDで指定しておくべきだ。

そしてRAID 5を構築するため以下のコマンドを実行する。

$ sudo mdadm --create /dev/md4 --level=5 -n 5 --metadata=0.9 /dev/sd[abcde]
$ cat /proc/mdstat

ここから長い長い再構築プロセスが始まる。mdstatの出力を見ると、spareがどうとかこうとか出力され、特にスペアディスクなどを指定していないのにと困惑するが、man mdadmによるといったんスペアがあることにしたほうが構築が速く済むということなので心配しないでいい。再構築には多分20時間くらいかかった。再構築が終了したら、構成を保存する。

$ sudo vi /etc/mdadm/mdadm.conf
{ 以前のARRAY行を削除する }
$ sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf
$ sudo update-initramfs -u
$ sudo reboot

後はファイルシステムを構築しマウントして終わり。

$ sudo mkfs -t ext4 /dev/md4
$ sudo blkid /dev/md4
$ sudo vi /etc/fstab
$ sudo mount -a

後日談

ある夜、サーバ置き場になっている書庫からボーという音がしていたのでのぞいてみると、ソフトウェアRAID 5で運用している裸族のインテリジェントビルのアクセスランプが全部赤くなっていてアクセスが連続して起きていた。これは何事?と思って調べてみた。

$ cat /proc/mdstat
md4 : active raid5 sda[0] sdb[1] sde[4] sdd[3] sdc[2]
      7814057984 blocks level 5, 512k chunk, algorithm 2 [5/5] [UUUUU]
      [=========>...........]  check = 49.8% (974687636/1953514496) finish=658.9min speed=24756K/sec

なんとRAIDの再構築が進行中だった。もう壊れたのか?と思ってよく見てみると、壊れたことを示すFAILなどの文字が無い。あちこち検索したところ、/etc/cron.d/mdadmによる設定によって週に一回/usr/share/mdadm/checkarrayが実行されることが判明した。そしてよく目をこらしてmdstatの出力を見るとcheck =となっていて、再構築ではなくチェックが進行中なだけであった。でも週1で20数時間かけてチェックするのもどうかな...

(2011/10/2追記)/etc/cron.d/mdadmをよく見ると、[ $(date +\%d) -le 7 ]というチェックが入っていて、月一度の実行だった。

 

2011-08-31

Ubuntu 11.04にCUDA開発環境を導入する

特売で買ったHP Z800 には nVidia の Tesla C2050 を2枚差してある。この GPGPU で遊ぶには CUDA の開発環境を導入する必要がある。nVidia が配布している Ubuntu 用の開発環境 CUDA Toolkit 4.0 は Ubuntu 10.10 用であるが、Ubuntu 11.04 にも導入できるのでその方法を紹介する。
CUDA を Ubuntu 11.04 に導入するに際しての問題点は以下の通り。

  • デフォルトでインストールされる X 用のドライバ nouveau と相性が悪い。
  • Ubuntu のソフトウェア更新(apt による upgrade)時のカーネルのバージョンアップへの対処が必要。
  • Ubuntu 11.04 では GCC のバージョンが 4.5 であるが、CUDA は 4.4 を必要とする。

最初の点の nouveau 問題は結構やっかいで、手順を失敗するとシステムが訳のわからない状態になるので注意が必要だ。この問題をさける一番簡単な対処法は GUI 画面で [追加ドライバ] 設定を用いて nVidia のドライバを導入することである。この方法で導入して再起動すると nouveau カーネルモジュールがロードされないはずで、確かめるには以下を実行すればよい。

$ lsmod | grep nouveau

この状態で nVidia が配布している devdriver → toolkit → sdk の順番でインストールすればよいのだが、nVidia 配布の devdriver を使うと、apt-get upgrade のときのカーネルのバージョンアップのたびにドライバを再導入する必要があってわずらわしい。これを解決するために X Updates の PPA を利用して最新の nVidia ドライバを導入することにする。この PPA を用いると、カーネルのバージョンアップの際に nVidia ドライバの再コンパイルも自動的に行ってくれるので世話がない。
以上を勘案した手順は以下の通り。

  1. GUI 画面で [追加ドライバ] を起動し、nVidia の高性能ドライバを導入し再起動する。
  2. ログイン画面(自動ログインしている人はログアウトしてから)で Ctrl-Alt-F1 を押し、テキストコンソール状態にしてログインする。
  3. $ sudo initctl stop gdm
    $ sudo add-apt-repository ppa:ubuntu-x-swat/x-updates
    $ sudo apt-get update
    $ sudo apt-get upgrade
    $ sudo reboot
    
    再起動後、バージョンを確認する。

     

    $ cat /proc/driver/nvidia/version
    NVRM version: NVIDIA UNIX x86_64 Kernel Module  280.13  Wed Jul 27 16:53:56 PDT 2011
    GCC version:  gcc version 4.5.2 (Ubuntu/Linaro 4.5.2-8ubuntu4)
    
  4. 必要なパッケージをインストールする。
  5. $ sudo apt-get install gcc-4.4 g++-4.4 libxi-dev libxmu-dev freeglut3-dev
    
  6. nVidia 配布の Toolkit とオプションで Tools SDK、そして SDK をインストールする(driver はインストールしない)。
  7. $ sudo sh cudatoolkit_4.0.17_linux_64_ubuntu10.10.run
    $ sudo sh cudatools_4.0.17_linux_64.run
    $ sh gpucomputingsdk_4.0.17_linux.run
    $ sudo vi /etc/ld.so.conf.d/cuda.conf
    /usr/local/cuda/lib64
    /usr/local/cuda/lib
    $ sudo ldconfig
    $ vi ~/.bashrc
    PATH=/usr/local/cuda/bin:$PATH
    
  8. Toolkit が gcc 4.4 を使うように設定する。
  9. $ sudo mkdir /usr/local/cuda/gcc
    $ for a in gcc g++ cpp; do sudo ln -s /usr/bin/$a-4.4 /usr/local/cuda/gcc/$a; done
    $ sudo vi /usr/local/cuda/bin/nvcc.profile
    compiler-bindir = /usr/local/cuda/gcc
  10. SDK をビルドする。
  11. $ cd ~/NVIDIA_GPU_Computing_SDK/C
    $ make
    $ bin/linux/release/driveQuery
    

ただし、6 の make のところで失敗する。これはどうやら SDK のバグ(devdriver が間違った場所にライブラリをインストールしており、SDK がそれに依存している)らしい。以下の方法で回避できる。

$ LPATH=/usr/lib64/nvidia-current make

これを .bashrc にでも入れておくとよいかも。

$ vi ~/.bashrc
export LPATH=/usr/lib64/nvidia-current

References

LPATH の件は: [0000065: /usr/bin/ld: cannot find -lcuda - Mantis]
X-Updates の PPA については以下で知った: [Ubuntu 10.04 に CUDA をインストールした時のメモ - irie めも]
nvcc.profile の設定による GCC 4.4 の利用については: [HDfpga: Install Cuda 4.0 on Ubuntu 11.04]

2012/2/14 追記

CUDA Toolkit 4.1 がリリースされ、Ubuntu 11.04 に正式対応した。CUDA 4.1 へのアップグレードについて書いた記事を参照: Ubuntu 11.04のCUDA開発環境を4.1にアップグレードする

4844329782 CUDA by Example 汎用GPUプログラミング入門
Jason Sanders, Edward Kandrot, 株式会社クイープ
インプレスジャパン 2011-02-14

2011-08-26

RAIDやLVMが設定されたHDを初期化する方法

Linux によるソフトウェアRAIDやLVMは、HD上のパーティションにメタデータという形で設定を書き込む。これによってHDをマシン間で移動したときなどでも設定ファイル無しに復元できることになる。

ただ、このメタデータは明示的に消去しないとHDを再フォーマットしてもそのまま残り続けて、再度のRAIDやLVMの設定に問題を起こすことがある。例えばインストーラがRAIDやLVMパーティションを誤検知してしまい、訳のわからないことが起こることがある。

Ubuntu のインストーラを用いてこのようなHDをリセット(再初期化)する方法を紹介する。起動ディスクとしてはUbuntuデスクトップインストーラまたはサーバインストーラを用いる。

$ sudo apt-get update
$ sudo apt-get install mdadm

Ubuntuサーバインストーラを使う場合はmdadmが入っているので、レスキューモードを選んでシェルに抜けるだけでよい。

では消去を実行しよう。mdadm には--zero-superblockというオプションがあって、これがメタデータを消去してくれる。

$ for a in /dev/sd[ab]?*; do sudo mdadm --zero-superblock $a; done

LVMも設定している場合は、各パーティションの先頭あたりをきれいにすればよい(lvremoveなどを用いたもっとスマートな方法があるはずだが調べるのが面倒だった...)。

$ for a in /dev/sd[ab]?*; do sudo dd if=/dev/zero of=$a bs=1M count=1; done

この方法で重要なのは、パーティション情報を消去する前に行う必要があるということだ。メタデータの場所はパーティションに対して位置が決まっているからである。もしパーティションを初期化してしまった場合、パーティションの分割を覚えているなら同じ分割でパーティションを設定すれば問題ない。覚えていないならメタデータがありそうな場所(あるいはHD全体)を0で埋める方法をとる必要があるだろう。

メタデータの場所

メタデータがパーティションのどこにあるかを調べてみた。以下のようになっている。

  • RAIDでmetadata=0.9の場合: パーティションのお尻から128K〜64Kの範囲で、64Kアラインされている位置から4Kぶん。
  • RAIDでmetadata=1.xの場合、xによって位置が異なる: 1.0はお尻、1.1は頭、1.2は頭から4Kの場所に位置する(アラインについては不明)。
  • LVMのメタデータはパーティションの先頭にある(RAID上のLVMの場合はもちろんRAIDのメタデータの内側)。

References

RAIDのメタデータの位置について: [RAID superblock formats - Linux Raid Wiki]

LVMのメタデータの位置について: [LVM-on-RAID - The Linux Documentation Project]