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

FreeBSD 10.0-RELEASEへのアプグレード続きの続き

どうも現状のportsだと、glib20は /usr/local/include/iconv.hがあれば使わないようにconfigureしても絶対それをincludeしちゃうようです。なら gnuのiconvを削除すればいいんじゃね?と思ったわけですが、libiconvを pkg remove -fで削除したら(当然ながら)いろいろなモノが動かなくなり、それでもまぁもっかいビルドすればいいかと思ってたんですが、portsそのものがコンパイルできなくなるという状態に(pythonとか動かないので)。これはいかんと、いうことで zfs rollbackで戻しました。いずれiconvは削除できるのは削除するという方向にして、 とりあえずは /usr/local/include/iconv.hだけを別名に renameして glib20をごまかしてやることにしました。(あとで忘れそうだな

この状態で

portmaster -a -w -d

としたら、大部分がリビルドできるように。たまに出るエラーは手動で修正。大抵は依存関係の問題なんで、先に別なほうをビルドしちゃえばOKですが(めんどうくさいw

全部まっさらにして入れ直したほうが早かったかなー?しかしFreeBSD8から継ぎ足して使ってきた秘伝の・・・(略

 

Posted by issei

カテゴリ: BSD

FreeBSD 10.0-RELEASEへのアプグレード続き

いくつか標準から外れたものがあるようだ。とりあえず cvsは消えてくれてサンキューだが、digは無いと困るので入れた。

portsのリコンパイルはportmasterにお任せなんですが、それでもiconv関連で以下のようなメッセージが出て、

error: GNU libiconv not in use but included iconv.h is from libiconv

エラーで止まって悩みました。

これ以前別のプロジェクトでもハマったんだよな。おそらくconstがついてるか否かとかそういう(些細な)問題だったような記憶があるけど、これは古い何かと何かがかち合って、何かと何かのiconv.hの宣言がかみ合ってないのか?まずはググるが、適切な回答みつからず。しゃーないから自分で調べる

/usr/ports/devel/glib20のMakefile

を眺めると

ICONV_LIBというのが定義されていると、 configureに  --with-libiconv=gnuが渡されるようである。エラーで止まったあとに workの下で ./config.statusしてみると

# ./config.status --config
'--enable-static' '--disable-gtk-doc' '--with-html-dir=/usr/local/share/doc' '--disable-man' '--without-xml-catalog' '--with-pcre=system' '--disable-fam' '--disable-dtrace' '--with-libiconv=native' '--disable-modular-tests' '--prefix=/usr/local' '--mandir=/usr/local/man' '--infodir=/usr/local/info/' '--build=x86_64-portbld-freebsd10.0' 'build_alias=x86_64-portbld-freebsd10.0' 'CC=cc' 'CFLAGS=-O2 -pipe -DLIBICONV_PLUG -fno-strict-aliasing' 'LDFLAGS= -L/usr/local/lib' 'CPPFLAGS=-I/usr/local/include -DLIBICONV_PLUG' 'CPP=cpp' 'CXX=c++' 'CXXFLAGS=-O2 -pipe -DLIBICONV_PLUG -fno-strict-aliasing -DLIBICONV_PLUG' 'PKG_CONFIG=pkgconf' 'PYTHON=/usr/local/bin/python2.7'

と、nativeなiconvを使おうとしてるので、これが効いていないっぽい。devel/glib20/Makefileを強引に gnuを使うように書き換えたらちゃんとコンパイルが通った。

つまるところ、nativeな iconvを使おうとしてるのに /usr/local/include/iconv.h をincludeしているのがよくないのであろう。ここまではわかった。

コンパイラのインクルードパスを見る順番という問題な気もするが、iconvを全削除して、portsをリビルドするとうまくいくような気もする?それはそれでいろいろ別な問題が発生するような気がするが、さてどちらの対処でいくかべきか?

 

Posted by issei

カテゴリ: BSD

FreeBSD10へのアプグレード

放置していたFreeBSD RELEASE-10へのアプグレードですが、OSはほぼ問題なく移行できました。まぁ問題はその後の設定なんですけどね。

  • jailの起動でいろいろ言われるので、警告どおり jail.confに書き換える
  • パッケージ管理システムがpkgへ移行したのでpkg2ngでコンバート(なにやら色々と嫌な感じの警告が沢山でてる)

とりあえずここまで。あとlinux関係のモジュールでいくつかエラーが出てたのう・・・

Posted by issei

カテゴリ: BSD

FreeBSD 9.2で6rdを使う

9.1まではこちらの記事にあるこちらのパッチが適用できたのですが、9.2からは数ヶ所rejectされるようになってしまいました(ちなみに /usr/ports/net/stf-6rd-kmodから入れても同じようなことになるような感じ)

なので手動でセコセコ直す作業が発生。疲れた~。 一応sakuraのVPSではちゃんと動いているようです。 疲れたついでに9.2用のパッチをここにおいときます。

Posted by issei

カテゴリ: BSD