ラベル サーバ構築 の投稿を表示しています。 すべての投稿を表示
ラベル サーバ構築 の投稿を表示しています。 すべての投稿を表示

2009年10月28日水曜日

【LVM】1TBのHDD増設レポ

LVM(Logical Volume Manager)は、パーティションの前後関係やディスク容量を気にすること無く、望むなら二つ以上のディスクに渡ったり別のボリュームを飛び越えてでもボリュームを作ることが出来るツールで、このブログでは一度も言及していないが私はいつもお世話になっている。

今回は、右図のように、1TBのHDD(SATA2)を組み入れる。もともと、ボロボロの80GBのHDD(以下、sdc)がバックアップ用、OSを含むマスターファイルが120GBのボロボロのHDD(以下、sdb)に割り当てられていた。それぞれ、backup、storageというVGを割り当てて管理していたが、今回バックアップが溢れそうになったこと、サーバにデータを置いてnfsで管理する方法を採ることにしたことなどが原因で、新品の1TB(以下、sda)のHDDを購入した。既存の2つはIDEであるうえ、どちらもたいした容量がないため、二つ合わせてbackupとする※。また、アクセス速度と容量を兼ね備えた新品のHDDには、storageの役割をになわせるのが最適だ。つまり
  1. sdaをLVMでフォーマットし、
  2. sdbのデータをsdaに移行し、
  3. sdbをbackupに参加させる
という作業が必要となってくる。自宅サーバであること、当日疲れていたことなどがあり、あまり止めても要られないので、サーバの停止時間は1時間程度に収めたいが、LVMを使用していればOSの再インストールなしでこれらの一連の作業ができた。

※ pdumpfsで、一時ファイルや大きすぎるファイル(動画など)を除外してバックアップしているので、バックアップにはたいした容量は必要ない

1. sdaのフォーマット

このセクションは、新しいディスクをフォーマットしたりするだけなのでサービスを動かしたままで行えるが、運用中のディスクからコピーをとるので、CDブートが望ましい。
ただのフォーマットだが、これが案外ややこしい。sdbをバックアップに降格させるため、sdbのMBRと/bootパーティションをコピーすることが必要になる。
今回の場合は、sdbはsdb1(200MB,ext2)、sdb2(120GB,lvm)となっている。したがって、sda1とMBRだけあればいい。
ここで荒技なのだが、ddを使ってコピーをとる。
# dd if=/dev/sdb of=/dev/sda
これの欠点は、sdbの大きさ分、つまり120GBをすべてコピーしてしまうということ。当然意味が無いので、数秒で止める。すると、コピー速度が出てくるので、sdb1の大きさから、必要な部分がコピーし終わるまでの時間を計算して、その時間待つ。これで、狙った部分のみコピーできる。ちゃんと大きさを指定することもできるが、どうせフォーマット前のディスク、こっちのほうがはるかに速い。
あとは、fdiskでsda2を作成してやればできあがり。sda2はゴミが入っているので、pvcreateに-ff(force)オプションをつける。
# pvcreate -ff /dev/sda2
# vgextend storage /dev/sda2

ここまで終われば、現在VGstorageは現在1.12TBの大所帯になっている。これから、0.12TBを追い出すわけだが、ここからはオンラインではできないので、CDブートで残りの作業を進める。
# reboot


2. sdbからデータを追い出す

現在、storageはsda2とsdb2が使われているが、sdbは一度空にしなければならないので、sdbからデータを追い出す。そのためのコマンドが用意されている:pvmoveだ。
# pvmove -v /dev/sdb2

これで、すべてのLVがコピーされるまで待つ。ddとちがってLVだけをコピーするのでまだ速いが、結構時間がかかるので、-vオプションで暇つぶしをするのは必須。
そして、これが終わったら/dev/sdb2をstorageから脱退させる。
# vgreduce -v server /dev/sdb2

実際には、pvmove終了後からはサービスの稼働は可能と思われるが、念のためこのまま最後まで作業を進めた。

3. sdbをbackupにする

これで、sdb2は宙に浮いてしまった。これを今度はbackupに参加させる。また、backupの唯一のLV「backup01」を200GBまで拡大する。backup01はxfsなので、xfs_growfsコマンドを使えばマウントしたままリサイズすることができる。ひとつ注意点は、xfs_growfsは、デバイスファイルではなくマウントポイントを指定するということ。
# vgextend backup /dev/sdb2
# xfs_growfs /backup


まとめ

以上の行程を踏めば、pvmoveの時間に依存するが1時間かからずにすべての作業が完了する。割とクリティカルな端末でもLVMが効力を発揮できることが実証できたと思う。
ただ、今回のpvmoveは今回初めて使ったので、もしかしたら運用中に実行できたのかもしれない。これが可能ならば、システムを一切止めること無くディスクを増設することができるようになるかもしれない。

2009年8月15日土曜日

postfixのインストール

月並みなタイトルだけど、Debian Lenny on Niftyな環境でのSMTPサーバであるpostfixのインストール記録。
今回は、自分のメールアドレス(foo@mail.comとする)に対して、サーバ内のroot及び自分のアカウントに届いたメールを転送する設定をする。したがって、POPやIMAPといったメール受信サービスは提供しない。

インストール
aptで済ます。ただし、exim4を削除して入れる場合にはmailutilsパッケージが削除されてしまうようだ。最小構成の場合にはそもそも入っていなかったようだったので、どちらにしても同時に入れておく必要がある。
# aptitude install postfix mailutils
postfixのインストール中に、用途を聞かれるので「インターネット」とする。

設定
/etc/postfix/main.cfを修正。
smtpd_banner = $myhostname ESMTP
(Postfixであることを隠す)
myhostname = toshia.dip.jp
(自分のサーバのFQDN)
mydestination = toshia.dip.jp, server, localhost.localdomain, , localhost
(このドメイン名宛のメールはこのマシンで受ける。myhostnameを追加しておく)
relayhost = smtp.nifty.com
(外向きメールはこのメールサーバを経由させる。上記はプロバイダがNiftyの場合には絶対必要)
mynetworks = 192.168.1.0/24 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
(リレーを許可するネットワーク。LAN内の全マシンがサーバ経由でエラーを通知できるようにしたいので設定した)
そして、/root/.forwardに自分のユーザ名、~/.forwardにfoo@mail.comと書いておけば、rootと自分のユーザに来たメールがfoo@mail.comに転送されるようになる。ただ、エイリアスファイルを作る方法もあり、それはrootでしか設定できないようになっているし、実在しないユーザ(postmasterとか)に対しても転送がかけられるので、そちらを使う方がベターだ。今回は割愛。

これで、rootで実行しているcronのジョブの結果も届くようになるし、その他何かあれば通知がくるようになる。SSHで誰かがログインする度にその旨をメールしてもいいかもしれない。
また、http://www.aconus.com/~oyaji/security/relay-mail.htmで紹介されているサービスを利用して、外部中継チェックを念のためにかけておく。今回はしなかったが、外部からのメール受信をすべて拒否して、メール送信専用にしてしまってもいいかもしれない。

2009年8月8日土曜日

サーバがまた死んだ

この間の豪雨の際、雷で三回ほど瞬間停電したのだが、どうやらこの間にサーバのデータが壊れていたようで、起動不能になった(起動中にエラーを吐いてランレベル6に移行するのだが、そっちでもエラーを吐いて止まる)。
ちょっと調べても原因がわからなかったので、(この間やったばかりなので覚えているということもあり)Debian Lennyを再設定することにした。

ApacheとSubversionのインストール( + ApacheのWebDAVを使ってSVNを動かす)
必要なパッケージのインストール

# aptitude install subversion libapache2-svn

libapache2-svnをインストールした時に、apacheのdavというモジュールが有効になる(apache2をパッケージで入れた場合、無効になっているだけで既に入っている)。

# mkdir /var/svn
# svnadmin create /var/svn
# chown -R www-data:www-data /var/svn

リポジトリを作成する。ただし、ここでリポジトリの所有者をapacheにしておかなければならない。

以下の内容を/etc/apache2/conf.d/以下に適当な名前(svnなど)で作る。

<Location /svn/miku>
DAV svn
SVNPath /var/svn/miku

Order Deny,Allow
Allow from 192.168.1.0/24
Deny from all

</Location>


Order ~ Deny from allまでは、192.168.1.*しか許可しないという意味になるので、外からのリポジトリへのアクセスを一切拒否している。外からアクセスしなければならない時はSSHでトンネルを張れば良いだけのことなのでこれで十分。なお、ローカルからもトンネル経由でないと許可しない、という設定にする場合は、Allowのところにlocalhostと書いてもいいかもしれない。いずれにしろ、SVNはソースコードなどの重要なデータがインターネット上を流れるので、SSH、VPN、SSL等で暗号化するのが望ましい。

ここまでの設定を確認。ローカル(別のPC。別に同じマシンでも可)にてチェックアウト。
本当はインポートとか使うんだろうけれど、普段やり慣れている方法でやってしまうよね(その方がミスが少ない・・・成長を妨げる要因だ)。

$ svn checkout http://server/svn
$ cp -ra /path/to/original svn/
$ svn add svn/*
$ svn commit

コミットできたら一応成功。

コミットしたら公開

こういうのを何て呼ぶのかは忘れたが、リポジトリのhook scriptを触れば実現できた。
/var/svn/hooks/post-commitに以下のように書く。

#! /bin/sh
/usr/bin/svn export --force file:///var/svn/ /var/www/

post-commitはコミットが成功した後に実行されるコマンドなので、この中にエクスポートするコマンドを書いておけばいいのだ。
これで、コミットの度にファイルが/var/wwwにエクスポートされるようになった。

eRubyを有効にする
RubyをPHPみたいに組み込みっぽく使いたいので(というか我がWebサイトで使っているので)eRubyを導入する。普通のHTMLのように書けるが、の間に書いた文章はRubyスクリプトとして実行される。
このインストール作業が意外と面倒。

# aptitude install euby eruby libapahe2-mod-ruby

まずは普通にインストール。
そして、/etc/apache2/mod-enable/ruby.loadに以下を追記(参考サイトからコピー)。

<IfModule mod_ruby.c>

RubySafeLevel 1

RubyRequire apache/ruby-run

RubyRequire apache/eruby-run

<Files *.rhtml>
SetHandler ruby-object
RubyHandler Apache::ERubyRun.instance
</Files>

</IfModule>

なお、私の場合はRuby Script内でファイルの最終更新日を調べているが、これはsafe levelが0でなければ動かないらしい。なんだか気味が悪いが、とりあえず0にした。

これだけでは、*.rhtmlをクリックしてもファイルダウンロード画面になってしまう。原因は、Live HTTP Header等で調べれば一目瞭然だが、MIME Typeが「application/x-httpd-eruby」というよくわからないものになっている(通常、text/htmlになっている)。これを正すために、/etc/mime.typesにちょっと手を加える。
以下のような行があるので、その行頭に # (コメント)をつける
application/x-httpd-eruby rhtml
これで完了。なんでも、eRubyがこういう風にmime typeを決め打ちされることを想定していないらしい。

これで私の環境復元は終了したのだが、6月、8月と二度も立て続けにクラッシュしたという事実をみすみす見逃してはいられない。あまりにもばかばかしいことだが、一応まとめると:
  • 停電対策(UPS)がまったくなされていない
  • バックアップサーバ自体のバックアップは取られていない
という問題があった(というか、ある)。
まず、UPSは雷の多い地域なので見当の余地はあるが、お金のかかることなのですぐには手は出ない。
問題は二つ目である。これは絶対にやっておくべき対策で、今すぐにでも手を打つべきだ。いままでやってなかった理由としては、「HDDの空き容量がないよ!」だったのだが、今やサーバにHDDを4台ほど積めるスペースがあり、バックアップ用HDDも搭載しているので、やろうとおもえばすぐにできる。

異常気象とはいえ、組んだばかりのサーバをあまり痛めつけてほしくないものだ。

2009年7月4日土曜日

ガラクタにDebianをインストール

8年頑張ってくれたサーバ機が壊れたので、最近(8年から見れば最近)何かと話題のAtomのマザーボードを買ってみた。

http://www1.pcdepot.co.jp/webshop/commerce/CSfEcLastGenGoodsPage_001.jsp?GOODS_NO=42471&IMG_ROOT=/webshop

型番で検索すると「誰がこんなもの買うんだ」みたいな批評も出てくるが、PCIが2枚、PCI Expressが1枚挿せるのでこれにした。100BASEケーブルにしか対応してないけれど、壁内を通しているケーブルが100BASEケーブルだから当面ギガビットは要らない。

すんなり行くだろうと思いきや、いろいろと問題が起こり、バッドノウハウが溜まったのでメモ。

DebianをUSBインストール
参考:公式サイトの「USB メモリでの起動用ファイルの準備
Ubuntu8.04でDebianのインストールUSBドライブを作成した。とはいっても、とくに難しいことはない。


# aptitude install selinux mtools
# syslinux /dev/sdc1 # USBメモリのデバイスファイル
# mount /dev/sdc1 /mnt
# cd /mnt
# echo "default vmlinuz" > syslinux.cfg
# echo "append initrd=initrd.gz" > syslinux.cfg


そして、ISOイメージをUSBメモリの中に放り込んで完成。作る側がDebianでもUbuntuでも何ら相違なかった。
これをマシンにさして、USBブートすればインストールできる。CDに焼くより早くできるので、余っているクリップドライブがあるならこれはかなり良い。


aptにISOイメージをCDとして認識させる
参考: Re:apt-cdrom on iso mount
これは厄介。USBインストールだとCDがないから、ISOイメージをCDとして認識させる必要がある。
(マシンにCDドライブが無く、ネットワークに接続できないため。でなければこんなもの不要かと思われる)
以下、インストールしたマシンで

# mount -o loop debian.iso /mnt
# nano /etc/fstab
上記マウントをfstabにも書き込む。
/home/toshi/debian.iso /mnt iso9660 loop,user 0 0
# nano /etc/apt/sources.list
以下の一行を追加
deb file:///mnt/ lenny main
利用しないリポジトリをすべてコメントアウト
# aptitude update


これでISOイメージをdebianパッケージの入ったCDとして利用できる。


組み込みLANインターフェイス「Realtek RTL8101EL」のドライバをDebian Lennyにインストール
参考:本家のドライバ - treffen - 自宅サーバ
これが一番厄介だった。R8101ELは、Linuxカーネルにこのドライバが組み込まれていない。そのため、Realtek本家のソースコードをコンパイルするわけだが、これがエラーを吐いてくるので若干の修正が必要なのだ。
まず、本家ドライバをUSBメモリなどで新PCに移動。
次に以下ようにパッケージをインストール

# aptitude install linux-headers-`uname -r` libgomp1


あとはマニュアルどおり

# lsmod | grep r8169
(元々入っているドライバが表示される)
# rmmod r8169
# lsmod | grep r8169
(表示されなくなる)


R8010用ドライバのディレクトリに移動して以下のパッチを適用。本当にやっつけなので、無保証です。
共通の下位ディレクトリー: src-orig/.svnとsrc/.svn
src/だけに発見: modules.order
diff -c src-orig/r8101.h src/r8101.h
*** src-orig/r8101.h 2008-01-04 18:48:42.000000000 +0900
--- src/r8101.h 2009-07-04 01:17:43.220310388 +0900
***************
*** 49,55 ****
--- 49,57 ----

#define NODE_ADDRESS_SIZE 6

+ /* temporary disable
#define CONFIG_R8101_NAPI 1
+ */

#ifdef CONFIG_R8101_NAPI
#define NAPI_SUFFIX "-NAPI"
***************
*** 988,990 ****
--- 990,1000 ----
#endif
unsigned wol_enabled : 1;
};
+
+ #ifndef SET_MODULE_OWNER
+ #define SET_MODULE_OWNER(dev) do { ; } while(0)
+ #endif
+
+ #ifndef SET_NETDEV_DEV
+ #define SET_NETDEV_DEV(net,pdev) ((net)->class_dev.dev = (pdev))
+ #endif
あとはマニュアルどおり。

# make clean modules (as root or with sudo)
# make install
# depmod -a
# insmod ./src/r8101.ko (or r8101.o for kernel 2.4.x)
確認用↓
# lsmod | grep r8101
# ifconfig -a
これで、晴れてネットワークにつながるようになった。
久しぶりにいろんなサイトを駆けずり回った。Linuxも易しくなったものだ・・・。
あとは、サーバを復旧するだけだ。