BSD

FreeBSD DHCP6で Name Serverを自動設定する

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

 

Posted by issei

カテゴリ: BSD

FreeBSDで DHCPv6でアドレスを配るときのメモ

rtadvdだけで配るのなら簡単なんですが、やはりちゃんと逆引きもさせたいよねー、とかなるとDHCPv6で配りたくなるというのが人情。その場合

  • RAの Managed address configuration flagと Other stateful configration flagのビットを立てる。
  • pinfoflagsは Autonomous address condifuration flagsを落とす。

の二つが必要なようですが、それは分かっても具体的な記述方法がよくわかりませんでした。これは、普通に10進数で /etc/rtadvd.confで raflagsに 192, pinfoflagsに 128を指定すればよいようです。

例)

fxp0:\
        :addr="2400:XXXX:YYYY:ZZZZ::":prefixlen#64:raflags#192:pinfoflags#128

これで、RAからのアドレスではなくDHCPv6サーバから取得したアドレスをクライアントが振るようになりました。

Posted by issei

カテゴリ: BSD

FreeBSD で IIJmioへ pppoe+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`"

/usr/local/etc/dhcp6c.conf:

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アドレスが振り出されていれば成功です。

 

 

Posted by issei

カテゴリ: BSD

IntelのNUC(DN2820FY)のファームを更新したらFreeBSD-CURRENTが起動しなくなった

imagejpg

IntelのNUC(DN2820FY)のファームをFY0041.BIOからFY0048.BIOにしたところ起動しなくなりました(UEFI経由)。

写真のように

elf64_exec: ExitBootServices() returned 0x8000000000000002

とか表示されて起動がとまってしまいます。少しづつファームを戻していったところFY0045.BIOでは起動することまでは確認しました。UEFI経由で起動しなければいいだけどいう話もありますが、その場合はパーティションがMBRでないと起動しないので、それもどうかと思いますし・・

調べて見るとこの問題はFreeBSDのUEFI wikiに Knwon Issues としてかかれていて

0x8000000000000002 is EFI_INVALID_PARAMETER and indicates that MapKey is incorrect - i.e., that the memory map has changed between the last call to GetMemoryMap and ExitBootServices. The main issue with real hardware fixed in r258754. This issue is still encountered on some hardware.

とります。ファームのバージョンアップで some hardwareに属してしまったぽいです。

このr258754の修正を見てみると printfの位置をずらしているだけで(printfがあるせいでメモリマップが変わってしまうというもののようで、しかも今現在CURRENTには取り込まれていないようなので、この修正を手動であててみれば起動するやもしれません。

Posted by issei

カテゴリ: BSD

pkg searchが使えなくなった

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

となり正常になりました

Posted by issei

カテゴリ: BSD

freebsd-updateでjailをupgradeする

ググると結構面倒な方法で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で出力を確認できる)その状態で

# freebsd-update -b /jails/hogehoge -r 10.1-RELEASE upgrade

を実行すれば 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にバージョンがあがったように見えます。その後何食わぬ顔で

# freebsd-update -b /jails/hogehoge  install

を再び実行してやればokです

Posted by issei

カテゴリ: BSD

IntelのNUCでUEFIからFreeBSDを起動させる

今迄業務で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の途中で止めて、

mode 2
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

とか妙な警告がでますが・・・これについてはこれから調査。

Posted by issei

カテゴリ: BSD

jailをbhyveに持ってったときのメモ

ホストであらかじめ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で作成したパーティションでは

  • 起動パーティションにはdisk0
  • swapパーティションにはswap0

というラベルがついているので次のように書いておけばよいだろう

/mnt/etc/fstab:

/dev/gpt/disk0 / ufs rw 1 1
/dev/gpt/swap0 none swap sw 0 0

/etc/rc.confにて sshd等を起動するようにしておかないと淋しいことになるので、設定をしておく。自分の環境ではこんな感じ。

/etc/rc.conf:

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

こんな感じに起動した

bhyvepng-8xnubtw9v039.png

Posted by issei

カテゴリ: BSD

FreeBSD findで空のディレクトリを findで削除する

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%くらい減らす効果はあったようで

 

 

Posted by issei

カテゴリ: BSD

FreeBSD 10.0 でqemuを使う

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サーバからアドレスが振られるのがわかるかと思います。

Posted by issei

カテゴリ: BSD