
編集:ソリューション
Timの助けを借りて、私はより大きなデータを書くことは失敗し、より小さいデータを書くことは失敗すると判断しました。スクリプトをインタラクティブに実行しても失敗しない理由はわかりませんが、回避策は次のとおりです(新しいマウントオプションwsize = 4096)。
if mount -t cifs -o guest,wsize=4096 //drobonas/public /mnt/drobonas-public; then
...
wsize=4096
かなり小さい書き込みなので(デフォルトは14x)、おそらく限界を見つけようとします。でも今は効果があって嬉しいです。
元の質問
svnリポジトリをバックアップするシェルスクリプトがあります。 NAS(Drobo)に移してバックアップしました。このスクリプトは、ネットワーク共有自体をマウントしてアンマウントすることを担当します。
スクリプト自体は直接実行するとうまく機能しますが、cronを介して実行するとシステムログにいくつかのCIFS関連のエラーが発生し、失敗するようです。まず、スクリプトは次のようになります。
#!/bin/sh
# This script tars up a backup of the needed svn repo directories.
# It expects to be run as root so that it can mount the drobo's drive.
# There are probably ways to allow user mounting (via additions to /etc/fstab) but I'm trying to minimize setup steps.
# I personally placed it in a directory for root (/root/bin or /home/root/bin depending on your distro), then used crontab -e (again as root) to schedule it.
# My crontab looked like this (runs at 1:01 AM, on Mon-Fri, as root user):
# 01 01 * * 1-5 /root/bin/svn-backup.sh
# mount our backup drive
if mount -t cifs -o guest //drobonas/public /mnt/drobonas-public; then
# perform the actual backup - went with tar so we can preserve permissions, etc
if tar cvpf /mnt/drobonas-public/SvnBackup/svn-backup-temp.tar /home/svnserver/svnconf/ /home/svnserver/svncreaterepo.sh /home/svnserver/svnrepositories/; then
# if everything worked out, we can do some cleanup
# remove our oldest backup in the rotation
rm /mnt/drobonas-public/SvnBackup/svn-backup-3.tar
# rename the existing backups to reflect the new order
#mv /mnt/drobonas-public/SvnBackup/svn-backup-4.tar /mnt/drobonas-public/SvnBackup/svn-backup-5.tar
#mv /mnt/drobonas-public/SvnBackup/svn-backup-3.tar /mnt/drobonas-public/SvnBackup/svn-backup-4.tar
mv /mnt/drobonas-public/SvnBackup/svn-backup-2.tar /mnt/drobonas-public/SvnBackup/svn-backup-3.tar
mv /mnt/drobonas-public/SvnBackup/svn-backup-latest.tar /mnt/drobonas-public/SvnBackup/svn-backup-2.tar
mv /mnt/drobonas-public/SvnBackup/svn-backup-temp.tar /mnt/drobonas-public/SvnBackup/svn-backup-latest.tar
# do svnadmin dumps as well - helps future-proof things
/bin/bash /root/bin/svn-dump.sh
# we're done, so unmount our drive
umount /mnt/drobonas-public
else
# something went wrong, unmount the drive and then exit signalling failure
umount /mnt/drobonas-public
exit 1
fi
else
# mount wasn't successful, exit signalling failure
exit 1
fi
ログエントリは次のようになります(注:「svn-backup-temp.tar」ファイルが正常に作成されたように見え、その後はエラーが発生し始めます)。
Jan 5 07:52:01 giantpenguin CRON[2759]: (root) CMD (/root/bin/svn-backup.sh)
Jan 5 07:52:02 giantpenguin kernel: [21139655.823930] CIFS VFS: Error -4 sending data on socket to server
Jan 5 07:52:02 giantpenguin kernel: [21139655.823961] CIFS VFS: Write2 ret -4, wrote 0
Jan 5 07:52:02 giantpenguin kernel: [21139655.824007] CIFS VFS: Write2 ret -112, wrote 0
その後、スクリプトが完了する前に、最後のエラー行が複数回表示されます。どんな洞察力がありますか?ありがとうございます!
答え1
作成したバックアップが正しいことを確認しましたか?
これらのエラーが表示されるにはいくつかの理由があります。
tar
作成中(およびコマンド実行中)、ファイル属性の設定に関連する純粋に情報提供エラーが表示されることがありますmv
。 CIFS マウント デフォルトの NTFS または FAT ファイルシステムは、実際には特定のシステムコールをサポートしていない可能性があり、これは実際のエラーではない可能性があります。tar
ローカルでアーカイブを作成してNASにコピーしましたか?
また、fs.cifs READMEを使用して、より詳細なロギングを有効にすることもできます。
エコ7> /proc/fs/cifs/cifsFYI
cifsFYIはビットマスクとして使用されます。この値を 1 に設定すると、さまざまな情報メッセージの追加カーネルロギングが有効になります。 2はゼロ以外のSMBリターンコードのロギングを有効にし、4は完了に1秒以上かかる要求のロギングを有効にします(バイト範囲ロック要求を除く)。 4に設定するには、ソースコードでCONFIG_CIFS_STATS2を手動で定義する必要があります(通常はcifsglob.hの先頭に設定)、7に設定すると3つすべてが有効になります。最後に、次のようにSMB要求と応答の開始トレースを有効にできます。
エコ1> /proc/fs/cifs/traceSMB
これら2つのオプションは、次に何をすべきかを知るのに十分な情報を提供できます。
答え2
権限の問題のようです。スクリプトを手動で実行するときのユーザーのユーザーIDは何ですか?クローンジョブを実行しているUIDと同じですか?
cronジョブをrootとして実行している場合は、マウントされたファイルシステムのコンテンツにアクセスするために必要な権限がない可能性があります。タスクシナリオで、ユーザーのcronタブにスクリプトを追加してみてください。crontab -e
should be your friend.