前回はWindows Subsystem for Linux (WSL2)上にインストールしたUbuntuにSSHで接続する方法を紹介しました。
今回はこのWSL2のUbuntuからNASのファイルを利用する方法を紹介します。
以前、WSL1とDebianの組み合わせで試した結果は下記になります。
前提となるネットワーク構成
私が普段作業してる環境ではSynologyのNASをファイルサーバとして動かしています。
LAN上のWindows PCではこのNASの共有フォルダをネットワークドライブとして割り当て、様々なデータを保存しています。
利用しているNASはいくつかのファイル共有プロトコルに対応していますが、WindowsからNAS利用する場合はSMB/CIFSを利用しています。
今回はWindows上にWSL2を用いてUbuntuを導入したので、このUbuntuからNAS上のファイルを見たいというのが私の希望です。
ファイル共有の方法
ファイル共有の方法としては大きく分けて二つの方法がありそうです。
- WSL2がWindows経由でファイルサーバ(Linux)にアクセスする
- WSL2からNASにアクセスする
とりあえず試行錯誤してみたいと思います。
Windows経由でファイルサーバにアクセス (drvfs)
WSL2にはWindowsのディスクドライブをマウントする「drvfs」という機能があります。
従って、ファイルサーバの共有フォルダをネットワークドライブに割り当てていれば、drvfsでマウントすることができるはずです。
正確にはネットワークドライブに割り当てなくても、UNCを使ってdrvfsでマウントすることができます。
イメージとしてはこんな感じです。
例えば、NASの共有フォルダをネットワークドライブとして「z:」に割り当ててあったとします。
この場合は次のようにマウントすればOKです。
$ sudo mkdir -p /mnt/z $ sudo mount -t drvfs -orw,noatime,uid=1000,gid=1000,umask=22,fmask=111 z: /mnt/z
これで/mnt/z以下にファイルサーバの共有フォルダが見えるようになります。
日本語のファイル名などもちゃんと表示されますが、ざっと使ってみたところ次のような制限がありそうです。
- ファイル名・ディレクトリ名で大文字・小文字の区別がない
例えば、test.txtとTest.txtは同じファイルを表すことになります。 - ファイル・ディレクトリの実行パーミッションが細かく制御できない
マウント時のumaskとfmaskで一律に制御することしかできません。読み書きのパーミッションについては問題ありません。
大文字・小文字の区別がない件については、例えばこんな感じにこの小文字ファイル名のファイルを作成しても、大文字を使ったファイル名でアクセスできてしまいます。
$ echo "This is test.txt" > /mnt/z/test.txt $ cat /mnt/z/Test.Txt This is test.txt
この点に注意すれば、この構成で問題なく使えそうです。
NASに直接アクセス
WSL上で動いているといるとはいえLinuxはLinuxです。
Linuxのネットワークファイルシステムといわれる仕組みと使うと、NASと直接ファイル共有ができる可能性があります。
いくつかのネットワークファイルシステム(上記の図の「???」に相当する部分)を試してみたいと思います。
NFS→失敗
Linux間でネットワークでファイルを共有する際の定番なのはNFSです。
WSL2でインストールしたUbuntuでサポートしているファイルシステムを確認したところ、NFSはサポートされていました。
$ cat /proc/filesystems nodev sysfs nodev tmpfs nodev bdev nodev proc nodev cgroup nodev cgroup2 nodev cpuset nodev devtmpfs nodev binfmt_misc nodev debugfs nodev tracefs nodev sockfs nodev bpf nodev pipefs nodev ramfs nodev hugetlbfs nodev rpc_pipefs nodev devpts ext3 ext2 ext4 squashfs vfat msdos iso9660 nodev nfs nodev nfs4 nodev nfsd nodev cifs nodev smb3 nodev autofs fuseblk nodev fuse nodev fusectl nodev virtiofs nodev overlay udf xfs nodev 9p nodev ceph nodev mqueue btrfs
ただし、nfsを利用するためのツール類が入っていないのでインストールしておきます。
$ sudo apt-get install nfs-common
そして必要なツールを起動しておきます。最初にディレクトリを作成しているのはエラーを回避するためです。
$ sudo mkdir -p /run/sendsigs.omit.d/rpcbind $ sudo /etc/init.d/rpcbind start $ sudo /etc/init.d/nfs-common start
あとはNAS側でNFSサーバ機能を有効にしてから、NFSで接続してみました。
$ sudo mkdir /mnt/nfs $ sudo mount -t nfs -o nolock 192.168.10.1:/volume1/share /mnt/nfs/ mount.nfs: access denied by server while mounting 192.168.10.1:/volume1/share
しかし、permission deniedになってしまい、接続できませんでした。
NAS側で詳細なエラーログがとれないため、原因の追及が難しく、今回はここで諦めてしまいました。
NAS側の設定をミスったかもしれません。
SMB/CIFS→可能
NASでWindowsに対してSMB/CIFSでファイルを公開しています。
従って、WSL2のUbuntuがSMB/CIFSクライアントになればファイルサーバとファイルを共有できるはずです。
WSL2のUbuntuのサポートしているファイルシステムにもcifsとsmb3が含まれているので使えるはずです。
まずUbuntu側に必要なツールをインストールしておきます。
$ sudo apt-get install cifs-utils
つづいてcifsを使ってNASの共有フォルダをマウントしてみます。「ユーザ名」の部分は、NASで作成済のユーザ名を設定します。uidとgidに設定するのはWSL(Ubuntu)上のユーザIDとグループIDです。
$ sudo mount -t cifs -o "username=ユーザ名,uid=1000,gid=1000,iocharset=utf8"" //192.168.10.1/share /mnt/cifs/ Password for ユーザ名@//192.168.10.1/share:
パスワードについてはNASで設定したパスワードを入力します。
これでエラーがでなければ無事にマウントできたことになります。
試してみたところ、日本語のファイル名も問題なく取り扱うことができました。ただ、Windows経由(drvfs)でアクセスしたときと同様に下記のような制限がありました。
- ファイル名・ディレクトリ名で大文字・小文字の区別がない
- ファイル・ディレクトリの実行パーミッションが細かく制御できない
このためWindows経由と比べ、あまりメリットが感じられませんでした。
大文字・小文字の区別はうまく設定できればできるような気がしますが、今回調査しきれませんでした。
FTPFS(FTP/FTPS)→可能
SynologyのNASはFTPサーバーと暗号化に対応したFTPSサーバに対応しています。
そこで「ftpfs」というFUSE対応のファイルシステムを利用してマウントしてみます。
まずはUbuntu側に必要なツールをインストールします。
$ sudo apt-get install curlftpfs
つづいてftpfsを使ってマウントしています。FTPを使うと暗号化されていないので、ここではFTPSを使ってみます。
家庭内であれば暗号化していなくても大丈夫かもしれませんが・・・
つづいて、Ubuntuのホームディレクトリに以下の内容の .netrc
を作成します。
machine 192.168.10.1 login ユーザ名 password パスワード
loginとpasswordに記述するユーザ名とパスワードはNAS上に設定してあるものです。
このファイルにはパスワードが書かれているので、パーミッションを600に変更しておきます。
$ chmod 600 .netrc
あとはcurlftpfsコマンドを使ってマウントします。「no_verify_peer」と「no_verify_hostname」を指定しているのは、SynologyのNASで使われているサーバ証明書が自己署名証明書だからです。
$ mkdir -p mnt/ftp $ curlftpfs -o ssl,utf8,no_verify_peer,no_verify_hostname ftp://192.168.10.1/ ~/mnt/ftp/
エラーでなければマウント成功です。
ざっと使ってみたところ、ファイル名の大文字・小文字はちゃんと区別できるようでした。
一方、ファイルのパーミッションは細かく制御できず、全ファイルで一律の設定になり、SMB/CIFSと同様の状態です。
むしろFTPFSを使っていて気になったのは、レスポンスの悪さです。ファイルを作成したときなど、処理が終わるまで一瞬待ちが入ります。
簡単なファイルのやりとりならば問題ありませんが、ファイルアクセスが多い用途だとストレスがあるかもしれません。
sshfs→可能
SynologyのNASはFTP/FTPSサーバーだけでなくSFTPにも対応しています。
このSFTPは名前に「FTP」が入っていますが、FTPとはあまり関係なく、セキュアなリモート接続システムである「SSH」を使ったファイル転送方式です。
そこでsshfsというファイルシステムを使ってNASの共有フォルダをマウントしてみます。
まずはUbuntu側に必要なツールをインストールします。
$ sudo apt-get install sshfs
あとはsshfsコマンドを使ってマウントします。「ユーザ名」の部分にはNASにおけるユーザ名を設定し、「2222」の部分にはNASにおけるSFTPのポート番号を設定します。
$ sshfs ユーザ名@192.168.10.1:/ mnt/sshfs/ -C -p 2222 The authenticity of host '[192.168.10.1]:2222 ([192.168.10.1]:2222)' can't be established. ECDSA key fingerprint is SHA256:abcdefghijklmnopqrstuvwxyz Are you sure you want to continue connecting (yes/no/[fingerprint])?
初回はサーバキーを受け入れるか確認されるので「yes」を入力します。するとパスワードを聞かれるのでNASにおけるパスワードを入力します。
これでエラーが出なければマウント成功です。
こちらも使ってみたところ、ftpfsと同様に、ファイル名の大文字・小文字の区別はOK、ファイルのパーミッションの制御はNGという状況でした。
ただレスポンスはftpfsより明らかにsshfsの方が軽快です。ftpfsよりはsshfsの方が便利と思います。
比較
FUSEが使えることもあって、ネットワークドライブへのアクセス手段もかなり柔軟に選べるようになりました。
ここで気になるのは一体どの方法を使えば良いのかということです。
ここではその参考にデータの読み書き速度の比較してみたいと思います。
実際にはrootになる必要があるかどうか(=FUSEを使った方法はroot権限が不要)など尺度もあると思いますが、WSLではroot権限の利用は制限がないと思いますので、ここでは気にしないことにします。
本来はベンチマークソフトを使うところですが、読み書き速度が遅い方法でアクセスするとベンチマークテストがなかなか終わらないという問題があります。
そこで今回はddコマンドで簡易測定しました。書き込み速度の測定は下記です。
$ dd if=/dev/zero of=./test.dat ibs=1M obs=1M count=256
書き込み速度の測定は下記です。
$ sudo bash -c 'sync ; echo 3 > /proc/sys/vm/drop_caches' $ dd if=./test.dat of=/dev/null ibs=1M obs=1M count=256
今回は3回実行した平均をとってみました。NASへのアクセスはWi-Fiを経由しているのでその影響変動もあると思います。
結果は次の通りです。
Write (MB/s) | Read(MB/s) | |
---|---|---|
drvfs | 34.4 | 35.6 |
cifs | 56.9 | 70.9 |
ftpfs | 24.7 | 54.1 |
sshfs | 40.6 | 35.8 |
sshfs (-C) | 37.7 | 29.2 |
sshfsについてはマウント時に「-C」つけるとデータの圧縮処理が追加されるので、「-Cあり」と「-Cなし」の両方で測定してみました。
結果的に一番パフォーマンスが高そうなのはSMB/CIFSを使って直接マウントする方法でした。
ただ、drvfsのReadについては2回目以降はLinuxのキャッシュ削除しても非常に高速になり、Linuxとは別のところでキャッシュされているようでした。そこで、上記では毎回アンマウントしてから測定を行いました。
このキャッシュの効用と手軽さを考えると、Windowsでネットワークドライブと認識させ、それをdrvfsでマウントするのが一番無難な気がします。
まとめ
今回はWindows Subsystem for Linux (WSL2)からNASの共有フォルダにアクセスする方法を紹介しました。
WSL2ではFUSEが利用できるため様々な方法でNASにアクセスすることができますが、結局Windowsにネットワークドライブとして認識させdrvfsでマウントしてしまうのがお手軽な方法となりそうです。
次回はWSL2(Ubuntu)のカーネルをアップデートしたいと思います。
コメント