700,000개의 파일을 동일한 FS 내의 단일 디렉터리로 이동할 때 장치에 남은 공간이 없습니다.

700,000개의 파일을 동일한 FS 내의 단일 디렉터리로 이동할 때 장치에 남은 공간이 없습니다.

나는 다음 명령을 사용하여 내 서버에서 많은 수의 파일을 찾고 이동합니다.

find SomeDir/ -maxdepth 10 -type f -mtime +90 -exec mv {} SomeDir2/ \;

약 700,000개의 파일을 이동한 후 다음 오류가 발생합니다.

mv: cannot move ‘SomeDir/Dir1/Dir2/Dir3/file.jpg.gz’ to ‘SomeDir2/file.jpg.gz’: No space left on device

df -i다음과 같은 결과가 있습니다.

/dev/sdb1           322125824 144163358 177962466   45% /files

df -h다음과 같은 결과가 있습니다.

/dev/sdb1            4.8T  3.5T  1.1T   78%   /files

/files다른 디렉토리에서 모든 작업을 수행합니다.

파일 시스템은 ext4.

고쳐 쓰다

제안한대로 이것을 실행했고 dmesg -Hwx출력은 다음과 같습니다.EXT4-fs warning (device sdb1): ext4_dx_add_entry:2016: Directory index full!

답변1

max_dir_size_kb디렉터리를 마운트할 때 설정을 초과하거나 기본값을 그대로 둘 수 있습니다 .

리눅스 문서:

max_dir_size_kb=n
    This limits the size of the directories so that any
    attempt to expand them beyond the specified limit in
    kilobytes will cause an ENOSPC error. This is useful in
    memory-constrained environments, where a very large
    directory can cause severe performance problems or even
    provoke the Out Of Memory killer. (For example, if there
    is only 512 MB memory available, a 176 MB directory may
    seriously cramp the system's style.)

ENOSPC( 오류 메시지 로 번역됨 )No space left on deviceperror

따라서 설치 시 옵션이 지정되지 않았는지(또는 매우 큰 숫자로 지정되었는지) 확인하십시오.

또한 다음 사항에 유의하세요.

  • 한 폴더에 너무 많은 파일을 저장하는 것은 좋은 생각이 아닌 것 같습니다. 관계형 데이터베이스를 원하시나요? 객체 스토리지?
  • 4.8TB: 이는 최신 하드 드라이브에서는 드문 일이 아니지만 솔직히 다음에 이 시대에 무언가를 설정할 때 LVM과 같은 스토리지 풀을 사용하십시오. 이렇게 하면 라이브 시스템 스냅샷과 같은 정보를 얻을 수 있습니다.

답변2

새로 얻은 정보에 따르면:

따라서 git 태그 v3.10(즉, 커널)에서 linux/fs/ext4/namei.c 라인 2007을 읽으면 운이 좋지 않아서 파일 시스템을 조정해야 한다고 생각합니다.

tune2fs -O large_dir /dev/sdb1

디렉토리당 더 많은 콘텐츠를 가질 수 있어야 dx_entries하지만 솔직히 저는 그렇게 해본 적이 없습니다. 언제나 그렇듯이 백업을 하세요.

백업이 있는지 확인하거나 파일을 동일한 파일 시스템으로 이동하는 대신 복사한 새 파일 시스템에 적용하세요. 이것은 내가 XFS 팬이라고 생각하게 만들 수도 있지만(아니요, 그냥 작동합니다), 조정되지 않은 ext4가 이 사용 사례에 좋은 파일 시스템이 될 것 같지는 않습니다.

관련 정보