«前の日記(2013-05-08) 最新 次の日記(2013-05-14)» 編集

meta's blog - The Power To Serve

筆者について

FreeBSDを通じてOSSにささかな貢献を。

OSS活動をご支援いただける方を募集しています


2013-05-09 gptzfsboot

ZFS にインストールした FreeBSD 起動時に unsupported ZFS version 5000 (should be 28) といわれる

なんかタイトルのようなことを言われるようになった。一応正常に起動はできる。

これも公式のフォーラムで解決策を見つけた。bootcode をアップデートすればいいらしい。

kernel も world も 9-STABLE にアップデート後、bootcode のインストール前に一応パーティション構成を確認しておく。

$ gpart show
=>        34  3907029101  ada0  GPT  (1.8T)
          34           6        - free -  (3.0k)
          40         128     1  freebsd-boot  (64k)
         168    16777216     2  freebsd-swap  (8.0G)
    16777384  3890251744     3  freebsd-zfs  (1.8T)
  3907029128           7        - free -  (3.5k)

/boot に新しい bootcode があることを確認、インストール先が ada0p1 なので以下のように。

# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada0

これでリブートしたら出なくなった!

UNIXにおけるパスの先頭から2つ以上連続するスラッシュの取り扱い

こういうツイートがきっかけでちょっと確かめてみました。

bash で / からスラッシュをひとつずつ増やして cd してみたときの結果です。

$ cd / && pwd
/
$ cd // && pwd
//
$ cd /// && pwd
/
$ cd //// && pwd
/

スラッシュが2つのときだけ // になってる。tcsh や zsh ではこうならずに、すべて / になります。

bash のソースコードを見てみると bash-4.2/lib/sh/pathphys.c にこんなコメントがありました。

 /* POSIX.2 says to leave a leading `//' alone.  On cygwin, we skip over any
    leading `x:' (dos drive name). */

先頭のスラッシュ2つ '//' はそのままにしろと POSIX で規定されているらしいです。

このあたりの POSIX のドキュメント探してみると 4.11 Pathname Resolution あたりが該当しそう。そして、それらしい文章がありました。

A pathname that begins with two successive slashes may be interpreted in an implementation-defined manner, although more than two leading slashes shall be treated as a single slash.
連続する2つのスラッシュで始まるパス名は実装が決めたやり方で解釈してよい(MAY)が、先頭から2つより多くのスラッシュが連続する場合は、1つのスラッシュとして扱うこと(SHALL)。

とのことです。また 3.266 Pathname のパス名の定義にはこう書かれていました。

Multiple successive slashes are considered to be the same as one slash.
複数の連続するスラッシュはひとつのスラッシュと同じとみなす。

こっちは先頭から連続するとは限らない場合です。

というわけでざっと POSIX の文章を参照した結果、探し方が足りないのかもしれませんが bash のコメントに書いてある「先頭から2つだけ連続するスラッシュをそのままにする」という根拠は見つけられませんでした。

  1. 2つ以上連続するスラッシュの意味は / と同じ
  2. 3つ以上連続するスラッシュは1つのスラッシュとして扱う
  3. 先頭から2つだけ連続するスラッシュの扱いは実装依存(ただし意味は / と同じ)
  4. 少なくとも bash は先頭から2つだけ連続するスラッシュをそのままにする
本日のツッコミ(全1件) [ツッコミを入れる]
Σ ぽこ (2013-10-22 21:23)

Windows でネットワーク越しにファイル共有する時<br>UNC (Universal Naming Convention) で<br>\\ホスト名\共有名<br>と言う書き方をしますが、<br>Linux で CIFS の mount する際には<br>mount -t cifs //ホスト名/共有名 /mnt<br>みたいにすることがあります。<br>Wikipedia / Path (computing)<br>http://en.wikipedia.org/wiki/Path_%28computing%29<br>によると Directory Separator は \ でも / でも良いような書き方がしてあるので、<br>これと関係あるんじゃないですかね?