前回はWindows Subsystem for Linux (WSL2)上にインストールしたUbuntu 24.04 LTSにSSHで接続する方法を紹介しました。
今回はこのWSL2のUbuntu 24.04 LTSからNASのファイルを利用する方法を紹介します。
以前、WSL1とDebianの組み合わせで試した結果はこちらになります。
前提となるネットワーク構成
私が普段作業している環境ではSynologyのNASをファイルサーバとして動かしています。
LAN上のWindows PCではこのNASの共有フォルダーをネットワークドライブとして割り当て、さまざまなデータを保存しています。
利用しているNASはいくつかのファイル共有プロトコルに対応していますが、WindowsからNASを利用する場合はSMB/CIFSを利用しています。
今回はWindows上にWSL2を用いてUbuntuを導入したので、このUbuntuからNAS上のファイルを見たいというのが私の希望です。
ファイル共有の方法
ファイル共有の方法としては大きく分けて2つの方法がありそうです。
- WSL2がWindows経由でファイルサーバ(Linux)にアクセスする
- WSL2からNASにアクセスする
とりあえず試行錯誤してみたいと思います。
Windows経由でファイルサーバにアクセス (9pfs)
WSL2ではデフォルトでWindowsのディスクドライブをマウントしています。たとえば、Windowsの「Cドライブ」はWSL2では「/mnt/c」としてアクセスできます。
Ubuntuでマウント状況を調べると「9p」というファイルシステムでマウントされていることがわかります。
$ mount | grep "/mnt/c"
C:\ on /mnt/c type 9p (rw,noatime,dirsync,aname=drvfs;path=C:\;uid=1000;gid=1000;symlinkroot=/mnt/,mmap,access=client,msize=65536,trans=fd,rfd=5,wfd=5)
NASをWindowsのネットワークドライブとして割り当てておけば(たとえば「Z:」に割当)、同様にマウントできることが期待できます。
正確にはUNCを使えばネットワークドライブに割り当てる必要ありません。
イメージとしてはこんな感じです。
ただ試してみると、mountコマンドの「-tオプション」に9pを指定してマウントしようとすると、エラーが発生してしまいます。
調べてみると、「drvfs」を使用するとマウントできるようです。
たとえば、NASの共有フォルダーをネットワークドライブとして「z:」に割り当ててあったとします。
この場合は次のようにマウントすればOKです。
sudo mkdir /mnt/z
sudo chown 1000:1000 /mnt/z
sudo chmod 777 /mnt/z
sudo mount -t drvfs -orw,noatime,uid=1000,gid=1000,umask=022,fmask=111 z: /mnt/z
これで/mnt/z以下にNASのの共有フォルダーが見えるようになります。
日本語のファイル名などもちゃんと表示されますが、ざっと使ってみたところ次のような制限がありそうです。
- ファイル名・ディレクトリ名で大文字・小文字の区別がない。
たとえば、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
erofs
nodev mqueue
btrfs
ただし、nfsを利用するためのツール類が入っていないのでインストールしておきます。
sudo apt-get install nfs-common
次に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,file_mode=0644,dir_mode=0775" //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対応のファイルシステムを利用してマウントしてみます。
このためには「curlftpfs」というパッケージが使えるのですが、残念ながらUbuntu 24.04LTSからは除外されています。
ここではUbuntu 25.04(Plucky Puffin)向けのパッケージを流用することにします。
sudo apt-get install libcurl3t64-gnutls libfuse2t64
wget https://launchpad.net/ubuntu/+archive/primary/+files/curlftpfs_0.9.2-10_amd64.deb
sudo dpkg -i curlftpfs_0.9.2-10_amd64.deb
つづいて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,uid=1000,gid=1000 ftp://192.168.10.1/ ~/mnt/ftp/
エラーでなければマウント成功です。
ざっと使ってみたところ、ファイル名の大文字・小文字はちゃんと区別できますし、ファイルのパーミッションも制御できるようでした。
ややレスポンスが悪いように感じるときもありましたが、そこそこ使える印象です。
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 -o uid=1000,gid=1000
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でした。
ただ、大きなファイルを転送しようとするとsshfsよりftpfsのほうが高速のような気がします。
比較
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へのアクセスはEthernet接続となっています。
結果は次の通りです。
Write (MB/s) | Read (MB/s) | |
---|---|---|
p9(drvfs) | 11.7 | 16.0 |
cifs | 111 | 117 |
ftpfs | 31.0 | 48.7 |
sshfs | 67.8 | 70.8 |
sshfs (-C) | 79.9 | 31.5 |
sshfsについてはマウント時に「-C」つけるとデータの圧縮処理が追加されるので、「-Cあり」と「-Cなし」の両方で測定してみました。
結果的に一番パフォーマンスが高そうなのはSMB/CIFSを使って直接マウントする方法でした。
ただ、p9(drvfs)のReadについては2回目以降はLinuxのキャッシュ削除しても非常に高速になり、Linuxとは別のところでキャッシュされているようでした。そこで、上記では毎回アンマウントしてから測定を行いました。
このキャッシュの効用と手軽さを考えると、Windowsでネットワークドライブと認識させ、それをdrvfsでマウントするのが一番無難な気がします。
まとめ
今回はWindows Subsystem for Linux (WSL2)からNASの共有フォルダーにアクセスする方法を紹介しました。
WSL2ではFUSEが利用できるためさまざまな方法でNASにアクセスできますが、結局Windowsにネットワークドライブとして認識させdrvfsでマウントしてしまうのがお手軽な方法となりそうです。
次回はWSL2のアップデート方法を紹介したいと思います。
コメント