hack のためのネタ帳, etc,,,

状況

パスの相互運用

rootfs の場所は、20171130: Fall Creators Update - wsl で書いたけど、
rootfs 以下のパスを他の環境に渡すのはかなり面倒を伴うようだ。

まず、Cygwin の cygpath と類似したコマンドとして WSL には wslpath が用意されている。
このため、cygpath と wslpath を用いれば、3 環境のパスは限定的には変換可能だ。

限定的と言っているのは、WSL の rootfs 以下のディレクトリは wslpath で処理できないため。
これはおそらく WSL 環境下では %LOCALAPPDATA%\Packages\ 以下にある rootfs 実体ディレクトリへのアクセス権がない為ではないかと思う。

あと愚痴だけど、wslpath は使い方は cygpath とほぼコンパチなので迷う事は余りないんだけど、
こいつ単独だと undocumented な状態になってて --help や man や info が通じない。
一応公式な document は WSL の Release Notes #build-17046 にあるんだけど、help をコマンド本体じゃなく web 上の Release Notes に書くのは酷いと思う。

参考:

Symbolic Link の相互運用

これが致命的に辛い。

Cygwin は通常ファイルにリンク先を「!<symlink>」+「UTF-16 LE (BOM) のパス名」の形式で記録して、システムファイル属性付けてけばシンボリックリンク扱いになる。

WSL は地味に謎。通常ファイルにリンク先を UTF-8 で記録しているまでは分かるのだが、ATTRIB や icacls の表示には特に仕掛けらしいものが見当たらない。DIR /R で代替データストリーム(ADS: Alternate Data Stream)が存在しないかも調べてみたがこちらにもなし。
いろいろ調べてみたところ、どうやら NTFS の拡張属性(EA: Extended Attribute)や、リパースポイント(Reparse Point)を利用しているらしい。
VolFS では EA、DrvFS では Reparse Point を利用しているんだとかなんとか。
しかし、EA や へのアクセスは簡単な方法が見当たらない。
PowerShell ならあるいはと思い、
WSL 上で
ln -s あいうえお aiueo
とかしておいて、PowerShell で以下のようにしてみたが、EA や Reparse Point は取れてない模様。
PS C:\Users\kou\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs\home\kou> dir aiueo | format-list


    ディレクトリ: C:\Users\kou\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs\home\kou



Name                                                                                                                                                                       : aiueo
if ($_ -is [System.IO.DirectoryInfo]) { return '' }
if ($_.Attributes -band [System.IO.FileAttributes]::Offline)
{
    return '({0})' -f $_.Length
}
return $_.Length : 15
CreationTime                                                                                                                                                               : 2018/09/13 14:09:56
LastWriteTime                                                                                                                                                              : 2018/09/13 14:09:56
LastAccessTime                                                                                                                                                             : 2018/09/13 14:09:56
Mode                                                                                                                                                                       : -a----
LinkType                                                                                                                                                                   :
Target                                                                                                                                                                     : {}
VersionInfo                                                                                                                                                                : File:             C:\Users\kou\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs\home\kou\aiueo
                                                                                                                                                                             InternalName:
                                                                                                                                                                             OriginalFilename:
                                                                                                                                                                             FileVersion:
                                                                                                                                                                             FileDescription:
                                                                                                                                                                             Product:
                                                                                                                                                                             ProductVersion:
                                                                                                                                                                             Debug:            False
                                                                                                                                                                             Patched:          False
                                                                                                                                                                             PreRelease:       False
                                                                                                                                                                             PrivateBuild:     False
                                                                                                                                                                             SpecialBuild:     False
                                                                                                                                                                             Language:
PS C:\Users\kou> dir aiueo | format-list


    ディレクトリ: C:\Users\kou



Name                                                                                                                                                                       : aiueo
if ($_ -is [System.IO.DirectoryInfo]) { return '' }
if ($_.Attributes -band [System.IO.FileAttributes]::Offline)
{
    return '({0})' -f $_.Length
}
return $_.Length : 0
CreationTime                                                                                                                                                               : 2018/09/13 15:03:58
LastWriteTime                                                                                                                                                              : 2018/09/13 15:03:58
LastAccessTime                                                                                                                                                             : 2018/09/13 15:03:58
Mode                                                                                                                                                                       : -a---l
LinkType                                                                                                                                                                   :
Target                                                                                                                                                                     : {}
VersionInfo                                                                                                                                                                : File:             C:\Users\kou\aiueo
                                                                                                                                                                             InternalName:
                                                                                                                                                                             OriginalFilename:
                                                                                                                                                                             FileVersion:
                                                                                                                                                                             FileDescription:
                                                                                                                                                                             Product:
                                                                                                                                                                             ProductVersion:
                                                                                                                                                                             Debug:            False
                                                                                                                                                                             Patched:          False
                                                                                                                                                                             PreRelease:       False
                                                                                                                                                                             PrivateBuild:     False
                                                                                                                                                                             SpecialBuild:     False
                                                                                                                                                                             Language:
cmd から見ると DrvFS 上に作ったものは Reparse Point を使っているためか JUNKTION 扱いになっていることまでは確認出来る。
C:\Users\kou\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs\home\kou>dir aiueo
 ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は 6E6F-F4F7 です

 C:\Users\kou\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs\home\kou のディレクトリ

2018/09/13  14:09                15 aiueo
C:\Users\kou>dir aiueo
 ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は 6E6F-F4F7 です

 C:\Users\kou のディレクトリ

2018/09/13  15:03    <JUNCTION>     aiueo [...]
ただし、
C:\Users\kou>mklink /J iroha いろは
iroha <<===>> いろは のジャンクションが作成されました
ってしておくと、
C:\Users\kou>dir
...
2018/09/13  15:13    <JUNCTION>     iroha [C:\Users\kou\いろは]
...
C:\Users\kou>dir iroha
 ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は 6E6F-F4F7 です

 C:\Users\kou\iroha のディレクトリ

ファイルが見つかりません
PS C:\Users\kou> dir


    ディレクトリ: C:\Users\kou


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
...
d----l       2018/09/13     15:13                iroha
-a---l       2018/09/13     15:03              0 aiueo
...
となるし、
explorer.exe から見ると aiueo は通常ファイル iroha はリンクアイコン付きのフォルダに見えるので、
普通に作った JUNKTION とはちょっと違ってる模様。

Windows 10 ネイティブのジャンクションやシンボリックリンクなら良さそうな気がするけど、これはこれで、Cygwin や WSL から作ったり消したりがやり難いというのが悩ましい。

PowerShell から EA 扱えそうなコード見つけたけど、確認は後日かな。

参考:

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Wiki内検索

フリーエリア

管理人/副管理人のみ編集できます