FC2ブログ

[CentOS]ZFSディスクがブートの邪魔する

症状

ホスト: g33
OS: CentOS 7.7.1908
OS用: HDD(A) ・・・ 1本
ZFS用: HDD(B),(C),(D),(E) ・・・ 4本


作業手順と困った事

1.OS用HDDだけで起動。
2.起動後にZFS用HDD 4本を接続。
3.ZFS用HDD 4本でZFSプールの作成、ボリュームの切り出し・マウント

zpool create -f tank raidz2 /dev/sdb /dev/sdc /dev/sdd /dev/sde
zfs create tank/share -o mountpoint=/home/share


4.再起動
 ・・・ すると、CentOSが起動しない。
ZFS用HDDだけ外してOS用HDDだけで起動するとCentOS起動する。


考察

ZFS用HDDを接続したらCentOSが起動しないので、何かしらの設定をしてしまいZFSプール用のHDD 4本がブータブル設定になっていると予想。
ブート優先順位はHDD同士なので同じだが、HDDの中でZFS用が先にチェックされて、それがブータブル設定だったのでそこから起動しようとしたが、OSデータは何もないため、起動出来なかった、と予想。


確認

川合さん著作の「OS自作入門」という素晴らしい本を読んでいたおかげで、ブータブルの設定かどうかは、
HDD先頭セクタ(512バイト)が0x1fe=55、0x1ff=aa、になっているかどうかで決まる、っと知ってた。
(著書のpage27に書いてます。)

早速確認してみます。
CentOSへログインして、シェルプロンプト上で
# df
/dev/sdaがOS用とわかる。

# dd if=/dev/sda bs=512 count=1 | hexdump -C
これで先頭セクタ(block size=512の1カウント分)を16進数表示で標準出力に出してくれる。
hexdump -Cをつけないとバイナリのままだから何がなにやらわからないので注意。
最後の方を見てみると、000001f0の行の右端が55aaになっている事が確認できた。
CentOSをインストールしたブータブルHDDだから当然だけど。

# dd if=/dev/sdb bs=512 count=1 | hexdump -C
次にZFSプールを構築したHDD 4本のうち1本を見てみる。
すると同様に0x1fe=55、0x1ff=aaとなっており、ブータブル設定になっている事が確認できた。
他の3本も同じくブータブル設定になってた。


実験

ZFSプール構築後、先頭セクタのブータブル設定だけ解除してみる。少し強引なやり方ですが。
まずは先頭セクタを4台共にファイルへ保存。

for x in b c d e
do
dd if=/dev/sdb bs=512 count=1 > dd.sd$x.1st_sec
done



次にバイナリエディタで編集。今回はvimのバイナリモードを使う。
vimでないと後述のxxdコマンドが使えないので、viは不可。
# vim -b dd.sdb.1st_sec

ファイルを開いてもバイナリのままだと読めないので以下コマンドでHEX表示にかえる。
:%!xxd
これで読めるようになったので最後を55aaから55abに変更する。
そうしたら、バイナリに戻してやる。ここで戻さないとバイナリでなくHEX値にしたテキストで保存されてしまう。
:%!xxd -r
あとは保存して終了。
:wq


試しに再度同じ手順で開いてみたら、ちゃんと55abで保存されてた。

後は以下コマンドで編集した先頭セクタのバイナリファイルをHDD先頭セクタへ上書きしてやる。
# dd if=dd.sdb.1st_sec of=/dev/sdb bs=512 count=1
念のため以下で確認してみると、ちゃんとHDD sdbの先頭セクタが55abに変わってた。
# dd if=/dev/sdb bs=512 count=1 | hexdump -C

同じ手順でsdbからsdeまで行う。


これをやったら確かにZFS用HDDを接続したままでも、CentOS用HDDからOS起動するようになった。


残る課題

・modprobe zfsを毎回やらないとモジュールがロードされない > これ自動化するのどうやるんだっけ?
・なので、もちろんZFSプールとかもなくなってる。 > これも自動化どうやる?



情報見つけた。これで解決かな?

https://web.chaperone.jp/w/index.php?CentOS/zfs

再起動すると外れる。。。
それを回避するには

[root@zfs ~]# systemctl enable zfs-import-cache
[root@zfs ~]# systemctl enable zfs-mount
[root@zfs ~]# systemctl enable zfs-import.target

を有効にしておく
*zfsのマウントポイントが存在した場合、この方式で再起動後でもzfsカーネルモジュールが外れなく、zfsマウントが反映されるって感じかな



http://lazy-dog.hatenablog.com/entry/2014/08/17/033038

zpool create -m /tank/zfs_pool/zfspool01/ zfs-pool1 raidz1 sdb sdc sdd

となる。コマンドを実行して、標準出力・エラー出力に何も表示されなければ、使用可能になる。なお、サーバを再起動しても、何も設定しなくとも自動でマウントされる。

スポンサーサイト



コメントの投稿

非公開コメント

カレンダー
12 | 2020/01 | 02
- - - 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 -
累積訪問者
現在の訪問者
現在の閲覧者数:
最新記事
最新トラックバック
最新コメント
月別アーカイブ
カテゴリ
プロフィール

bobgosso

Author:bobgosso
FPGAのブログへようこそ!

検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード