ほぼ雑記的メモ
request domain-name-servers;
をinteterfaceの設定に書くとDNSのサーバが降ってくるので、それをスクリプトをつかって/etc/resolv.confを書き換える
といった流れにするのがよいようです。もっとよいやり方があるのかもしれませんが・・・ちなみにname serversは $new_domain_name_serversでスクリプトから参照することができます。
/usr/local/etc/dhcp6c.conf:
interface tun2{ send ia-pd 0; request domain-name-servers; script "/usr/local/sbin/iijmio6.script"; }; id-assoc pd 0 { prefix-interface fxp0 { sla-id 1; sla-len 8; }; };
私は以下のようなスクリプトを書きました。
/usr/local/sbin/iijmio6.script:
#!/bin/sh echo -n "" > /etc/newresolv.conf if [ -n "$new_domain_name_servers" ] ; then for i in $new_domain_name_servers ; do echo nameserver $i >> /etc/newresolv.conf done mv /etc/newresolv.conf /etc/resolv.conf fi
rtadvdだけで配るのなら簡単なんですが、やはりちゃんと逆引きもさせたいよねー、とかなるとDHCPv6で配りたくなるというのが人情。その場合
の二つが必要なようですが、それは分かっても具体的な記述方法がよくわかりませんでした。これは、普通に10進数で /etc/rtadvd.confで raflagsに 192, pinfoflagsに 128を指定すればよいようです。
例)
fxp0:\ :addr="2400:XXXX:YYYY:ZZZZ::":prefixlen#64:raflags#192:pinfoflags#128
これで、RAからのアドレスではなくDHCPv6サーバから取得したアドレスをクライアントが振るようになりました。
我が家のマンションもBフレッツからフレッツネクストになり、やっとIPv6接続が安価に可能になりました。IIJmioに限らずフレッツ網使ってる限り、pppoeで接続後にDHCPv6でプレフィックスが振り出されるというやり方は基本同じなので、他のプロバイダでも通用するでしょう。
DHCPv6が必要になるので、あらかじめ pkg から dhcp6を インストールしておきます。
# pkg install dhcp6
pppの設定
/etc/ppp/ppp.conf:
iijmiov6: set authname AUTHNAME@bnf6.iij.ad.jp set authkey AUTHKEY set device PPPoE:re0:pppoe-in enable lqr disable ipcp enable ipv6cp set cd 5 set dial set login set redial 0 0 set timeout 0 set reconnect 10 20
AUTHNAME, AUTHKEY, deviceは適宜環境に合わせてください。 ipcpをdisableしてipv6cpをenableにするのがコツです。うまく設定できているかどうかは以下のコマンドで確認できます。
# ppp -unit2 iijmiov6 Working in interactive mode Using interface: tun2 ppp ON peach> dial ppp ON peach> Warning: deflink: Reducing configured MRU from 1500 to 1492 Ppp ON peach> PPp ON peach> Warning: ::/0: Change route failed: errno: No such process PPP ON peach>
pppがPPPになれば、リンクが確立したことになります。ここで、ワーニングが出ますが、これを消す方法があるのかどうかは不明です。別に出てもちゃんと動くようなので気にしないようにしました。
この状態では、リンクがつながってもIPアドレスも振られてなければdefault rotueも設定されていないので、まだIPv6で通信はできません。これらを自動で取得するためにpppを一旦終了し、次のような設定ファイルを書きます。
/etc/ppp/ppp.linkup:
iijmiov6: ! sh -c "/usr/local/sbin/dhcp6c tun2" ! sh -c "route -6 add default -iface tun2"
/etc/ppp/ppp.linkdown:
iijmiov6: ! sh -c "route -6 delete default" ! sh -c "kill `cat /var/run/dhcp6c.pid`"
interface tun2{ send ia-pd 0; }; id-assoc pd 0 { prefix-interface fxp0 { sla-id 1; sla-len 8; }; };
dhcp6c.confの fxp0等は適宜読み替えてください。
やってることはなんということはなく、リンクが確立したら
/usr/local/sbin/dhcp6c tun2 route -6 add default -iface tun2
が順番に実行されるだけです。設定段階では上記コマンドを手動でタイプしてちゃんと動いているかどうか、設定に間違いがないかどうか確認するとよいでしょう。特にdhcp6cは間違いやすいので -D -f オプションをつけて実行すると捗るのではないかと思います。
ちなみに dhcp6c.confの意味ですが、プロバイダから振り出されたプレフィックスに 8ビット足してその部分を1にしたものがfxp0にIPv6アドレスとして振るという設定です。IIJmioからは /56でIPv6アドレスが振り出されるので結果/64のアドレスがfxp0に振られます。
うまく動いているようでしたら、起動時に自動で実行されるよう /etc/rc.confに以下の行を追加します
ppp_enable="YES" ppp_profile="iijmiov6" ppp_mode="ddial" ppp_iijmiov6_unit="2" ppp_iijmiov6_nat="NO"
これで
# /etc/rc.d/ppp start
でIPv6アドレスが振り出されていれば成功です。
IntelのNUC(DN2820FY)のファームをFY0041.BIOからFY0048.BIOにしたところ起動しなくなりました(UEFI経由)。
写真のように
とか表示されて起動がとまってしまいます。少しづつファームを戻していったところFY0045.BIOでは起動することまでは確認しました。UEFI経由で起動しなければいいだけどいう話もありますが、その場合はパーティションがMBRでないと起動しないので、それもどうかと思いますし・・
調べて見るとこの問題はFreeBSDのUEFI wikiに Knwon Issues としてかかれていて
とります。ファームのバージョンアップで some hardwareに属してしまったぽいです。
このr258754の修正を見てみると printfの位置をずらしているだけで(printfがあるせいでメモリマップが変わってしまうというもののようで、しかも今現在CURRENTには取り込まれていないようなので、この修正を手動であててみれば起動するやもしれません。
search しても何も帰ってこない。というかinstallもできない。
そこで ls -l /var/db/pkg/repo-FreeBSD.sqlite
を見てみると
-rw-r--r-- 1 root wheel 54272 2月 5 09:49 /var/db/pkg/repo-FreeBSD.sqlite
とあからさまにファイルのサイズが小さいようです。どうもぶっ壊れたもよう。
sqlite3を起動して select name from packages;とかやっても何も帰ってきません。
強引に更新するほうほうが分からなかったのでrepo-FreeBSD.sqliteを削除。その後
pkg searchなど実行したら
-rw-r--r-- 1 root wheel 43327488 2月 5 03:41 /var/db/pkg/repo-FreeBSD.sqlite
となり正常になりました
ググると結構面倒な方法でupgradeしている人が多いのでメモがてら。
例えば母艦が10.1で、jailが10.0の場合、母艦側で
# freebsd-update -b /jails/hogehoge -r 10.1-RELEASE upgrade
とかやっても
freebsd-update: Cannot upgrade from 10.1-RELEASE to itself
というエラーが出てupdateできません。これは環境変数をいじくってunameの出力をごまかしてやることで解決できます。
# setenv UNAME_r 10.0-RELEASE
とすれば自分自身が10.0-RELEASEに見えるので、(uname -rで出力を確認できる)その状態で
を実行すれば jailがupgradeされます。その後
# freebsd-update -b /jails/hogehoge install
を実行すると
Installing updates... Kernel updates have been installed. Please reboot and run "/usr/sbin/freebsd-update install" again to finish installing updates.
のようにrebootしろと出ますが、これは
# unsetenv UNAME_r 10.0-RELEASE
とするだけでok。これで10.1-RELEASEにバージョンがあがったように見えます。その後何食わぬ顔で
を再び実行してやればokです
今迄業務でDebianを入れていたIntelのNUC(DN2820FYKH)にFreeBSD-10.1を入れてみました。
このマシンは発売当初から結構クセがあってBIOSのバージョンをアップデートしたり、設定しなおしたりで、なんとかDebianを動かした記憶があるので(具体的に何をしたかは忘れました)今回も苦労するだろうなぁと思ったらやっぱりその通りでした。以下そのメモです
まず、BIOSは現時点での最新のものをもってきました。
FY0041.BIO
というやつです。ググって見ると古いほうが安定してるとかいろんな情報がありますが一々確認してられないのでとりあえず最新のにしました。設定もとりあえずBIOSのデフォルトに。
次に 起動imageをもってきます。USBメモリからの起動が楽だと思います。10.1からはUEFIからの起動イメージがあるんでそれを持ってきました。
ftp://ftp6.jp.freebsd.org/pub/FreeBSD/ISO-IMAGES-amd64/10.1/ ftp://ftp6.jp.freebsd.org/pub/FreeBSD/ISO-IMAGES-amd64/10.1/FreeBSD-10.1-RELEASE-amd64-uefi-mini-memstick.img.xz
xzを解凍してからusbメモリに焼きます。このUSBから起動してインストールをすすめていくとUEFIから起動するようにパーティションが切られてセットアップが完了するはず……なんですが、あっさりとはいきませんでした
ブートする途中でコケてしまうんですよね。ちなみに非UEFIバージョンのイメージではちゃんと起動します。これで起動してLiveCDに移行して gpart等でパーティションを作ってインストールするという手段をとるとインストールはできましたが、OSの再起動で同じことがおきます。詰み。 さてどうしたものかと、試行錯誤的を繰替えしていたところ
Booting [/boot/kernel/kernel] in 10 seconds...
とカウントダウンが始まったら適当なキー(スペースとか)を押して止めて
mode 2 boot
とタイプして画面のモードを切りかえてbootすればうまく行くことにきがつきました。あとはインストーラが起動するのでそれに従っていきます。diskパーティションは Auto(UFS)を選択すればUEFIから起動するようにパーティションが自動で設定されます。
インストールが終わってHDDから起動するときもbootの途中で止めて、
をタイプします。毎回こんなことをしてられないので
/boot/loader.rc.local
というファイルを作成し
mode 2
と書いておけば次から自動でmodeが切り替わります。まぁまだ
Root mount waiting for: usbus0 ugen0.3: <Logitech> at usbus0 Root mount waiting for: usbus0 usb_alloc_device: set address 4 failed (USB_ERR_TIMEOUT, ignored) Root mount waiting for: usbus0 usbd_setup_device_desc: getting device descriptor at addr 4 failed, USB_ERR_TIMEOUT
とか妙な警告がでますが・・・これについてはこれから調査。
ホストであらかじめbridgeやtapを作っておく
/etc/rc.conf:
cloned_interfaces="tap0 bridge0" autobridge_interfaces="bridge0" autobridge_bridge0="re0 tap*" ifconfig_bridge0="up"
diskイメージを作成しmdconfigでmd0にattachしてパーティションなどをつくっていく
# truncate -s 10G diskdev # mdconfig -a diskdev # gpart create -s gpt md0 # gpart add -b 40 -s 64K -t freebsd-boot -l boot0 md0 # gpart add -s 1G -t freebsd-swap -l swap0 md0 # gpart add -t freebsd-ufs -l disk0 md0 # gpart bootcode -b /boot/pmbr -p /boot/gptboot -i 1 md0
ファイルシステムの作成/マウント/コピー
# newfs /dev/md0p3 # mount /dev/md0p3 /mnt # tar cfzp - -C /SOURCE-DIR . | tar tvfp - -C /mnt
guestを起動させるには /etc/fstabを設定する必要がある。tarでパッケージを展開しただけやjailからコピーした場合は/etc/fstabは存在しないので作ってやる必要がある。
先程gpartで作成したパーティションでは
というラベルがついているので次のように書いておけばよいだろう
/mnt/etc/fstab:
/dev/gpt/disk0 / ufs rw 1 1 /dev/gpt/swap0 none swap sw 0 0
/etc/rc.confにて sshd等を起動するようにしておかないと淋しいことになるので、設定をしておく。自分の環境ではこんな感じ。
hostname="test" ifconfig_vtnet0="DHCP" ifconfig_vtnet0_ipv6="inet6 accept_rtadv" sshd_enable="YES"
bhyveをコマンドラインから起動したあとにその端末を consoleとするように/etc/ttysを書換えておくとなんかあったときに楽
/mnt/etc/ttys:
console "/usr/libexec/getty Pc" vt100 on secure
作業が終了したので /dev/md0を unmountする
# umount /mnt
vmrun.shを使って起動してみる(/usr/share/example/bhyve/の下にある)
# ./vmrun.sh -d diskdev vm0
こんな感じに起動した
railsはほっとくと大量のディレクトリとファイルをtmp/cachesの下に作るんでファイルだけは30日程度で消してました。これでファイルはすっきりするんですがこのファイルは123/456のような3文字/3文字のディレクトリを掘ってその下にファイルを置いてるため空のディレクトリも大量に存在してることに気がつきました。これが大量にあるとゴミ掃除が遅い・・というわけで空のディレクトリを削除する方法です
find . -type d -empty -print -exec rmdir {} \;
-emptyとか便利なオプションがあるんですね・・しかしこれだとディレクトリを削除したあとにそのディレクトリを辿ろうとするので
find: ./E0D/C70: No such file or directory
とか出てしまいます。
depth firstアルゴリズムにするのがおすすめ
find -d . -type d -empty -print -exec rmdir {} \;
これですっきり
inodeを2%くらい減らす効果はあったようで
FreeBSDでqemuを使うためのメモ。基本的にはここのwikiを参考にしています。
1) パッケージのインストール
# pkg install qemu
2) /boot/loader.confに以下の4行を追加する
if_bridge_load="YES" bridgestp_load="YES" if_tap_load="YES" aio_load="YES"
再起動しておしまい。再起動が嫌ならkldloadでモジュールを読み込ませるとよいかと。
3)適当な起動可能なゲストのCDのimageを用意して起動させて動くのを確認する
以下の例ではFreeBSD-9.0のimageを使用しています。
# qemu-system-x86_64 \ -hda vm00.img -m 1024 -monitor telnet::4444,server,nowait -vnc :0 \ -cdrom Images/FreeBSD-9.0-RELEASE-amd64-disc1.iso
確認は適当なvncclientで
% vncviewer localhost
とかやればOKです。
動かすだけならこれでもいいのですが、これだけですとHostがDHCPサーバ&ルータになり、ゲストと外界が遮断されている状態なので、もうひと捻りします。具体的には bridgeとtapデバイスを使って、ホスト側からのパケットをゲスト側にも持ってくるという作戦。
4) /etc/sysctl.confに以下の2行を追加
net.link.tap.up_on_open=1
これは tapデバイスがopenされたとき自動的にupするというものの設定らしいです。設定しなくてもqemu起動する度に ifconfig tap0 upとかしてやればいいのですが、煩雑なので設定しておいたほうがよいでしょう。
5) /etc/rc.confに以下の3行を追加 (re0は使用しているNICの名前に適宜読み替えてください)
cloned_interfaces="bridge0 tap0" autobridge_interfaces="bridge0" autobridge_bridge0="re0 tap*" ifconfig_bridge0="up"
cloned_interfacesにbridge0と書いただけでは bridge0がupされた状態でやってこないので、ifconfig_bridge0="up"を書いています。もっとスマートな手法があるかもしれませんが。ここまで設定したら念のため再起動します。これも再起動が嫌だというひとは4の設定も含めてsysctrlやifconfigで自力で設定するという手法もあります。
6) 適当な起動可能なゲストのCDのimageを用意して起動させて動くのを確認
qemu-system-x86_64 -net nic -net tap,name=tap0,script=no \ -hda vm00.img -m 1024 -monitor telnet::4444,server,nowait -vnc :0 \ -cdrom Images/FreeBSD-9.0-RELEASE-amd64-disc1.iso
VNCで起動を確認し、LiveCDやshellに移行し dhclient ed0等するとDHCPサーバからアドレスが振られるのがわかるかと思います。
Powered by Red Leaf ( Rev. c78c769f2 ), © Issei Numata, 2007-2021