cd: ..: Permission denied by newvers.sh2017年09月13日 11時10分32秒

FreeBSD で一般ユーザで buildkernel をするとエラーが出るようになった。11.1-RELEASE を作ったときは、自分のアカウントで出来たから、current と 11-STABLE が影響の対象だと思う。uyota で buildkernel をすると、無限ループに陥る。root で buildkernel をすると問題はない。

少し実験をする。make buildkernel から問題のあるコマンドだけを抜き取っった。newvers.sh が原因のようだ。

% MAKE=/usr/obj/usr/src/make.i386/bmake sh /usr/src/sys/conf/newvers.sh  GENERIC
cd: ..: Permission denied
cd: ..: Permission denied
sh に -x を渡して、実行されているコマンドを見る。
env MAKE=/usr/obj/usr/src/make.i386/bmake sh -x /usr/src/sys/conf/newvers.sh  GENERIC

+ [ -z '' ]
+ dirname /usr/src/sys/conf/newvers.sh
+ SYSDIR=/usr/src/sys/conf/..
...
+ findvcs .git
+ local savedir
+ pwd
+ savedir=/usr/src
+ cd /usr/src/sys/conf/../..
+ pwd
+ [ /usr/src '!=' / ]
+ [ -e ./.git ]
+ cd ..
+ pwd
+ [ /usr '!=' / ]
+ [ -e ./.git ]
+ cd ..
cd: ..: Permission denied
findvcs で無限ループに陥っているようだ。どうも /usr からは / へ .. で移動できていない様だ。取り合えず、該当する部分を見てみる。
findvcs()
{
        local savedir

        savedir=$(pwd)
        cd ${SYSDIR}/..
        while [ $(pwd) != "/" ]; do
                if [ -e "./$1" ]; then
while ループの pwd が成功しないため、while ループが無限ループに陥っている。

今まで目撃したことの無かった現象なので、気になったのでテスト。

% cd /usr/src
% df .
Filesystem  1K-blocks    Used   Avail Capacity  Mounted on
/dev/da2s2f   5061628 2584592 2072108    56%    /usr/src
% cd ..
% cd ..
..: Permission denied.
% df -k .
Filesystem   1024-blocks    Used   Avail Capacity  Mounted on
/dev/ada0s3d     7103150 1625446 4909452    25%    /usr
% pwd -P
/usr
% pwd
/usr
% cd ..
..: Permission denied.
% ls -ld /usr
drwxr-xr-x  19 root  wheel  512 Jun 18 13:42 /usr
% ls -ld /
drwxr-xr-x  23 root  wheel  1024 Sep 26 21:39 /
/usr/src から、/usr へは問題なく cd .. が出来ているが、/usr から / へは出来ていないようだ。ディレクトリへのアクセス権限も問題ない。

原因は分からないが、該当箇所を /usr と比較することで、一時的な回避は出来る。buildkernel は /usr/src から行うので、/usr までみれば十分だ。

        while [ $(pwd) != "/usr" ]; do

git の [rejected] master -> master (non-fast-forward) の対処法2017年09月14日 10時55分03秒

git push と git pull を繰り返しているうちに、手元の git レポジトリと共有元の履歴が合わなくなるときがある。変更履歴が手元の複製と共有用で変わってしまった場合だ。そんなときに、pig push をすると以下のようなエラーが出る。
% git push
[rejected] master -> master (non-fast-forward)

共有用を常に元として作業をするようにしているので、このような状況に陥ったときは、手元のものを共有用と同じ状態にしたい。

% git rebase origin master
とすると origin、つまり手元の履歴を rebase できる。これで、共有用の履歴に合わせることが出来る。

FreeBSD で NFS ファイルにスワップする2017年09月15日 11時56分57秒

FreeBSD では長らくの間、NFS ファイルをスワップに指定できるようになっている。FreeBSD の古いドキュメントを見付けると、4.x 以前はとても遅かったといった記述や、NFS はネットワークに左右されるので、勧められないとの記述もあることはある。

取り敢えず実例。NFS の export と mount の位置はあまり関係なく、個々の設定による。

$ mount -t nfs x.x.x.x:/swap /mnt/swap
$ dd if=/dev/zero of=/mnt/swap/swap1 count=1 seek=1200
$ swapon /mnt/swap/swap1
swapon にそのままファイルのパスを指定すれば良い。dd にて空のファイルを先に作った。
$ swapctl -l
$ systat -swap
Device:       1024-blocks     Used:
/dev/#NODEV     1229824    109580
Disk      1K-blocks   Used /0%  /10  /20  /30  /40  /50  /60  /70  /80  /90  /10
[NFS swap]  1229696 109580 XXXXX

sswapctl や systat などで、スワップの割り当てや利用量をみられる。しかし、残念ながらファイル名は表示されないので、覚えておかなければいけない。
$ swapoff /mnt/swap/swap1
スワップ領域を外す場合は、ファイル名で指定する。複数の NFS ファイルで複数の領域を割り当てる事は出来るが、swapoff はファイル名で指定なので、忘れたら swapoff 出来なくなる。

shutdown 時には、nfs の umount や swapoff -a のタイミングが結構微妙な様なので、出来るならば shutdown 前に swapoff をしておいた方が良さそうだ。

dtrace で pid と execname を表示2017年09月16日 13時48分36秒

dtrace で pid と execname は特殊な変数。pid はプロセス番号を保持し、execname はプログラムの名前を保持する。

open システムコールを呼び出す pid とプログラムを表示する。

$ dtrace -n 'syscall::open:entry{printf("%d %s", pid, execname)}'
dtrace: description 'syscall::open:entry' matched 1 probe
CPU     ID                    FUNCTION:NAME
  0  39684                       open:entry 13981 dtrace
  0  39684                       open:entry 13741 make
  1  39684                       open:entry 13741 make
最初に open を呼んだのは dtrace だった。

マンハッタンのパークアベニューが通行規制中2017年09月19日 12時41分38秒

国連の会議で、マンハッタンのパークアベニューを中心に、自動車の東西に移動できる道が大きく通行規制中。グランドセントラル辺りから、セントラルパーク近くまで、ほとんど曲がれない模様。

57 番の大通りは東西に動けるが、それより南は無理な模様。渋滞が特に激しいので、ニューヨークでの車の運転は普段以上に時間と注意が必要そう。

FreeBSD の mdconfig のでスワップファイルは非効率2017年09月20日 06時15分21秒

スワップ領域にするのに一番適しているのは、デバイス。一時的な利用などにより、物理メモリが足りなくて、さらにスワップデバイスも容量が逼迫してしまうときもある。そのような時には、ファイルを通してスワップをすることも可能だ。
$ dd if=/dev/zero of=/mnt/scratch/swap bs=1M count=1 seek=10000
$ mdconfig -a -t vnode -f /mnt/scratch/swap
md1
$ swapon /dev/md1

ただ、これは本当に一時凌ぎの様だ。まずは、root に成れなくてはならない。そして、読み書きの様子を観察をしていると、ファイルへのアクセスは多いのだが、swapin や swapon は大して多くならない。mdconfig を通して、ファイルとしてアクセスするオーバーヘッドがかなり大きい様だ。10 MB/s のディスクアクセスでも、実際のページングになるのは 1 MB/s あたり。ディスクのアクセス効率は、十から二十パーセントからぐらいのようだ。

良く使う mail のコマンド2017年09月22日 12時44分24秒

いわゆる /bin/mail のメールクライアント。日常的に使うコマンドでは無くなったが、cron job 等から受け取ったメールをローカルで点検したりする時に使う。

作業の順番に。

h
表題のリストを見る。
数字
h で表示されている番号のメールをみる。一気にスクロールする mail クライアントも。
page 数字
番号のメールを PAGER を使って見る。個人的には less が一番使いやすい。
d 数字
番号のメールを消す。数字-数字の形で二つの数をハイホンで繋ぐと、その範囲のメールを全て消す。
q
終了。

FreeBSD の一時スワップデバイスは tmpfs を nfs で export して swapon2017年09月25日 12時52分37秒

mdconfig の swapon はかなりオーバヘッドが多い。と言うか、ほとんどがオーバヘッドだ。

それに引き換え、あまり推奨されていない筈のNFS ファイルの swapon は、swap pager と NFS、そしてディスクの IO の値が一致する。ネットワークの帯域に多少は心配があっての、ファイルやデバイスへのアクセスは優秀で、ほぼ 100% の様だ。

これらを総合すると、swap 領域の圧迫の一時的な対処法は、別機からのサポートのようだ。メモリに余裕のあるシステムから、tmpfs を nfs エクスポートし、そこのファイルを直接 swapon をする。

また、大量のページングが発生している状況だと、スワップ領域も細切れになり、また、仮装メモリと実メモリのマッピングも随分と断片化する。ディスクが主体のスワップよりも、ネットワークと tmpfs のメモリアクセスの方が数倍も早くなる場合が多い。

NFS の export の部分を若干省略するが、大体の作業。

nfs-server $ mount -t swap dummy /mnt/tmp
nfs-server $ dd if=/dev/zero of=/mnt/tmp/swap bs=1M count=1 seek=9999
nfs-server $ vi /etc/export
nfs-server $ sh /etc/rc.d/nfsd onestart
swapping-machine $ mount -t nfs nfs-server:/mnt/tmp /mnt/swap
swapping-machine $ swapon /mnt/swap/swap

マンハッタンの交通規制が終っていた2017年09月26日 12時38分00秒

先週の交通規制は一週間で終ったようだ。今日は、若干街角に警察が立ってはいたが、先週のように道路を閉鎖したり、交差点での右左折を禁止していたりはいない。

交通量も若干少なめだった。

ジョージワシントン橋の南側の通路が閉鎖中2017年09月28日 14時22分05秒

ジョージワシントン橋の南側の通路が閉鎖されている。今週の月曜日から、北側の通路が開いている。北側は階段があるので、若干不便。

月曜日は 9W で何かあったらしく、ニューヨークの渋滞がジョージワシントン橋の交通を止め、ニュージャージー側も、大渋滞して橋の付近では車の長い列があちこちに出来ていた。