2024/03/30(土)FreeBSD gmirror 拡張方法メモ

FreeBSD の gmirror (geom mirror) で構成しているミラーを、
容量の大きいHDDでメンバーを置き換えて、最終的に大きいミラーボリュームにする作業の手順メモ。


本メモ注意点

  • 各手順では、ステータス表示コマンドなどは省略している。
  • 本手順では、gmirror で構成したミラーデバイスに対してGPTパーティショニングをして使用している例となる。
    • 個別HDDを先に GPT パーティションで区切って、各パーティションを gmirror のメンバーとする場合は若干手順が異なる。
本手順の例示構成

HDD1 : /dev/ada0
HDD2 : /dev/ada1

ミラーを構成するメンバー (/dev/ada0 + /dev/ada1) 
↓
 gmirror (mirorr/data2)
↓
 GPTパーティション(gpart)
↓
 UFS2ファイルシステム (mirror/data2p2)
この構成で、ada0, ada1 を大きいHDDに置き換えて、ファイルシステムを拡張する。

  • ディスク全体を1つのファイルシステムとするときは、GPT(MBR)パーティションを使用しての管理は必ずしも必要ではない。
  • 高いサーバなら電源投入したままHDDを差し替えてもOKだと思うが、私の作業対象はそこまで高くないので、HDD交換時は電源を落として作業をしている。
    • 高いサーバでもディスク交換時は spindown や eject、交換後の rescan などの手順が追加で必要かと思われる。
  • IPL領域を含むディスクの場合(起動用ディスクがmirrorの場合)、1本目を交換してから電源を投入した場合に、2本目のディスクから正常に起動するかどうかはBIOS(or uEFI)の出来による。
    • 1本目のディスクが真っ新なときにBIOSが2本目以降の起動領域を探してくれる必要がある。無理な場合は正常なディスクを1本目に、真っ新なHDDを2本目に入れ替えて起動する必要があるかもしれない。

作業時に取得しておいた方が良い情報など

面倒なので各手順の所には記載していませんが実際には各コマンドの前後に色々と情報を取得しています。

ディスク情報関係
dmesg | grep ^ada
camcontrol devlist
geom disk list
smartctl -a /dev/ada0
smartctl -a /dev/ada1
cat /etc/fstab
ミラーの情報関係
gmirror list
gmirror status
パーティション情報関係
gpart show
gpart list
ファイルシステムの空き容量等
df -h
df -g
df -i
その他 GEOM 関連ログ
grep GEOM /var/log/messages

作業順

  • 念のため 別のPCを使って GEOM 情報を削除する
  • HDD交換1本目
    • ミラーからメンバーを外す
    • サーバ停止
    • HDDを入れ替える
    • サーバ起動
    • ミラーにメンバーを追加する
    • 同期完了を待つ
  • HDD交換2本目
    • ミラーからメンバーを外す
    • サーバ停止
    • HDDを入れ替える
    • サーバ起動
    • ミラーにメンバーを追加する
    • 同期完了を待つ
  • サイズ拡張
    • gmirror サイズ拡張
    • GPT パーティションサイズ拡張
    • UFS2 ファイルシステム サイズ拡張

念のため 別のPCを使って GEOM 情報を削除する

やらなくてもたぶん大丈夫かなと思ってるが、
新しく使用するHDD が過去にgmirror メンバーだった場合で、gmirror remove や gmirror destory し忘れていたHDDの場合に事故ると困るので念のためgeom 情報を強制的に削除する。
(新品HDDに対しては、もちろんこの作業は不要です)


手順は省略
dd で先頭100MB位を /dev/zero で上書きするだけ。

個別の手順で使用するコマンドの説明

ミラーからメンバーを外す

既存の gmirror のメンバーとなっているディスクを、ミラーから外す
書式:
gmirror remove ミラー名 メンバー名

例:
gmirror remove -v data2 ada0

実行例 (gmirror remove)
# gmirror status data2
        Name    Status  Components
mirror/data2  COMPLETE  ada0 (ACTIVE)
                        ada1 (ACTIVE)
#
# gmirror remove -v data2 ada1
Done.
#
# gmirror status
        Name    Status  Components
mirror/data2  COMPLETE  ada0 (ACTIVE)
#



ミラーからメンバーを外し忘れてディスクを抜いて DEGRADED になったステータスを修正する

既存の gmirror のメンバーとなっているディスクを、
ミラーから外し(remove)忘れてHDDを抜いて起動すると、ミラーのステータスが DEGRADED に変わる。

このステータスを正常扱いにするには、すでに抜いたHDDメンバーの事を忘れさせる必要がある。
書式:
gmirror forgetミラー名

例:
gmirror forget -v data2

forget すると、間違えて抜いてしまった場合に挿しなおしても、もう同期再開されない。
誤って forget した場合は、新しいメンバーとして insert する必要がある。
実行例 (gmirror forget)
# gmirror status data2
        Name    Status  Components
mirror/data2  DEGRADED  ada1 (ACTIVE)
#
# gmirror forget data2
# gmirror status data2
        Name    Status  Components
mirror/data2  COMPLETE  ada1 (ACTIVE)
#


ミラーにメンバーを追加する

書式:
gmirror insert ミラー名 メンバー名

例:
gmirror insert -v data2 ada1

実行例 (gmirror insert)
# gmirror status
        Name    Status  Components
mirror/data2  COMPLETE  ada0 (ACTIVE)
# gmirror insert -v data2 ada1
Done.
# gmirror status
        Name    Status  Components
mirror/data2  DEGRADED  ada0 (ACTIVE)
                        ada1 (SYNCHRONIZING, 0%)
#

gmirror サイズ拡張(最大サイズ)

ディスクの余っている最大サイズまで、gmirror のサイズを拡大する。
書式:
gmirror resize ミラー名

例:
gmirror resize -v data2
実行例 (gmirror resize)
# gmirror list data2
Geom name: data2
State: COMPLETE
Components: 2
Balance: load
Slice: 4096
Flags: NONE
GenID: 0
SyncID: 2
ID: 706164073
Type: AUTOMATIC
Providers:
1. Name: mirror/data2
   Mediasize: 4000787029504 (3.6T)
   Sectorsize: 512
   Stripesize: 4096
   Stripeoffset: 0
   Mode: r1w1e2
Consumers:
1. Name: ada1
   Mediasize: 16000900661248 (15T)
(略)
#
# gmirror resize -v data2
Done.
#
# gmirror list data2
Geom name: data2
State: COMPLETE
Components: 2
Balance: load
Slice: 4096
Flags: NONE
GenID: 0
SyncID: 2
ID: 706164073
Type: AUTOMATIC
Providers:
1. Name: mirror/data2
   Mediasize: 16000900660736 (15T)
   Sectorsize: 512
   Stripesize: 4096
   Stripeoffset: 0
   Mode: r2w2e3
Consumers:
1. Name: ada1
   Mediasize: 16000900661248 (15T)
(略)

#


GPT パーティションサイズ拡張

GPT パーティションでパーティションを管理している場合、ファイルシステムの拡張前にパーティションサイズを拡張する。
(MBRパーティションでも同様)
書式:
gpart show 
gpart resize -i インデックス番号 mirror/data2

例:
gpart resize -i 2 mirror/data2
実行例 (gpart resize)
# gpart show
=>         40  31251759024  mirror/data2  GPT  (15T)
           40         4056                - free -  (2.0M)
         4096    125829120             1  freebsd-swap  (60G)
    125833216        28672                - free -  (14M)
    125861888   7688159232             2  freebsd-ufs  (3.6T)
   7814021120  23437737944                - free -  (11T)

# gpart resize -i 2 mirror/data2
mirror/data2p2 resized
#
# gpart show
=>         40  31251759024  mirror/data2  GPT  (15T)
           40         4056                - free -  (2.0M)
         4096    125829120             1  freebsd-swap  (60G)
    125833216        28672                - free -  (14M)
    125861888  31125897176             2  freebsd-ufs  (14T)

#

UFS2 ファイルシステム サイズ拡張

最後にファイルシステムを拡張する。
サイズ未指定時は最大サイズを確保する。
書式:
growfs マウントポイント名
growfs デバイス名

例:
growfs /home
実行例 (growfs)
# growfs /home
Device is mounted read-write; resizing will result in temporary write suspension for /home.
It's strongly recommended to make a backup before growing the file system.
OK to grow filesystem on /dev/mirror/data2p2, mounted on /home, from 3.6TB to 14TB? [yes/no] yes
super-block backups (for fsck_ffs -b #) at:
 7689935040, 7691762496, 7693589952, 7695417408, 7697244864, 7699072320, 7700899776, 7702727232, 7704554688,
 7706382144, 7708209600, 7710037056, 7711864512, 7713691968, 7715519424, 7717346880, 7719174336, 7721001792,
 7722829248, 7724656704, 7726484160, 7728311616, 7730139072, 7731966528, 7733793984, 7735621440, 7737448896,
 7739276352, 7741103808, 7742931264, 7744758720, 7746586176, 7748413632, 7750241088, 7752068544, 7753896000,

省略

 31077716928, 31079544384, 31081371840, 31083199296, 31085026752, 31086854208, 31088681664, 31090509120, 31092336576,
 31094164032, 31095991488, 31097818944, 31099646400, 31101473856, 31103301312, 31105128768, 31106956224, 31108783680,
 31110611136, 31112438592, 31114266048, 31116093504, 31117920960, 31119748416, 31121575872, 31123403328, 31125230784
#
どうでもいいけど super-block backups 多すぎでは・・・?

2023/05/11(木)プログラミング言語の else-if

メモ

Rubyは何故 if else ではなく if elsif なのか
https://blog.turai.work/entry/20190818/1566056828

"else if"を読み解く~なぜelifでもelsifでもelseifでもないのか~
https://qiita.com/progre/items/867e9c9346747b87cd13

dangling else と、関連事項について
https://ksmakoto.hatenadiary.com/entry/2013/10/14/131608

2021/02/22(月)FreeBSD 日本語マニュアル閲覧環境の整備

FreeBSD日本語マニュアル

現状、最新のFreeBSD日本語マニュアルは小金丸さんという方が
http://www.koganemaru.co.jp/
で作成され、公開されています。
ありがたいことです。

本記事では、
  • 上記サイトで公開されている整形済みマニュアルページ(本記事では、catページと呼ぶ)
  • FreeBSD 標準の man コマンド
  • 日本語表示可能なページャ(テキストビューア)
を使用して、日本語マニュアル表示環境を整えることを目的とします。

本ページでは、ja-groff などの整形ツールをインストールせずに済む方法を紹介します。

マニュアルのインストール

日本語マニュアルを読むだけの場合、
man(未整形状態)ではなく cat ページ(整形済み)だけでしたら、ja-groff 等の整形ツールを
インストールせずとも表示可能なので、cat ページを利用します。
 pkg add -M ja-cat-doc-12.2.20201029.amd64.txz
あるいは
 pkg add -M ftp://ftp.koganemaru.co.jp/pub/jman12/ja-man-doc-12.2.20201029.amd64.txz
のように、-M (依存関係無視オプション) 付きで pkg add してください。

pkg add が完了すると、 /usr/share/man/ja 以下に cat ページがセクション毎のディレクトリに分かれて配置されます。

ページャとして、ja-less や lv などの日本語を推測して表示可能なものをインストールしてください。
 pkg install ja-less

設定

FreeBSD 標準の man コマンドは、環境変数 LANG / LC_CTYPE に応じたディレクトリからマニュアルページを探してくる機能があります。

自分が使用するロケールに symlink します。
# cd /usr/share/man
# ln -s ja ja_JP.UTF-8
# ln -s ja ja_JP.eucJP
cat ページ自体は eucJP でエンコードされていますが、
cat ページは整形されずにそのまま PAGER に渡されますので、
気にせずリンクしてしまいます。

ページャの設定

例として jless (ja-lessパッケージ) コマンドを使用する方法を記載します。
jless は日本語文字コードを推測して表示できます。(他には lv 等もあります)。

環境変数を以下のように設定します。
JLESSCHARSET=japanese
LC_CTYPE=ja_JP.UTF-8
PAGER=jless
export JLESSCHARSET LC_CTYPE PAGER
JLESSCHARSET=japanese
jless コマンドに、入力データは日本語であると指示します
LC_CTYPE
端末の文字コードを指定します。この環境変数と、シンボリックリンクを張る名前は同じにします。
eucJPやUTF-8など、複数のキャラクターセットを使用している場合は、複数のシンボリックリンクを張ります。
PAGER
manコマンドのページャとして jless を指定します。
以上で、man.conf(5) や環境変数 MANPATH などの設定無しで、日本語マニュアルを表示可能となります。
(特に理由が無い限り、man.conf や環境変数 MANPATH は設定しないでください。)

また、この方法では、man -o ls のように、オリジナルの英語版マニュアルページを表示することも可能です。

2018/12/01(土)環八を利用した記録(朝の南下)

3ヶ月ほど環八を使用して関越から三本杉陸橋付近へ自動車で通勤したので
忘れる前に環八(笹目通りなどを含む)の通行について記録する。

時間帯・方向は主にAM8~9時前後の南行き。

この時間帯に練馬ICから環八三本杉陸橋まではおよそ1時間20分ほどかかる。
混雑によるかなり酷い渋滞の場合は2時間かかる(それほど回数は多くない)。
渋滞なくすいている場合は40分ほど。

環八について

  • 基本的にほとんどの交差点が転回禁止
  • 片側2車線部分は、右折は昼間は禁止の交差点が多い
  • 通過交通が多いので関越道降りたときに近くにいた車が最後まで近くを走行していることが多い
  • 渋滞時、大型車は車間距離を広めに開け、ゆっくり進むことが多いので、混んでるように見える車線でもコンスタントに進むことが多い
  • 南行きの渋滞ポイントは以下の通り
    • 井荻トンネル入り口手前の信号を先頭に順天堂病院付近まで
    • 四面道を先頭に井荻トンネル入り口付近まで
    • 川南交差点付近
    • 高井戸北陸橋の先の交差点を先頭に陸橋入り口まで
    • 首都高3号線の高架下の交差点
    • 高井戸陸橋手前
  • 杉並区内は朝は概ね常に渋滞している
  • 世田谷区に入ると3車線になり渋滞はほぼない

練馬IC→笹目通り合流まで

車線の選択
笹目通りに行くには練馬ICを降りてずっと右側車線を走る。
谷原交差点
谷原交差点の右折用車線は2車線あるが、右折後はすぐ1車線に減るので、
左側の右折用車線から右折した場合は、右折後にファスナー合流で合流する側となる。
合流する側になるのを嫌ってか、左側の右折用車線は人気がないが、そっちの方が早く右折可能である。

渋滞が酷い場合は右折用車線から数台しか右折できずに右折信号が赤になる。
右折先の道路状況を見てから交差点に出ること。(場合によっては1台も右折できない。)

谷原交差点右折後の笹目通りへの合流では、余裕があれば右側車線へ合流すること。
合流後の交差点がすぐに赤になるため、谷原交差点からの車をなるべく多く合流できるようにするためである。
谷原交差点での信号待ちが先頭の場合で余裕がある場合は、
右折後にスピードをあまり落とさず笹目通りへ合流し、赤信号になる前に通過してしまうこと。

合流後、井荻トンネル入り口付近まで

車線の選択
すいてる場合は右、混んでる場合は左を走る。

井荻トンネルまではどちら走ってもあまり変わりないが、
井荻トンネル入り口では左側車線から側道へ行く車が結構あるので、進みが速い場合がある。
酷い渋滞時以外はトンネル内は左側車線の方がすいていることが多い。

井荻トンネル出口付近から四面道(しめんどう)を超えて東電荻窪支社前まで

車線の選択
すいているときは右、交差点渋滞の場合は左を走る。

トンネル出口の交差点(今川一丁目)では側道からの合流車が多いと左側車線の進みが遅くなり、
トンネル出口の次の交差点(妙正寺西)で右折待ちが多いと右側車線の進みが遅くなる。
右折待ち行列がトンネル内まで影響している場合もある。この場合は左側車線の方が速い。
右折待ち行列がない場合は、トンネル出口手前まで左車線、トンネル出口付近で右側車線に移るのが良い。

四面道および次の中央本線ガード下は交差する道路/線路をくぐるが、
車線変更禁止で、混んでいる車線に入っても車線変更できない。
基本的には左側車線の方がすいていることが多い。(側道へ入る車が抜けるので。)
ただし、くぐった後の信号機は右側車線の方が速いことが多い。

東電荻窪支社前から川南交差点まで

車線の選択
かなりすいているときは右、それ以外は左車線を走る
川南交差点で旧道へ分岐するが、旧道へ抜けてく車が多いので左側車線の方が速いことが多い。
ただし、川南交差点までは路線バスのコースなので、前にバスが走っている場合は右側車線も考慮する。

川南交差点から高井戸北陸橋の出口まで

車線の選択
どちらでも構わない。あまり速さに影響はない。

ここの立体交差は夜と昼間の一時以外は渋滞ポイントなので渋滞は諦める。
ただし、陸橋右側車線だけが混んでいる場合があるので、左側をお勧めする。
酷い渋滞のときに旧道に逃げても、合流する交差点で酷く待たされるため、概ね環八本線の方が速い。

高井戸北陸橋の出口から中の橋交差点(首都高の下の交差点)まで

車線の選択

どちらでも構わない。

首都高へ行く車が多い場合は左側車線から左折レーンへ抜ける車が多いので左側車線の方が進みが良いこと多い。
中の橋交差点ではネズミ捕りが頻繁に行われているので要注意。

中の橋交差点から甲州街道をまたぐ高井戸陸橋まで

車線の選択
高井戸陸橋の手前で側道の信号待ち渋滞が本線まで伸びていることがある。
この待ち行列は左側車線をふさぐ事があるので右側車線をお勧めする。
陸橋に入ったらどちらでも構わない。

高井戸陸橋から三本杉まで

車線の選択
高井戸陸橋を渡り終わると3車線になり、三本杉陸橋前まで渋滞がほぼなくなる。
走行はどの車線でも構わない。
たまに左側車線で路駐している自動車店前のキャリアカーや工事整理などがあるが、
それがなければ左側車線は走行車が少なめで快適である。

小田急小田原線(小田急本線)の高架下を過ぎたら、
環八をまっすぐ行きたい場合は中央車線か右側車線を走行すること。
また、側道にいきたい場合は左側車線を走行すること。
三本杉陸橋手前のカーブ手前から車線変更禁止になるため。(側道と分かれる場所はカーブ先なので見えない。立体・側道案内の標識に注意。)
また、ここでのネズミ捕りが頻繁に行われている(おそらく進路変更禁止違反の取り締まりと思われる)。