QNAPのHDDアクセスが止まらないので他の方法を試してみた・・・今度こそ原因を見つけて対処した!


QNAPのHDDアクセスが止まらないのを直してみた話!

QNAPのNAS(TS-251D)がずーーーーーーっとHDDアクセスを行っていたので少し前に対処をしました。
多少良くなったものの・・・結局ガリガリガリガリガリガリうるさいです。


前回試したことは以下のページに載っています。



前回効果があったのはDropboxのLAN同期を停止したことでした。
しかし少し経つと、またガリガリガリガリガリガリうるさくなってきました。


原因はよく分からないのですが、NASを再起動して少しの間は静かなのです。
HDDアクセスランプもアクセスせずに落ち着いています。
しかし、少し経つとうるさくなります。



ここでふと思いつきました。
Macのバックアップ「Time Machine



Time MachineのデータをNASに保存するように設定しています。
Time Machineは自動バックアップにしていると概ね1時間おきに動作します。
バックアップをしている間にHDDへアクセスをするのは当然です。
しかし、バックアップが完了してもHDDアクセスが止まりません。

ずーーーーーーっと何かをしているようです。

NASの管理画面のダッシュボードを見ても、「オンラインユーザー」のところにTime Machineのユーザーがいつまでもいます。


試しにこのTime Machineのユーザーの接続を切ってみました。

HDDアクセスが止まりました。

Time Machineを動作させると、Time Machineのユーザーが表示され続けHDDアクセスを行っています。
もう一度Time Machineのユーザーの接続を切ってみました。

HDDアクセスが止まります。

原因はこれですね・・・


バックアップが終わった後にベリファイのようなことをしているのかもしれませんが、いつまでも終わらないベリファイもどうかと思います。
なので、バックアップ後にTime Machineのユーザーを切断することにします・・・が、どうやって実装するか・・・


NASから見ると、いつバックアップが終わったのかはわかりません。
適当に切断するわけにもいかないので、端末側からどうするかを考えます。
Time Machineの設定項目を見ても、これ以上何かすることは難しそうです。


ググってみると、ターミナルからTime Machineを動かすことができるようです。
バックアップを開始すると、NASのディレクトリをマウントしてバックアップを実行するので、終わったらアンマウントすれば接続を切ることができそうです。
もう少しググってみると、マウント→実行→アンマウントをするスクリプトを書いている人を見つけました。



おぉぉぉぉと思い、試しに実行してみたのですが・・・動きませんでした。
このスクリプトは、普段繋がっている外付けHDDのようなものにマウント、その後バックアップを実行してアンマウントする動きのようです。
今回はNASなので、ネットワーク越しのHDDに対し実行しないといけません。

そこで、このスクリプトをカスタマイズさせて頂くことにしました。
カスタマイズポイントは以下の通りです。

  • Time Machineを実行すると勝手にマウントされるのでマウント部分は削除
  • 実行後であれば、コマンドでマウントポイントを見つけることができるのでそのマウントポイントを取得
  • マウントを解除

こんな感じの流れで実装してみました。
通常のアンマウントでは解除できなかったので、強制的にアンマウントすることにしました。


#!/usr/bin/env zsh -f
# Purpose: 	Once you set the DEVICE,
#			this script will mount your Time Machine drive,
#			run Time Machine,
#			and then unmount the drive
#
# From:	Timothy J. Luoma
# Mail:	luomat at gmail dot com
# Date:	2020-04-20
# Customized by UG at 2021-07-10
#			this script will run Time Machine,
#			and then unmount the drive
################################################################################################

NAME="$0:t:r"

if [[ -e "$HOME/.path" ]]
then
	source "$HOME/.path"
else
	PATH="$HOME/scripts:/usr/local/bin:/usr/bin:/usr/sbin:/sbin:/bin"
fi

zmodload zsh/datetime

TIME=$(strftime "%Y-%m-%d--%H.%M.%S" "$EPOCHSECONDS")

function timestamp { strftime "%Y-%m-%d--%H.%M.%S" "$EPOCHSECONDS" }

STATUS=$(tmutil currentphase)

if [[ "$STATUS" != "BackupNotRunning" ]]
then
	echo "$NAME: Time Machine status is '$STATUS'. Should be 'BackupNotRunning'." >>/dev/stderr
	exit 0
fi

ID=$(tmutil destinationinfo | egrep '^ID  ' | sed 's#^ID  *: ##g' | head -1)

echo "$NAME: Starting backup at `timestamp`"

# `caffeinate -i` is optional but keeps your Mac from sleeping
caffeinate -i tmutil startbackup --block --destination "$ID"

EXIT="$?"

if [[ "$EXIT" == "0" ]]
then
	echo "$NAME: Finished successfully at `timestamp`."

else

	echo "$NAME: Finished UN-successfully (Exit = $EXIT) at `timestamp`."

fi

MNTPNT=$(tmutil destinationinfo | egrep '^Mount Point  ' | sed 's#^Mount Point  *: ##g' | head -1)

sleep 10

# this will try to unmount the drive as long as it is mounted

diskutil unmount force "$MNTPNT"

exit 0
#EOF

それでは、実際にTime Machineの設定をします。
※plist部分の「アカウント」のところはご自身のユーザー名に置き換えてください。


  1. システム環境設定のTime Machineで自動バックアップのチェックは外す(ディスクの設定等をしていない場合はここで実施)
  2. ↑のスクリプトをコピーして、「/usr/local/bin/ug-timemachine-run-unmount.sh」(好きな名前でOK)に保存
  3. ターミナルから「chmod 755 /usr/local/bin/ug-timemachine-run-unmount.sh」を実行
  4. ↓の自動実行用のplistを作成し、「/Users/アカウント/Library/LaunchAgents/scheduled-timemachine.plist」(好きな名前でOK)に保存
  5. ターミナルから「launchctl load "/Users/アカウント/Library/LaunchAgents/scheduled-timemachine.plist"」を実行




  
    Label
    net.ug.scheduled-timemachine
    ProgramArguments
    
      /usr/local/bin/ug-timemachine-run-unmount.sh
    
    StandardOutPath
    /Users/アカウント/.Trash/scheduled-timemachine.log
    StandardErrorPath
    /Users/アカウント/.Trash/scheduled-timemachine-err.log
    StartCalendarInterval
    
      Hour
      3
      Minute
      00
    
  


実行ログやエラーログは、普段は不要なのでゴミ箱に入れています。
必要な場合は、StandardOutPathとStandardErrorPathを変更してください。


最初は近くの時間に設定して動作確認し、問題無ければ本来実施したい時間へ設定しなおしてください。
plistを修正した場合は、unloadしてから再度loadしてください。


launchctl unload "/Users/アカウント/Library/LaunchAgents/scheduled-timemachine.plist"
launchctl load "/Users/アカウント/Library/LaunchAgents/scheduled-timemachine.plist"

毎時間のバックアップは不要なので1日1回3時に実行するようにしました。
何時間おきに実行したい場合など時間設定は、このページを参考にしてください。
スリープ中でも実行したい場合は省電力の設定でPower Napをオンにする必要があります。
(Apple Siliconの場合は常にオンです)


これでHDDアクセスが止まらない問題は解決しそうです。
こんなにHDDアクセスが止まらないのに、騒いでいる様子が無いのでうちの環境だけかなとは思っていました。
QNAPのNASを使い、MacのTime Machineを設定している方で同様の症状が出ている方は試してみてください。
そうでない方でも、Time Machineの毎時間のバックアップが不要な方はplist部分をやると良いかもしれません。
ただ・・・そういう場合は「TimeMachineEditor」を使う方が楽ですね。


--
やっと静かになった・・・
これでTS-251Dがさらに最強に。