편집 : 솔루션
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는 0이 아닌 SMB 반환 코드의 로깅을 활성화하고, 4는 완료하는 데 1초 이상 걸리는 요청의 로깅을 활성화합니다(바이트 범위 잠금 요청 제외). 4로 설정하려면 소스 코드에서 CONFIG_CIFS_STATS2를 수동으로 정의해야 하며(일반적으로 cifsglob.h의 시작 부분에 설정), 7로 설정하면 세 가지가 모두 활성화됩니다. 마지막으로 다음을 통해 SMB 요청 및 응답의 시작 추적을 활성화할 수 있습니다.
에코 1 > /proc/fs/cifs/traceSMB
이 두 가지 옵션은 다음에 수행할 작업을 알 수 있는 충분한 정보를 제공할 수 있습니다.
답변2
권한 문제인 것 같습니다. 스크립트를 수동으로 실행할 때 사용자의 사용자 ID는 무엇입니까? 크론 작업을 실행하는 UID와 동일한가요?
cron 작업을 루트로 실행하는 경우 마운트된 파일 시스템의 콘텐츠에 액세스하는 데 필요한 권한이 없을 수도 있습니다. 작업 시나리오에서 사용자의 cron 탭에 스크립트를 추가해 보세요. crontab -e
should be your friend.