ラズパイでファイルサーバー構築2

前の続き
NFSサーバーのインストールと動作までできたけど、まだ問題があったのでメモ

問題その1 書き込めない

まずその前に前回のコマンドラインでの接続だとエクスプローラーで見れなかったので、
エクスプローラー開いて左PCを選択してメニューに出てくるネットワークドライブの割り当てでエクスプローラーに表示されるように。

んで試しにファイルをドラッグ&ドロップでなんかエラーが出て書き込めない。
新規作成でフォルダを作ってみる。
これはできた。

よくわからないのでサーバーの方を確認。
nfs rpc fragment too large ~ ってなのが流れてきてる。
ググってみると書き込みのサイズが大きすぎるっぽい。んで調べた結果windows側でnfsadminなるコマンドで設定を変えれるみたい
以下で現在の設定を確認

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
> nfsadmin client config

localhost の設定

プロトコル : TCP+UDP
マウントの種類 : ソフト
大文字小文字を区別する : いいえ
再試行回数 : 1
タイムアウト : 8 秒
読み取りバッファー サイズ : 1024 KiloBytes
書き込みバッファー サイズ : 1024 KiloBytes
予約ポートを使用する : はい
セキュリティの種類 : sys,krb5,krb5i,krb5p

ファイルの設定
ユーザー : rwx
グループ : r-x
その他 : r-x

1024KBらしいとりあえず半分にしてみる.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#書き込み
> nfsadmin client config wsize=512
設定が正常に更新されました。
#読み込み
> nfsadmin client config rsize=512
設定が正常に更新されました。
#確認
> nfsadmin client config

localhost の設定

プロトコル : TCP+UDP
マウントの種類 : ソフト
大文字小文字を区別する : いいえ
再試行回数 : 1
タイムアウト : 8 秒
読み取りバッファー サイズ : 512 KiloBytes
書き込みバッファー サイズ : 512 KiloBytes
予約ポートを使用する : はい
セキュリティの種類 : sys,krb5,krb5i,krb5p

ファイルの設定
ユーザー : rwx
グループ : r-x
その他 : r-x

これで書き込みができるようになりました。
GUIでもWindows管理ツールにNFSの設定できるのがあったんでだけど変更できるのはプロトコルとか再試行回数とかで、
書き込み、読み込みサイズはCUIからしかできないみたい。

問題2 文字化け

よしできたってことmusicフォルダをドラック&ドロップでぶち込んで、Volumoの方でも一度初期化してネットワークドライブの設定して音楽ファイルのスキャンを実行。
なんだけどなぜか一部の曲しか認識されない、エクスプローラーで確認してもちゃんと全部書き込まれてるし、再生もできる。
なんでじゃ???って思ってたんだけどサーバ側でファイル見たら一発解決ファイル名がめっちゃ文字化けしてる!!!
文字コードはWindowsはShft-JISでLinuxはUTF8なんでそりゃそうだですよねー。
ってとでファイル名の文字コード変換コマンドで変換。

1
2
# cd /mnt/hdd1/music
# convmv -r -f shift_jis -t utf * --notest

再度Volummioでスキャンしてみると全曲認識された。
で解決したとおもいきや、今度はWindows側で文字化け。
ですよねーってことでどうするか?

Linuxはmountコマンドのオプションで文字コード指定とかできるみたいだけど、Windowsはできないらしい。
クライアント側でどうにかできないならサーバー側でどうにかするしかないってことで調べるとfuse-convmvfsなるものが使えそう。

https://ja.osdn.net/projects/sfnet_fuse-convmvfs/
これは 1 つの文字セットから別にファイル名を変換するファイルシステムです。それはヒューズ (ユーザランドファイルシステム) を使用して実装されます。

これでsjisでマウントしたものをWindowsようにエクスポートすればいい。
ここでまた問題CentOSはこれのパッケージがない。。。
自分でビルドしなきゃなんだけどサーバー運用するマシンにビルド環境いれるのはなんか気持ち悪い。
なのでrpm作ってインストールしよう。

別のSDカードにもっかいCentOS焼いてラズパイにさしてそっちで作業。
http://rpmfind.net/linux/RPM/fedora/devel/rawhide/x86_64/f/fuse-convmvfs-0.2.6-16.fc28.x86_64.html
幸いfedora向けのrpmパッケージはあるみたいののでfuse-convmvfs-0.2.6-16.fc28.src.rpmをもらってくる。

1
# curl -O -L https://download.fedoraproject.org/pub/fedora/linux/development/rawhide/Everything/source/tree/Packages/f/fuse-convmvfs-0.2.6-16.fc28.src.rpm

展開

1
2
3
4
5
6
7
8
# rpm -ivh fuse-convmvfs-0.2.6-16.fc28.src.rpm
warning: fuse-convmvfs-0.2.6-16.fc28.src.rpm: Header V3 RSA/SHA256 Signature, key ID 429476b4: NOKEY
Updating / installing...
1:fuse-convmvfs-0.2.6-16.fc28 ################################# [100%]
warning: user mockbuild does not exist - using root
warning: group mockbuild does not exist - using root
warning: user mockbuild does not exist - using root
warning: group mockbuild does not exist - using root

ビルドに必要なパッケージのインストール

1
# yum install gcc gcc-c++ make fuse-devel libattr-devel rpm-build

ビルド

1
2
3
4
5
6
7
8
9
10
11
12
# cd ~/rpmbuild
# rpmbuild -bb SPECS/fuse-convmvfs.spec
...
...
...
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd fuse-convmvfs-0.2.6
+ rm -rf /root/rpmbuild/BUILDROOT/fuse-convmvfs-0.2.6-16.el7.centos.armv7hl
+ exit 0
# ls RPMS/armv7hl/
fuse-convmvfs-0.2.6-16.el7.centos.armv7hl.rpm fuse-convmvfs-debuginfo-0.2.6-16.el7.centos.armv7hl.rpm

fuse-convmvfs-0.2.6-16.el7.centos.armv7hl.rpm
こっちをいったん別マシンに引き上げて、またNFSサーバをインストールしたSDカードにいれかえて持ってきます。

インストール

1
2
3
# yum localinstall fuse-convmvfs-0.2.6-16.el7.centos.armv7hl.rpm
# ls /bin | grep convmvfs
convmvfs

/binの下にインストールされました~。

使ってみる。

1
2
# mkdir /mnt/hdd1_sjis
# convmvfs -o ocharset=cp932,srcdir=/mnt/hdd1 /mnt/hdd1_sjis

これだと一回こっきりなので/etc/fstabに追記で自動マウントするように

1
2
3
4
5
UUID=29b74cbb-382b-49ea-91c8-f1dcb9cae36c  / ext4    defaults,noatime 0 0
UUID=FE5A-B773 /boot vfat defaults,noatime 0 0
UUID=b0c2039d-218d-47ba-9c9f-dffb7df77228 swap swap defaults,noatime 0 0
UUID=cefbb8c2-ae53-4223-b6c2-77d386a70cca /mnt/hdd1 ext4 defaults,noatime,nofail 0 0
convmvfs /mnt/hdd1_sjis fuse ocharset=cp932,srcdir=/mnt/hdd1 0 0

/etc/exportsに追記

1
2
/mnt/hdd1 192.168.0.0/24(rw)
/mnt/hdd1_sjis 192.168.0.0/24(rw,fsid=1)

エクスポートもとがfuseだとfsidの指定が必要らしい。

これでようやく目的の環境が完成。