ext4 파일 시스템에서 inode 수를 늘리려면 어떻게해야합니까?


61

지난주에 새로운 문제가 생겼습니다. ext4 (Fedora 15) 파일 시스템이 있습니다. 서버에서 실행되는 응용 프로그램이 갑자기 중지되었습니다. 처음에는 문제를 찾을 수 없었습니다.

df사용 가능한 공간이 50 %로 표시되었습니다. 약 1 시간 동안 검색 한 후, 그 사람이 사용한 포럼 게시물을 보았습니다 df -i. 이 옵션은 inode 사용을 찾습니다. 시스템에는 inode가 없었으며, 내가 알지 못하는 간단한 문제였습니다. 파티션에는 3.2M inode 만있었습니다.

이제 내 질문은 : 시스템에 더 많은 inode를 만들 수 있습니까? 디스크를 포맷 할 때 설정해야합니까? 3.2M inode를 사용하면 몇 개의 파일을 가질 수 있습니까?


1
모든 파일 또는 디렉토리는 하나의 inode를 사용합니다. 파일에 대한 하드 링크 는 inode를 생성 하지 않습니다 . en.wikipedia.org/wiki/Inode
Paul Tomblin

답변:


33

일반적인 예상보다 많은 파일이있는 것 같습니다.

inode 테이블 크기를 동적으로 변경하는 솔루션이 있는지 모르겠습니다. 데이터를 백업하고 새 파일 시스템을 만들고 데이터를 복원해야한다고 걱정됩니다.

거대한 inode 테이블로 새로운 파일 시스템을 만들려면 mke2fs (8)의 '-N'옵션을 사용해야합니다.

추정 된 inode 수를 얻을 수 있도록 '-n'옵션을 먼저 사용하는 것이 좋습니다 (fs를 만들지 않지만 유용한 정보를 표시 함). 그런 다음 '-N'을 사용하여 특정 inode 번호로 파일 시스템을 만드십시오.


11
mke2fs -iinode 수를 지정하는 데 사용할 수 있습니다 . 이 문서에는 "파일 시스템에서 inode 수를 확장 한 후에는 확장 할 수 없습니다"라고 명시되어 있습니다.
Gilles

2
@piovisqui : 각 파일은 inode에서 소비되며 이는 파일 시스템의 포인터입니다. 파일이 다른 파일에 대한 하드 링크 인 경우 동일한 inode를 갖습니다.
Hanan N.

6
@Gilles이 -i옵션은 아이 노드의 크기를 지정합니다. 이 -N옵션은 숫자 inode를 설정합니다.
theillien

1
inode와 파일 번호의 관계가 반드시 1 : 1 일 필요는 없습니다. 첫 번째 inode에는 파일이 저장된 블록에 대한 포인터 목록이 있습니다. 블록 목록이 하나의 inode에 맞지 않으면 inode에는 파일이 저장된 블록을 나열하는 inode에 대한 포인터 목록이 포함됩니다. 그것이 적합하지 않다면, 그 블록 목록 등을 위해 3 세트의 inode를 간다.
StuWhitby

2
@StuWhitby 그것은 옳지 않습니다. 단일 inode에는 여러 개의 직접 포인터와 단일, 이중 및 삼중 간접 포인터가 있습니다. 블록 목록이 직접 포인터에 맞지 않을 경우 단일 간접 포인터는 더 많은 포인터를 포함하는 데이터 블록 (다른 inode 아님)을 가리 킵니다. 그보다 더 많은 포인터가 필요한 경우 이중 간접 포인터는 단일 간접 포인터가 포함 된 블록을 가리키고 이중 간접 포인터는 이중 간접 포인터가있는 블록을 가리 킵니다. 실제로 파일은 크기에 관계없이 하나의 inode 만 사용합니다.
user125355

11

또 다른 해결 방법으로 거대한 파일 모음을 압축되지 않은 (!) tar아카이브 로 압축 한 다음 archivemount파일 시스템으로 마운트하는 데 사용할 것을 제안 할 수 있습니다. tar 아카이브는 파일 시스템 이미지보다 공유하기에 좋으며 클라우드 또는 다른 스토리지에 백업 할 때 유사한 성능을 제공합니다.


컬렉션이 읽기 전용 squashfs이어야하는 경우 옵션 일 수 있지만 커널에서 특정 옵션을 사용하도록 설정해야 xz하며 동일한 성능으로 tar에 대해서도 압축을 사용할 수 있습니다.


2
좋은 제안입니다.
piovisqui

11

320 만 개의 inode를 사용하면 총 320 만 개의 파일과 디렉토리를 가질 수 있습니다 (그러나 파일에 대한 여러 하드 링크는 하나의 inode 만 사용합니다).

예, 파티션에서 파일 시스템을 만들 때 설정할 수 있습니다. 옵션 -T usage-type, -N number-of-inodes또는 -i bytes-per-inode모두 inode 수를 설정할 수 있습니다. 나는 일반적으로 사용 -i의 출력을 비교 한 후, du -sfind | wc -l파일의 유사한 수집 및 일부 여유를 허용.

아니요, 기존 파일 시스템에서 해당 위치를 변경할 수 없습니다. 하나:

  • LVM을 실행 중이거나 파일 시스템이 SAN의 LUN에 있거나 (LUN에 직접 또는 LUN의 마지막 파티션으로) 파티션 뒤에 디스크에 빈 공간이있는 경우 파티션을 확장 한 다음 resize2fs파일 시스템을 확장하는 데 사용 합니다. 이것은 추가 된 공간에 비례하여 더 많은 inode를 추가합니다. 향후 파일의 평균 크기가 거의 같다고 가정하고 공간 전에 inode가 부족하지 않게하려면을 사용하여 예약 된 블록 비율을 충분히 높게 설정하십시오 tune2fs -m.
  • 충분한 공간이 있고 파일 시스템을 오프라인으로 전환 할 수있는 경우 오프라인으로 전환하고 더 많은 inode가있는 새 파일 시스템을 생성 한 다음 모든 파일을 복사하십시오.
  • 파일의 서브 세트 만 많은 inode를 사용하고 충분한 여유 공간이있는 경우 파일 시스템의 파일이 지원하는 루프 장치에 파일 시스템을 작성하고 더 많은 inode (및 더 작은 블록도 포함)가있는 파일 시스템을 작성하십시오. 그것에 문제를 일으키는 디렉토리로 옮기십시오. 아마도 성능이 저하되고 유지 관리가 번거로울 수 있지만 대안입니다.
  • 물론 불필요한 파일을 많이 삭제할 수 있다면 도움이 될 것입니다.

6

이 상황에 대한 대체 솔루션이 있습니다. 10G 파티션 에 1000 개의 inode가 있다고 가정 해 봅시다. 그러나 inode 제한으로 인해 모든 파티션 공간을 사용한다고 가정하지는 않습니다 . 그러나이 솔루션에서는 파티션 의 남은 공간을 포맷 하지 않고 사용할 수 있습니다.

$ df -i  # see list ( I need just one free inode here so move just one file into other PARTITION)
/dev/part1  1000 999 1 99.9%     /data

$ dd if=/dev/zero of=/data/new_data
$ mkfs.ext4 /data/new_data
$ mkdir /data1
$ mount /data/new_data /data1

영구 장착 용

$ echo "/data/new_data /data1 ext4 defaults 0 1" >> /etc/fstab

2
U & L에 오신 것을 환영합니다. 나는 $명령과 출력을 명확하게 구별하기 위해 프롬프트 ( )를 삽입하여 명령의 일반적인 표현으로 대답을 다시 포맷 할 자유를 얻었습니다 ( 명령이있는 경우 프롬프트는 일반적으로 생략됩니다). 나는 또한 대담한 위상 강조에서 SHOUTING을 변경했습니다. 내가 가지 잘못 경우 변경 내용을 롤백 할 수 있습니다
안톤

이 솔루션에는 논리가 있다고 생각하지만 dd를 실행할 때 크기를 관리해야합니다.
piovisqui

3
세부 사항이 잘못되어 응용 프로그램에 따라 루프 장치를 사용해야 할 수도 있고 심지어 Unionfs를 사용해야 할 수도 있지만, 수백만 개의 파일이 필요한 경우 백업에서 포맷 및 복원을 피할 수있는 유일한 솔루션입니다. 이것이 하루를 구할 수있는 상황이 있습니다!
medoc

6

최근에 apt 또는 aptitude 업그레이드를 사용할 때이 문제가 발생했습니다.

df -h

Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1      7.8G  5.1G  2.3G  70% /

df -i

Filesystem     Inodes  IUsed  IFree IUse% Mounted on
/dev/xvda1     524288 521497   2791  100% /

발행 된 명령 :

du /|sort -k1 -n

대부분의 파일이 다음의 여러 커널 버전에 대한 하위 폴더에 있음을 공개했습니다.

/usr/src/linux-headers

해당 하위 폴더를 제거하고 inode 문제가 해결되었습니다.

df -i

Filesystem     Inodes  IUsed  IFree IUse% Mounted on
/dev/xvda1     524288 104986 419302   21% /

"du / | sort -k1 -n"은 inode를 표시합니까?
고아

아니요. 디렉토리를 정렬하여 파일이 가장 많은 디렉토리와 inode를 많이 사용하지만 실제 공간 사용량은 적은 폴더를 보여주었습니다. 디스크 여유 공간은 30 %이지만 100 % inode 사용량은 위와 같습니다.
kph0x1

나는 솔직히 "du"가 어떤 플래그로 몇 개의 파일이 있는지 보여주지 못합니까? 좀 더 자세히 설명해 주시겠습니까?
고아

du명령에 대한 플래그가 없습니다 . 위의 예에서 파일 시스템의 루트는 공간 만보고 사용됩니다. 가장 많은 파일이 포함 된 디렉토리를 표시하기 위해 출력이 정렬됩니다. 위의 예제에서 파일의 수는 질문의 '파일 수'부분에 포함되지 않습니다. 커널 소스는 du출력에 표시된 범인이었습니다 . 예를 들어, 과거의 컴파일에서 가져온 작은 파일, 하위 폴더 등은 inode를 비우기 위해 제거하기에 매우 적합합니다. 인간의 du결과물에 대한 수동적 인 검토는 여전히 남아 있고, /usr/src/linux-headers명백했다.
kph0x1

1
du는 파일이 아닌 바이트 만 표시합니다. 그리고 du 명령을 통해서만 아웃 아웃을 파이핑하고 있습니다. 그렇다면 sort -k1 -n은 제안한 방식으로 출력을 어떻게 정렬합니까? 내가 볼 수있는 유일한 것은 "du / | sort -k1 -n"은 바이트 단위의 크기를 기준으로 모든 행만 정렬한다는 것입니다. 아무것도
고아

2

du -s --inodes * 2>/dev/null |sort -g출력의 마지막 dir에 cd를 시도 하고 반복하십시오.

전체 공개 : --inodesdu 명령에 대한 모든 OS의 지원 플래그는 아니지만 (Mac OS는 그렇지 않음) 많은 Linux OS는 지원합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.