ものすごく久しぶりにブログを書いてます。業務で集中してインプットする期間が長かったからなのですが、少しずつアウトプットしていこうと思います。今日は SSD や HDD などのディスクを初期化する話です。
「ディスクの初期化ってフォーマットすればいいんじゃないの?」と考える人が多いかもしれませんが、場合によってはもう少し複雑な背景があったりします。まずはそんな背景から説明します。
【シンプルなケース】
一度何かの用途で OS をインストールするなりして使ったディスクがあり、これに新しい別の OS をインストールしたい、という場合であれば、大抵のケースではそもそもあらかじめディスクを初期化しておく必要もなく、OS のインストールの一環として使っているディスクを初期化したり、パーティショニングを変更したりすることができると思っています。仮に事前の初期化が必要であったとしても(例えば Linux のインストーラー DVD で起動した後に)fdisk でパーティショニングを変更したり、mkfs で特定のフォーマットに変更/初期化することができます。しかもこの方法であれば一度ディスクを取り出して、別のマシンに繋ぎなおして・・ といった手順も不要です。さほど難しい話ではないです。
【PXE のような特殊なケース】
後述するような初期化の方法をとらなければいけないような特殊なケースとはどんなケースが考えられるでしょうか? その1つが「PXE(Pre eXecution Environment)」と呼ばれる起動やインストールを行う場合です。まずはこの PXE について説明します。
エンジニアならばこんな画面を一度くらいは見たことある人が大半だと思うのですが、これは BIOS と呼ばれる OS 起動前に実行されるソフトウェアの設定画面です(機種によって見栄えは異なります)。その中にこのような「起動優先順位」を設定する項目があります:
上図の場合だと以下のように設定されています:
1 CD/DVD
2 ハードディスク
3 リムーバブルデバイス(USB メモリなど)
4 ネットワーク
この起動優先順位設定により、この PC に電源を入れると・・・
1 DVD ドライブに起動可能なメディア(インストール DVD など)が入っていたら、そこから起動
2 1に該当せず、ハードディスクに OS がインストールされていたら、そこから起動
3 2に該当せず、起動可能な USB メモリが刺さっていたら、そこから起動
4 3に該当せず、ネットワーク経由で起動できる環境が揃っていれば、そこから起動
5 4にも該当しなかった場合は何も起動しない
・・という優先順位を経て起動対象が決まります。1、2、3(、5)は何となくわかる人が多数だと思うのですが、4の「ネットワーク経由で起動できる環境」はあまり詳しくない人が多いのではないでしょうか? 実はこれが PXE なのです。PXE そのものの詳しい説明はウィキペディアに譲りますが、簡単に言うと DHCP, TFTP, HTTP などのプロトコルを組み合わせて事前に必要な環境を用意しておくことで、電源を入れた時にネットワークカードが繋がった先から(OS 起動前に) IP アドレスを取得し、必要なファイルもダウンロードして起動(と、必要であれば起動後のインストール)するための環境です。「PXE ブート」とか「PXE インストール」と呼んだりもします。
PXE ブートする場合は上述のように低い起動優先順位が設定されることが多いです。理由は
・何もインストールされていない状態のディスクに、
・ネットワーク経由で OS をインストールして、
・インストール後は、そのインストールされた OS を起動する
という使い方をするケースが大半なので、これを実現するために少なくともディスクよりは下の起動優先順位が設定されている必要があります。また何かあった時の緊急対応用 DVD などはディスクよりも優先的に起動できる必要があるため、DVD の優先順位は高めになることが多いのでした(個人的には USB メディアも同じ理由で高めに設定することが多いです)。
ともあれ PXE ブートは何かの OS を複数台の PC にまとめてインストールするようなケースや、複雑に入り組むサーバー環境を(1つ1つ手作業で構築するのではなく)PXE ブートによってある程度まとめて作ってしまうようなケースに使われるもの、という印象があります。
【PXE だと何が問題になるのか?】
さて、このような PXE ブートを経て環境構築するようなサーバー環境(極端な例だと、PXE ブートによるインストールだけがサポートされているようなサーバー環境)があったとします。PXE ブートで OS もインストールされ、構築完了まであと一息・・・という所でオペレーションをミスしてしまって、環境構築に失敗してしまい、初めからやり直さないといけなくなったケースを想像してみてください。
それまでの作業や時間が無駄になってしまったのはショックですが、PXE ブートの環境が残っていればある程度は「電源をオンにするだけ」で済む環境なので、(手作業部分の量にもよりますが)イチから作り直すほどのショックはないはずです。というわけで、改めて電源を入れなおして・・・
・・・とここで気付くはずです。環境構築には失敗してやり直さなければいけなくなっているのですが、ディスクには OS が導入済みです。PXE 環境だと上述のような起動優先順位に設定されていることが多いため、電源を入れなおすと PXE ブートの前にインストール済みの OS が起動してしまうのでした。
そして「そうか。じゃあネットワークインストールの起動優先順位をディスクよりも上にして・・・」と考えて設定し直した場合、確かに PXE ブートによって環境構築をやり直す所まではできるのですが、次回(再)起動時の際にも OS がインストールされたディスクではなく PXE ブートが始まってしまいます。環境構築時に自動的に数度のリブートが伴うようなサーバー環境(例:某社のコンテナクラスタプラットフォーム)の場合は OS 導入直後の絶妙なタイミングを測って起動優先順位を変更する必要があり、失敗するとまた PXE ブートが始まって・・・ という無限ループに陥ってしまうのです。話が単純ではなく、かなり複雑になることがご理解いただけるでしょうか?
※これは VMWare や VirtualBox などの仮想サーバー環境であればさほど問題ではないです。ディスクはディスクイメージというファイルになっているケースがほとんどで、「ディスクを初期化する」=「ディスクイメージファイルを初期化する」と考えれば、要は既存のイメージファイルを削除し、新しいディスクイメージファイルを作って付け替えてあげるだけです。 でも物理サーバー環境だとそうはいきません。
上述の PXE ブート無限ループ問題を解決するには、起動優先順位を変更するのではなく、「ディスクに導入された OS 環境をなかったことに(初期化)した上で再度 PXE ブートからやり直す」必要があるのでした。 正確には「ディスクの OS が起動できない状態にした上で、再度 PXE ブートからやり直す」必要があります。
この「OS が起動できない状態」というのが問題です。実は OS の各パーティションをフォーマットしたり、極端な例ではパーティションを初期化(例えば全パーティションを削除してパーティションが1つもない状態にする)してもパーティションとは別に存在する MBR(マスターブートレコード)には(grub などと呼ばれる)起動する OS の情報が残ってしまうのでした。この MBR に情報が残った状態で PXE ブートを試みると、ディスクには OS が存在すると判断されてしまい、一方でパーティションは存在していないので実際には起動できなくなって止まってしまう、という状態に陥ってしまいます。
・・・前置きが長くなってしまいましたが、この状態を回避するには、改めてこのブログエントリのサブジェクトでもある「ディスクを MBR ごと初期化する」必要があるのでした。以下、その手順を紹介します。
【ディスクを MBR ごと初期化する手順】
実は前置きの長さに比べて本体が超あっさりなんですが(苦笑)、以下その手順を紹介します:
"/dev/sda" 部分は対象ディスクのデバイス名です(分からない場合は fdisk コマンドで確認できます)。MBR はディスクの先頭 512 バイト(固定)に格納されるという特徴から、先頭 512 バイトを無理やり無駄な情報で埋めることで MBR を消す、という処理を実現しています。 fdisk コマンドや dd コマンドであれば大半の Linux ディストリビューション・インストールメディア内に用意されているはずなので、このディストリビューションだと使えない、ということはほぼないはず。
上述のように、これが問題になるのは物理サーバー環境であることが多いと思うのですが、この方法であれば対象の物理サーバーからディスクを取り出して、別のサーバーに付け替えて・・・といった余計な作業も発生しません。手順やり直しの際に必要と考えると、PXE ブートを伴う物理サーバー環境構築においては事実上必須のオペレーションになると考えています。
「ディスクの初期化ってフォーマットすればいいんじゃないの?」と考える人が多いかもしれませんが、場合によってはもう少し複雑な背景があったりします。まずはそんな背景から説明します。
【シンプルなケース】
一度何かの用途で OS をインストールするなりして使ったディスクがあり、これに新しい別の OS をインストールしたい、という場合であれば、大抵のケースではそもそもあらかじめディスクを初期化しておく必要もなく、OS のインストールの一環として使っているディスクを初期化したり、パーティショニングを変更したりすることができると思っています。仮に事前の初期化が必要であったとしても(例えば Linux のインストーラー DVD で起動した後に)fdisk でパーティショニングを変更したり、mkfs で特定のフォーマットに変更/初期化することができます。しかもこの方法であれば一度ディスクを取り出して、別のマシンに繋ぎなおして・・ といった手順も不要です。さほど難しい話ではないです。
【PXE のような特殊なケース】
後述するような初期化の方法をとらなければいけないような特殊なケースとはどんなケースが考えられるでしょうか? その1つが「PXE(Pre eXecution Environment)」と呼ばれる起動やインストールを行う場合です。まずはこの PXE について説明します。
エンジニアならばこんな画面を一度くらいは見たことある人が大半だと思うのですが、これは BIOS と呼ばれる OS 起動前に実行されるソフトウェアの設定画面です(機種によって見栄えは異なります)。その中にこのような「起動優先順位」を設定する項目があります:
上図の場合だと以下のように設定されています:
1 CD/DVD
2 ハードディスク
3 リムーバブルデバイス(USB メモリなど)
4 ネットワーク
この起動優先順位設定により、この PC に電源を入れると・・・
1 DVD ドライブに起動可能なメディア(インストール DVD など)が入っていたら、そこから起動
2 1に該当せず、ハードディスクに OS がインストールされていたら、そこから起動
3 2に該当せず、起動可能な USB メモリが刺さっていたら、そこから起動
4 3に該当せず、ネットワーク経由で起動できる環境が揃っていれば、そこから起動
5 4にも該当しなかった場合は何も起動しない
・・という優先順位を経て起動対象が決まります。1、2、3(、5)は何となくわかる人が多数だと思うのですが、4の「ネットワーク経由で起動できる環境」はあまり詳しくない人が多いのではないでしょうか? 実はこれが PXE なのです。PXE そのものの詳しい説明はウィキペディアに譲りますが、簡単に言うと DHCP, TFTP, HTTP などのプロトコルを組み合わせて事前に必要な環境を用意しておくことで、電源を入れた時にネットワークカードが繋がった先から(OS 起動前に) IP アドレスを取得し、必要なファイルもダウンロードして起動(と、必要であれば起動後のインストール)するための環境です。「PXE ブート」とか「PXE インストール」と呼んだりもします。
PXE ブートする場合は上述のように低い起動優先順位が設定されることが多いです。理由は
・何もインストールされていない状態のディスクに、
・ネットワーク経由で OS をインストールして、
・インストール後は、そのインストールされた OS を起動する
という使い方をするケースが大半なので、これを実現するために少なくともディスクよりは下の起動優先順位が設定されている必要があります。また何かあった時の緊急対応用 DVD などはディスクよりも優先的に起動できる必要があるため、DVD の優先順位は高めになることが多いのでした(個人的には USB メディアも同じ理由で高めに設定することが多いです)。
ともあれ PXE ブートは何かの OS を複数台の PC にまとめてインストールするようなケースや、複雑に入り組むサーバー環境を(1つ1つ手作業で構築するのではなく)PXE ブートによってある程度まとめて作ってしまうようなケースに使われるもの、という印象があります。
【PXE だと何が問題になるのか?】
さて、このような PXE ブートを経て環境構築するようなサーバー環境(極端な例だと、PXE ブートによるインストールだけがサポートされているようなサーバー環境)があったとします。PXE ブートで OS もインストールされ、構築完了まであと一息・・・という所でオペレーションをミスしてしまって、環境構築に失敗してしまい、初めからやり直さないといけなくなったケースを想像してみてください。
それまでの作業や時間が無駄になってしまったのはショックですが、PXE ブートの環境が残っていればある程度は「電源をオンにするだけ」で済む環境なので、(手作業部分の量にもよりますが)イチから作り直すほどのショックはないはずです。というわけで、改めて電源を入れなおして・・・
・・・とここで気付くはずです。環境構築には失敗してやり直さなければいけなくなっているのですが、ディスクには OS が導入済みです。PXE 環境だと上述のような起動優先順位に設定されていることが多いため、電源を入れなおすと PXE ブートの前にインストール済みの OS が起動してしまうのでした。
そして「そうか。じゃあネットワークインストールの起動優先順位をディスクよりも上にして・・・」と考えて設定し直した場合、確かに PXE ブートによって環境構築をやり直す所まではできるのですが、次回(再)起動時の際にも OS がインストールされたディスクではなく PXE ブートが始まってしまいます。環境構築時に自動的に数度のリブートが伴うようなサーバー環境(例:某社のコンテナクラスタプラットフォーム)の場合は OS 導入直後の絶妙なタイミングを測って起動優先順位を変更する必要があり、失敗するとまた PXE ブートが始まって・・・ という無限ループに陥ってしまうのです。話が単純ではなく、かなり複雑になることがご理解いただけるでしょうか?
※これは VMWare や VirtualBox などの仮想サーバー環境であればさほど問題ではないです。ディスクはディスクイメージというファイルになっているケースがほとんどで、「ディスクを初期化する」=「ディスクイメージファイルを初期化する」と考えれば、要は既存のイメージファイルを削除し、新しいディスクイメージファイルを作って付け替えてあげるだけです。 でも物理サーバー環境だとそうはいきません。
上述の PXE ブート無限ループ問題を解決するには、起動優先順位を変更するのではなく、「ディスクに導入された OS 環境をなかったことに(初期化)した上で再度 PXE ブートからやり直す」必要があるのでした。 正確には「ディスクの OS が起動できない状態にした上で、再度 PXE ブートからやり直す」必要があります。
この「OS が起動できない状態」というのが問題です。実は OS の各パーティションをフォーマットしたり、極端な例ではパーティションを初期化(例えば全パーティションを削除してパーティションが1つもない状態にする)してもパーティションとは別に存在する MBR(マスターブートレコード)には(grub などと呼ばれる)起動する OS の情報が残ってしまうのでした。この MBR に情報が残った状態で PXE ブートを試みると、ディスクには OS が存在すると判断されてしまい、一方でパーティションは存在していないので実際には起動できなくなって止まってしまう、という状態に陥ってしまいます。
・・・前置きが長くなってしまいましたが、この状態を回避するには、改めてこのブログエントリのサブジェクトでもある「ディスクを MBR ごと初期化する」必要があるのでした。以下、その手順を紹介します。
【ディスクを MBR ごと初期化する手順】
実は前置きの長さに比べて本体が超あっさりなんですが(苦笑)、以下その手順を紹介します:
- Ubuntu などの起動可能なインストール DVD を用意して、DVD ドライブに入れて DVD から起動して(DVD がない場合は USB から起動して)、
- ターミナルなどの画面から以下のコマンドを実行してからシャットダウン
$ sudo dd if=/dev/zero of=/dev/sda bs=512 count=1
"/dev/sda" 部分は対象ディスクのデバイス名です(分からない場合は fdisk コマンドで確認できます)。MBR はディスクの先頭 512 バイト(固定)に格納されるという特徴から、先頭 512 バイトを無理やり無駄な情報で埋めることで MBR を消す、という処理を実現しています。 fdisk コマンドや dd コマンドであれば大半の Linux ディストリビューション・インストールメディア内に用意されているはずなので、このディストリビューションだと使えない、ということはほぼないはず。
上述のように、これが問題になるのは物理サーバー環境であることが多いと思うのですが、この方法であれば対象の物理サーバーからディスクを取り出して、別のサーバーに付け替えて・・・といった余計な作業も発生しません。手順やり直しの際に必要と考えると、PXE ブートを伴う物理サーバー環境構築においては事実上必須のオペレーションになると考えています。
コメント