나는 다음 명령을 사용하여 내 서버에서 많은 수의 파일을 찾고 이동합니다.
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 device
perror
따라서 설치 시 옵션이 지정되지 않았는지(또는 매우 큰 숫자로 지정되었는지) 확인하십시오.
또한 다음 사항에 유의하세요.
- 한 폴더에 너무 많은 파일을 저장하는 것은 좋은 생각이 아닌 것 같습니다. 관계형 데이터베이스를 원하시나요? 객체 스토리지?
- 4.8TB: 이는 최신 하드 드라이브에서는 드문 일이 아니지만 솔직히 다음에 이 시대에 무언가를 설정할 때 LVM과 같은 스토리지 풀을 사용하십시오. 이렇게 하면 라이브 시스템 스냅샷과 같은 정보를 얻을 수 있습니다.
답변2
새로 얻은 정보에 따르면:
따라서 git 태그 v3.10(즉, 커널)에서 linux/fs/ext4/namei.c 라인 2007을 읽으면 운이 좋지 않아서 파일 시스템을 조정해야 한다고 생각합니다.
tune2fs -O large_dir /dev/sdb1
디렉토리당 더 많은 콘텐츠를 가질 수 있어야 dx_entries
하지만 솔직히 저는 그렇게 해본 적이 없습니다. 언제나 그렇듯이 백업을 하세요.
백업이 있는지 확인하거나 파일을 동일한 파일 시스템으로 이동하는 대신 복사한 새 파일 시스템에 적용하세요. 이것은 내가 XFS 팬이라고 생각하게 만들 수도 있지만(아니요, 그냥 작동합니다), 조정되지 않은 ext4가 이 사용 사례에 좋은 파일 시스템이 될 것 같지는 않습니다.