概要
WebDAVを使って、WindowsのエクスプローラーからUSBメモリ内のLinuxのファイルにアクセスする環境を作ります。
なぜWebDAV
Windowsのエクスプローラーで仮想化PCのLinuxのファイルにアクセスしたいときは仮想PC独自の共有フォルダ設定かsambaを使うのが一般的だと思うのですが、Qemuにはフォルダ共有機能が(実質)なく(Linux側でsamba実行するだけっぽい)、設定が凄まじく面倒そうだったのと古いsambaは設定しないとWindows10からアクセスできないのでWebDAVにしてみた。
ftpdは立てるのは簡単だけど(管理者権限なしで)ドライブに割り当てるのは無理そう。これが簡単にできるのならftpのほうがいいんだけど…。
Dockerコンテナ
おそらく需要の関係で公式のコンテナは存在しないようなので、基本的には公式のApache使用httpdコンテナをベースにデフォルト無効のWebDAVを有効にして各種設定を行うDockerfileを作るのがセオリーのようです。
それは面倒なのでbytemark/webdavを使います。2020年8月現在、一番使われているWebDAVコンテナで、必要な項目を環境変数で設定できるように工夫しているようです。
自分でDockerfileを作る場合はこの記事が参考になりそうです。
composeファイル
USBメモリ内のLinuxにサーバーを立てる想定なのでセキュリティガン無視の方向で。
ANONYMOUS_METHODS: ALLですべてのメソッドで認証なし匿名アクセスができるようになります。それでも認証方式をDigestに、かつ適当にでもユーザー名とパスワードを設定しておかないとWindowsからアクセスしてもエラーになるようです。
volumeで[任意のディレクトリ]:/var/lib/dav/dataと設定すると[任意のディレクトリ]がWebDAVでアクセスしたときのルートフォルダになります。
webdav:
image: bytemark/webdav
container_name: webdav
restart: always
ports:
- "80:80"
environment:
AUTH_TYPE: Digest
USERNAME: user
PASSWORD: abcdefgh
ANONYMOUS_METHODS: ALL
volumes:
- /root:/var/lib/dav/data
これをLinuxのどこかのディレクトリにおいてdocker-compose up -d .
するとWebDAVサーバーが起動します。
composeファイルを使わない場合は、
docker run -d -p 80:80 --name webdav --restart=always -e AUTH_TYPE=Digest -e USERNAME=user -e PASSWORD=abcdefg -e ANONYMOUS_METHODS=ALL -v /root:/var/lib/dav/data bytemark/webdav
Windowsからアクセスする
設定に問題なければエクスプローラーのアドレスバーに
\\localhost@80\DavWWWRoot
とするとLinux側のファイルやフォルダが表示されるはずです。
ドライブに割り当てる
SUBSTを使えば管理者権限なしでWebDAVフォルダーを任意のドライブレターに割り当てることができます。
上記のUNCパスではうまくいかないソフトウェアでもドライブレターを割り当てればうまくいくことがあります。
実際、VisualStudioCodeではUNCパスでフォルダを開こうとしても通りません(全く関係ないフォルダを開きます)が、ドライブレターを割り当てればうまくいきます。
エクスプローラーで一度開いている場合はsubstだけでドライブ割り当てできますが、初めて開く場合は一度net useコマンドを使って接続しておく必要があります。net useでドライブを割り当てることもできますが管理者権限が必要です。
net use \\localhost@80\DavWWWRoot
subst Z: \\localhost@80\DavWWWRoot
タイトルバーには切断されたネットワーク ドライブと表示されますが、接続されているようです。
batに記述する場合はwebdavサーバーの起動に時間がかかっているとnet useに失敗するので、成功するまで数十秒~1分間隔で再接続するようにしておいたほうがいいと思います。
:NETUSE
timeout 30 /nobreak
net use \\localhost@80\DavWWWRoot
if %ERRORLEVEL% NEQ 0 goto NETUSE
subst Z: \\localhost@80\DavWWWRoot