Yum repo 미러에는 updateinfo.xml.gz 파일이 축적됩니다. 삭제할 수 있나요?

Yum repo 미러에는 updateinfo.xml.gz 파일이 축적됩니다. 삭제할 수 있나요?

매일 업데이트되는 Redhat YUM 저장소의 미러가 많이 있습니다. 이를 수행하는 데 사용되는 명령은 다음과 같습니다.

reposync --repoid=${i} --download_path=${destdir}  --gpgcheck -l --download-metadata --downloadcomps --newest --delete

createrepo -s sha256 --checkts --update --workers=4 -g $destdir/$fn/comps.xml

변수(i, destdir 및 fn)는 명령을 실행하는 스크립트에 설정됩니다. 모든 것이 정말 잘 작동했고 팀에서는 거울을 사용하여 좋은 효과를 냈습니다.

문제는 약 1년 후 저장소 중 하나에 이름 패턴 <hash>-updateinfo.xml.gz: 456MB가 최상위 디렉토리에 있고 28.45GB가 기본 디렉토리에 있는 인상적인 updateinfo xml 파일 스택이 축적되었다는 것입니다. repodata 하위 디렉터리. 저장소에는 4GB의 패키지 파일만 포함되어 있습니다.

이 저장소에서 yum makecache를 실행하는 클라이언트는 결국 4GB의 repmod.xml 파일을 갖게 됩니다.

내 질문은

  1. --delete..를 지정했는데도 이러한 파일이 누적되는 이유는 무엇입니까?
  2. 저장소를 손상시키지 않고 삭제할 수 있나요?
  3. 내가 사용하고 있는 매개변수가 최적인가요? 우리는 전체 저장소를 미러링하고 싶지만 각 패키지의 최신 버전만 미러링하고 싶습니다.

2018년 4월 6일에 수정됨

더 깊이 파고든 후에 이러한 파일이 실제로 필요하지 않음을 나타내는 더 많은 힌트를 발견했습니다.

저장소의 최상위 디렉토리에 있는 <hash>updateinfo.xml.gz 파일의 크기는 모두 약 3.8M로 거의 동일합니다. repodata 디렉터리(createrepo에 의해 생성/업데이트됨)의 파일 크기는 최상위 디렉터리의 모든 파일이 연결됨에 따라 계속 증가합니다.

예: 이 repodata 디렉터리에는 129개의 gzip 압축 파일이 있습니다. 첫 번째 파일은 최상위 디렉터리의 파일과 평균 크기가 동일하고, 마지막 파일은 업데이트 태그가 129개로 상당히 큽니다. 첫 번째 파일의 업데이트 태그는 1개에 불과합니다.

# l -tr
total 29G
-rw-r--r-- 1 root root 3.5M Sep 28  2016 6f9c8bca09bb360b0ac2c18231168d45aa6ef51254fee7b791c6d09693677f4c-updateinfo.xml.gz
...
-rw-r--r-- 1 root root 465M May 17 03:21 1696bec0516791660751bb4a319b287f2a3a5ecfee086aefb73285f07cad3ac5-updateinfo.xml.gz
drwxr-xr-x 3 root root  20K May 22 12:37 ../
# gzip -dc  1696bec0516791660751bb4a319b287f2a3a5ecfee086aefb73285f07cad3ac5-updateinfo.xml.gz >updateinfo-big.xml
# gzip -dc  6f9c8bca09bb360b0ac2c18231168d45aa6ef51254fee7b791c6d09693677f4c-updateinfo.xml.gz >updateinfo.xml
# grep '<updates>' updateinfo.xml |wc -l
1
# grep '<updates>' updateinfo-big.xml |wc -l
129
# ls -1 *updateinfo.xml.gz|wc -l
129
# l updateinfo*
-rw-r--r-- 1 root root 2.4G Jun  4 17:09 updateinfo-big.xml
-rw-r--r-- 1 root root  18M Jun  4 17:10 updateinfo.xml

나는 reposync가 createrepo가 ​​실행되기 전에 최상위 디렉토리에 있는 기존 updateinfo.xml.gz 파일을 삭제해야 한다고 생각합니다. 클라이언트는 makecache를 실행할 때 repodata 디렉터리에서 최신 gzip 압축 파일을 가져와서 압축을 풉니다.

위의 질문을 게시한 후 스택을 백업 디렉터리로 옮겼으며 클라이언트에 부정적인 영향을 미치지 않습니다.

답변1

내 질문에 답하고 다른 사람들을 위해 이를 문서화합니다.

이제 우리는 이전 updateinfo.xml 파일이 우리의 필요에 비해 중복된다는 것을 거의 확신합니다. 아무래도 파일명 앞의 해시값 때문에 쌓이는 것 같습니다. 이를 기반으로 몇 가지 변경을 했고 이제 저장소의 크기는 기본적으로 동일하게 유지됩니다.

원래 형식에서는 질문에 참조된 reposync 및 createrepo 명령 다음에 스크립트가 gunzip을 실행한 다음 ../repodata 디렉터리에 새 updateinfo.xml.gz 파일을 생성하는 adjustrepo 명령을 실행합니다.

  if  [ -n "$(/bin/ls -t $destdir/$fn/*updateinfo.xml.gz 2>/dev/null)" ]; then
     gunzip -c $(/bin/ls -t $destdir/$fn/*updateinfo.xml.gz) > $destdir/$fn/updateinfo.xml 2>> $LOGFILE
     modifyrepo $destdir/$fn/updateinfo.xml $destdir/$fn/repodata  >> $LOGFILE 2>&1
  fi

이 부분을 다음과 같이 변경했습니다.

  if  [ -n "$(/bin/ls -t $destdir/$fn/*updateinfo.xml.gz 2>/dev/null)" ]; then
     gunzip -c $(/bin/ls -tr $destdir/$fn/*updateinfo.xml.gz|tail -1) > $destdir/$fn/updateinfo.xml 2>> $LOGFILE
     modifyrepo $destdir/$fn/updateinfo.xml $destdir/$fn/repodata  >> $LOGFILE 2>&1

     # clean up old update info - keeping only the 2 most recent files.
     for i in $destdir/$fn $destdir/$fn/repodata; do
         for j in `/bin/ls -t ${i}/*updateinfo.xml.gz|tail -n +3`; do
            echo "removing security file "$(ls -l ${j}) >> $LOGFILE
            /bin/rm -f ${j} >> $LOGFILE 2>&1
         done
     done
  fi

타임스탬프와 tail 명령의 역순으로 인해 gunzip 명령은 최신 updateinfo.xml만 추출합니다. 따라서 repodata 디렉터리의 새 파일에는 하나의 버전만 포함됩니다. 두 번째 변경 사항은 만일의 경우를 대비하여 모든 이전 updateinfo.xml 파일의 2열을 삭제하는 것입니다.

우리는 이 버전을 몇 달 동안 사용해 왔지만 원치 않는 부작용을 발견하지 못했습니다.

관련 정보