문제의 이유
XFS가 inode를 할당하는 방식에 문제가있는 것으로 나타났습니다. 대부분의 파일 시스템과 달리 할당은 새 파일이 생성 될 때 동적으로 발생합니다. 그러나 달리 지정하지 않으면 inode는 32 비트 값으로 제한됩니다. 즉, 파일 시스템의 첫 번째 테라 바이트 스토리지에 맞아야합니다. 따라서 첫 번째 테라 바이트를 완전히 채우고 디스크를 확장하면 새 공간에서 inode를 만들 수 없으므로 새 파일을 만들 수 없습니다.
해결 방법 1-마운트 옵션 변경
한 가지 해결책은 mount 옵션을 사용하여 파일 시스템을 다시 마운트하는 것 inode64
입니다. 그러나 일부 응용 프로그램은 이것 (예 : MySQL)에서 이상하게 동작 할 것이며 NFS는 매우 혼란 스러울 것입니다. 따라서 시스템이이 옵션으로 작동하는지 확실하지 않으면 다음 옵션으로 넘어갈 수 있습니다.
해결 방법 2-파일 이동
두 번째 해결책은 현재 첫 번째 테라 바이트에 저장된 일부 파일을 찾아 파일 시스템의 다른 영역으로 옮기는 것입니다.
나이로 이동
이 경우 파일 시스템은 수년 동안 사용되어 왔기 때문에 가장 오래된 파일을 찾아서 파일 시스템에서 멀리 옮긴 다음 다시 옮길 수있었습니다. 이것은 find를 사용하여 쉽게 수행되었습니다.
find /extra -mindepth 3 -maxdepth 3 -type d -mtime +730 -exec du -sh {} \; > /tmp/olddirs.txt
2 년보다 오래된 마운트 포인트 아래 정확히 3 단계에있는 모든 디렉토리의 크기와 디렉토리 이름을 포함하는 목록을 제공했습니다. 그런 다음 목록을 정렬하여 가장 큰 디렉토리를 찾은 다음이를 사용 mv
하여 다른 파일 시스템으로 이동했다가 다시 되돌릴 수 있습니다.
할당 그룹 별 이동
예를 들어, 많은 파일이 동시에 생성 된 경우와 같이 나이가 지나갈 수없는 경우에도 올바른 파일을 찾을 수 있지만 시간이 조금 더 걸립니다.
XFS에는 0으로 시작하는 할당 그룹 (일명 AG )이 있습니다 xfs_info /path/to/mountpoint
.를 사용하여 각 테라 바이트의 블록 크기와 블록 수를 확인하여 첫 번째 테라 바이트에있는 그룹을 파악할 수 있습니다. 또는 처음 몇 개의 AG를 확인하여 어떤 AG가 가득 찬지 확인한 후 지울 수 있습니다.
- 처음 네 개의 AG에서 여유 공간 확인 :
`식 1 15 '에서 ag에 대해; AG $ ag에서 자유 공간을 반향하십시오. xfs_db -r -c "freesp -s -a $ ag"/ dev / CACHE / CACHE; grep "total free"; 끝난
그룹의 총 여유 공간이 40 미만이면 새 파일을 만들 수 없습니다.
- 해당 AG에서 파일 찾기
파일 시스템에서 각 파일의 메타 데이터를 확인해야합니다. 시간 이 오래 걸립니다 ... 여기에 제안 사항이 있습니다.
/ extra -mindepth 3 -type f -exec 찾기 xfs_bmap -v {} \; > /tmp/agfilelist.txt
그런 다음 grep " 0 "
(공백, 0 및 다른 공간)을 사용하여 AG 0에서 모든 파일 " 1 "
을 찾고 AGp에서 AG 1에서 파일 을 찾도록 grep 하십시오. AG 0부터 시작하여 가장 큰 파일을 이동하십시오 mv
)가 아니라 cp
다시 돌아옵니다. 여유 공간이 충분해질 때까지 반복하십시오.
결과
/ extra에서 충분한 파일을 옮겼다가 다시 되 돌리면 AG 0에 많은 공간이 생겨 다시 새 파일을 만들 수있었습니다.