トラブル☆しゅーたーずに参加してきた #トラしゅ




4/8 に、
hbstudy・ncstudy・odstudy の合同勉強会、トラブル☆しゅーたーず
に参加してきました。

内容は、

  • 新入社員の山〇君の行ったメンテ後、お客さんから「サイトがおかしい」と連絡があり、トップページは表示されるが、他のページがエラー状態。さあ、直せ!
というものでした。



トラブル☆しゅーたーず読本 – Google Docs
全員でこの読本を読み合わせた後、6 ~ 7 名のチームに分かれ、障害対応・報告書作成を行いました。

僕はチーム 6 でした。(無事復旧できました!)
最終的に仕上がった報告書はこちら。
トラブルしゅーたーずの障害報告書 #6 – Google Docs



僕のチームのよかった点

・意見を出し合えた。

僕のチームの悪かった点

・役割分担をせず、いきなり調査を始めてしまった。
・役割分担のため、自己紹介の時に、スキルレベルまで述べるべきだった。
・いつ何をして、どのような状態になったか、時間の記録をしていなかった。



再び全員があつまり、各チームの発表。
各チームガチの報告書、ガチの発表で驚きました。
だんだんと会場が暗い雰囲気になっていくのが面白かったw



トラブル☆しゅーたーず 解答編 – Google Docs
解答編として、障害切り分けのポイント・報告のポイント等を学びました。



感想

とてもリアルな障害でした。
また、実際に手を動かして障害対応の練習ができたので、とてもいい勉強になりました。

僕はこの 4 月からの新人です。
障害対応をすることになったら、今日学んだことが生かせればと思います。
特に作業時間の記録、これは普段から忘れないようにしよう…。

レゴ「はやぶさ」を作った


レゴ「はやぶさ」を作りました。



製作風景




完成




ちゃんと故障している。



デスクに置くには大きすぎたので、

ルータの上に置いた。

逆ポートフォワードで NAT 配下のサーバを外から弄る


・研究室の NAT 配下に一時的に置いたサーバを外から弄りたい。
・でも、一時的なものだし、担当の先輩にポート開放頼むのもめんどくさいな。

と思ったので、ssh の逆方向のポートフォワードを使った。



弄りたいサーバ (以下 server) にて以下のコマンドを実行しておくと、example.com の 127.0.0.1:8022 が server の 127.0.0.1:22 に転送され、example.com で ssh localhost -p 8022 すると server につながる。
NAT 配下なので、ServerAliveInterval を設定して接続が維持されるようにしている。

# ssh -o ServerAliveInterval=30 -N -R 8022:127.0.0.1:22 example.com -l user



さらに、研究室のネットワークは、ネットワーク機器が古いせいかコネクションがブチブチ切れるので、接続が切れたら再接続するようにしたい。
なので、daemontools で上記コマンドを実行するようにする。

server から example.com にノーパスログインできるようにした上で、daemontools の run スクリプトを以下のように書く。
#!/bin/sh

PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/sbin:/usr/sbin
export PATH

sleep 3
exec 2>&1

exec ssh -o ServerAliveInterval=30 -N -R 8022:127.0.0.1:22 example.com -l user

このようにすれば、ssh 接続が切れた時だけでなく server が再起動した時も、勝手に再接続してくれる。
これは ssh -L や ssh -D の時にも使える。



ちなみに、example.com の sshd_config にて GatewayPorts を yes に設定すると、example.com の 0.0.0.0:8022 が転送されるようになり、example.com の外から 8022 番ポートにアクセスしても server につながる。

zroot を細かく分割する


ストレージサーバの zroot を細かく分割しました。

FreeBSD に初めて触れたのが、このストレージサーバを構築した時なので、zroot をどの程度分割すればよいのか悩み、結局 sysinstall でのインストール時の自動割り当てを参考に分割していました。
(/tmp, /usr, /var のみ…。)

9 ヶ月程 FreeBSD を使ってきて、どこを分割すると良さそうか、分割すると何が良いのか分かってきたので、この機会に分割します。

(環境)
FreeBSD 9.0-RELEASE amd64


■ プール構成

前後のファイルシステム構成の比較です。
各ファイルシステムに適切な属性を設定します。

いままで
zroot
zroot/tmp                                               setuid=off
zroot/usr
zroot/var

分割後
zroot
zroot/tmp                                               setuid=off
zroot/usr
zroot/usr/home
zroot/usr/local
zroot/usr/ports             compression=lzjb,           setuid=off
zroot/usr/ports/distfiles   compression=off,  exec=off, setuid=off
zroot/usr/ports/packages    compression=off,  exec=off, setuid=off
zroot/usr/src               compression=lzjb, exec=off, setuid=off
zroot/var
zroot/var/db                                  exec=off, setuid=off
zroot/var/db/pkg            compression=lzjb, exec=on,  setuid=off
zroot/var/empty                               exec=off, setuid=off, readonly=on
zroot/var/log               compression=lzjb, exec=off, setuid=off
zroot/var/tmp                                           setuid=off


■ ぶんかつ!

起動中にいじってもよさそうなパスから分割をはじめます。
今回は、/usr/local, /var/log 以外は大丈夫でしょう。

まず lsof で対象のパス以下の何かが使用中でないか調べ、使用中であればそのプロセスを落とします。
落とせそうになければ後回しにします。

以下は /usr/src を分割するときの例です。
新しいファイルシステムを作成して属性を設定した後、リネームしておいたディレクトリ内から中身をコピーします。
コピーの際に find しているのは、アスタリスクがドットファイルにマッチしないからです。
# mv /usr/src /usr/src_

# zfs create zroot/usr/src
# zfs set compression=lzjb zroot/usr/src
# zfs set exec=off         zroot/usr/src
# zfs set setuid=off       zroot/usr/src

# cd /usr/src_
# cp -a `find ./ -depth 1` /usr/src
# rm -rf /usr/src_

ちなみに、/var/empty には schg フラグが立っており、mv できないので、
# chflags noschg /var/empty
としてから mv してください。



起動中にいじれそうにないパスは、一旦電源を落として Live CD モードなどで起動し、以下のようにマウントして作業します。
(最初から全部これでやれよっていうツッコミは無しで。)
# kldload opensolaris.ko
# kldload zfs.ko

# mkdir /var/mnt
# zpool import -f -R /var/mnt zroot


■ 参考

RootOnZFS/GPTZFSBoot – FreeBSD Wiki

FreeBSD 8.2-RELEASE から 9.0-RELEASE への更新メモ


freebsd-update コマンドを使って 8.2-RELEASE から 9.0-RELEASE へアップグレードした時のメモです。

FreeBSD 9.0-RELEASE Installation Instructions


■ 事前準備

1. アップデート

9.0-RELEASE にするために必要なアップデートを行う。
(freebsd-update コマンドが変更される。)
# freebsd-update fetch
# freebsd-update install


2. デーモンの設定

ports で導入したソフトウェアに関する /etc/rc.conf 内の記述をコメントアウトする。


3. 再起動
# shutdown -r now


■ アップグレード実行

4. 差分の取得・設定ファイルのマージ
# freebsd-update upgrade -r 9.0-RELEASE
Looking up update.FreeBSD.org mirrors... 4 mirrors found.
Fetching metadata signature for 8.2-RELEASE from update4.FreeBSD.org... done.
Fetching metadata index... done.
Fetching 1 metadata files... done.
Inspecting system... done.

The following components of FreeBSD seem to be installed:
kernel/generic src/base src/bin src/cddl src/contrib src/crypto src/etc
src/games src/gnu src/include src/krb5 src/lib src/libexec src/release
src/rescue src/sbin src/secure src/share src/sys src/tools src/ubin
src/usbin world/base world/catpages world/dict world/doc world/games
world/info world/lib32 world/manpages

The following components of FreeBSD do not seem to be installed:
world/proflibs

Does this look reasonable (y/n)? y

Fetching metadata signature for 9.0-RELEASE from update4.FreeBSD.org... done.
Fetching metadata index... done.
Fetching 1 metadata patches. done.
Applying metadata patches... done.
Fetching 1 metadata files... done.
Inspecting system... done.
Fetching files from 8.2-RELEASE for merging... done.
Preparing to download files... done.
Fetching 8854 patches.....10....20....30....40....50....
(略)
....8800....8810....8820....8830....8840....8850.. done.
Applying patches... done.
Fetching 1839 files... done.
Attempting to automatically merge changes in files... done.

各種設定ファイルのマージを行う。
差分が表示されるので、問題なければ y で進む。

設定ファイルに手を加えている場合など、差分の適用がコンフリクトする場合は vi が起動するので適切に編集する。
その際以下の行は削除する。
<<<<<<< current version
=======
>>>>>>> 9.0-RELEASE


5. カーネルのインストール
# freebsd-update install
Installing updates...
Kernel updates have been installed.  Please reboot and run
"/usr/sbin/freebsd-update install" again to finish installing updates.
# shutdown -r now
カーネルがインストールされる。
指示通りに再起動する。
(他のアップデートをインストールするために新しいカーネルで起動する。)


6. アップデートのインストール
# freebsd-update install
Installing updates...
Completing this upgrade requires removing old shared object files.
Please rebuild all installed 3rd party software (e.g., programs
installed from the ports tree) and then run "/usr/sbin/freebsd-update install"
again to finish installing updates.
指示通り、サードパーティアプリを入れなおす。
# portmaster --no-confirm -adf
古いライブラリを削除する。
# freebsd-update install
Installing updates... done.


7. 再起動

アップグレード終了。再起動する。
# shutdown -r now


■ ZFS の更新

zpool のバージョンと zfs のバージョンを更新する。
# zpool upgrade -a
This system is currently running ZFS pool version 28.

Successfully upgraded 'zpool0'

Successfully upgraded 'zroot'

If you boot from pool 'zroot', don't forget to update boot code.
Assuming you use GPT partitioning and da0 is your boot disk
the following command will do it:

        gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 da0

# zfs upgrade -a
10 filesystems upgraded
zpool upgrade でブートコードの更新を忘れないで、と親切にメッセージを出してくれるので、更新する。
# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada0

1 / 512345