UbuntuをWindows11上で動かす その6: NASのファイルを利用する

UbuntuをWindows11上で動かす その6: NASのファイルを利用する Ubuntu
スポンサーリンク

前回はWindows Subsystem for Linux (WSL2)上にインストールしたUbuntuにSSHで接続する方法を紹介しました。

今回はこのWSL2のUbuntuからNASのファイルを利用する方法を紹介します。

スポンサーリンク

前提となるネットワーク構成

私が普段作業してる環境ではSynologyのNASをファイルサーバとして動かしています。

NASキット Synology DiskStation DS220jで遊ぶ その1: 購入!
今回は自宅のネットワーク環境を改善するためにSynologyのNAS DiskStation DS220jを購入したことを紹介します。拡張性を考えるとドライブベイが多い方が良いのですが、ディスクの入れ替えで容量拡張もできますし、値段の落ち着いている2ドライブベイの製品を購入するのもありだと思います。

LAN上のWindows PCではこのNASの共有フォルダをネットワークドライブとして割り当て、様々なデータを保存しています。

現状のネットワーク構成

利用しているNASはいくつかのファイル共有プロトコルに対応していますが、WindowsからNAS利用する場合はSMB/CIFSを利用しています。

今回はWindows上にWSL2を用いてUbuntuを導入したので、このUbuntuからNAS上のファイルを見たいというのが私の希望です。

やりたいこと

スポンサーリンク

ファイル共有の方法

ファイル共有の方法としては大きく分けて二つの方法がありそうです。

  1. WSL2がWindows経由でファイルサーバ(Linux)にアクセスする
  2. WSL2からNASにアクセスする

とりあえず試行錯誤してみたいと思います。

Windows経由でファイルサーバにアクセス (drvfs)

WSL2にはWindowsのディスクドライブをマウントする「drvfs」という機能があります。

従って、ファイルサーバの共有フォルダをネットワークドライブに割り当てていれば、drvfsでマウントすることができるはずです。

正確にはネットワークドライブに割り当てなくても、UNCを使ってdrvfsでマウントすることができます。

イメージとしてはこんな感じです。

Windows経由でアクセス

例えば、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以下にファイルサーバの共有フォルダが見えるようになります。

日本語のファイル名などもちゃんと表示されますが、ざっと使ってみたところ次のような制限がありそうです。

  1. ファイル名・ディレクトリ名で大文字・小文字の区別がない
    例えば、test.txtとTest.txtは同じファイルを表すことになります。
  2. ファイル・ディレクトリの実行パーミッションが細かく制御できない
    マウント時の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と直接ファイル共有ができる可能性があります。

network2

いくつかのネットワークファイルシステム(上記の図の「???」に相当する部分)を試してみたいと思います。

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)でアクセスしたときと同様に下記のような制限がありました。

  1. ファイル名・ディレクトリ名で大文字・小文字の区別がない
  2. ファイル・ディレクトリの実行パーミッションが細かく制御できない

このため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)のカーネルをアップデートしたいと思います。

コメント

タイトルとURLをコピーしました