どうもみむらです。
時代の流れに沿って(?)最近 NAS を買ってみました。
録画データを置いておいたり、時々使う ISO ファイルの保存場所に使ってみたり DLNA で色んな機器から触れるようになって QoL があがったりと「NAS は良いものだ」なんて感じている今日この頃です。
DataSync Center というソフトを入れると、外部のクラウドサービスとも同期してくれるので、スマホで撮った画像をクラウド経由で NAS に入れて DLNA で触れるようになったり・・等々、とても QoL が上がっております。
ただそんな NAS と DataSync Center なのですが、このソフトが常時 HDD にアクセスに行くために夜中も音がしてしまい、これは精神衛生上よろしくないので静音化を図ることにしてみました。
内容について
紹介する内容を実施した後で不具合が発生しても、私自身は責任を負えないため自己責任でお願い致します。
下記の内容としては稼働中の datacenter のメタデータを tmpfs に配置して解決というものになります。後半に作成物がありますので、お急ぎの方はそちらを参照ください。
1. 原因を追う
1.1. entware のインストールと SSH アクセスの許可
DataSync Center が何にアクセスしているかをトレースするため
entware のインストールと、SSH アクセスの許可を行います。
以上の手順を踏むと “/opt/bin/opkg” から entware のパッケージマネージャが使えるようになります。
1.2. strace で挙動を見る
sudo su 等で root に登った後、下記のコマンドでインストールします。
なお opkg のパッケージは基本的に /opt 以下で触れるように配置されます。
またそれらのデータ群は /usr/local/AppCentral/entware-ng/opt/ 以下にシンボリックリンクが張られるようになるため、App Central から entware を削除すると、同時に opkg で入れたファイル群も削除されるようです。
# /opt/bin/opkg update
Downloading http://bin.entware.net/armv7sf-k2.6/Packages.gz
Updated list of available packages in /opt/var/opkg-lists/entware
# /opt/bin/opkg install strace
Installing strace (5.10-1) to root...
Downloading http://bin.entware.net/armv7sf-k2.6/strace_5.10-1_armv7-2.6.ipk
Configuring strace.
次に ps コマンドでプロセスを探します
# ps | grep datasync
3442 root 0:00 grep datasync
5145 ***** 1295:0 /usr/local/AppCentral/datasync-center/bin/datasync_center 1
上記の例では PID は 5145 になっていることが分かります。
では strace でアタッチして挙動を観察しましょう。
# /opt/bin/strace -p (PID)
(上記例の場合は /opt/bin/strace -p 5145 と入力する)
gettimeofday({tv_sec=1619546282, tv_usec=544859}, NULL) = 0
gettimeofday({tv_sec=1619546282, tv_usec=544976}, NULL) = 0
gettimeofday({tv_sec=1619546282, tv_usec=545057}, NULL) = 0
stat64("/usr/builtin/etc/ldapclient/asldapclient.conf", 0xbead4188) = -1 EACCES (Permission denied)
stat64("/etc/passwd", {st_mode=S_IFREG|0644, st_size=461, ...}) = 0
open("/etc/passwd", O_RDONLY|O_LARGEFILE) = 12
read(12, "root:x:0:0:,0,,root:/root:/bin/s"..., 461) = 461
close(12) = 0
stat64("/etc/passwd", {st_mode=S_IFREG|0644, st_size=461, ...}) = 0
open("/etc/passwd", O_RDONLY|O_LARGEFILE) = 12
read(12, "root:x:0:0:,0,,root:/root:/bin/s"..., 461) = 461
close(12) = 0
stat64("/etc/passwd", {st_mode=S_IFREG|0644, st_size=461, ...}) = 0
open("/etc/passwd", O_RDONLY|O_LARGEFILE) = 12
read(12, "root:x:0:0:,0,,root:/root:/bin/s"..., 461) = 461
close(12) = 0
stat64("/etc/nas.conf", {st_mode=S_IFREG|0644, st_size=3257, ...}) = 0
open("/etc/nas.conf", O_RDONLY|O_LARGEFILE) = 12
read(12, "[Basic]\nModel = AS1002T\nVersion "..., 3257) = 3257
close(12) = 0
lstat64("/share", {st_mode=S_IFDIR|0755, st_size=1024, ...}) = 0
lstat64("/share/home", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
lstat64("/share/home/*******", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
open("/share/home/*******/.datasync-center/connections/1/user_info.json.lock", O_RDWR|O_CREAT|O_LARGEFILE|O_CLOEXEC, 0777) = 12
flock(12, LOCK_EX) = 0
open("/share/home/*******/.datasync-center/connections/1/user_info.json_5145.tmp", O_WRONLY|O_CREAT|O_TRUNC, 0644) = 15
write(15, "{\"quota\":1131723882496,\"normal\":"..., 109) = 109
close(15) = 0
rename("/share/home/*******/.datasync-center/connections/1/user_info.json_5145.tmp", "/share/home/*******/.datasync-center/connections/1/user_info.json") = 0
open("/etc/passwd", O_RDONLY|O_CLOEXEC) = 15
_llseek(15, 0, [0], SEEK_CUR) = 0
fstat64(15, {st_mode=S_IFREG|0644, st_size=461, ...}) = 0
mmap2(NULL, 461, PROT_READ, MAP_SHARED, 15, 0) = 0xb6faa000
_llseek(15, 461, [461], SEEK_SET) = 0
munmap(0xb6faa000, 461) = 0
close(15) = 0
geteuid32() = 1000
chmod("/share/home/*******/.datasync-center/connections/1/user_info.json", 0700) = 0
flock(12, LOCK_UN) = 0
close(12) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigaction(SIGCHLD, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
nanosleep({tv_sec=1, tv_nsec=0},
定期的な read は良いとしても 「user_info.json_5145.tmp という名前でファイルを書いて、 user_info.json を消して、user_info.json に置換する」というのを定期的に行われるのは、やはりあんまり心臓にもよろしくないですね。。
ということで、これらを tmpfs に配置するようにしてみます。
(ディスクの書き込み先を RAM 上に作成したドライブに変更して、ディスクへの書き込みを行わせない)
2. データを tmpfs に配置するようにする。
2.1. 現在のデータをコピーして取っておく
方針としては、起動時・シャットダウン時にメタデータをコピーしておき
稼働中は tmpfs に対してずっと書かせるようにしてみます。
/share/home/(USERNAME)/.datasync-center/connections 以下のデータがずっと読み書きされていますので、connections 以下を tmpfs にするように丸っとコピーを取ります。
# /volume1/.@plugins/etc/init.d/K50datasync-center start
(DataSync Center を停止する)
# cd /share/home/(USERNAME)/.datasync-center/
( ユーザ名が hogeo であれば cd /share/home/hogeo/.datasync-center/ になる.)
# ln -ln
(UID,GID を調べておく. 下記の例では UID=1000, GID=100)
drwxrwxrwt 3 1000 100 60 Apr 23 11:55 connections
# cp -R connections original_connections
(コピーを取る)
# cd original_connections
# find -name "*lock" | xargs rm
# find -name "pid" | xargs rm
# find -name "sock" | xargs rm
(最後3つは誤作動の原因になりそうなものの削除です)
2.2. 起動時・シャットダウン時の挙動をサービスとして記述する
下記のサイトを参考にすると “/volume1/.@plugins/etc/init.d/ ” あたりにスクリプトを配置すると幸せになれそうですので、ここにスクリプトを記述していきます。
Digging in to the Linux install on a NAS
https://ljones.dev/blog/digging-into-nas/
基本的には下記2つのスクリプトを作成するだけです。
/volume1/.@plugins/etc/init.d/S01prepare-datasync-center
このスクリプトでは既存の connections ディレクトリを削除して tmpfs (かつ UID, GID はユーザに合わせる) をそこにマウントさせた後、コピーしておいたものを書き戻す処理になります。
下記スクリプトを利用される際は (USERNAME) 部分および (UID) 部分をご自身の環境に合わせて書き換えてください。
#!/bin/sh -e
rm -rf /share/home/(USERNAME)/.datasync-center/connections
mkdir /share/home/(USERNAME)/.datasync-center/connections
mount tmpfs -t tmpfs /share/home/(USERNAME)/.datasync-center/connections -o uid=(UID),gid=100
cp -R /share/home/(USERNAME)/.datasync-center/original_connections/* /share/home/(USERNAME)/.datasync-center/connections/
chown -R (UID):100 /share/home/(USERNAME)/.datasync-center/connections/
/volume1/.@plugins/etc/init.d/K99store-datasync-center
このスクリプトでは既存の connections ディレクトリの中身を待避させ、かつ誤作動の原因になりそうなものを削除する内容になります。
上記同様、下記スクリプトを利用される際は (USERNAME) 部分および (UID) 部分をご自身の環境に合わせて書き換えてください。
#!/bin/sh -e
cp -R /share/home/(USERNAME)/.datasync-center/connections/* /share/home/(USERNAME)/.datasync-center/original_connections/
find /share/home/(USERNAME)/.datasync-center/original_connections/ -name "*lock" | xargs rm
find /share/home/(USERNAME)/.datasync-center/original_connections/ -name "pid" | xargs rm
find /share/home/(USERNAME)/.datasync-center/original_connections/ -name "sock" | xargs rm
上記二つのスクリプトを書き上げた後は chmod で実行権限を与えることを忘れずに。
# vi /volume1/.@plugins/etc/init.d/S01prepare-datasync-center
( スクリプトを書く。書き上がったら :wq で抜ける )
# vi /volume1/.@plugins/etc/init.d/K99store-datasync-center
( スクリプトを書く。書き上がったら :wq で抜ける )
# chmod 755 /volume1/.@plugins/etc/init.d/S01prepare-datasync-center
# chmod 755 /volume1/.@plugins/etc/init.d/K99store-datasync-center
2.3. NAS を再起動して動作することを確認する
再起動後に root で mount コマンドを実行して tmpfs がマウントされていることを確認します。
# mount
rootfs on / type rootfs (rw)
proc on /proc type proc (rw,relatime)
sysfs on /sys type sysfs (rw,relatime)
devpts on /dev/pts type devpts (rw,relatime,gid=5,mode=620,ptmxmode=000)
tmpfs on /tmp type tmpfs (rw,relatime)
/dev/md0 on /volume0 type ext4 (rw,relatime,data=ordered)
/dev/loop0 on /share type ext4 (rw,relatime)
/dev/md1 on /volume1 type ext4 (rw,relatime,data=ordered,jqfmt=vfsv1,usrjquota=aquota.user,grpjquota=aquota.group)
/dev/md1 on /share/home type ext4 (rw,relatime,data=ordered,jqfmt=vfsv1,usrjquota=aquota.user,grpjquota=aquota.group)
/dev/md1 on /share/Web type ext4 (rw,relatime,data=ordered,jqfmt=vfsv1,usrjquota=aquota.user,grpjquota=aquota.group)
/dev/md1 on /share/Music type ext4 (rw,relatime,data=ordered,jqfmt=vfsv1,usrjquota=aquota.user,grpjquota=aquota.group)
/dev/md1 on /share/Photos type ext4 (rw,relatime,data=ordered,jqfmt=vfsv1,usrjquota=aquota.user,grpjquota=aquota.group)
/dev/md1 on /share/Pictures type ext4 (rw,relatime,data=ordered,jqfmt=vfsv1,usrjquota=aquota.user,grpjquota=aquota.group)
/dev/md1 on /share/Movie type ext4 (rw,relatime,data=ordered,jqfmt=vfsv1,usrjquota=aquota.user,grpjquota=aquota.group)
/dev/md1 on /share/MSDN type ext4 (rw,relatime,data=ordered,jqfmt=vfsv1,usrjquota=aquota.user,grpjquota=aquota.group)
/dev/md1 on /share/Media type ext4 (rw,relatime,data=ordered,jqfmt=vfsv1,usrjquota=aquota.user,grpjquota=aquota.group)
tmpfs on /share/home/******/.datasync-center/connections type tmpfs (rw,relatime,uid=****,gid=100)
また DataSync Center を開き、正常に動作していることを併せて確認します。
3. 後片付け
App Central から entware-ng の削除 (インストールした場合) と、
SSH の無効化を忘れずに行っておきましょう。
ということで・・。
ここまで完了すると、HDD への DataSync Center による常時アクセスが無くなるため、 “Disk Hibernation” の設定に従って、未使用時間は眠ってくれるようになります。
快適な睡眠も得られて、めでたしめでたし・・です!
(書いてる時間的に寝られているのか、というのは一端脇に置いておきましょう)
素敵な NAS ライフをー!