2005年1月23日
pkg_deleteでメタ・パッケージを一発削除
NetBSDでpkgsrcを使う場合、依存関係を解決してインストールしてくれます… というのはよいとして、これをうまく使ってるのがメタ・パッケージです。 メタ・パッケージは、パッケージの実体はないんですが、 複数のパッケージに依存することで一括してインストールできる仕組みなわけです。 ところが、インストールは簡単でも、 メタ・パッケージを一括して消す方法がわからない、 ということで、長年悩んでいたわけですね。
ところが、ちょっと機会があってpkg_deleteのマニュアルを読んでたんですが… あるじゃん、一括削除! なんと-Rオプションをつければ、 依存しているパッケージを再帰的に削除してくれるんですね(常識かしら)。 もちろん、ほかのパッケージが依存しているために消せない、 というパッケージは消えません。 たとえば、
# pkg_delete -R postgresql74
とやると、postgresql74が依存してるパッケージは再帰的に消えていくわけです。 ただし、databases/p5-DBD-postgresqlが入っていたりすると、 databases/postgresql74-libは消えない、という感じです。 これは便利。
2006年3月20日
libpq.dylib: No such file or directory
話に聞くところでは、MacOS X使いでパッケージシステムにpkgsrcを使っているひとは、 相当少ないらしい。NetBSDから移ったひとでさえ「なんでpkgsrc?」とまで云うありさま。 その中には、その昔、*BSDで統一的なパッケージシステムを目指してたひともいるはずなのに、 なんなんでしょうね。あがっちゃったということでしょうか。
それはさておき、やはりNetBSD以外で使おうとすると問題が多いことも確か。 たとえば、databases/postgresql80-clientもすんなりとはコンパイルが通りません。
で、ちゃんと追いかけてないので、だっさいworkaroundなんですが、 とりあえず動かないと困るひとも多い(かもしれない)ので、メモ程度に。
# cd work/postgresql-8.0.7/src/interfaces/ecpg/compatlib # for i in ../../libpq/.libs/*.dylib; do > ln -s $i > done
ってなもんで。
2006年4月15日
PKG_SUGGESTED_OPTIONSなオプションを抜く
最近(といってもだいぶ前からですが)のpkgsrcは、 options.mkを使ったシステムになってきています。 例えば、devel/aprでは、mk.confに
PKG_OPTIONS.apr=db4
と書くと、databases/db4を使ってくれるようになるわけです。
では、options.mkはどうなっているかというと、
# $NetBSD: options.mk,v 1.6 2006/04/06 06:22:00 reed Exp $ PKG_OPTIONS_VAR= PKG_OPTIONS.ImageMagick PKG_SUPPORTED_OPTIONS= x11 PKG_SUGGESTED_OPTIONS= x11 .include "../../mk/bsd.options.mk" .if !empty(PKG_OPTIONS:Mx11) BUILDLINK_API_DEPENDS.jasper+= jasper>=1.701.0 DEPENDS+= mpeg2codec>=1.2:../../graphics/mpeg2codec .include "../../graphics/jasper/buildlink3.mk" .include "../../graphics/libwmf/buildlink3.mk" .include "../../mk/x11.buildlink3.mk" .else CONFIGURE_ARGS+= --without-x .endif
という感じ。これはdevel/aprじゃなくてgraphics/ImageMagickです。
ここで大事のなのは
- PKG_OPTIONS_VAR
- PKG_SUPPORTED_OPTIONS
- PKG_SUGGESTED_OPTIONS
の3つ。一番最初のものはオプションを指定するときに使う変数名で、 この例ではmk.confでPKG_OPTIONS.ImageMagickを設定すればいいことがわかります。 二番目はこのパッケージでサポートされているオプションで、 ここではx11というオプションが指定できることがわかります、と。
さて、問題は最後のひとつです。 これは、デフォルトで使われるオプションを示しています。 すなわち、mk.confになにも書かなければx11を指定したと云うことになるわけです。 それじゃあ、x11というオプションをつけたくない場合はどうするんだってことで、
PKG_OPTIONS.ImageMagick=
とか書いてみたくなりますよね。でもはずれです。 実はPKG_SUGGESTED_OPTIONSで指定されたオプションを抜くためには、 以下のようにしなければなりません。
PKG_OPTIONS.ImageMagick = -x11
これは知らないとわかんないなあということで、メモでした。
2006年7月28日
teTeX3とdvipdfmx
MacOSXでpkgsrcを使ってるのは物好きらしいですが、その物好きなわけです。 理由はいろいろあるんだけど、まあそこは今回の主題ではないので触れないことで。
で、いつだったかteTeXを3系統に更新しました。 バージョン2ではコンパイルのときにちょっくら細工をしないとだめだったんですが、 そういうこともなくなり快適…かとおもいきや、思わぬ落とし穴が。 dvipdfmxがまともに動かないのです。
これ、ちゃんと調べてませんが、おそらくpkgsrcがどうこうというよりは、 teTeX3ではちゃんと環境にあった設定をしろよって方針に変わったんですかね。 結論から書くと、設定がことごとくされてなかったと云うことです。 まず、
** WARNING ** Could not locate a virtual/physical font for TFM "rml". ** WARNING ** >> There are no valid font mapping entry for this font. ** WARNING ** >> Font file name "rml" was assumed but failed to locate that font. ** ERROR ** Cannot proceed without .vf or "physical" font for PDF output...
って怒られます。dvipdfmxではフォントはcid-x.map (pkgsrcでは/usr/pkg/share/texmf-local/dvipdfm/config/cid-x.map) に書かれてるんですけど、見事に空っぽ。 ってことで、お好みに応じてなんですけど、次のような感じに。
%% This file 'cid-x.map' is read by dvipdfmx for default %% dvipdfmx.cfg setting. Please append fontmap entries here. rml H Ryumin-Light gbm H GothicBBB-Medium rmlv V Ryumin-Light gbmv V GothicBBB-Medium
さて、これで万事解決かというとそういうわけにもいかず。
** WARNING ** No image converter available for converting file "xxxxx.eps" to PDF format. ** WARNING ** >> Please check if you have 'D' option in config file. ** WARNING ** pdf: image inclusion failed for "xxxxx.eps". ** WARNING ** Failed to read image file: xxxxx.eps ** WARNING ** Interpreting special command PSfile (ps:) failed. ** WARNING ** >> at page="4" position="(141.304, 552.345)" (in PDF) ** WARNING ** >> xxx "PSfile="xxxxx.eps" llx=0 lly=0 urx=1039 ury=612 rwi=103"
まーじで。teTeX2ではこんなことはなかったんだがなーとおもいつつ、 云われるがままにDオプションを確認するとdvipdfmx.cfg (/usr/pkg/share/texmf-local/dvipdfm/config/dvipdfmx.cfg) を確認すると(ちょっと長いので途中折り返してます)、
%% *Examples* for GhostScript (PS-to-PDF)%% %% The following example decode all DCT (i.e., JPEG) encoded images %% and then recompress images with Flate (zlib, same as PNG) encode %% filter. If you are using recent version of gs, then please remove %% -dAutoFilterXXXImages and -dXXXImageFilter. %% /FlateEncode is introduced to avoid quality loss of "EPS JPEG" %% images. %% %% Also note that PAPERSIZE=a0 is specified below. This convert PS %% files (including EPS) to A0 papersize PDF. This is necessary to %% prevent gs from clipping PS figure at some papersize. (A0 above %% simply means large size paper)%% %% GhostScript (Unix/Linux): %D "gs -q -dNOPAUSE -dBATCH -sPAPERSIZE=a0 -sDEVICE=pdfwrite -dCompatibilityLevel=1.3 -dAutoFilterGrayImages=false -dGrayImageFilter=/FlateEncode -dAutoFilterColorImages=false -dColorImageFilter=/FlateEncode -dUseFlateCompression=true -sOutputFile=%o %i -c quit" (略)
全部コメントアウトされてるじゃん… ってことで、gsのコメントアウトをはずして、めでたしめでたし。 ちなみに、Windowsの場合はその次のgswin32cを使えばいいだろうし、 Acrobat持ってるひとはdistill使えばいいってことでしょうね。 MacOSXのAcrobatではDistillerを単独起動できなさそうなので、 まあgsを使って満足。
2006年8月25日
teTeX3とvfxdvi
pkgsrcでteTeX3をいれると、vfxdviも動きません。
Unexpected error in "read_ZEIT_char()"
環境をMacBook Proに乗り換えたこともあって、まっさら状態。 これteTeX2のときもあったなー、なんだったけなー、と記憶をたどると、 そういえばフォントが足りないんだったような気がしてきた。
ってことで、fonts/watanabe_vfをインストールすると…正解! まあ、最近X11あがってないから使わないんですけどね、これ。
2006年10月30日
Armadillo-210でNetBSD
久々かもしれない、NetBSDねた。 といっても、たいしたことはなくて、 Arimadillo-210というARMな超小型計算機でNetBSDを動かしました、 という話です。
この手の小型計算機でNetBSDというネタは、 とくださんのところがとても参考になるわけで、 Armadillo-210に関してもやっぱりいろいろ書いていただいているわけです。 なのでぶっちゃけ、 Armadillo-210でNetBSDしたいひとはそこを見ていただければいいわけですが…
で、ブートするとこんな感じ。
Hermit-At v1.0.7 (Armadillo-210C/ttyAM1) compiled at 19:04:02, Oct 12 2006
Uncompressing kernel...........................................................
................................................................................
...........................done.
Doing console=ttyAM1,115200
Doing mtdparts=armadillo210-nor:0x10000(bootloader)ro,0x3e0000(kernel),-(config)
NetBSD/Armadillo-210 booting ...
Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
The NetBSD Foundation, Inc. All rights reserved.
Copyright (c) 1982, 1986, 1989, 1991, 1993
The Regents of the University of California. All rights reserved.
NetBSD 4.0_BETA (ARMADILLO210) #1: Sat Oct 14 16:34:52 JST 2006
naoto@takayama.xxxxx:/usr/home/naoto/tmp/armadillo/src/sys/arch/evbarm/c
ompile/obj/ARMADILLO210
total memory = 32768 KB
avail memory = 26360 KB
mainbus0 (root)
cpu0 at mainbus0: ARM920T rev 0 (ARM9TDMI core)
cpu0: DC enabled IC enabled WB enabled EABT
cpu0: 16KB/32B 64-way Instruction cache
cpu0: 16KB/32B 64-way write-back-locking-A Data cache
epsoc0 at mainbus0: Cirrus Logic EP93xx SoC rev E1
epsoc0: fclk 199.99 MHz hclk 99.99 MHz pclk 49.100 MHz
epclk0 at epsoc0 addr 0x80810000-0x8081008f intr 4
epgpio0 at epsoc0 addr 0x80840000-0x808400cb intr 59
gpio0 at epgpio0: port A: 8 pins
gpio1 at epgpio0: port B: 8 pins
gpio2 at epgpio0: port C: 8 pins
gpio3 at epgpio0: port D: 8 pins
gpio4 at epgpio0: port E: 8 pins
gpio5 at epgpio0: port F: 8 pins
gpio6 at epgpio0: port G: 8 pins
gpio7 at epgpio0: port H: 8 pins
epled0 at epgpio0: port E bit1 1 bit2 0
armadillo9iic0 at epgpio0: port B bit1 4 bit2 5
iic0 at armadillo9iic0: I2C bus
seeprom0 at iic0 addr 0x50: AT24Cxx EEPROM
epe0 at epsoc0 addr 0x80010000-0x8001ffff intr 39
epe0: MAC address 00:11:0c:03:03:e3
lxtphy0 at epe0 phy 0: LXT971/2 10/100 media interface, rev. 2
lxtphy0: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto
epcom0 at epsoc0 addr 0x808c0000-0x808c0fff intr 52
epcom1 at epsoc0 addr 0x808d0000-0x808d0fff intr 54
epcom1: console
epwdog0 at epsoc0 addr 0x80940000-0x80940007 intr 36
eprtc0 at epsoc0 addr 0x80920000-0x8092010b intr 37
md0: internal 4096 KB image area
boot device:
root on md0a dumps on md0b
root file system type: ffs
WARNING: clock lost 13444 days
WARNING: CHECK AND RESET THE DATE!
Thu Jan 1 00:00:06 GMT 1970
Setting tty flags.
Starting network.
Hostname: armadillo210
IPv6 mode: autoconfigured host
Configuring network interfaces: epe0.
Adding interface aliases:
Building databases...
Mounting all filesystems...
Setting securelevel: kern.securelevel: 0 -> 1
Starting local daemons:.
Setting date via ntp.
Starting ntpd.
Starting rtsold.
Starting sshd.
Mon Oct 23 13:43:20 GMT 2006
NetBSD/evbarm (armadillo210) (console)
login:
注意するべきがいくつかあります。
まず、上記のページにあるブートローダはHermit-At 1.0.2なので、ちょっと古い。 最近Armadillo-210を手にした人は基盤がRev.Cになっているので、これでは動きません。 というわけで、自分で作らないといけません…が、それもなんですので、 このあたりに転がしておきます。 もちろん無保証。基本的には濱嶋さんのパッチを1.0.7ベースに取り込んだだけです。 書き込みは以下の通り。
$ hermit download -i loader-armadillo210.bin -r bootloader --force-locked
次に、nfs_rootするならいいんですが、in-kernel mdでブートしようとすると、 initでこけます。 どうも、コンソールにメッセージを吐くためのopenlogでブロックしているらしい。 めんどくさいのでまじめに追ってませんが、 log関係を全部捨てれば普通にあがります。
あとはあれですね、いかに4Mに押さえ込むかという勝負でしょうか。 戦略としては、昔の1FD BSDのように全部crunchするか、 あるいは必要な分だけをcrunchして、残りをvnode diskにつっこみ、 vndcompressして容量を稼ぐか、でしょう。 私の場合は後者の戦略で、dhclient/ntpd/ntpupdate/sshdまで入れて、 残りが200kbってところです。
2007年2月18日
SOCK_RAWとバイトオーダ
たまにはそれっぽい記事も書いてみよう。 ユーザランドでIPデータグラムを生成して、SOCK_RAWではき出すときの注意点です。 ちなみにIPv4です。IPv6は必要に迫られてないので見てません。 また、環境はNetBSDしか見てないので、特にLinux系だと事情が違うかもしれないです。
まずはコードから。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/in_systm.h>
#include <netinet/ip.h>
int
main(void)
{
struct in_addr ip_src = { .s_addr = htonl(0x0a000001) }; /* 10.0.0.1 */
struct in_addr ip_dst = { .s_addr = htonl(0x0a000002) }; /* 10.0.0.2 */
struct sockaddr_in sa_dst;
struct ip ip;
int fd;
int on = 1;
size_t len;
if ((fd = socket(PF_INET, SOCK_RAW, IPPROTO_RAW)) < 0) {
perror("socket");
exit(1);
}
if (setsockopt(fd, IPPROTO_IP, IP_HDRINCL, &on, sizeof(int)) < 0) {
perror("setsockopt");
exit(1);
}
memset(&ip, 0, sizeof(struct ip));
ip.ip_v = IPVERSION;
ip.ip_hl = sizeof(struct ip) >> 2;
ip.ip_tos = 0;
ip.ip_len = sizeof(struct ip);
ip.ip_id = 0;
ip.ip_off = IP_DF|0;
ip.ip_ttl = 255;
ip.ip_p = IPPROTO_RAW;
ip.ip_sum = 0;
memcpy(&ip.ip_src, &ip_src, sizeof(struct in_addr));
memcpy(&ip.ip_dst, &ip_dst, sizeof(struct in_addr));
sa_dst.sin_family = AF_INET;
sa_dst.sin_len = sizeof(struct sockaddr_in);
sa_dst.sin_port = htons(0);
memcpy(&sa_dst.sin_addr, &ip_dst, sizeof(struct sockaddr_in));
len = sendto(fd, &ip, sizeof(struct ip), 0,
(struct sockaddr *)&sa_dst, sizeof(struct sockaddr_in));
if (len < 0) {
perror("sendto");
exit(1);
}
return 0;
}
socketをSOCK_RAW, IPPROTO_RAWで開くのはまあいいですね。 IPヘッダもユーザランド側で作る場合は、IP_HDRINCLをセットする必要がありますが、 これも難しくはないでしょう。
問題はIPヘッダを作るところです。 普通に値を埋めているように見えますが、鋭い人なら「ん?」と思うかもしれません。 よく見ると、ip_lenとip_offにそのまま値をつっこんでいます。 ここは16ビット幅を持つフィールドなので、バイトオーダを直さないといけないはずです。 ところが、カーネル側ではこのふたつのフィールドに対して、ホスト・バイトオーダを期待しているのです (少なくとも、NetBSD 3.1_STABLEでは)。 というわけで、気を利かせてhtonsするとはまります。 ip_lenがおかしいとsendtoでEINVALが返ってきますし、ip_offに至っては何も云わずににデータグラムが出て行きます。
残りのフィールドは特に気をつけることはありません。 ip_idは自前でつけることもできますが、0でつっこむとrip_outputでよしなにつけてくれます。 またip_sumも自前で計算してもよいのですが、0でつっこむとip_outputで計算して埋めてくれます。 いずれのフィールドもネットワーク・バイトオーダです (ip_sumにバイトオーダもなんもないけれど)。 ただし、ip_sumを自前で計算するときは上記のip_lenとip_offがネットワーク・バイトオーダでなければなりませんから、注意が必要です。
2008年8月 2日
Metadata journaling support added to FFS
おー、ついにきましたか。HEADだし、もちろん試す余裕はなし...