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()
- vfs_mountroot()
- kernel_mount()
- vfs_donmount()
- オプション解析
- vfs_domount()
参考:
qpstudy #06
5/28(土)に開催されたqpstudy #06 に行ってきた.開場は大森のniftyさんのところ.niftyさん,ありがとう!
- 公式:第6回 qpstudy06 - キユーピー3分インフラクッキング 公式Webサイト
- 公式:http://blog.qpstudy.com/Entry/4/
- 座席表:http://seats.nekoruri.jp/6
- ATND:キユーピー3分インフラクッキング qpstudy06 一般枠 : ATND
- ATND:キユーピー3分インフラクッキング qpstudy06 初心者枠 : ATND
グループディスカッションの議論についてまとめとこう.
メンバーは,@wenbose さん,@k_zoarさん,@soestudio さん,@isjunichi さん,@yudoufu さん,@yogata でした.
議題1:チームでのナレッジや資料の共有と,成果物の再利用について
「ブレスト→親和図作成→結論+ストーリづくり」の流れでやっていました.
ブレスト
各自で付箋紙に書く → 口頭で補足しながら周りに説明.同時に,粒度はばらばらだが,ある程度のグループ化.
出た意見は,「勉強会」「社内LT」「Wiki(全体で管理/個人毎に管理)」「メールやML」「IRC」「電話」「FAX」「チケットを切って可視化」「報告書や手順書の標準化」「共有しない(キリッ(都度知っている人にIRC等で聞く)」等
議題2:みんなはどうやってキャリア形成のための勉強をしているの?
この議論は難しかった.サブテーマは6つ有ったが,大別すると「キャリアの方向性は何か」「どうやって勉強しているか」の2つであり,我々のチームは前者について議論することにした.
後者は個人によるところが大きく,その共有というのも魅力的だが,グループディスカッションとしては前者のほうが適していると判断したため.
議題2の結論としては,キャリアの方向性は以下の2つがあり,そのキャリア形成に向けた勉強をすべき.
- 設計
- 今後の技術の目利き
- ベンチマークテスト等による各技術の長所/短所=適用箇所が判別できる
- 設定
- 仕様に基づく設定
- パフォーマンスチューニング(特にスケールしたときの)
LTについて
お酒が入っていてあまり記憶が無いけれど……
- File Capability すごい.特権とアクセス制御の違いを初めて知った.
- フリーランスは自由だけれど大変そう.健康第一なのは良いかも.(但し,医療費的な意味で健康第一)
- gitit うわー簡単.Wiiプレゼン超かっこいい.勢いが凄い.大爆笑.
- 英語でメール書いたらかっこいい!
- \キャーハセガワサーン/.第一部「段取り8分とはよく言ったものです」/第二部「今日のパッチはどうだい?」
- 人には言えない怪談話@qpstudy#9.GDで「言えることは社内で,言えないことはqpstudyで」って意見があったような
- Catalyst=二郎.大爆笑.
- 主催者が関西在住なのに,キックオフが関東な #ipv6study の存在!?
- 座席表は超重要.タイムラインのアノ人を探すのには必須.
nwstudy
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 の作成が出来ない.
- VIMAGE は対応 jail にするには jail に -c vnet オプションを渡す必要があるが,/etc/rc.d/jail は -c オプション指定時のフォーマットに対応していない*1ため,素の /etc/rc.d/jail は使えない.
- デフォルトの devfs のマウント方法は VIMAGE 対応を前提としていないため,jail 環境に /dev/*mem がなく,jail 環境でルーティングが出来ない.
- 通常の jail とは違って起動時に IP アドレスを割り当てない.そのためゲスト側で IP アドレス設定,ルーティング設定,サービス(sshd等)実行を jail 環境を立ち上げた後に行う必要がある.
ここでは課題としては以下の3点をあげた.
- /etc/rc.d/jail で -c vnet オプションを使えるようにして VIMAGE 対応 jail を作成できるようにする.
- jail 環境で /dev/*mem を使えるようにする.
- 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 環境で構築するのがなぜよろしく無いのかを参考にしました
- prestart, poststart の実行環境/タイミングを参考にしました
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のブートプロセスについて調べたのでまとめ.参考にしたページは下記:
- http://www.freebsd.org/doc/en_US.ISO8859-1/books/arch-handbook/boot.html
- http://www.freebsd.org/doc/ja_JP.eucJP/books/handbook/boot.html
- http://www.khmere.com/freebsd_book/html/ch02.html
1. boot0
3. boot2
- 先頭の512から8192バイトに書き込まれる
- 中身は/boot/boot2
- 通常起動モードとかシングルユーザモードとかの選択画面を表示する.デーモン君のアレ
- ファイルシステムが分かる
- /boot/loaderをロード
4.loader
- /boot/loader.confを読んで,もしくは対話的に読み込むモジュールを選択
- カーネルをメモリ上にロード
6.system stage2
- ハードウェア/メモリを初期化
7.system stage3
- カーネルプロセス(pid0)を作成
8.プロセスの起動
- /sbin/init(pid1) を起動
- ttyの準備
- /etc/rcからプロセスの実行