FreeBSDでkernelが/をマウントするところ

ざっくりメモ

mbr(boot0) -> boot1(pbr) -> boot2 -> loader -> kernel -> /etc/rcで,kernelが/をマウントするところを調べた.

  • cpu_set_fork_handler() → start_init() → vfs_mountroot() -> vfs_mountroot_try() -> kernel_mount() -> vfs_donmount() -> vfs_domount() -> 色々
  • start_init()
    • /usr/src/sys/kern/init_main.c
    • /をマウントして init を起動する
  • vfs_mountroot()
    • /usr/src/sys/kern/vfs_mount.c
    • boothowtoとかからブート方法を分岐
    • vfs.root.mountfromとかvfs.root.mountfrom.optionsとかを取得.
    • マウントポイントをvfs_mountroot_try()へ渡す
  • vfs_mountroot()
    • /usr/src/sys/kern/vfs_mount.c
    • vfs_mountroot_try() でマウント
      • vfs.root.mountfromをルートマウントとして選択
      • vfsnameとかを抽出してkernel_mount()に渡す
    • まずったら vfs_mountroot_ask()
  • kernel_mount()
    • vfs_donmount() -> vfs_domount()
  • vfs_donmount()
    • オプション解析
  • vfs_domount()
    • 実際にマウント
    • vfs_byname()
      • ffsじゃなかったらufs.nullを返すことも.此処の詳細な条件は不明
    • vfs_byname_kld()
      • vfs_bynameでnullだったらkern_kldload()する
    • kern_kldload()
      • kldlname.ko / kldname.ver.koをロード
      • linker_load_module() (/usr/src/sys/kern/kern_linker.c)
    • linker_load_module()
      • linker_search_module()でlinker_path("/boot/kernel;/boot/modules")から探す
  • /usr/src/sys/i386/i386/vm_machdep.c
    • set_cpu_fork_handler()はこちら
    • 良く解らん

参考:

qpstudy #06

5/28(土)に開催されたqpstudy #06 に行ってきた.開場は大森のniftyさんのところ.niftyさん,ありがとう!

グループディスカッションの議論についてまとめとこう.
メンバーは,@wenbose さん,@k_zoarさん,@soestudio さん,@isjunichi さん,@yudoufu さん,@yogata でした.

議題1:チームでのナレッジや資料の共有と,成果物の再利用について

「ブレスト→親和図作成→結論+ストーリづくり」の流れでやっていました.

ブレスト

各自で付箋紙に書く → 口頭で補足しながら周りに説明.同時に,粒度はばらばらだが,ある程度のグループ化.
出た意見は,「勉強会」「社内LT」「Wiki(全体で管理/個人毎に管理)」「メールやML」「IRC」「電話」「FAX」「チケットを切って可視化」「報告書や手順書の標準化」「共有しない(キリッ(都度知っている人にIRC等で聞く)」等

親和図作成

次に,さらにグループ化をすすめるために,出た意見を使っているシーンを議論した.
そのなかで,例えば,

  • IRC(リアルタイム)→ 後からログ検索可能(非リアルタイム/永続)
  • Wiki等にまとめる → まとめた資料を元に共有する

と,ナレッジ・情報・資料の共有までにはいくつかのフェーズがあるという意見がでた.

結論+ストーリづくり

ここまでにたくさんの議論があったので,それらをできるだけ正直にまとめた.全体の思考の流れや,特に議論したのは何かを振り返った.
議題1の結論:ナレッジや資料の共有・成果物の再利用には以下の4フェーズがある.

  1. ナレッジ・情報を出すフェーズ.これは口頭議論,IRC,ML等
  2. ナレッジ・情報をまとめて資料化するフェーズ.これは,Wiki.PPT化等
  3. 上記を効率的に資料化するフェーズ.資料の標準化
  4. 情報を共有するフェーズ.これは,勉強会,LT等

議題2:みんなはどうやってキャリア形成のための勉強をしているの?

この議論は難しかった.サブテーマは6つ有ったが,大別すると「キャリアの方向性は何か」「どうやって勉強しているか」の2つであり,我々のチームは前者について議論することにした.
後者は個人によるところが大きく,その共有というのも魅力的だが,グループディスカッションとしては前者のほうが適していると判断したため.

議題2の結論としては,キャリアの方向性は以下の2つがあり,そのキャリア形成に向けた勉強をすべき.

  • 設計
    • 今後の技術の目利き
    • ベンチマークテスト等による各技術の長所/短所=適用箇所が判別できる
  • 設定
    • 仕様に基づく設定
    • パフォーマンスチューニング(特にスケールしたときの)

LTについて

お酒が入っていてあまり記憶が無いけれど……

  • File Capability すごい.特権とアクセス制御の違いを初めて知った.
  • フリーランスは自由だけれど大変そう.健康第一なのは良いかも.(但し,医療費的な意味で健康第一)
  • gitit うわー簡単.Wiiプレゼン超かっこいい.勢いが凄い.大爆笑.
  • 英語でメール書いたらかっこいい!
  • \キャーハセガワサーン/.第一部「段取り8分とはよく言ったものです」/第二部「今日のパッチはどうだい?」
  • 人には言えない怪談話@qpstudy#9.GDで「言えることは社内で,言えないことはqpstudyで」って意見があったような
  • Catalyst=二郎.大爆笑.
  • 主催者が関西在住なのに,キックオフが関東な #ipv6study の存在!?
  • 座席表は超重要.タイムラインのアノ人を探すのには必須.

nwstudy

この記事はnwstudyに行ってきた感想です.

  • Interop STMに参加してみよう (@hagane5563さん)/NW技術者とサーバ技術者の限界 (@udaotokoさん)ともに,「きっかけはネットワーク」なテーマでとても良かった.
  • Interop STMは学生の時に行きたかった.とても面白そう.技術力の高い人について障害復旧/問題切り分けのテクニックを盗みたい.
  • NW技術者とサーバ技術者の限界も面白かった.NWとサーバと連携して動くのだから,互いにその動きをある程度知っておいたほうが円滑に進むよね,ということだと思った.
  • \キャーナンバサーン/
  • ほむぺろ監視委員

以上.

ejzailを使ったVIMAGE対応jailの作り方

背景

NFS サーバのメモリが余っているのが勿体無いので jail 環境を構築しようと思った.
しかしながら,通常の jail 環境の作り方では,ホスト OS の NIC に jail 環境用 IP アドレスを alias する必要があり,NFS は受け待ち IP アドレスを指定できないため,jail 環境用 IP アドレスで NFS サービスを待ち受けてしまう.これは意図しないことなのでよろしくない.

ということがわかったのでツイートしたら,VIMAGE でいけるよ,と教えてもらったので ezjail を使って VIMAGE 対応 jail を作ってみた.


(追記)
nfsd に -h [bindip] というオプションがあるらしい.これを使えばよかったかもしれない.

KVM との比較

KVM だと vnet インターフェースを自動で生成してくれるし,さらに libvirt を使えばブリッジまで行なってくれるが, jail や ezjail ではそこまでやってくれない.
vnet インターフェース相当である epair インタフェース(epair0a, epair0b の様なペアのインターフェースができる)を作って片方をゲスト OS に持って行けば,ホスト OS とゲスト OS をブリッジのように繋がる.また,ホスト OS 側の epair と外に繋がるインターフェースをブリッジすることでゲスト OS は外と繋がることができる.

ezjail のメモ

  • ports は sysutils/ezjail
  • 設定ファイルは /usr/local/etc/ezjail.conf
  • デフォルトだと ezjail のルートは /usr/jails
  • /usr/jails/basejail にバイナリがある.
  • /usr/jails/newjail は各 jail のスケルトン.ツリー構造が重要.バイナリの実体は /usr/jails/basejail.必要なものだけをシンボリックリンクで持ってくる.
  • /usr/jails/flavour は各 jail 毎に設定ファイル等を上書きするのに使う.puppet と連携させると便利と思った.
  • jail の作り方:ezjail-admin create -f [flavour] [name] 0.0.0.0 (アドレスは最終的に消すので適当でOK)
  • 各 jail の設定ファイル(各 jail のルートディレクトリや IP アドレス等):/usr/local/etc/ezjail/[name]
  • jail 環境を作ったらすること
    • /etc/fstab.[name] を編集./usr/ports, /home をマウントするようにする.
    • /usr/local/etc/ezjail/[name] を編集.IP アドレスを消す.後は後述の変更をする.

問題点と課題の整理

ezjail のデフォルトでは以下3点の問題点があるために ejzail だけを使った VIMAGE 対応 jail の作成が出来ない.

  1. VIMAGE は対応 jail にするには jail に -c vnet オプションを渡す必要があるが,/etc/rc.d/jail は -c オプション指定時のフォーマットに対応していない*1ため,素の /etc/rc.d/jail は使えない.
  2. デフォルトの devfs のマウント方法は VIMAGE 対応を前提としていないため,jail 環境に /dev/*mem がなく,jail 環境でルーティングが出来ない.
  3. 通常の jail とは違って起動時に IP アドレスを割り当てない.そのためゲスト側で IP アドレス設定,ルーティング設定,サービス(sshd等)実行を jail 環境を立ち上げた後に行う必要がある.

ここでは課題としては以下の3点をあげた.

  1. /etc/rc.d/jail で -c vnet オプションを使えるようにして VIMAGE 対応 jail を作成できるようにする.
  2. jail 環境で /dev/*mem を使えるようにする.
  3. jail 環境が起動した後に epair インターフェースを渡して,IP アドレスの設定,ルーティングの設定,サービスの立ち上げを行うようにする.

以下で3つの課題に対する解決手順をまとめる.

解決策(1つ目):/etc/rc.d/jail で VIMAGE 対応 jail を作成できるようにする

まずは jail に渡すオプションを/etc/rc.conf に設定する.

  • /etc/rc.conf
jail_flags="-c vnet"

次にこのオプションを解釈できるように /etc/rc.d/jail を書き換える.
デフォルトでは -c オプション無しなのでスペース区切りで path hostname [ip[,..] ] command を渡しているが,-c オプション指定時はparameter=value形式で指定する必要がある.

  • /etc/rc.d/jail
> diff -u /etc/rc.d/jail /usr/src/etc/rc.d/jail
--- /etc/rc.d/jail	2011-05-06 00:18:19.000000000 +0900
+++ /usr/src/etc/rc.d/jail	2010-12-22 02:09:25.000000000 +0900
@@ -635,10 +635,8 @@
 			i=$((i + 1))
 		done
 
-		eval ${_setfib} jail -J ${_tmp_jail}_ ${_flags} host.hostname=${_hostname} name=`echo ${_hostname} | cut -f 1 -d .` \
-			path=${_rootdir} persist
-		cat ${_tmp_jail}_ | cut -f 1 -d " " | cut -f 2 -d = > ${_tmp_jail}
-		rm -f ${_tmp_jail}_
+		eval ${_setfib} jail ${_flags} -i ${_rootdir} ${_hostname} \
+			\"${_addrl}\" ${_exec_start} > ${_tmp_jail} 2>&1
 
 		if [ "$?" -eq 0 ] ; then
 			_jail_id=$(head -1 ${_tmp_jail})
@@ -699,7 +697,9 @@
 					eval env -i /usr/sbin/jexec ${_jail_id} ${_exec_stop} \
 						>> ${_consolelog} 2>&1
 				fi
-				jail -r ${_jail_id}
+				killall -j ${_jail_id} -TERM > /dev/null 2>&1
+				sleep 1
+				killall -j ${_jail_id} -KILL > /dev/null 2>&1
 				jail_umount_fs
 				echo -n " $_hostname"

解決策(2つ目):jail 環境で /dev/*mem を使えるようにする

devfs をマウントするときにどのデバイスを使えるようにするかは /etc/default/devfs.rules に書いているルールに従っている.どのルールを使うかは /usr/local/etc/ezjail/[name] の変数 jail_[name]_devfs_ruleset で指定している.
ルールを見ると devfsrules_unhide_basicにすれば /dev/*mem を使えそうなので, /usr/local/etc/ezjail/[name] を以下のように変更する.

  • /usr/local/etc/ezjail/[name]
    • i.e. /usr/local/etc/ezjail/cattleya02_osaka_remu
export jail_cattleya02_osaka_remu_devfs_ruleset="devfsrules_unhide_basic"

解決策(3つ目):jail 環境が起動した後に epair インターフェースを渡して,IP アドレスの設定,ルーティングの設定を行うようにする

/usr/local/etc/ezjail/[name] の jail_[name]_exec_xxx に設定することで jail 起動時にホスト OS 側,ゲスト OS 側で任意のコマンドを実行出来る.コレを使って epair インターフェースを渡したり,ゲスト OS 側の IP アドレス設定等を行う.
ゲスト OS 側で実行してくれる afterstart がうまく動かなかったので,ホスト OS 側から jexec コマンドを使ってゲスト OS 側の設定をする.以下の内容を /usr/local/etc/ezjail/[name] に追加した.

  • /usr/local/etc/ezjail/[name]
    • i.e. /usr/local/etc/ezjail/cattleya02_osaka_remu
export jail_cattleya02_osaka_remu_exec_prestart0="ifconfig epair0 create"
export jail_cattleya02_osaka_remu_exec_prestart1="ifconfig epair0a up"
export jail_cattleya02_osaka_remu_exec_prestart2="ifconfig bridge0 addm epair0a"
export jail_cattleya02_osaka_remu_exec_poststart0="ifconfig epair0b vnet cattleya02"
export jail_cattleya02_osaka_remu_exec_poststart1="jexec cattleya02 /sbin/ifconfig epair0b 10.3.2.21/24"
export jail_cattleya02_osaka_remu_exec_poststart2="jexec cattleya02 /sbin/route add default 10.3.2.1"
export jail_cattleya02_osaka_remu_exec_poststart3="jexec cattleya02 /etc/rc.d/sshd start"
export jail_cattleya02_osaka_remu_exec_poststop0="ifconfig bridge0 deletem epair0a"
export jail_cattleya02_osaka_remu_exec_poststop1="ifconfig epair0a destroy"

参考

hasegaw blog: FreeBSD VIMAGEを使ったTCP/IPのルーティング デモンストレーション

  • VIMAGE 概要と設定例について参考にしました

http://www.jp.freebsd.org/cgi/mroff.cgi?subdir=man&lc=1&cmd=&man=jail&dir=jpman-5.2.0%2Fman§=8

  • NFS サーバ上で jail 環境で構築するのがなぜよろしく無いのかを参考にしました

First stab at a new jail(8)

  • prestart, poststart の実行環境/タイミングを参考にしました

*1:jail に -c オプションを使うとそれ以外の引数が変わるため,ezjailのスクリプトを書き換える必要がある

Googleへの経路

Googleへの経路が変わったと話題になっているので,今どういう経路なのか記録しとこう.

  • AS7679(BBIQ) → AS7521(mfeed) → AS15169(Google)
  • AS2519(vectant) → AS15169(Google)
  • AS4713(OCN) → AS15169(Google)

BBIQ(QTNet) → Google

AS7679(BBIQ) → AS7521(mfeed) → AS15169(Google)

% traceroute -a google.com
traceroute: Warning: google.com has multiple addresses; using 72.14.203.147
traceroute: warning: whois/tcp service not found

traceroute to google.com (72.14.203.147), 64 hops max, 52 byte packets
 1  [AS8151] 192.168.11.1 (192.168.11.1)  1.589 ms  4.252 ms  0.716 ms
 2  [AS65534] 10.2.3.1 (10.2.3.1)  1.387 ms  1.133 ms  1.070 ms
 3  [AS7679] hakatae120bbiq01lo1.qtnet.ad.jp (218.40.227.41)  3.692 ms  3.239 ms  2.688 ms
 4  [AS7679] 218.40.224.30 (218.40.224.30)  2.886 ms  6.763 ms  3.052 ms
 5  [AS7679] 61.203.192.149 (61.203.192.149)  3.072 ms  4.743 ms  4.685 ms
 6  [AS7679] 61.203.192.98 (61.203.192.98)  24.047 ms  23.859 ms  26.656 ms
 7  [AS7521] 210.173.176.243 (210.173.176.243)  21.480 ms  20.856 ms  21.089 ms
 8  [AS15169] 209.85.241.90 (209.85.241.90)  20.983 ms
    [AS15169] 209.85.241.94 (209.85.241.94)  123.774 ms
    [AS15169] 209.85.241.90 (209.85.241.90)  27.225 ms
 9  [AS15169] 209.85.255.58 (209.85.255.58)  40.985 ms
    [AS15169] 209.85.255.36 (209.85.255.36)  46.023 ms
    [AS15169] 209.85.255.56 (209.85.255.56)  23.230 ms
10  [AS15169] 209.85.255.39 (209.85.255.39)  52.381 ms  53.949 ms  52.209 ms
11  [AS15169] 209.85.243.21 (209.85.243.21)  53.757 ms
    [AS15169] 209.85.250.103 (209.85.250.103)  53.235 ms
    [AS15169] 209.85.243.23 (209.85.243.23)  52.509 ms
12  [AS15169] 209.85.241.158 (209.85.241.158)  60.921 ms
    [AS15169] 209.85.241.162 (209.85.241.162)  61.702 ms
    [AS15169] 209.85.241.158 (209.85.241.158)  59.866 ms
13  [AS15169] tx-in-f147.1e100.net (72.14.203.147)  54.083 ms  56.241 ms  52.814 ms

vectabt(livedoor)→Google

AS2519(vectant) → AS15169(Google)

% traceroute -a google.com
traceroute: Warning: google.com has multiple addresses; using 72.14.203.105
traceroute to google.com (72.14.203.105), 64 hops max, 40 byte packets
 1  [AS65534] ix2015-02 (10.3.2.1)  0.344 ms  0.465 ms  0.380 ms
 2  * * *
 3  [AS2519] 163-139-125-30.rv.vectant.ne.jp (163.139.125.30)  6.831 ms  6.846 ms  6.484 ms
 4  [AS2519] 163-139-68-29.rv.vectant.ne.jp (163.139.68.29)  6.323 ms  6.213 ms  6.226 ms
 5  [AS2519] 163-139-68-5.rv.vectant.ne.jp (163.139.68.5)  6.054 ms  6.424 ms  6.082 ms
 6  [AS2519] ae1.peer1.nihonbashi.vectant.ne.jp (163.139.128.230)  14.290 ms  14.713 ms  14.786 ms
 7  [AS2519] 163.139.130.130 (163.139.130.130)  15.131 ms
    [AS15169] 74.125.50.49 (74.125.50.49)  14.414 ms  14.474 ms
 8  [AS15169] 209.85.241.64 (209.85.241.64)  14.305 ms
    [AS15169] 209.85.241.68 (209.85.241.68)  15.088 ms
    [AS15169] 209.85.241.64 (209.85.241.64)  14.905 ms
 9  [AS15169] 209.85.255.34 (209.85.255.34)  17.158 ms
    [AS15169] 209.85.255.56 (209.85.255.56)  17.337 ms  17.350 ms
10  [AS15169] 209.85.255.217 (209.85.255.217)  46.373 ms  85.752 ms
    [AS15169] 209.85.255.39 (209.85.255.39)  46.298 ms
11  [AS15169] 209.85.250.103 (209.85.250.103)  48.526 ms
    [AS15169] 209.85.250.101 (209.85.250.101)  47.371 ms
    [AS15169] 209.85.243.21 (209.85.243.21)  46.484 ms
12  [AS15169] 209.85.241.158 (209.85.241.158)  59.277 ms
    [AS15169] 209.85.241.166 (209.85.241.166)  57.258 ms
    [AS15169] 209.85.241.158 (209.85.241.158)  47.825 ms
13  [AS15169] tx-in-f105.1e100.net (72.14.203.105)  48.898 ms  46.936 ms  47.688 ms

OCN → Google

AS4713(OCN) → AS15169(Google)

%traceroute -a google.com
traceroute: Warning: google.com has multiple addresses; using 72.14.203.104
traceroute to google.com (72.14.203.104), 64 hops max, 40 byte packets
 1  [AS65534] ix2015-01 (10.3.3.1)  0.432 ms  0.326 ms  0.361 ms
 2  * * *
 3  [AS4713] 122.1.250.65 (122.1.250.65)  6.623 ms  5.997 ms  5.977 ms
 4  [AS4713] 118.23.130.113 (118.23.130.113)  5.607 ms  5.714 ms  5.860 ms
 5  [AS4713] 118.23.85.25 (118.23.85.25)  7.482 ms  7.468 ms  7.484 ms
 6  [AS4713] 211.129.29.25 (211.129.29.25)  5.983 ms  5.718 ms  5.485 ms
 7  [AS4713] 211.122.1.57 (211.122.1.57)  5.858 ms  6.218 ms  6.109 ms
 8  [AS4713] 203.139.175.121 (203.139.175.121)  5.858 ms  6.208 ms  5.740 ms
 9  [AS4713] 125.170.97.65 (125.170.97.65)  14.346 ms  14.708 ms  14.730 ms
10  [AS4713] 125.170.97.74 (125.170.97.74)  17.101 ms  16.712 ms  16.854 ms
11  [AS4713] 60.37.27.87 (60.37.27.87)  17.101 ms  16.835 ms  16.854 ms
12  [AS4713] 118.23.146.238 (118.23.146.238)  16.976 ms  31.578 ms  16.854 ms
13  [AS4713] 61.126.89.38 (61.126.89.38)  17.601 ms  17.587 ms  76.069 ms
14  [AS15169] 209.85.241.94 (209.85.241.94)  17.975 ms
    [AS15169] 209.85.241.90 (209.85.241.90)  18.711 ms
    [AS15169] 209.85.241.94 (209.85.241.94)  34.453 ms
15  [AS15169] 209.85.255.36 (209.85.255.36)  32.077 ms
    [AS15169] 209.85.255.56 (209.85.255.56)  20.084 ms
    [AS15169] 209.85.255.34 (209.85.255.34)  20.084 ms
16  [AS15169] 209.85.255.217 (209.85.255.217)  48.691 ms  48.945 ms  49.086 ms
17  [AS15169] 209.85.250.101 (209.85.250.101)  51.581 ms
    [AS15169] 209.85.250.103 (209.85.250.103)  49.320 ms
    [AS15169] 209.85.243.21 (209.85.243.21)  48.694 ms
18  [AS15169] 209.85.241.154 (209.85.241.154)  61.061 ms
    [AS15169] 209.85.241.162 (209.85.241.162)  52.817 ms
    [AS15169] 209.85.241.154 (209.85.241.154)  56.697 ms
19  [AS15169] tx-in-f104.1e100.net (72.14.203.104)  49.068 ms  51.310 ms  50.084 ms

macbookair(late 2010)にubuntu11.04をインストール

MacBook Air "11 (late 2010)に ubuntu 11.04 をインストールした.
マルチタッチがイケてないので
https://help.ubuntu.com/community/MacBookAir3-2/Meerkat
を見てやったけれど,一部のパッケージが入らないみたい.

yasuhiko@mba(69)% sudo apt-get install btusb-dkms applesmc-dkms hid-apple-dkms bcm5974-dkms xf86-input-multitouch snd-hda-dkms mbp-nvidia-bl-dkms -y
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
E: パッケージ btusb-dkms が見つかりません
E: パッケージ applesmc-dkms が見つかりません
E: パッケージ snd-hda-dkms が見つかりません
E: パッケージ mbp-nvidia-bl-dkms が見つかりません

FreeBSD boot process

FreeBSDのブートプロセスについて調べたのでまとめ.参考にしたページは下記:

1. boot0

2. boot1

3. boot2

  • 先頭の512から8192バイトに書き込まれる
  • 中身は/boot/boot2
  • 通常起動モードとかシングルユーザモードとかの選択画面を表示する.デーモン君のアレ
  • ファイルシステムが分かる
  • /boot/loaderをロード

4.loader

  • /boot/loader.confを読んで,もしくは対話的に読み込むモジュールを選択
  • カーネルをメモリ上にロード

5.system stage1

  • MMU初期化
  • CPUタイプ,サポートする拡張命令,接続しているハードウェアを確認
  • 起動時に接続デバイスが流れるアレ

6.system stage2

  • ハードウェア/メモリを初期化

7.system stage3

8.プロセスの起動

  • /sbin/init(pid1) を起動
  • ttyの準備
  • /etc/rcからプロセスの実行