システム奮闘記:その23

サーバー・データのバックアップ強化の話



(2003年10月20日に掲載)
はじめに

  サーバーの危機管理体制強化の話を書きます。
  2003年6月5日、いきなり停電が起こり、サーバーが落ちてしまった。
  しかも、Linuxサーバーのファイルの一部が破損してしまい、
復旧に時間がかかってしまった。

  そこで、停電や瞬電が起こって大丈夫なようにするためにUPSの導入と、
データの保全のため、CD-RWでのバックアップ体制とRAIDの導入が決まった。

  まずは、サーバーのRAIDを構築する所から始まった。
  「RedHat7.3対応で作るLinux7」(サーバー構築研究会:秀和システム)を開いた。

  RAIDの説明が書いてあるので、読んでいく事にしたら、
毎度の如く、すぐに用語で立往生になった。

 ストライピングって何やねん?

  実は、RAIDとはミラーリングの事だと思い込んでいた。
  ここで、はじめて、RAIDにも種類があるのを知った (^^;;

  そういえば、以前から、RAID1とかRAID5などの言葉を目にしていた。
しかし、何の意味か、さっぱりわからなかったし、実際に使っていなかっただけに
理解しようとは思わなかった (^^;;

  さて、「ストライピングとは何か」を本の説明を読んでみることにした。

ストライピング
(RAID0とも言う)
ストライピングの概略図(RAID0)
ハードディスクにデータを書き込む際、データを2分割して、
別々のディスクに保存させるのを「ストライピング」と言う。
そうする事によって、ハードディスクに書き込む際、
書き込む時間が半分になる。もちろん、読み込む際も同じである。
ディスクへの読み込みが早くなる利点が出てくる。理論的には半分になる

しかし、問題点もある。
データを2分割して別個のハードディスクに保存しているため、
片方のハードディスクが壊れると、データの半分は破壊されるため
データの読み込みができなくなる。

  これを知って「へぇ〜、そんなRAIDがあったのか」と感心した。
  それに、理論的にはディスクアクセスの時間が半分になる。
こういう技術があったのかと思った。

  続けて、RAID1が出てきた。これこそ、ミラーリングの事だった。

ミラーリング
(RAID1とも言う)
ミラーリングの概略(RAID1)
これこそ、私が今までRAIDと思い込んでいた物です。
書き込みデータを、2つ以上のハードディスクに書き込むため、
例え、1台のハードディスクが壊れても、大丈夫という物です。

  次に、RAID5が出てきた。
  「ストライピング+分散パリティ」だという。

  分散パリティって何?

  この時、ふと思った。
  「用語でつまづいても、立ち止まらず、少し先を見てから用語を調べてみよう」と。
  そこで、RAID5がどういう物か見ていくことにした。

ストライピング+分散パリティ
(RAID5とも言う)
ストライピング+分散パリティ
この図を見て、「誤解を招くかも」と思われる方。
詳しくは後述していますので、ここでは突っ込まないでくださいね (^^;;

  なんだか、複雑そうな仕組みだと思った。
  さて、まずは「パリティとは何か」を見てみた。
  ハードディスクに書き込むデータがあるとする。
  これをA、Bに2分割する。この時、A+Bの排他的論理和の値を「P」とする。
  排他的論理和(この場合、値P)の事をパリティという。

  RAID5の特徴は、データを2分割しているため、ディスクアクセスが早い。
その上、例え、ディスクが1つ壊れても、パリティというものがあるため、
P-A=Bと式を使って計算をし、データを復元できる。
  この点が、単なるストライピングと違う!

補足説明
本当に、RAID5を導入したらディスクの読み書きが早くなるといえば、
そうでもないみたい。普段から、RAID1やRAID5のディスクと
接している私の後輩に当たるH君に聞いてみたら「マザーボードなどの関係があり
単純に速度が倍にはならないですよ。ちょっと早い感じかなぁ」と言っていた。
定量的に示すデータがないため、どれだけ違いがあるのかが、わからず残念 (--;;

  さて、私は排他的論理和にしている所に注目して

 なるほどなぁ、巧妙だ!

 と思った

  ところで、読者の方で、こう思っている人がいるかもしれません。
「ホンマに、排他的論理和が何か、わかっているのかいな?」という感じで。

  でも、今回は、私の勘違いや、誤解を期待している読者の方を

  100%裏切ります (^^)

  実は、この辺りの話は、私の大好きな部分です (^^)

 論理学の初歩は面白いだけに、のめり込んだ時期がありました。

論理学の初歩は面白い
 高校の時(90年代初頭)、必要十分条件の辺りが好きでした。

  論理学で命題がある。高校の数学I(1990年の話)の分野にもあります。
 「宇宙戦艦ヤマトが空を飛んでいるならば、地球はデスラ─に支配される」
 
  この命題、普通の人は「偽」と答えるが、正しくは「真」。
 そのため大抵の人は、わけがわからなくなり混乱する。
  高校時代、人をバカにした態度で数学力を自慢する同級生がいたので、
「ムッ」ときた私は、この手の問題を出して混乱させた事がある。
  当時から、性格の悪さは変っていないと思う今日この頃 (^^)

 閑話休題。
 論理和と排他的論理和の違いを表にしてみました。

論理和と排他的論理和の違い
論理和(A+B) 排他的論理和(A+B)
A=0A=1 A=0A=1
B=001 B=001
B=111 B=110

  先ほども書きましたが、私は排他的論理和を使った巧妙さに注目しました。
  排他的論理和だと「1+1=0」になる。逆に言えば「0-1=1」になる。
  これだと、パリティPの値と、Aの値がわかっていれば、必然的にBの値が求まる。

  もし、普通に論理和で計算する場合、「1+1=1」になる。
もし、P=1、A=1の時、Bの値を求めようとすると「1-1=1 or 0」に
なってしまう。Bが1の場合も、0の場合もあり得るからだ。
  その点、排他的論理和だと、キチンと答えがでる。

  排他的論理和。大学の一般教養の講義で、排他的論理和を知ったのですが、
当時から今まで、排他的論理和は、何に使うのか、全くわかりませんでした。
それは、排他的論理和を使った例に出会った事がなかったからだった。
  今回、この例を見て、学生時代からの疑問が解けた感じだった  (^^)V


  論理演算。この辺りの話が、初心者にとって敷居になる事を聞いた事がある。
  ネットワークアドレスを求める時に、IPアドレスとネットマスクの
論理積を求めたりする部分などが、つまづき所になるようだ。


  さて、上のRAID5の図で「誤解を招く」と書きました。
  実は、上の図だと、RAID4と間違えそうだからです。
  そこで、RAID4とRAID5を比較してみました。

ストライピング+パリティ
(RAID4とも言う)
ストライピング+パリティ (RAID4)
RAID4の場合、2台のディスクがストライピング専用で、
もう1台のディスクがパリティだけを保存させる仕組みになっている。
しかし、現在ではRAID4は使われなくなった。
パリティ専用のディスクにアクセスが集中するため、ディスクアクセスの
性能が落ちるからだという。でも、この辺りの話は、「どうして?」という感じで
私は理解はしていないが、とりあえず、性能が落ちるみたいです (^^;;<

 RAID5の仕組みを見てみる。

ストライピング+分散パリティ
(RAID5)
ストライピング+分散パリティ (RAID5)
RAID4との違いは、パリティを3つのディスクに分散させて
保存している点にある。
これだと1つのディスクにアクセスが集中しなくなり性能が落ちないという。
分散パリティと意味は、パリティを分散させて保存しているためです。

  RAID4と、RAID5の違いがわかった所で、こういう声があると思います。

  RAID2、RAID3はあるのか?

  もちろんありますが、現在、使われていないです。
  RAID2、RAID3も、RAID4に似た「ストライピング+パリティ」です。
本によれば、違いはストライピング(分割したデータ)の大きさの違いで、
RAID2はビット単位、RAID3はバイト単位です。
  でも、実装が難しいため、使われていないです。

  ちなみに、RAID4のストライピングの大きさは、その処理系で定められている
固有のブロック単位と書かれています。

 その処理系で定められている固有のブロック単位って何?

  地雷を発見してしまった!! RAID2、RAID3に触れるんじゃなかった (--;;

  ここは忍法「先送りの術」で逃げようと考えたが、「ちょっと待てよ」と思った。
  以前、OSによってブロックの大きさが違う話を思い出した。

  そういえば、Linuxでディスク容量を見る時に、dfコマンドを使う。
この時、ブロック数で表示される。

自宅のマシンでdfをした結果
[root@localhost doc]# df
Filesystem           1k-blocks      Used Available Use% Mounted on
/dev/hda1              6048320   1348228   4392852  23% /
/dev/hda3              5042564   3768864   1273700  75% /msdos

  だんだん思い出してきた。MS-DOSの1ブロックが512バイトなどの話だ。
  しかし、この辺りの知識は、話を聞きかじった程度で、全くないに等しい。

  そこで「パソコン技術体系2002 OS編」で、ファイルシステムについて
書かれたページを見てみた。
  ハードディスクにアクセスする際、1セクター単位でアクセスする。
1セクターは512バイト。
  1バイト単位でアクセスしたくても、1セクター単位でアクセスするため、
その調整をファイルシステムが行なっているという。
  この話、初めて知った。

  dfコマンドに「-h」のオプションを付けると、ギガ単位で出てくる。
  6048320Kバイトが5.8Gだったので、どうやら、Linuxの場合は、
1ブロックが1024バイトのようだ。

  まだ、推測の域を出ないが、RAID5の場合の、ストライピング(分割)の
大きさは固定ブロック長なので、1024バイトだと考えられる。
  これだと、RAID2のビット単位や、RAID3のバイト単位よりも
RAID5のブロック単位の方が実装がしやすいのではと考えられる。

  ファイルシステム。奥が相当深い感じがした。
 詳しい事については「システム奮闘記:その31」の
「ファイルシステム入門」をご覧下さい。

  
  さて、RAIDの部分を読んでいると、実は、日本語でもつまずいた。
 それは・・・

 冗・長・性

 だった。
  はじめ、どういう意味か、わからなかったので、そこで国語辞典で調べてみた。

国語辞典で調べた「冗長性」の意味
言語による伝達の際、ある情報が必要最小限よりも数多く表現されている事。
冗長性があれば、雑音などで伝達が妨げられても、情報伝達に成功する事がある。

  これを見て「なるほど」と思った。
  要するに、RAIDで使われている「冗長性」は、データを2重(3重)に
複製している事を意味する。重複があるという意味になる。
  そこで、もう一度、RAIDの説明を読み返した。

RAIDで使う「冗長性」という言葉
ストライピング データが2重に記録されないので冗長性がない。
ミラーリング データが2重化されるので、冗長性がある。

  「冗長性」という言葉の意味を知れば、「なんだ、難しくないやん」となる。
しかし、コンピューター用語ならぬ日本語でコケてしまった。
  そこで私は「理系だから、国語力がないのらー!!」と開き直る。

理系に国語力はないのか?
理系の人間は国語が苦手な場合が多いと言われる。私も苦手だった。
しかし、高校時代、数学の先生が「君らは理系じゃない」と言った。
そして「非文系だよ」と続けた。意味は、文系教科が苦手で、
理系に逃れてきた「非文系」で、理系が得意という意味でない事を指す。
教室中、みんなで苦笑いしたが、大半は理系教科の成績も良くないので、
反論ができなかった。私も反論ができず、苦笑していた。
理系が国語が苦手な前に、非文系ではないかと考えてみるのも1つかも

  RAIDと「冗長性」の言葉の意味がわかった所で、
RAIDの略について、こんな話があるのを紹介します。

「RAID」の略について
  この2つを勉強する前後、「暗黒のシステムインテグレーション」
(森 正久:IDGジャパン)を読んでいた。
  その中に「暗黒のRAID」という章がある。ここに書いてある内容が
RAID0とか冗長性とかが出てきて、チンプンカンプンだった。
  折角、勉強したのだからと思って読み返すと、内容がよくわかる。

  それにしても、えげつないSIベンダーがあるなぁと思う。
  RAIDの選択を間違えているのに、顧客に責任を押し付ける実態や、
RAID0が冗長性がないのを隠して売った話などがある。
  ところで、「へぇ〜」と思ったのが、RAIDの意味だった。
  元々は「Redundant Arrays of Inexpensive Disks」だったのが、
「Inexpensive」は「安い」という意味なので、印象が悪くなるため、
「Redundant Arrays of Independent Disks」と変えたのではと書いている。
  私は関西人なので、関西人的な発想だと「安いで、ええやん!」となる。
  「良い物を安く買う」のが自慢になる関西だが、他の地域では、そうでもないので、
「安い」となれば、関西以外では、安かろう悪かろうの印象になってしまう。
そのため、名前を変える必要があったのかなぁと思う。

 RAIDの略の部分のすり替え。
 言葉遊びに思えてしまうが、Inexpensiveの意味を考えると
すり替えする必要があるのかどうか疑問に思ってしまった。

Inexpensive」は「安い」と訳して良いのか
この所、やたら英語の訳に突っ込みを入れたがる私。
Inexpensiveの言葉は安いと訳されている場合は他にもあった。
「RedHat7.3対応で作るLinux7」(サーバー構築研究会:秀和システム)にも
「言葉の通り、安価なディスクを用いて・・・」と書いている。

「安い」という訳を見て、一応、英英辞典で「Inexpensive」を調べてみた。
辞書には「not costing much money」とある。「そんなに高くない」という意味だ。
高価な意味の「expensive」の反対語になるため、「安物」というのは短絡的だ。
実際、国語の問題でも、「高い」の反対語は、「高くない」が正解。
なぜかを、図を使って簡単に説明します。



上の図は、懐かしき高校の数学で出てきたベン図です。
価格の度合いを表す領域の中に「高い」という部分があります。
となれば、左図のように「高い」の反対は「高くない」という領域になります。
「安い」は右図のように、「高くない」の領域の一部なので、
「高い」の反対は「安い」というと、短絡的な発想になってしまいます。

しかし、言葉は人間が使うので、論理的の白黒と分られない現実があります。
英語のできる弟の話だと、「安物」の遠回しの言い方で
「お値打ち品」などの意味合いで使うこともあるという。

そこで、わかったのは、英語表現で「安価なディスク」の遠回しで、
「高くないディスク」という表現で「Inexpensive」を使ったのだが、
日本語に歯切れの良い言葉がないため、直接的な訳の「安い」に
なってしまったと思う。
英語で遠回しにした表現を、日本語に訳す時に、直接的な訳になり、
それが露骨なため、言葉をすり替えるという形になったと想像できる。
英語だと接頭語を使うと、反対語でも歯切れの良い言葉になるのだが、
日本語では、そうはいかないため、直接的に言葉にならざる得ない。 そう考えると、言葉の翻訳は難しい・・・。

 閑話休題。

  RAIDについて本を読み進めると、また違った区分に分かれる。
  「ハードRAID」と「ソフトRAID」の2種類がある。

ハードRAID
ハードRAID
ハードRAIDは、上図のように、装置が自動的に、
データの書き込みを振り分けてくれる。
頭の良い装置になれば、スイッチの切り替えだけで、
RAIDのレベルを変更できる。OS側で何も設定しないため楽だが、
装置の購入という意味では費用の問題が出てくる・・・

  お金があれば、ハードRAIDにしたいが、予算は限られる・・・ (--;;

ソフトRAID
ソフトRAID
ソフトRAIDは、ハードRAIDと違い、上図のように、
OSがデータの書き込みの振り分けてくれる。
OSの設定は必要だが、極端な話、ハードディスクの増設だけで可能なため、
費用的には安くできる利点がある。

  ここで、悩んでしまった。
  うちの会社の場合、3台、サーバーがある。

2003年のネットの構成
ネットの構成

  3台ともソフトRAIDにするか、それとも、ハードRAIDにするのか。
  だが、予算の問題がある。そこで、考えた。

  1台のマシンにソフトRAIDができるかどうか確認して、可能であれば、
全てのサーバーをソフトRAIDにする。ダメだったら、ハードRAIDにする。


  そこで、次のようなソフトRAIDを考えた。

ソフトRAIDの実験
ソフトRAIDの実験のディスク構成

  さて、どうやって外付けのディスクを調達しようかと考えた。
  ふと、姉の家に古い外付けハードディスクがあるのを思い出す。
この間、Pentium4という高性能なパソコンを買ったのを聞いて、
古いパソコンは使っていないと思った。案の定、使っていないので、
早速、姉の家へ行って、外付けのハードディスクを取りに行った。

  しかし、5年くらい前の代物なので、2GBしか容量がない。
  2GBしか使えないとなると、新しいサーバーで使うと、ミラーリングすると
内蔵ディスクの容量が大きくても、外付けの容量の影響を受けて2Gまでになる。
非常に、勿体ない話になる。

  そこで、まず、社長のお古で、PostgreSQLサーバーからRAID導入を考えた。
  性能は、Pentium150MHz、RAM48M、HDD 2GB。
  調達した外付けハードディスクとは、良い組み合せだ。

  幸い、実験サーバーがあるので、実験サーバーを、PostgreSQLサーバーにして、
社長のお古を、ソフトRAIDの実験台にする事にした。


  そして、外付けのハードディスクをつけるために、SCSIカードの購入が必要。
  部長のOKが出たので、早速、SCSIカードを買いに行く。
  パソコンショップへ行くが、Linux対応とは書かれていない。
  イチかバチかの博打になる。元々、メーカー保証がないのを承知だったので、
1番、安いSCSIカードを買うと考えた。
  でも、ふと店員に「Linux対応はないのですか」と聞いてみた。
店員は「難しいですねぇ」と答えながらも、探してくれた。
  Linux対応と書かれた物が見つかった。店員に聞いてみるものだと思った。
  これで、例え、認識しなくても、言い訳ができる (^^;;

  翌日、外付けハードディスクが認識するかどうか試してみた。

  無事、認識してくれた!!

  これで円滑に、ソフトRAIDが導入できると期待したが、
やっぱり私が導入するためなのか、泥沼にハマっていった。

  そこで、泥沼にハマった話を書く事にします。はじまり、はじまり (^^)
  (私は、失敗談を書くために、生まれてきたのかと自問自答する今日この頃)

ソフトRAIDの設定実験

RedHatの場合、インストールする時に、ソフトRAIDの設定ができる。 さて、インストール時の、ソフトRAIDの設定方法を見てみたが・・・。 本に設定方法が書いてへん (TT) いきなりピンチに立たされた。何せ、お得意の「丸写し」ができないからだ。 RAIDの記述されている所には、ハードディスクを増設した後に、 RAIDの設定する方法が書かれている。 そこで思いついたのが、最初は、内蔵ハードには普通にインストールをして、 その上で、後から、外付けのハードを増設する方法をとることにした。 そして、/etc/raidtabを記述してから、mkraid /dev/md0を使ってRAIDを構築する。 しかし、結果は・・・。 外付けハードが認識してくれへん (TT) 実は、インストール後からディスクを増設する時、色々な操作が必要。 本の内容を見よう見まねで、ディスク増設の操作を行なったがダメだった。 RAIDを構築する以前の問題だった (--;; この辺りの話は、今はシステム奮闘記に書ける程の知識がありませんので、 後日、触れたいと思います。 そこで、最初から外付けハードディスクも認識させれば良いと思い、 外付けハードディスクをつけた状態で、Linuxのインストールを起った。 外付けハードディスクは認識しているが、/etc/raidtabを記述してから、 mkraid /dev/md0を使ってみても 何の反応もあらへん (TT) でも、めげずに、また頭を捻った。 インストールの時、インストーラーを使っている。 ディスクパーティションを行なう際、ファイルシステムの選択がある。 私は、内蔵・外付けディスクの両方とも、ext3のファイルシステムを選択していた。 でも、選択肢の中に「 ソフトRAID 」という物がある。 私は外付けディスクのファイルシステムを「 ソフトRAID 」にして インストールしたが、うまくいかなかった。 ならばと思い、ネットでソフトRAIDを調べてみた。 ディスクパーティションの時、RAIDをする場合は、両方ともファイルシステムを 「ソフトRAID」にすると書いていた。 早速、真似してやってみた。 どうやら、うまくいった見たい。 さて、うまくRAIDが設定できたか確かめる事にした。
ソフトRAIDの稼働確認実験
ソフトRAIDの稼働確認実験

  上のように、外付けディスクの電源を落としても正常に稼働するか
確認してみたら

  なんでエラーが出るねん!

  しかも操作も何もきかなくなった  (・・)

  そこで、一度、電源を切って再起動してRAIDの設定を見てみたら

  なんで、RAID0になっているの?

  もしかして、RAIDの選択の時に、マウス操作を誤ったのではと思い、
再度、インストールしなおすことになった。
  キチンとRAID1の設定になっている事を確認した。

  さて、インストールができた所で、外付けディスクの電源を切った。
そうすると、エラーが出たが、操作はできたので、様子を見る事にした。
  触っていると、見れないファイル、移動できないディレクトリーなどがあった。
  見れないファイルを見ようとすると、エラーを吐いたので「おかしいなぁ」と
思った。
  そこで、もう一度、インストールをやりなおしたが、同じだった。

  そうなると・・・

 気が変になる (@o@)

  ネットを探すが情報がない・・・。

  もしかして、ドライバーの認識がうまくいっていないのではと思った。
そこで、起動時の状態を見るため、dmesgのコマンドを打った。
  ちなみに、RAIDの場合、mdデバイスなので、mdデバイスに注目した。

dmesgを打った結果
(途中省略)
md: md driver 0.90.0 MAX_MD_DEVS=256, MD_SB_DISKS=27
md: Autodetecting RAID arrays.
 [events: 00000004]
 [events: 00000003]
 [events: 00000002]
md: autorun ...
md: considering hda3 ...
md:  adding hda3 ...
md: created md0
md: bind
md: running: 
md: hda3's event counter: 00000002
md0: former device [dev 08:03] is unavailable, removing from array!
md: RAID level 1 does not need chunksize! Continuing anyway.
kmod: failed to exec /sbin/modprobe -s -k md-personality-3, errno = 2
md: personality 3 is not loaded!
md :do_md_run() returned -22
md: md0 stopped.

  どうやら、mdデバイスの認識がうまくいっていないようだ。
  RAIDが失敗している事が読み取れる・・・。
  でも、ここで、めげる私ではない。

  何せ、何度も失敗に泣かされてきたのだから、根性だけはついている! 
  RedHat7.3がダメなら、RedHat8.0で挑戦したら

  インストーラーが立ち上がらない (TT)

  GUIのインストーラーばかり使っている私。
  テキスト版のインストーラーに切り替えてやってみる事にした。
  なんとかインストールができた。
  でも、結果はダメだった。RAID1がうまくいかない (TT)

  意地になって、次に、RedHat9.0をインストールするが

  何も認識してくれない (TT)

  CD-ROMからの起動はダメだし、フロッピーで起動させても、
すぐにコケてしまう・・・。私の技術力では、どうにもならない。

  もう、万策が尽きた。
  部長が「どないや」と聞いてきたので、私が「万策、尽きました」と答えた。


  ついに万策が尽きたため、ソフトRAIDは諦めた。
  次なる手は、ハードRAIDしかない。失敗した時のリスクは恐い。
だって、お金かかるもん (^^;;

  リスク軽減のため、Linuxのハードを得意としているデゥアルコンピューターから
ハードRAIDの装置を買う事にした。

デゥアルコンピューターから購入した
RAID1の装置
Accusys ACS-7500W
RAID1の装置
この装置には、2つ内蔵ハードディスクを入れる所があり
自動的にRAID1として働いてくれる。
例え、1つしかハードディスクを入れなくても、正常に動く。
もし、1つハードディスクが昇天した時、入れ替えるだけでOK。
あとは、自動的にもう一つのディスクからコピーしてくれる。
装置の値段は、23800円(税抜き)なので、お得だと思う。

  サーバーは3台あるが、うち2台は古いため、装置の認識が
あやしい可能性がある。
そこで、まずは、3年前に買ったサーバー分だけ買って
装置をつけることにした。

  ソフトRAID以外にも、安くバックアップがとれるように
CD-RWもつける事にした。

  さて、古いサーバーのうち、1台は、DNS&NATマシン。
これは壊れても、DNSはセカンダリ─がある上、NATは開発実験用サーバーを
NAT&DNSマシンに持ってくれば、応急処置がとれる。無理に買う必要はない。

  もう1台のPostgreSQLサーバー。
  ディスクが壊れるとマズイし、応急処理ができない。
  まだまだ、現役で稼働できるが、社長のお古で、5、6年前のマシン。
24時間連続稼働なので、いつ、ハードディスクが昇天するかわからない。
  しかし、古いだけにRAID1の装置とマザーボードなどの相性が
合わない可能性もある。

  そこで、新しくサーバーを購入する事になった。
  社長のお古の後継機は、Celeron2GHz RAM 256Mという
馬力のあるサーバー。
  それに、RAID1の装置とCD-RWをつけた物だ。
  稟議が通ったので、早速、注文する事にした。

  そして、サーバーの構成を次のように一新する事になった。

今までのサーバーの構成 新しいサーバーの構成
今までのサーバー構成 新しいサーバー構成


UPSの設定

UPSの方は、GEEE製品のUPSで、4台のPCサーバーが接続できる代物の 購入が決まった。 このUPSの場合、5分くらい停電が続いても、バッテリーが持つ代物だ。

いざ設定開始

お盆休み。誰にも気を使う事なくサーバーが止められる。 そこで盆休み中に設定のため出勤する事にした。 休日出勤の初日(8月14日) お盆なので、メールサーバーを停止させた。そして、そのサーバーに RAID1のハードとCD-RWを増設した。 後は、UPSをつける事だった。 UPSの説明書を読むと「最低、24時間充電してください」と書かれていた。 そ、そんなアホな・・・ (・・) UPSの設定は、翌日に持ち越された。 電話は少ないし、事務の仕事はない。時間はあるので、時間潰しに アイスクリームを食べながら、システム奮闘記の原稿を書いていた。 翌日の8月15日。 UPSの充電が完了したので説明書を読んでいったが・・・ 説明書が、わかりにくい (TT) それでも、なんとか読んでいく事にした。 さて、付属CDについているツールを使って、UPSにIPを持たせる 必要があると書いている。 UPSでも、自動電源ダウン装置がついている物なので、 LANケーブルを使って、サーバーに電源を落とす信号を送る。 LANにつないでいるので、IPが必要なのだなぁと思った。 UPSの初期状態でのIPアドレスは、192.168.0.1だった。 そこで、パソコン1台のIPを 192.168.0.2 に割り当てて、 LANケーブル(クロスタイプ)を持ってきて、パソコンとUPSをつなげた。 そして、付属CDのツールを使う。 しかし、ツールを使っても、新しいIPを覚えてくれない (TT) テストで、パソコンから ping を打つと、UPSから反応が返ってきた。 同じように、何回か、ツールを使っていると、UPSにつながらなくなった 「あれっ?」と思って、ping 192.168.0.1とするが反応が返ってこない。 そこで、UPSをLANにつないで、pingで、本来、UPSに割り振るIPを 打つと、反応が返ってきた。 適当にやっていたら、IPアドレスを覚えてくれた。 次に、Linuxに信号を送って自動的にシャットダウンを行なうソフトのインストール。 意外と簡単にできた。 さて、テストとして、UPSの電源を切るために、コンセントの元を抜いた。 3分後、Linuxが自動的にシャットダウンした。 テストは成功。無事、UPSは導入できた (^^)

CD-RWでバックアップ

盆休みが終わり、UPSとRAID1の装備は終了した。 CD-RWだが、とりあえず、CD-ROMの役目はできた。 後は、バックアップ体制で、自動的にデータをCD-RWに書き込む 設定をしなければならないのだが、事務仕事が降ってくるわ、 基幹業務システムのRPGプログラムの追加はあるわで、Linuxから少し遠ざかった。 ようやく落ち着き、CD-RWの書き込みに着手する事にした。 デゥアルコンピューターから「cdrecord」というコマンドを使えば、 CD-RWに書き込みができる事を教えてもらった。 さて、google先生を使って、調べてみる事にした。 DZNetのホームページに、CD-RWの設定方法が載っていた。 まずは、既存のサーバーにCD-RWを増設した物から設定する事にした。
新しいサーバーの構成
新しいサーバーの構成

  ATAPIのCD-RWなのだが、サーバーにはSCSIだとダマして設定する方法が取られる。

  ブート方法は、LILOを使っているので、lilo.confのファイルの最後に
append="hdc=ide-scsi"という呪文をつけた。
  これの意味は、よくわからないが、調べても、今の私の知識では
太刀打ちできないので、ここは丸写しにした。
  そして、再起動をかけた。

  次に、モジュールを取り込むため、modprobe ide-scsiを入力。
  モジュールの取り込みを確認するために、lsmodコマンドを打ったが何も反応なし。

  おかしいと思った。Webには、デバイスファイルを直接みる方法が書いてあった。
  /proc/scsi/scsi なので、見てみたが

  ファイルそのものがあらへん (TT)

  こりゃ、アカンなぁと思い、CD-RWが使えるかどうか確認のため、
cdrecord -scanbusコマンドを打ってみたが

  エラーを吐いてしまう (TT)

  しかし、この程度で諦めない私。
  ネットで検索していくと、カーネル再構築の話が書かれていた。
  CD-RWがSCSIという認識で使うため、SCSIを認識させる必要がある。
  そこで、カーネル再構築に挑戦と思ったが、しかし、このマシンは、
メール&Webサーバーで稼働中。止めるわけにいかないし、
カーネル再構築に失敗して、変な事になったら恐い。


  そこで、購入したばかりのPostgreSQLサーバー(RAID1、CD-RW付き)を
使って、カーネル再構築をやってみることにした。
  こちらの方は、止めても、今までPostgreSQLサーバーとして使っていた
社長のお古を継続運用する事によって、業務に支障はなくなる。
  そのため、心置き無く、カーネルの再構築ができる。

  「RedHat7.3対応で作るLinux7」(サーバー構築研究会:秀和システム)を見た。
  make xconfigというコマンドを打つと、GUIでカーネル再構築の画面が出る。
  さっそくコマンドを打ってみたら・・・

 エラーを吐いてしまう (TT)

エラーの内容
make: *** ターゲット `config' を make するルールがありません. 中止。

  何度かコマンドを打つがエラーが出る。呪われていると思った。
  もしかして、カーネルのソースがインストールされていないからだと思い、

 rpm -q kernel-source

 を打ってみたが、キチンとインストールされている。
 
 なんで、俺の時は、エラーが出るねん (TT)

 と思ったが、しかし「待てよ」と思った。
  カーネルのソースがあるディレクトリーでないと、makeはできない
  makeする時のファイルがないからだ。
  私は、rootのホームディレクトリーで、makeを行なおうとしていた (^^;;;
  そこで、/usr/src/linux-2.4 (これはカーネルが2.4系の場合)へ移動して、
make xconfigというコマンドを打つと、GUIが出てきた。

  でも、SCSIの中を認識させるのか、全くわからない。
  Webには書いてあるが、カーネル再構築は初めての作業。
丸写しすらできない・・・。
  そこで、SCSIの部分を全て「Yes」にして、本の通り、コンパイルをかけた。
  そして、再起動をした。

  再起動すると、なんだか、おかしな動作をする。
  CD-RW装置が、CD-ROMの役目すら果たさなくなった!
  でも、ここは気にせず、先へ進む事にした。
  とりあえず、lilo.confのファイルに、append="hdc=ide-scsi"という呪文を
つけようとしたが、既についていた。
  ここで「なぜかなぁ」と思うわないといけないが、気にせず、次へ進む。
  次に、モジュールを取り込むため、modprobe ide-scsiを入力。
  ちなみに、このモジュールはカーネルをダマすためにある。
ATAPIのCD-R(W)装置の場合、そのままでは認識してくれないため、
一度、SCSI接続の装置だと見せかけてるためにしている工夫(?)だ。
  モジュールの取り込みを確認するために、lsmodコマンドを打ったが何も反応なし。
  でも、気にせずcdrecord -scanbusコマンドを打ってみたが

  エラーを吐いてしまう (TT)

  ここで、カーネル再構築がうまくいっていない事が判明した。
  知識がないのに、カーネル再構築すると、こういう事になるのだなぁと思った (^^;;

  これでは、CD-ROMとしても使えないので、カーネルを再構築する前の物で
再起動させた。


  ここで、lilo.confの記述に目をつけた。
  最初から、append="hdc=ide-scsi"という呪文がついていた事は、
インストール時にCD-RW装置があると認識しているのではないか。
  そこで、cdrecord -scanbusコマンドを打ってみたら

 見事、認識していた (^^)V

認識している様子
[root@server]# cdrecord -scanbus
Cdrecord 1.10 (i686-pc-linux-gnu) Copyright (C) 1995-2001 J?g Schilling
Linux sg driver version: 3.1.22
Using libscg version 'schily-0.5'
scsibus0:
	0,0,0	  0) 'ATAPI   ' 'CD-RW 52X24     ' 'K.SC' Removable CD-ROM
	0,1,0	  1) *
	0,2,0	  2) *
	0,3,0	  3) *
	0,4,0	  4) *
	0,5,0	  5) *
	0,6,0	  6) *
	0,7,0	  7) *

  どうやら、CD-RW装置が最初からついていた上で、RedHat7.3を
インストールした時、インストーラーがATAPIのCD-RWとして認識して、
自動的にSCSI認識という風に、ダマす設定までやってくれる場合もあると思った。
  この辺の話は、キチンと検証した上でないと、断言できない (^^;;;

  さて、認識できた所で、実際に、CD-Rを焼いてみる事にする。
  ここは、Webサイトの書いている事の丸写し。

  まずは、イメージファイルの作成を行なう。
  mkisofs -r -J -o  file.img ./file.dat

  ちなみに、上に書いているfile.imgはイメージ化するファイルで、
file.datはイメージ化する前のファイルを意味する。

  なぜ、ファイルのイメージ化するのか。
  CD-RWを焼く作業中には、その疑問を持っていなかったが、
この奮闘記を書いている時に、ふと思った。
  そういえば、Windowsで、CD-Rを焼く時にも「イメージファイルを作成中」と
出ていたのを思い出した。
  (イメージファイル作成については後述しています)

  いよいよ、CD-RWを焼く作業に移る。
  社内に、空のCD-Rのメディアが結構あるので、それで実験する事にした。
  もちろん、焼く際のコマンドも丸写し (^^)  

  cdrecord -eject  speed=4 dev=0,0,0 ./file.imgのコマンドを打った。

  ちなみに、これはfile.imgのファイルを4倍速で焼き
焼き終えたら、メディアを自動的に取り出すという意味だ。
  早速、実行してみたら、成功した!!

実行結果
[root@server]# cdrecord -eject  speed=4 dev=0,0,0  ./file.img
Cdrecord 1.10 (i686-pc-linux-gnu) Copyright (C) 1995-2001 J?g Schilling
scsidev: '0,0,0'
scsibus: 0 target: 0 lun: 0
Linux sg driver version: 3.1.22
Using libscg version 'schily-0.5'
Device type    : Removable CD-ROM
Version        : 0
Response Format: 1
Vendor_info    : 'ATAPI   '
Identifikation : 'CD-RW 52X24     '
Revision       : 'K.SC'
Device seems to be: Generic mmc CD-RW.
Using generic SCSI-3/mmc CD-R driver (mmc_cdr).
Driver flags   : SWABAUDIO
Starting to write CD/DVD at speed 4 in write mode for single session.
Last chance to quit, starting real write in 6 seconds.
0 seconds. Operation starts.
Track 01: Total bytes read/written: 1376256/1376256 (672 sectors).

  実際に焼けているか、どうかCD-Rの中のファイルを見てみたら、
問題なく焼けていた実験成功!
  次は、バックアップの自動化に進む事にした。

  実は、まだCD-RWについての話があるが、それは後述しています。

cdrecordのコマンドでの補足
cdrecord -eject  speed=4 dev=0,0,0  ./file.imgで実行しました。
cdrecordのコマンドの中で「dev=0,0,0」があります。
これは、cdrecord -scanbusを実行した時に、
CD-RWの装置が、どのデバイスなのかが出力されます。
0,0,0	  0) 'ATAPI   ' 'CD-RW 52X24     ' 'K.SC' Removable CD-ROM
うちの会社のCD-RWだと、「0,0,0」と出ましたので、
デバイスの指定を「dev=0,0,0」にしています。
でも、全てのマシンがそうでないので、ご注意してください。

  さて、無事、焼けた事を確認できたので、次に、バックアップデータを
CD-RWに書き込む際、手動操作を行なうのは面倒なので、自動化しようと考えた。
  すぐに浮かぶのは、cronを使う。cronを使うと、指定した時に
自動的に処理を行なってくれる仕組みだ。

  だが、問題があった。

  今まで、cronは触った事、あらへん!!

  知識として「cron」は知っていても、実際に、触っていないと使えない。
  そのため、勉強する必要が出てくる。

  そこで、Webで検索して、cronの記述のページを見つけた。
  まずは、いつ何を実行させるのかを設定するファイルがある。
  /etc/crontabというファイルだ。
  早速、ファイルの中を覗いてみた。

/etc/crontabの中身(RedHat7.3の場合)
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

  これだど、なんとなくわかる。
  言葉の通り、/etc/cron.hourlyは毎時間あたりの処理だとわかる。
  だけど、毎時間あたり何を処理するのかまでは、見えてこない。
  そこでWebに書かれている説明を見る事にした。

ファイルの中身
ファイルの中身
設定例
設定例

  これで、時間指定などができるようになった。
  シェルを実行させるディレクトリーには、拡張子が「conf」のシェルファイルを
格納していれば、後は、勝手に指定した時間が来れば実行してくれる。

  しかし、次の問題も出てきた。

  シェルが、組まれへん!!

  cronを実行させるスクリプトとして、シェル(Shell)が使われる。
  シェル。言い訳を書くと、全くできないわけではない。
  以前、ホームページのカウンターと、簡単な掲示板をシェルで書いた事がある。
  本の丸写し、見よう見まねで適当に作った産物だったのだが、かなり前なので、
すっかり忘れている (^^;;

  そこで、シェルの助っ人として次の本を取り出した。
  「応用UNIX」(羽山 博:アスキー出版)
  「Linux & UNIX Shellプログラミング」(デイビッドタンズリー著:
服部 由実子訳:ピアソンエデゥケーション)

  シェルといえば、UNIX系のOSを使う時、何かとお世話になるスクリプトだ。  
起動時も、シェルが動き出して立ち上がる。
  UNIXの思想は、小さいツールの集団を作り、それをつなぎ合わせて、
大きな仕事を行なうというのがある。
  つなぎ合わせる役目を果たすのに、シェルが欠かせない。


  まずは、データベースからバックアップデータを取り出す処理から。

  クーロンは root権限で行なう。しかし、PostgreSQLの場合、ユーザーごとに
データベースのテーブルを持っているため、該当のユーザー権限で、
バックアップデータを取り出す必要が出てくる。
 (もちろん、PostgreSQLの管理者ユーザー権限だと、全てのテーブル情報がとれる)


  そこで、各ユーザー権限で実行する命令(sudo)をに目をつけた。
  manで使い方を見て、見よう見まねで、下の命令文を作った。

 sudo -u postgres /usr/local/pgsql/bin/pg_dump testdb > /home/postgres/testdb.out

  これは、postgresというユーザー権限で、データベースの中のtestdbという
テーブルのバックアップをとり、postgresのホームディレクトリーに放り込む命令だ。

  早速、rootから、上の命令を使ってみると、問題なくできた!
  さて、取り出したバックアップデータの所有者を見てみたら、rootになっていた。
  rootで、sudo命令文を使って、postgresというユーザー権限で作成したファイルの
所有者がrootになっている。
  いかにも、不思議だなぁと思った。

  ところで、バックアップデータ-。毎日、データーを取るとしたら、
ファイル名に日付を入れた方が、わかりやすい。
  日付を、どうファイル名に入れようかと思いながら、本を見たら、
単純な方法であった。
  そこで、簡単なシェルを組んでみた。

生成したファイルの名前に日付をつける方法
#!/bin/sh
set `date`
nslookup  www.example.com > test-$1-$2
これは「 nslookup www.example.com 」の出力結果をファイルに
収めるためのシェルのプログラム。
3行目のファイル名の部分の$1と$2がミソ。
$1はdateコマンドの出力の1つ目の値。$2は2つ目の値

  コマンドの出力結果を「$」の変数に置き換えれるので、便利だ。
それを、ファイル名に直接、「$」変数を入れることができる。

  不思議だなぁ、オモロイなぁと思い出すと、止まらない私。
シェルに、ちょっと、ハマってしまった。

  /etc/rc.sysinc という起動時に動くシェルスクリプトを見てみた。
  スクリプトを見ている途中、if文を見て疑問が出た。

  if [ -Z /etc/hosts ] って、どういう意味?

  C言語や、PHPなど、if文の中は比較する場合ばかりだ。
これは比較文とは考えにくい。そのため「なんだ、こりゃ?」と疑問に思った。

  本を引っくり返して、調べると、/etc/hostsというファイルが存在した上で、
ファイルの大きさが0バイトの場合、真の値と判断するif文だった。
  シェルのif文でif [ -f /etc/rc.local ] などの比較文とは考えにくい
if文があるので、以前から「なんやろなぁ」と思っていた。
  しかし、調べる気がなかった。だって、わかんないもーん (^^)V
  でも、今回、面白いから調べてみたら、答えがわかった。
  ファイルの存在の有無、ファイルの大きさなどで、真かどうかを判断するif文。

  数値や文字列の比較のif文を見ると、これも驚いてしまう。
  大抵、C言語などの比較の場合、次の記号を使う。「=」 「<」 「>」 「!=」
しかし、シェルでは「-eq」や「-gt」など、文字を使って比較記号を表す事ができる。


  色々、夢中になって触っていると、あっという間に時間が過ぎる。
「今日のお題はシェルスクリプト」といわんばかり、事務の仕事を横に置いたまま
シェルにハマってしまったのだ。でも、サボりじゃないのらー!!
  これでシステム管理の簡略化のための技術習得だから、立派な仕事なのらー!


  シェルに少しハマったが、肝心のcronによるバックアップの自動化のシェルを
完成させねばならない。
  そこで、自動化のためのシェルを簡単に組んでみた。

生成したファイルの名前に日付をつける方法
#!/bin/sh
set `date -R`
sudo -u postgres /usr/local/pgsql/bin/pg_dump testdb > /backup/testdb-$4-$3-$2
mkisofs -r -J -o /backup/testdb-$4-$3-$2.img /backup/testdb-$4-$3-$2
cdrecord -eject speed=4 dev=0,0,0 /backup/testdb-$4-$3-$2.img

  さて、稼働する事にしてみた。

  でも、エラーが出る (TT)

  おかしいなぁ。どこに問題があるのやろかと考え込んだ。
  そこで、別のCD-Rを入れて書き込んだら、問題なく、うまくいった。
  ふと、書き込んだCD-Rに、別のデータを追加で書き込もうとしたら、

  追加で書かれへん (TT)

  ここで、何が原因かわかった。
  CD-Rで一度書き込んだら、いくらまだ書き込む領域があったとしても
書き込めなくなる。
  これはCD-Rだけに見られる現象なのか、CD-RWにもあるものか
確かめてみたら、CD-RWでも同じ事が起こった。

  大量のデータを書き込むなら、まだしも、数10Mのデータを書き込んで
終わりだと、メディアがもったいない。
  そこで、追加で書き込める方法がないかと、ネットで検索してみた。

  そうすると、あるMLのログを引っ掛けた。そこに書かれているのは、

  RockRidgeだと、1度焼くと2度焼けない

  (上の記述は実は、間違いなのだが、この時は、わからなかった)
  何やらRockRidgeという新しい言葉が出てきた。
  早速、調べてみたら、ファイルシステムの拡張形式の一つだという。

  調べると、イメージファイルを作る時のオプションでファイルシステムの
拡張形式を選択できるという。

  mkisofs -r -J -o file.img ./file.dat

  -rは、RockRidge拡張形式で、UNIX系に使われる。
  -Jは、Joliet拡張形式で、Windowsに使われる。
  他にも、MACの拡張形式もあります。

  そこで、「-r」のオプションを外して、イメージファイルを作成して、
CD-Rを焼いてみた。そして、2度目に別のデータを焼こうとするが

  それでも焼かれへん (TT)

  「なんで焼かれへんねん」と思いながら、1つのファイルしか、
CD-Rに書き込まれへんのかと思った。

  しかし、Webを検索していると、違う方法を見つける。
  イメージファイルを作成する時、焼くファイル名を書くのではなく、
ディレクトリーごと、イメージファイルにしてしまう事ができるのを発見した。

  mkisofs -r -J -o file.img ./direc (direcというディレクトリー)

  さて、試しに、direcというディレクトリーに、いくつかのファイルを入れてから
イメージファイルを作成。そして、CD-Rに焼くと、見事、ディレクトリーの中の
ファイルが全て焼く事ができた。
  しかも、CD-Rに direcというディレクトリーが作られるのではなく、
direcの中のファイルが書き込まれている。
  これだと、1度しか焼けなくても、大量のデータを焼くことができる。

  でも、2度目も焼けるようにしたい。そこで、引き続き、調べることにした。

  ふと、思った。なぜ、イメージファイルを作成して、CD-Rに焼くのか。
そういえば、WindowsでCD-Rを焼く時もイメージファイルを作成する。
  そっちの方も調べてみた。そうすると、CD-ROMに記録させる場合の
ファイルシステムは、ISO9660という形式だとわかった。
  イメージファイルは、ISO9660という形式に変換するためと書いていた。
  RockRidgeJolietについても書かれていた。
  RockRidge拡張形式だと、UNIXのファイルシステムの情報を記録できる。
例えば、パーミッションの情報や、uid、gidの情報も記録できる。
  Joliet拡張形式だと、unicodeだが、日本語のファイル名が可能になる。

CD-R(W)を焼く時の記録について
CD-R(W)を焼く時の記録について
まずは、ISO9660形式の情報を書き込む。
そして、「-J」オプションがあれば、Joliet部分の領域が設けられ
Windowsファイルとしての情報が書き込める。
そして、「-r」オプションがあれば、RockRidge部分の領域が設けられ
UNIXファイルとしての情報が書き込める。
そして、ファイル本体の情報が書き込まれる。

  なるほど、なるほど。ISO9660のファイルシステムに書き込むために
イメージファイルを作成するのかと納得ができた。

  しかし、「待てよ」と思った。フロッピーに書き込む際は、どうなるのだ?
  もし、書き込み際のファイルシステムが違う場合、イメージファイルを
作成なんかしていないのに、どうやって処理しているのか。
  調べても、なかなか答えがなかったので「謎に終わった」と締めくくろうと思った。
でも、幸い、アップロードする手前で、答えが見つかった (^^)

  フロッピーの場合は、ハードディスクと同じファイルシステムを使うため
特に、イメージファイルを作成して書き込む必要はない!


  さて、2度焼きする話。
  今度は、「-multi」オプションをつけての話だった。
  そして、1度目に焼いた後、どこまで焼いたかをチェックして、
2度目に焼く時は、その数値を入力して焼けば良いと書いていた。
  早速、本の丸写しでやってみた。

  まずは、イメージファイルの作成から。
  最初に焼くためのイメージファイルは、今までと同じ通りにする。

 mkisofs -r -J -o file.img ./file.dat 

  そして、cdrecordのコマンドを使って焼く。この時「-multi」オプションをつける。

 cdrecord dev=0,0,0 speed=4 -v -multi file.img

  最初のデータが焼けた所で、次に、CD-Rのセクター情報を見る。
  「セクター情報って何やねん!」と突っ込まれる方がおられると思います。
正直、私も、わかりませんーん (^^;;
  この辺りの話は、いずれファイルシステムの話で取り上げたいと思います。
  さて、CD-Rのセクター情報を見てみる。

  cdrecord dev=0,0,0 -msifo

  上のコマンドを実行したのだが・・・

  なんで、エラーが出るねん (TT)

エラーの内容
[root@server]# cdrecord dev=0,0,0 -msifo
cdrecord: Bad Option: -msifo.
cdrecord: Usage: cdrecord [options] track1...trackn
Options:
	-version	print version information and exit
	dev=target	SCSI target to use as CD/DVD-Recorder
(途中、省略)
	-swab		Audio data source is byte-swapped (little-endian/Intel)
The type of the first track is used for the toc type.
Currently only form 1 tracks are supported.

  最初、なぜ、エラーが出たのか、わからなかった。
  しばらく考え込んで、別のサイトを見たら、
 
  原因は、オプションの綴り間違いだった!!-msinfo」であるべき所が「-msifo」になっていたのだった (^^;;

  Webサイトの丸写ししていると、誤字、脱字などがあると、それに気がつかない。
もっとも、気がつくほどの知識があれば、本の丸写しなどしていない (^^;;
  でも、私は「誤字、脱字なんぞするな!」と批判する事はできない。
  なぜなら、私も誤字・脱字があり、時々、システム奮闘記を
ご覧になってくださる方から、ご指摘を受けることがある。
  誤字・脱字には気をつけないとと思う今日この頃。

  さて、気をとりなおして、セクター情報をみるコマンドを入力した。
  cdrecord dev=0,0,0 -msinfo

  すると見事に成功した。

成功した様子
[root@server]# cdrecord dev=0,0,0 -msinfo
0,12074

  さて、次に、2度目に焼くためのイメージファイルを作成する。
  この時は、イメージ作成方法に違いがみられる。

  mkisofs -r -J -C 0,12074 -M /dev/cdrom -o data.img ./data.dat

  そして、cdrecordのコマンドに「-multi」オプションを使って焼く。
  cdrecord dev=0,0,0 speed=4 -v -multi data.img

  結果を見てみると

  見事に焼けた (^^)V

  さて、2度焼きが見事、成功したので、バックアップ自動化のシェルを、
どうしようかと考えた。
  そこで、CD-RWに何も書かれていない場合、cdrecord dev=0,0,0 -msinfo
を実行すると、返ってくる答えが0,0になると思った。
  そこで、0,0の場合だけ、普通に書き込んで、
2度目以上の書き込みの場合には、イメージファイルを作成する時に、
「-C」オプションをつけたりするようにしようと考えた。

  早速、何も焼かれていないメディアをCD-RWの装置に入れて
cdrecord dev=0,0,0 -msinfoを実行すると

  なんで、エラーが出るねん (TT)

エラー内容
[root@server]# cdrecord dev=0,0,0 -msinfo
cdrecord: Input/output error. read toc: scsi sendcmd: no error
CDB:  43 00 01 00 00 00 00 00 04 00
status: 0x2 (CHECK CONDITION)
Sense Bytes: F0 00 05 00 00 00 00 0A 00 00 00 00 24 00 00 00
Sense Key: 0x5 Illegal Request, Segment 0
Sense Code: 0x24 Qual 0x00 (invalid field in cdb) Fru 0x0
Sense flags: Blk 0 (valid) 
cmd finished after 0.000s timeout 40s
cdrecord: Cannot read session offset

  さぁ、困った。
 結果が「0,0」と返ってきたら、if文で振り分けれるが、
エラーがでると、どうしようもない。
  もしかしたら、シェルの知識があれば対処できるが、そんな知識はない。


  もう一つ思った事だが、毎日、CD-RWのメディアに書き込んでいくと
いずれは満杯になる。どのタイミングで、メディアをとりかえるべきかを
考えるが、これが難しい。

  よく考えると、今回のサーバーの場合、バックアップでとる予定のデータは、
PostgreSQLのデータベースのバックアップと、PHPのスクリプトぐらいになる。
  データベースのデータは、常に過去の分まで蓄積されているため、
毎日とるデータを全て保管しなくても、極端な話、前日にバックアップした
データを消して、今日のデータをとっても問題はない。
  そこで考えた。バックアップのCD-RWは2枚を使って、
毎日、交互にCD-RWを使えば良い。もちろん、過去のデータは消去するため
バックアップをとる前は、CD-RWのデータを消去すれば良い。
  もし、データのバックアップ中に、サーバーが壊れたとしても、
最悪、前々日のデータに戻すことができる。

  それに、バックアップをとる際に、バックアップ用のディレクトリーを設けて
そこに、バックアップするデータを落とし込んだら、ディレクトリーごと
イメージファイルが作成される。
  つまり、無理に、2度目以降の焼き方をシェルに組み込まなくても、
バックアップがとれる!
  よっしゃ、それで行こうと思い実行した。
  cronにバックアップのシェルを組み込んで、夜間のバックアップを実行した。
翌日、無事、バックアップがとれていた。成功!

  ちなみに、CD-RWのメディアの中のデータを綺麗に消すコマンドは

  cdrecord dev=0,0,0 -v blank=fast


  まだ、課題があった。
  メール兼WebサーバーのCD-RW装置を使えるようにすることだが、
問題は、カーネル再構築を行なわねばならない。
  とても稼働中のマシンで実験するほどの勇気はない。そこで、

  お得意の忍法「先送りの術」を使う事にした ← おい!!

  カーネル再構築については、後日、取り上げたいと思います。
  最近、システム奮闘記を書く度に、次のネタが2、3できるため、
ねずみ算式にネタが増えている。私の能力が破綻するのは間近かも (^^;;


最後に 危機管理体制。 今までは、インターネットサーバーは、導入時は、利用頻度が低く、 メールは社内連絡程度だった上、Webサイトも1日数件しか見に来ていないため あまり重要視されていなかったのですが、何時の間にか、ネットなしでは 仕事に支障がくるようになったため、今回のRAID、UPS、バックアップ体制に つながりました。 それにしても、RAIDは奥が深いなぁと感心してしまいました。

次章:「社内LANの設定・構築」を読む
前章:「DNSサーバー構築。BINDの設定」を読む
目次:Linux、オープンソースで「システム奮闘記」に戻る