rdiff-backup은 이전 백업 실패를 복구하기 위해 너무 많은 공간을 필요로 합니까?

rdiff-backup은 이전 백업 실패를 복구하기 위해 너무 많은 공간을 필요로 합니까?

이 파일 시스템에는 꽤 많은 여유 공간(및 inode)이 있지만 rdiff-backup공간이 충분하지 않은 것 같습니다. 그래서 현재 백업이 작동하지 않습니다. :-(. 왜죠?

(앞으로 이것을 위해 얼마나 많은 공간을 확보해야 할지 궁금합니다!)

내 rdiff-backup 버전은 입니다 1.2.8-7. 내 운영 체제는 Debian 9 "stretch"입니다.

# df -h /d/backup
Filesystem                      Size  Used Avail Use% Mounted on
/dev/mapper/vg_brick-lv_backup  139G   95G   38G  72% /d/backup

# df -i /d/backup
Filesystem                      Inodes  IUsed   IFree IUse% Mounted on
/dev/mapper/vg_brick-lv_backup 9240576 413341 8827235    5% /d/backup

# df -h
Filesystem                      Size  Used Avail Use% Mounted on
udev                            244M     0  244M   0% /dev
tmpfs                            51M  1.9M   49M   4% /run
/dev/sda7                        15G  4.1G  9.8G  30% /
tmpfs                           251M     0  251M   0% /dev/shm
tmpfs                           5.0M     0  5.0M   0% /run/lock
tmpfs                           251M     0  251M   0% /sys/fs/cgroup
/dev/ubi0_0                     462M  225M  233M  50% /d/ubi
tmpfs                           251M  4.0K  251M   1% /tmp
/dev/mapper/vg_brick-lv_attic    44G   21G   21G  50% /d/attic
/dev/mapper/vg_brick-lv_backup  139G   95G   38G  72% /d/backup
/dev/sda6                       2.0G   81M  1.8G   5% /boot
/dev/mapper/vg_brick-lv_home    134G   91G   37G  71% /home
/dev/sda10                      9.8G  2.9G  6.9G  30% /d/xfer
tmpfs                            51M     0   51M   0% /run/user/1003

root@brick:/d/backup/jenkins-desktop# du -sh mike
5.7G    mike
root@brick:/d/backup/jenkins-desktop# du -sh ../jenkins-desktop.rdiff/mike
8.2G    ../jenkins-desktop.rdiff/mike

root@brick:/d/backup/jenkins-desktop# rdiff-backup mike ../jenkins-desktop.rdiff/mike
Previous backup seems to have failed, regressing destination now.                                                                                     
Exception '[Errno 28] No space left on device' raised of class '<type 'exceptions.IOError'>':                                                         
  File "/usr/lib/python2.7/dist-packages/rdiff_backup/robust.py", line 32, in check_common_error                                                      
    try: return function(*args)                                                                                                                       
  File "/usr/lib/python2.7/dist-packages/rdiff_backup/restore.py", line 468, in get_fp                                                                
    Rdiff.write_patched_fp(current_fp, delta_fp, new_fp)                                                                                              
  File "/usr/lib/python2.7/dist-packages/rdiff_backup/Rdiff.py", line 73, in write_patched_fp                                                         
    rpath.copyfileobj(librsync.PatchedFile(basis_fp, delta_fp), out_fp)                                                                               
  File "/usr/lib/python2.7/dist-packages/rdiff_backup/rpath.py", line 64, in copyfileobj                                                              
    outputfp.write(inbuf)

Exception '[Errno 28] No space left on device' raised of class '<type 'exceptions.IOError'>':                                                         
  File "/usr/lib/python2.7/dist-packages/rdiff_backup/Main.py", line 304, in error_check_Main                                                         
    try: Main(arglist)                                                                                                                                
  File "/usr/lib/python2.7/dist-packages/rdiff_backup/Main.py", line 324, in Main
    take_action(rps)
  File "/usr/lib/python2.7/dist-packages/rdiff_backup/Main.py", line 280, in take_action
    elif action == "backup": Backup(rps[0], rps[1])
  File "/usr/lib/python2.7/dist-packages/rdiff_backup/Main.py", line 337, in Backup
    backup_final_init(rpout)
  File "/usr/lib/python2.7/dist-packages/rdiff_backup/Main.py", line 501, in backup_final_init
    checkdest_if_necessary(rpout)
  File "/usr/lib/python2.7/dist-packages/rdiff_backup/Main.py", line 920, in checkdest_if_necessary
    dest_rp.conn.regress.Regress(dest_rp)
  File "/usr/lib/python2.7/dist-packages/rdiff_backup/regress.py", line 71, in Regress
    for rf in iterate_meta_rfs(mirror_rp, inc_rpath): ITR(rf.index, rf)
  File "/usr/lib/python2.7/dist-packages/rdiff_backup/rorpiter.py", line 281, in __call__
    last_branch.fast_process(*args)
  File "/usr/lib/python2.7/dist-packages/rdiff_backup/regress.py", line 268, in fast_process
    if rf.metadata_rorp.isreg(): self.restore_orig_regfile(rf)
  File "/usr/lib/python2.7/dist-packages/rdiff_backup/regress.py", line 290, in restore_orig_regfile
    tf.write_from_fileobj(rf.get_restore_fp())
  File "/usr/lib/python2.7/dist-packages/rdiff_backup/restore.py", line 488, in get_restore_fp
    return robust.check_common_error(error_handler, get_fp)
  File "/usr/lib/python2.7/dist-packages/rdiff_backup/robust.py", line 32, in check_common_error
    try: return function(*args)
  File "/usr/lib/python2.7/dist-packages/rdiff_backup/restore.py", line 468, in get_fp
    Rdiff.write_patched_fp(current_fp, delta_fp, new_fp)
  File "/usr/lib/python2.7/dist-packages/rdiff_backup/Rdiff.py", line 73, in write_patched_fp
    rpath.copyfileobj(librsync.PatchedFile(basis_fp, delta_fp), out_fp)
  File "/usr/lib/python2.7/dist-packages/rdiff_backup/rpath.py", line 64, in copyfileobj
    outputfp.write(inbuf)

Traceback (most recent call last):                                                                                                                    
  File "/usr/bin/rdiff-backup", line 30, in <module>                                                                                                  
    rdiff_backup.Main.error_check_Main(sys.argv[1:])                                                                                                  
  File "/usr/lib/python2.7/dist-packages/rdiff_backup/Main.py", line 304, in error_check_Main    
  File "/usr/lib/python2.7/dist-packages/rdiff_backup/Main.py", line 324, in Main
    take_action(rps)
  File "/usr/lib/python2.7/dist-packages/rdiff_backup/Main.py", line 280, in take_action
    elif action == "backup": Backup(rps[0], rps[1])
  File "/usr/lib/python2.7/dist-packages/rdiff_backup/Main.py", line 337, in Backup
    backup_final_init(rpout)
  File "/usr/lib/python2.7/dist-packages/rdiff_backup/Main.py", line 501, in backup_final_init
    checkdest_if_necessary(rpout)
  File "/usr/lib/python2.7/dist-packages/rdiff_backup/Main.py", line 920, in checkdest_if_necessary
    dest_rp.conn.regress.Regress(dest_rp)
  File "/usr/lib/python2.7/dist-packages/rdiff_backup/regress.py", line 71, in Regress
    for rf in iterate_meta_rfs(mirror_rp, inc_rpath): ITR(rf.index, rf)
  File "/usr/lib/python2.7/dist-packages/rdiff_backup/rorpiter.py", line 281, in __call__
    last_branch.fast_process(*args)
  File "/usr/lib/python2.7/dist-packages/rdiff_backup/regress.py", line 268, in fast_process
    if rf.metadata_rorp.isreg(): self.restore_orig_regfile(rf)
  File "/usr/lib/python2.7/dist-packages/rdiff_backup/regress.py", line 290, in restore_orig_regfile
    tf.write_from_fileobj(rf.get_restore_fp())
  File "/usr/lib/python2.7/dist-packages/rdiff_backup/restore.py", line 488, in get_restore_fp
    return robust.check_common_error(error_handler, get_fp)
  File "/usr/lib/python2.7/dist-packages/rdiff_backup/robust.py", line 32, in check_common_error
    try: return function(*args)
  File "/usr/lib/python2.7/dist-packages/rdiff_backup/restore.py", line 468, in get_fp
    Rdiff.write_patched_fp(current_fp, delta_fp, new_fp)
  File "/usr/lib/python2.7/dist-packages/rdiff_backup/Rdiff.py", line 73, in write_patched_fp
    rpath.copyfileobj(librsync.PatchedFile(basis_fp, delta_fp), out_fp)
  File "/usr/lib/python2.7/dist-packages/rdiff_backup/rpath.py", line 64, in copyfileobj
    outputfp.write(inbuf)
IOError: [Errno 28] No space left on device

답변1

에서 tmpfs를 비활성화 /tmp하거나 rdiff-backup충분한 공간이 있는 다른 임시 디렉터리를 사용하도록 구성해야 합니다. 가능한 /var/tmp.

tmpfs                           251M  4.0K  251M   1% /tmp

복원하거나 되돌릴 때 rdiff-backup에는 기본 임시 디렉터리에 여유 공간이 필요합니다. Unix 시스템에서는 일반적으로 /tmp 디렉토리입니다. rdiff-backup에서 사용되는 임시 디렉토리는 1.1.13 이상에서 사용 가능한 --tempdir 및 --remote-tempdir 옵션을 사용하여 설정할 수 있습니다. 기본 임시 디렉터리에 대한 자세한 내용은 Python 임시 파일 설명서의 tempfile.tempdir 항목을 참조하세요. 필요한 여유 공간의 양은 다양할 수 있지만 일반적으로 복구할 가장 큰 파일의 크기와 비슷합니다.

--rdiff-백업 FAQ:rdiff-backup에는 여유 공간이 필요한 위치와 공간이 얼마나 필요합니까? rdiff-backup에서 "ValueError: 생성된 데이터 길이가 잘못되었습니다"라는 메시지가 표시되면 문제는 무엇입니까?

답변2

이것이 OP의 경우인지는 잘 모르겠지만 제 경우에는 백업하고 있던 호스트에서 96Gb mssql "백업" 파일을 잘랐습니다. (mssql 백업이추가무한히 자라도록 하라.이 답변더 알아보기).

내 rdiff-backup 마스터가 내 mssql "백업" 파일의 잘린 새 버전을 백업하려고 하면 먼저 해당 /tmp 디렉터리에 이전 96Gb 버전의 파일을 생성합니다. 나는 rdiff-backup이 파일에 대해 "diff" 작업을 수행하기 위해 이 작업을 수행한다고 가정합니다. 그러나 이 거대한 이전 버전을 생성하는 과정에서 기본 rdiff 백업 프로세스의 /tmp 공간이 부족하여 이 질문에 표시된 결과가 발생했습니다.

문제를 이해한 후 rdiff FAQ라는 프로젝트의 단계를 따랐습니다.어떤 이유로 백업 시 rdiff-backup이 실패합니다. 이제 실행할 때마다 "대상으로 돌아가는 중"이라는 메시지가 나타나고 다시 실패합니다. 어떻게 해야 합니까?회귀를 비활성화합니다. 그러므로 나는 rdiff-backup이 파일 비교를 "포기"하고 대신 디렉토리 정보에 의존한다고 가정합니다. 결과적으로 내 rdiff-backup 마스터는 더 이상 /tmp 공간을 모두 소비하지 않으며 내 백업이 성공합니다.

답변3

저는 수년 동안 rdiff-backup을 사용해 왔으며 이를 절대적으로 믿습니다. 그러나 다른 모든 방법이 실패할 경우 rsync -av (source dir) (dest dir)대안이 있습니다.

중요 편집: 즉, 다른 것을 사용할 수 있다면(대상 디렉토리)또는 드라이브를 사용하지 않으면 rdiff 백업 기록 파일에 큰 피해를 줄 수 있습니다. 감사해요@소스제디!

관련 정보