SSブログ

re: リンクいろいろ [その他]

元ネタ:リンクいろいろ


Windows限定かつ曖昧な知識で。

ハードリンク
  • ファイルの実体に複数の名前を付ける為の方法。片方のファイルを開いて修正すると,もう一方も変更される。ディレクトリには作れない
  • Windows NT 4.0時代はBackupWrite APIを使って頑張って書いていたが,Windows 2000でCreateHradLink APIが追加され,気軽に作れるようになった
  • Windows XP以降ではfsutilでコマンドプロンプトから作成可能。Vistaではmklinkコマンドでさらに簡単になった
リパースポイント (再解析ポイント)
パスの解析の途中に別の処理を割り込ませる方法。シンボリックリンク~マウントポイントの実装に使われている。
シンボリックリンク/ジャンクション/マウントポイント
  • 他のファイルやディレクトリ,ボリューム名を内部 (BACKUP_REPARSE_DATA) に持っていて,それぞれへのアクセスを置き換える物。 早い話が,ファイルシステムネイティブなショートカットファイル/ディレクトリ。
  • 違いは,
    ジャンクション/マウントポイント
    • 実は一緒の物。絶対パスで保持していて,Windows 2000以降で利用可能
    • 作成するにはDeviceIoControl APIを使う
    • Windows Vistaのmklinkまで,コマンドプロンプトから作成する方法はなかった
    • 対象は,同一PCのみ
    • ネットワーク越しでジャンクションにアクセスした場合,サーバー側で再解析が起こる
    • ファイルへのジャンクションは,不可能ではない物の,BackupWrite API使うとか,パッチ当てるとか,裏技でしかできない
    シンボリックリンク
    • 絶対パスまたは相対パスで保持していて,Windows Vistaで利用可能
    • 作成するにはCreateSymbolicLink APIを使う
    • mklinkを使って,コマンドプロンプトから作成可能
    • 対象は,同一PCの他,ネットワーク越しのファイルへのリンクも可能
    • ネットワーク越しでシンボリックリンクにアクセスした場合,クライアント側で再解析が起こるので,本来のリンク先にネットワーク越しではアクセスすることができない
    • 管理者権限が必要
subst
リパースポイントと違い,ドライブにディレクトリを割り当てる方法。

こんなんでよいっすかね?>シャノンさん


タグ:Windows
コメント(4)  トラックバック(0) 

コメント 4

シャノン

スバラシー。

> ジャンクション/マウントポイント
> 実は一緒の物。

ターゲットがディレクトリの場合はジャンクション、ドライブの場合はマウントポイント?

> シンボリックリンク

ジャンクションと違い、ファイルに対しても可能。

> 作成するにはCreateSymbolicLink APIを使う

たぶん DeviceIoControl でも作れる。

> 管理者権限が必要

まぢ?

> subst

NTFS の機能ではなく OS の機能。
DefineDosDevice で同じことができる。

その他のリンク:

ショートカット
 リンク先の情報を持ったファイル。NTFS の機能ではなくシェルの機能。
 対象は他のコンピュータでも、ファイル以外のシェルオブジェクト(マイコンピュータとかコントロールパネル内のアイテムとか)も可能
 作るには IShellLink インターフェイスを使う
 Windows Installer が作るショートカットはアドバタイズショートカットと呼ばれる特殊なもの

フォルダのショートカット:
 名前に反して、上記のショートカットのフォルダ版ではない
 http://d.hatena.ne.jp/seraphy/20060209
by シャノン (2008-05-27 19:14) 

YuO

> ターゲットがディレクトリの場合はジャンクション、ドライブの場合はマウントポイント?
一応は……。リパースタグが同じなので,区別するにはリパースバッファの中身までみないとわかりません。
DIRコマンドでは,まとめてって表示していますし。

>> 作成するにはCreateSymbolicLink APIを使う
> たぶん DeviceIoControl でも作れる。
作れます。
さらに面倒くさくなりますが,BackupWriteでも作れます。

>> 管理者権限が必要
> まぢ?
mklink /Dとかすると,
この操作を実行するのに十分な特権がありません。
って怒られます。CreateSymbolicLinkではエラーコード1314が返ります。
昇格したコマンドプロンプトで実行すると,どちらの方法でもちゃんと作成できます。

正確には,SE_CREATE_SYMBOLIC_LINK_NAME特権を持っていることになります。
デフォルトではユーザーはこの特権を持っていないため,昇格必須になります。
このあたりは,emkさんのリンク/ジャンクション作成ツール
http://homepage1.nifty.com/emk/symlink.html
のソースコードで知りました。

>> subst
> ショートカット
> フォルダのショートカット:

追記,ありがとうございます。
by YuO (2008-05-27 21:34) 

れい

リパースポイントというのはファイルやディレクトリにメタデータを持たせる仕組みのことで、
そのメタデータをどう解釈するかはOS(というか入ってるフィルタ)次第、って話なので、

> 他のファイルやディレクトリ,ボリューム名を内部 (BACKUP_REPARSE_DATA) に持っていて,それぞれへのアクセスを置き換える物。

このBACKUP_REPARSE_DATAというのは誤解を招くかなぁと。
BackupWriteを使うときにリパースポイントのデータを指定するためのただのタグですから。
by れい (2008-05-30 07:09) 

YuO

>> 他のファイルやディレクトリ,ボリューム名を内部 (BACKUP_REPARSE_DATA) に持っていて,それぞれへのアクセスを置き換える物。
> このBACKUP_REPARSE_DATAというのは誤解を招くかなぁと。
> BackupWriteを使うときにリパースポイントのデータを指定するためのただのタグですから。

うまい表現が見つからなくて,この表記にしました。
私の場合,DeviceIoControl + FSCTL_*_REPARSE_POINTやBackup*といったAPIを使って見える仕組みまでしかわかっていないので,これ以上の感覚を持てないのですよ……。
by YuO (2008-06-05 12:03) 

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。