このページの本文へ

Windows Info第114回

RS4におけるWindows Subsystem for Linuxの改良点 drvfsのメタデータ対応

2018年01月28日 10時00分更新

文● 塩田紳二 編集● ASCII編集部

  • この記事をはてなブックマークに追加
  • 本文印刷

 次期Windows 10となる予定のRS4(Ver.1803が想定されている)では、Windows Subsystem for Linux(以下、WSL)からWindows側のファイルをアクセスするためのdrvfsが改良される。この改良では、ファイルの所有者やパーミッションが設定可能になる。というのも、現在のRS3では、devfs側ではファイルの所有者やパーミッションの設定がまったくできなかったのだ。

 ただしこの改良では、Linux側とWindows側で矛盾なく動作させる必要性から、Windows側のアクセス許可が優先される。たとえばWindows側で書き込み不可としたファイルにWSL側から書き込むことはできない。一方で、パーミッションを制御するchmodコマンドでは、書き込み属性を設定することができ、lsコマンドも書き込み属性があるように表示する。また、ファイルやディレクトリの所有者も変更が可能になるが、こちらもWindows側のファイル所有者を変更しない。しかしWSL側では変更が有効になり、所有者やグループが変更されたように見える。

 具体的にどんな改良なのかを見ていくことにしよう。

RS4におけるパーミッション

 RS3までのdrvfsでは、所有者のユーザーID、グループIDは、rootであり、パーミッションは「rwxrwxrwx」(所有者、グループ、その他のユーザーがすべて読み書き可能で実行可能)となっていた。chmodやchownといったパーミッションや所有者を変更するコマンドはエラーにならなかったが、変更はまったくできなかった。

RS3では、drvfsでのパーミッション変更や所有者変更コマンドはエラーにならないものの効果がなかった

 また、実際のファイルやディレクトリに対するアクセス許可はWindows側のアクセス許可に従っていて、Windows側でリードオンリーとしたファイルに書き込むことはできず、実行時にエラーとなった。

 これに対してRS4のWSLでは、drvfsに対してパーミッションや所有者の変更が有効になった。chmodやchownコマンドを実行すると、ls -lコマンドの結果に変更が反映される。

RS4では、drvfsでもパーミッションや所有者の変更コマンドが有効になる。Build17074では再マウントしてmetadataを有効にする必要がある

 もっとも、実際のファイルやディレクトリに対する操作は、Windows側のアクセス許可に従って判断され、RS3同様にWindows側で書き込み禁止したファイルにWSL側で書き込むことはできない。

 しかしWSL側からは、ファイルやディレクトリに対する変更が反映されたように見えるため、ソフトウェアの互換性という問題をある程度クリアできる。一部のLinuxソフトウェアは、セキュリティ上の理由などにより、自身が扱うファイルやディレクトリのパーミッションや所有者などをチェックしている。

 たとえばsshdは、認証鍵ファイルが保存されているディレクトリのパーミッションが特定の状態ないとエラーになる。これは、重要な情報に他のユーザーがアクセスできないようにしないとセキュリティ上の問題になるからだ。

 このパーミッションや所有者の設定は、Windowsのファイルとは別の場所に記憶されるようだ。WSLを再起動しても、前回設定した状態が復元される。この記録は、WSL側で設定したもののみで、WSL側でなにも設定していないファイルやディレクトリに関しては、デフォルト値が使われる。

 RS4では、ファイルの所有者のデフォルト値は、Linuxディストリビューションのインストール時に設定したユーザーとなっている(WSLコマンドなどでログイン状態となるユーザーアカウント)。また標準では、このユーザーには、1000というユーザーID、グループID番号が割り当てられている。

Linuxにおけるファイルパーミッション

 Windows Insider Preview Build 17074では、WSLを起動したときのdrvfsは、metadataを扱うようになっていないため、ユーザーがオプションを指定してdevfsを再マウントする必要がある。

 このオプションなどを説明するには、Linuxのパーミッションなどについてある程度の知識が必要になる。ここでは、最低限の説明としてchmod、chownコマンドを中心にパーミッションについて説明しておく。

 Linuxのファイルやディレクトリに対するパーミッション(Windowsでいうアクセス許可)は、「読み込み」「書き込み」「実行」の3つを個別に可、不可と設定するもの。ただし実行はファイルに対するもので、対象がディレクトリの場合には、ディレクトリ内部を見せるかどうかの許可になる。この許可は、3ビットで表現できるため、0~7までの数字を対応させて表現することもある)。

 また、すべてのファイルは所有者がいて、登録されたユーザーの誰か(システムアカウントもある)になる。また、すべてのユーザーはグループに属している。前記のパーミッションは、「所有者」に対するもの、同じ「グループ」に属する他のユーザー、それ以外のユーザーの3種類ある。このため、前記のパーミッションを表現する0~7までの数字をそれぞれのユーザー別に3桁とした数値で表現できる。

 この仕組みはUnix由来のもので、ファイルやディレクトリのパーミッションを操作するchmodコマンドもUnix由来の仕様がそのままLinuxでも使われている(プログラムが同じという意味ではない)。

 このchmodにはファイルやディレクトリのパーミッションを設定するのに「数値モード」と「シンボリックモード」の2つがある。前者は、パーミッションを意味するビットを4桁の8進数として表現する。

 先頭の1桁(最上位桁)は属性でファイル実行時の特殊なモードなどを表す。

 後者は、許可するパーミッションをrwxなどの文字と+(許可)、-(不許可)などの文字で表現する(詳細はmanなどでchmodを調べてほしい)。

 もう1つ、数値モードで使われるパーミッションに対して、「mask」という概念がある。これは、指定されたパーミッションを2進数に見立て、同じく2進数のマスクパターンと、現在のパーミッションを組みあわせて論理演算をし、最終的なパーミッション値を計算するもの。マスクパターンでは、変更させたくないビットを1にして指定をする。

 たとえば、ファイルに対して、所有者は読み書き実行を許可し、グループに対して読み込みと実行のみ、それ以外のユーザーには何も許可しないという場合には、「0750」という数字を使う。なお、先頭行のゼロは省略可能なので、これを「750」と表記することが多い。

 また、所有者はすべてのパーミッションが設定可能で、グループメンバーやその他のユーザーには、書き込みを禁止させたい場合、mask値として「022」(22)を利用する。

 chownコマンドは、ファイルに設定されている所有者のユーザーidやグループid(ユーザーは複数のグループに属することができるがファイルに指定できるグループidは1つだけ)を変更するためのコマンドだ。詳しくはmanコマンドをみてほしいが、以下の書式で所有者を変更する。

chown ユーザー:グループ 対象ファイルやディレクトリ

 なお、ユーザーやグループの指定には、ユーザー名(rootなどの文字表現)やグループ名とユーザーID番号、グループID番号も指定できる。ユーザー名とユーザーID番号の対応は/etc/passwdというファイルに、グループ名とグループID番号との対応は/etc/groupファイルに記載されている。

RS4におけるdrvfsマウントオプション

 RS4からは、drvfsをシステムにマウントする場合のオプションが追加され、メタデータ利用の可否、デフォルトのユーザーidやグループid、デフォルトのパーミッションマスクなどが指定できる。これにより、WSL側からパーミッションの指定がまったくされていないファイルやディレクトリはデフォルトのパーミッションと許可マスクを持つことができる。

 ただし、Build 17074では、WSLを起動したときには、cドライブなどは、メタデータなしでユーザーIDとグループIDは1000(Linuxディストリビューションインストール時に登録したユーザーアカウントのユーザーID番号)となっている。

 このため、メタデータを利用する場合には、一回umountコマンドでCドライブに対応するdrvfsをアンマウントしてから、再度mountコマンドでオプションを指定してマウントしなおす必要がある。

metadataをdevfsで有効にするには、マウントコマンドにオプションを指定する。そのためには一回umountコマンドでアンマウントする必要がある

 このときには、drvfs固有のマウントオプションとし以下の表のようなものがある。

 また、mountコマンドでdrvfsをマウントするときには、

mount -t drvfs C: /mnt/c -o metadata,uid=1000,……

などととして指定をし、マウントを解除(アンマウント)する場合には、

umount /mnt/c

とする。

 drvfsは、WSLでLinuxが起動するときに自動的にマウントされるが、まだmetadataを反映する形ではマウントされていない。おそらく、最終版では、オプションにmetadataが指定された形でLinuxディストリビューションが起動することになると思われる。

 というのも、WSLで自動的にマウントされるdrvfsなどについては/etc/fstabに記述がなく、また、前回説明したようにrcスクリプトも動作していないため、initプロセスの中でマウント処理が行われているのだと考えられる。早晩プレビュービルドでマウントオプションが変わると思われるが、init側に手がつけられていないのは、そもそも現在のdrvfs固有のマウントオプション(その多くはfatファイルシステム固有のmountオプションだったもの)は最終仕様ではなく、今後変化する可能性があるからと推測される。

カテゴリートップへ

この連載の記事

注目ニュース

ASCII倶楽部

最新記事

QDレーザー販促企画バナー

プレミアムPC試用レポート

ピックアップ

ASCII.jp RSS2.0 配信中

ASCII.jpメール デジタルMac/iPodマガジン