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 に書くのは酷いと思う。
参考:
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 に書くのは酷いと思う。
参考:
- ラボラジアン / 2018-07-26: 【WSL】パスのフォーマットを変換する wslpath コマンドの使い方
これが致命的に辛い。
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 上で
explorer.exe から見ると aiueo は通常ファイル iroha はリンクアイコン付きのフォルダに見えるので、
普通に作った JUNKTION とはちょっと違ってる模様。
Windows 10 ネイティブのジャンクションやシンボリックリンクなら良さそうな気がするけど、これはこれで、Cygwin や WSL から作ったり消したりがやり難いというのが悩ましい。
PowerShell から EA 扱えそうなコード見つけたけど、確認は後日かな。
参考:
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
タグ
コメントをかく