これが致命的に辛い。
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 扱えそうなコード見つけたけど、確認は後日かな。
参考:
- kledgeb / 2016-06-26: WSL その27 - WSLがサポートするファイルシステム(後編)・WSLのファイルシステム
- teratail / 2018-05-17: WSL(Windows Subsystem for Linux)におけるパーミッションの問題
- MSDN Blogs / Windows Subsystem for Linux / 2016-06-15: WSL File System Support
- Symantec / Security Response / 2012-08-15: NTFS の EA に隠された Trojan.Zeroaccess.C
- Microsoft / Hardware Dev Center / ZwQueryEaFile function
- Microsoft / TechNet ライブラリ / Select-Object コマンドレットの使用
- PowerShell Gallery / PSReflect-Functions 1.1 / Examples / Get-ExtendedAttribute.ps1
- Google: Peparse Point NTFS