[an error occurred while processing this directive]
障害時にSSDから起動できる仕組みを考えました

第203日目:障害時にSSDから起動できる仕組みを考えました

どうも、▲('A`)です。
もう10月ですね。早いもので今年もあと2ヶ月でおしまいです。
えーと、10月1日といいますと、「衣替え」の日と思うのですが、
札幌では既に学生さんたちはもう先々週くらいから冬服です。
本州の方とは違い、寒いですから。

さて、以前197日目でkamome大破のお話を、
で、198日目で障害時にシステムディスク以外から
サーバを起動する方法としてUSBメモリから起動する方法をお話しました。
で、root兄(・∀・)からは、「SSDから起動できるといいなあ」などと言われまして・・・
もうね、社内サーバを使って色々試しました。はー、大変でした。

Linuxを使っている人だと、GRUBとかlilo等のマルチブートローダーを使って
任意の場所(パーティション)からサーバを起動する人もいるでしょう。
「そんなの、簡単だよ!」って言われそうですが、、、FreeBSDって、おんなじ様に
いかないんですよ、ハイ。

まず、FreeBSDでは任意のパーティションからは起動できないのです。
ルートパーティション(/ の事です)からでないと、いけないのです。
装置記号名で言いますと、/dev/ad10s1a とか、 /dev/ad12s1aとか、
末尾にaがつきます。ちなみに末尾が
/dev/ad10s1b とかbの場合には
SWAPパーティションになります。
こういうaとかbがつくものは特殊なパーティションです。

「スライスとかパーティションとか何じゃらほい?」となるかもしれませんね。
実際▲('A`)も最初はそんな感じでした。で、色々妄想して「こういう事かな」と
理解しました。(判ったつもり、かもしれません。)
まあ、住宅の設計図で例えるなら、スライスはマイホームの建設予定地、
パーティションは「自宅」「物置」「車庫」が立つ場所を想像すると
いいかなあ。
サーバでは一般的なパーティションとして /home、 /usr、/varとかがあると
思います。これらは使う目的によって区分けをしている訳です。
でも、そういうのはスライスという「基礎」部分にたてる事になる訳です。

で、この「スライス」はHDD全体で1つ設定する事も可能ですし(大抵はそうです)、
HDDの中に複数設定する事も可能です。
で、FreeBSDではスライス中に存在する aパーティション(つまり / です)の
中に存在する(しているはずの) /kernel から起動しようとするのです。

なので、システムディスク以外でFreeBSDを起動しようとするならば、
以下の3つを施す必要があります。
==============================================================
・HDD上に MBR(マスターブートレコード)を設定する
(MBRは大抵HDDの記録領域の先頭セクタに記録されているものです。)
・HDD上に aパーティション( / )を作る
・そこにOS起動に必要なファイルを設置する
==============================================================

システムディスクから起動できない、という事が起きた時には、
HDDのMBR内の情報が壊れて、OSの核となるプログラムを実行できない
状態が多いです。
MBRに記録されているのは、大まかにいって次の2つです。
1) ブートストラップローダー
2) パーティションテーブル

ブートストラップローダーはHDDとBIOSとの間を取り持ちます。
パーティションテーブルはHDDがどの様に区分けされているか、
どういう種類のデータが記録されているかをまとめています。

BIOSはまずHDD上のMBRを読み出します。で、MBR中に存在する
ブートストラップローダーはパーティションテーブルを見て
実行して欲しいプログラムの場所をBIOSに伝えて、実行する様に
お願いする訳です。

えーと、取りとめもなくお話していますが、今回はサーバにOSを
インストールする際にパーティションやスライスを設定する処を
ちょっと変えています。
ここからが本編とも言えます。お待たせしました。

いつもはOSインストール時に以下の様に設定しています。
-----------------------------------------------------------
スライス:
/dev/ad10s1 ← SATA HDD(システムディスク)全部
/dev/ad12s1 ← SSD HDD全部

パーティション:
/dev/ad10s1a /
/dev/ad10s1b SWAP
/dev/ad10s1d /usr
/dev/ad10s1e /hd

/dev/ad12s1d /var
/dev/ad12s1e /home
-----------------------------------------------------------

今回はOSインストール時に以下の様に設定していました。
注意点としてはこの時に全ての設定が終わらない、という事です。
-----------------------------------------------------------
スライス:
/dev/ad10s1 ← SATA HDD(システムディスク)全部
/dev/ad12s1 ← SSD HDDの先頭2GB分(FDISK時に指定)
/dev/ad12s2 ← SSD HDDの残り全部

パーティション:
/dev/ad10s1a /
/dev/ad10s1b SWAP
/dev/ad10s1d /usr
/dev/ad10s1e /hd

/dev/ad12s2d /var
/dev/ad12s2e /home
-----------------------------------------------------------
OSインストール時のfdiskやbsdlabelではSSDの先頭のスライス
(/dev/ad12s1)に対しては何も弄らないです。

以下の画像はインストール時のSSDのスライス、パーティション設定の
雰囲気を判ってもらう為、作り出しました。
(本当はちょっと違う処もあります。ad10の内訳が表示されていないと
指摘しないでね。KVMとかの設備が無いので、スクリーンショットが
取れなかったのです、ハイ。)

例えば、FreeBSDをインストールする際に「Standard」モードを選択して
進めて行くと、以下のディスク選択の画面が表示されます。
以下ではSSDのHDD(ad12)に対してスライスを設定します。
キーボードを使ってカーソルをad12の処に移動させ、スペースキーを
押して、チックボックスにチェックを付けてからOKを押します。

で、以下の画面が表示されますが、そのままOKを選択します。

そうすると、ディスクの状態が表示されます。
まだ、何も整地されていない「まっさらな」状態ですので、
FreeBSDで使えるようにします。
下の方にコマンドが表示されているので、キーボードのCキー
(Create Slice)を押します。

で、以下の画面が表示されます。
デフォルトではディスク全体のブロック数が表示されます。
ディスク全体で良ければここでOKを、サイズを指定したい場合には
ここでブロック数か、容量(MB単位)を入力します。

今回は先頭部分2GBを他と切り分けたいので、2048Mと入力します。

すると以下の画面がでます。スライス番号を入力する画面です。
今回はデフォルト(165)のままで行きますが、このスライス番号にも
意味があります。FreeBSDでは同一のHDD内で複数のスライスが存在
している時には、スライス番号の若い方を検索し、そこにルート
パーティションがあるか調べるのです。

1つ目のスライスを作りましたので、もう1つ作ります。
下の方のunusedと表示されている領域にカーソルを移動させ、
キーボードのCキー(Create Slice)を押します。

で、今回は残り全部を1つのスライスとするので、デフォルトの
表示のままでOKです。

これでSSD上に2つのスライス(ad12s1、ad12s2)ができた訳です。

ここで、Qキー(Quit)を押すと以下の画面が表示されます。

MBRを設定したいので「Standard」にカーソルを移動して、OKを押します。
これでSSDの先頭セクタにMBRが記録される事になります。

次に論理パーティション(/varとか/home)を設定します。
で、ここではまだ第一スライス(ad12s1)には何もしない事

なので、カーソルをad12s2の処に移動して、Cキー(Create)を押します。

まずは容量を指定します。
デフォルトではスライス全体の量が表示されます。

/varを作りたいので、8GBと入力しOKと選択します。

え、次はパーティションのタイプを選択します。
SWAPではないので、FSを選択します。

パーティションの名前を /var と入力し、OKとします。

次に/homeを設定します。先程と同じ様に操作します。

残り全部を/homeとしたいので、そのままOKを押します。

で、先程の様にパーティションのタイプ選択画面が表示されます。
SWAPではないので、FSを選択します。

パーティションの名前を /home と入力し、OKとします。

で、これでSSDの第二スライスにパーティションができました。
(本当だと、OSインストールではad10側のパーティション設定も行い、
ad10側のパーティションも表示されているのですが、最初に言い訳
しました通り、スクリーンショットが取れないので、あるものだと
思って下さい。)

で、この状態でOSインストールします。
OSインストールが終わると、ディスクの構成はこう認識されます。
[dfコマンドの結果]
# df
Filesystem 1K-blocks Used Avail Capacity Mounted on
/dev/ad10s1a 1012974 272248 659690 29% /
devfs 1 1 0 100% /dev
/dev/ad10s1e 223309044 4 205444318 0% /hd
/dev/ad12s2e 65533706 22 60290988 0% /home
/dev/ad10s1d 4058062 654782 3078636 18% /usr
/dev/ad12s2d 8122126 348 7472008 0% /var
# ls /dev
acd0
acpi
ad10
ad10s1
ad10s1a
ad10s1b
ad10s1d
ad10s1e
ad12
ad12s1 ←SSDの第一スライス
ad12s2
ad12s2d
ad12s2e
agpgart
ata
#

それではSSDの第一スライス(ad12s1)にルートパーティション(ad12s1a)を
作ってみましょう。
まずは、ラベル情報を見てみます。
# bsdlabel /dev/ad12s1
# /dev/ad12s1:
8 partitions:
# size offset fstype [fsize bsize bps/cpg]
c: 4194225 0 unused 0 0 # "raw" part, don't edit


うん、整地されていません。ではFreeBSDで使える様に整地しましょう。
# bsdlabel -w -B /dev/ad12s1

で、整地できたか確認してみます。
# bsdlabel /dev/ad12s1
# /dev/ad12s1:
8 partitions:
# size offset fstype [fsize bsize bps/cpg]
a: 4194209 16 unused 0 0
c: 4194225 0 unused 0 0 # "raw" part, don't edit
#

んんん?えーと、更地にはしたけど、fstypeがunusedになっています。
これではいけません。ちょっと手直しします。
eオプションを付けてbsdlabelコマンドを実行します。
# bsdlabel -e /dev/ad12s1

このコマンドを実行するとviエディタが起動し、ラベル情報を編集できるようになります。
なので、ますは unused を 4.2BSD と直して保存します。
viエディタで保存する時にはescキーを押してコマンドモードになってから、
:wq と入力してENTERキーを押します。
# /dev/ad12s1:
8 partitions:
# size offset fstype [fsize bsize bps/cpg]
a: 4194209 16 unused 0 0
c: 4194225 0 unused 0 0 # "raw" part, don't edit
~
~

          ↓こう修正します。

# /dev/ad12s1:
8 partitions:
# size offset fstype [fsize bsize bps/cpg]
a: 4194209 16 4.2BSD 0 0 ←ココ注目!
c: 4194225 0 unused 0 0 # "raw" part, don't edit
~
~

で、ちゃんと修正されたか確認します。以下の様になっていればOKです。
# bsdlabel /dev/ad12s1
# /dev/ad12s1:
8 partitions:
# size offset fstype [fsize bsize bps/cpg]
a: 4194209 16 4.2BSD 0 0 0
c: 4194225 0 unused 0 0 # "raw" part, don't edit
#

さて、いよいよルートパーティションを作ります。
以下の様にnewfsコマンドを実行します。
# newfs /dev/ad12s1a
/dev/ad12s1a: 2048.0MB (4194208 sectors) block size 16384, fragment size 2048
using 12 cylinder groups of 183.72MB, 11758 blks, 23552 inodes.
super-block backups (for fsck -b #) at:
160, 376416, 752672, 1128928, 1505184, 1881440, 2257696, 2633952, 3010208,
3386464, 3762720, 4138976
#

では、各ディスクはどの様になったでしょうか。
lsコマンドで/devを確認してみます。
# ls /dev acd0 acpi ad10 ad10s1 ad10s1a ad10s1b ad10s1d ad10s1e ad12 ad12s1 ad12s1a ad12s2 ad12s2d ad12s2e agpgart ata #

うん、ad12s1にルートパーティションができました。
ではマウントしてみます。
# mount /dev/ad12s1a /mnt
# df
Filesystem 1K-blocks Used Avail Capacity Mounted on
/dev/ad10s1a 1012974 272248 659690 29% /
devfs 1 1 0 100% /dev
/dev/ad10s1e 223309044 4 205444318 0% /hd
/dev/ad12s2e 65533706 22 60290988 0% /home
/dev/ad10s1d 4058062 654782 3078636 18% /usr
/dev/ad12s2d 8122126 378 7471978 0% /var
/dev/ad12s1a 2025982 4 1863900 0% /mnt
#

さて、ここまできたら、日記198日目で書いた様にFreeBSDの起動に
必要なファイルとかをコピーします。
cp -Rpv /bin /mnt
cp -Rpv /boot /mnt
cp -Rpv /dev /mnt
cp -Rpv /etc /mnt
cp -Rpv /lib /mnt
cp -Rpv /libexec /mnt
cp -Rpv /sbin /mnt
cp -Rpv /home /mnt
cp -Rpv /root /mnt

mkdir /mnt/usr/
mkdir /mnt/usr/bin
mkdir /mnt/usr/compat
mkdir /mnt/usr/include
mkdir /mnt/usr/lib
mkdir /mnt/usr/libdata
mkdir /mnt/usr/libexec
mkdir /mnt/usr/local
mkdir /mnt/usr/obj
mkdir /mnt/usr/sbin
mkdir /mnt/usr/share

cp -Rpv /usr/bin /mnt/usr/
cp -Rpv /usr/compat /mnt/usr/
cp -Rpv /usr/include /mnt/usr/
cp -Rpv /usr/lib /mnt/usr/
cp -Rpv /usr/libdata /mnt/usr/
cp -Rpv /usr/libexec /mnt/usr/
cp -Rpv /usr/local /mnt/usr/
cp -Rpv /usr/obj /mnt/usr/
cp -Rpv /usr/sbin /mnt/usr/
cp -Rpv /usr/share /mnt/usr/

mkdir /mnt/cdrom
mkdir /mnt/dist
mkdir /mnt/mnt
mkdir /mnt/proc
mkdir /mnt/tmp
mkdir /mnt/var

で、とても大切な事ですが、コピーした/etc/fstabを修正しないといけません。
コピーしたてのfstab(オリジナル、ですね)はこうなっています。
# cd /mnt/etc
# cat fstab
# Device Mountpoint FStype Options Dump Pass#
/dev/ad10s1b none swap sw 0 0
/dev/ad10s1a / ufs rw 1 1
/dev/ad10s1e /backup ufs rw 2 2
/dev/ad12s2e /home ufs rw 2 2
/dev/ad10s1d /usr ufs rw 2 2
/dev/ad12s2d /var ufs rw 2 2
/dev/acd0 /cdrom cd9660 ro,noauto 0 0
#

なおすべき個所は /dev/ad10なんちゃら の個所です。
以下の内容にします。
# Device Mountpoint FStype Options Dump Pass#
#/dev/ad10s1b none swap sw 0 0
/dev/ad12s1a / ufs rw 1 1
#/dev/ad10s1e /backup ufs rw 2 2
/dev/ad12s2e /home ufs rw 2 2
#/dev/ad10s1d /usr ufs rw 2 2
/dev/ad12s2d /var ufs rw 2 2
/dev/acd0 /cdrom cd9660 ro,noauto 0 0

オリジナルのシステムHDD(SATA、/dev/ad10s1○)が故障した場合、
/dev/ad10s1aから起動する様に指定するとまずい訳です。

さて、この状態でSSDから起動したい場合には起動前にBIOSを操作して設定を
変更しないといけません。
たぶんハイブリッドもそうだと思うのですが、Intelのマザーボードだと、
どのHDDから参照するか設定する個所があるので、そこをいじります。
「F2」キーを押してBIOSメニューの「Boot」タブに移動してHDDの欄に
カーソルを移動させENTERキーを押します。それで、SSDのHDDの処に
カーソルを移動し、+キーを押すと、SATA HDDの上側に移動しますので、
もう一度ENTERキーを押します。これでSSDがSATAよりも先に参照されます。

ふー、相変わらず▲('A`)だらだらと説明書きをしてしまいましたが、
この方法の良い処は、任意のタイミングのシステム構成をSSDの処に
コピーできます。
あと、AHCIモードでも動かせます。大丈夫です。
なので、極端な事を言うと、SWAPとかを切ってあげれば単独でWeb
サーバ等のサービスを動かすことだってできます。
まあ、止めた方がいいですけど、ね。
(HDDの容量だって実質少なくなっている訳ですし、故障した時って
HDD以外の部分も危ないかもしれない、、、と心配した方が良いのです。)

今回は社内サーバを使っての試し、です。 なので、実機では試していませんので、あしからず

もっと良い方法があったら、ぜひ教えて下さい。
今回の件でGRUBとかインストールしようとしたのですが、うまくいかなかったのです。
FreeBSD8.1 amd64ですと、GRUBではなくGRUB2というのを入れるそうなのです。
(GRUBをportsからインストールしようとすると、
「おまえはamd64だぞ。俺はi386じゃないとダメだ」とメッセージを出してきます。)
で、GRUB2を入れて、スライスを切ろうとすると、
# bsdlable /dev/ad10s1
bsdlable: Command not found.
と言って受け付けてくれません。トホホ・・・

それでは、また。▲('A`)/

202日目に戻る。   204日目に続く。

目次に戻る
1日目 2日目 3日目 4日目 5日目 6日目 7日目
8日目 9日目 10日目 11日目 12日目 13日目 14日目
15日目 16日目 17日目 18日目 19日目 20日目 21日目
22日目 23日目 24日目 25日目 26日目 27日目 28日目
29日目 30日目 31日目 32日目 33日目 34日目 35日目
36日目 37日目 38日目 39日目 40日目 41日目 42日目
43日目 44日目 45日目 46日目 47日目 48日目 49日目
50日目 51日目 52日目 53日目 54日目 55日目 56日目
57日目 58日目 59日目 60日目 61日目 62日目 63日目
64日目 65日目 66日目 67日目 68日目 69日目 70日目
71日目 72日目 73日目 74日目 75日目 76日目 77日目
78日目 79日目 80日目 81日目 82日目 83日目 84日目
85日目 86日目 87日目 88日目 89日目 90日目 91日目
92日目 93日目 94日目 95日目 96日目 97日目 98日目
99日目 100日目 101日目 102日目 103日目 104日目 105日目
106日目 107日目 108日目 109日目 110日目 111日目 112日目
113日目 114日目 115日目 116日目 117日目 118日目 119日目
120日目 121日目 122日目 123日目 124日目 125日目 126日目
127日目 128日目 129日目 130日目 131日目 132日目 133日目
134日目 135日目 136日目 137日目 138日目 139日目 140日目
141日目 142日目 143日目 144日目 145日目 146日目 147日目
148日目 149日目 150日目 151日目 152日目 153日目 154日目
155日目 156日目 157日目 158日目 159日目 160日目 161日目
162日目 163日目 164日目 165日目 166日目 167日目 168日目
169日目 170日目 171日目 172日目 173日目 174日目 175日目
176日目 177日目 178日目 179日目 180日目 181日目 182日目
183日目 184日目 185日目 186日目 187日目 188日目 189日目
190日目 191日目 192日目 193日目 194日目 195日目 196日目
197日目 198日目 199日目 200日目 201日目 202日目 203日目
204日目 205日目 206日目 207日目 208日目 209日目 210日目
211日目 212日目 213日目 214日目 215日目 216日目 217日目
218日目 219日目 220日目 221日目 222日目 223日目 224日目
225日目 226日目 227日目 228日目 229日目 230日目 231日目
232日目 233日目 234日目 235日目 236日目 237日目 238日目
239日目 240日目 241日目 242日目 243日目 244日目 245日目
246日目 247日目 248日目 249日目 250日目 251日目 252日目
253日目 254日目 255日目 256日目 257日目 258日目 259日目
260日目 261日目 262日目 263日目 264日目 265日目 266日目
267日目 268日目 269日目 270日目 271日目 272日目 273日目
274日目 275日目 276日目 277日目 278日目 279日目 280日目
281日目 282日目 283日目 284日目 285日目 286日目 287日目
288日目 289日目 290日目 291日目 292日目 293日目 294日目
295日目 296日目 297日目 298日目 299日目 300日目 301日目
302日目 303日目 304日目 305日目 306日目 307日目 308日目
309日目 310日目 311日目 312日目 313日目 314日目 315日目
316日目 317日目 318日目 319日目 320日目 321日目 322日目
323日目 324日目 325日目 326日目 327日目 328日目 329日目
330日目 331日目 332日目 333日目 334日目 335日目 336日目
337日目 338日目 339日目 340日目 341日目 342日目 343日目
344日目 345日目 346日目 347日目 348日目 349日目 350日目
351日目 352日目 353日目 354日目 355日目 356日目 357日目
358日目 359日目 360日目 361日目 362日目 363日目 364日目

いま一番お得なページ! 解析
[an error occurred while processing this directive]