Ubuntu 24.04 LTSをWindows 11上で動かす その6 NASのファイルを利用する

Ubuntu
スポンサーリンク

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

今回はこのWSL2のUbuntu 24.04 LTSから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上のファイルを見たいというのが私の希望です。

やりたいこと

スポンサーリンク

ファイル共有の方法

ファイル共有の方法としては大きく分けて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を使えばネットワークドライブに割り当てる必要ありません。

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

Windows経由でアクセス

ただ試してみると、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と直接ファイル共有ができる可能性があります。

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のアップデート方法を紹介したいと思います。

コメント

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