파일 수가 inode와 일치하지 않습니다.

파일 수가 inode와 일치하지 않습니다.

OCFS2 파티션에서 사용된 inode의 수는 약 2,800만 개에 달하는 것으로 나타났습니다. 518K 파일이 담긴 폴더를 옮겼더니 그 수가 2,200만 개가 되었습니다.

다음 스크립트는 약 65,000개의 파일 수와 40개의 폴더 수를 찾습니다.

제 질문은 2,200만이라는 숫자가 어디서 나오는 걸까요? 이게 정상인가요?

[root@bopapp1 ~]# cat /etc/issue
Oracle Linux Server release 6.5
Kernel \r on an \m

[root@bopapp1 ~]# uname -a
Linux bopapp1 3.8.13-16.2.1.el6uek.x86_64 #1 SMP Thu Nov 7 17:01:44 PST 2013 x86_64 x86_64 x86_64 GNU/Linux

[root@bopapp1 ~]# df -i
Filesystem                        Inodes    IUsed    IFree IUse% Mounted on
/dev/mapper/vg_testapp2-lv_root  3276800   765283  2511517   24% /
tmpfs                            3089556        3  3089553    1% /dev/shm
/dev/sda1                         128016       55   127961    1% /boot
/dev/mapper/vg_testapp2-lv_home  4882432     9662  4872770    1% /home
/dev/dm-4                       39321087 22543323 16777764   58% /u
/dev/dm-5                       26214055  8319457 17894598   32% /usr/oracle

[root@bopapp1 ~]# cd /u

[root@bopapp1 u]# for i in `find . -type d `; do echo `ls -a $i 2> /dev/null | wc -l` $i; done | sort -n | awk '{sum+=$1} END{print "sum=",sum}'
sum= 62950

답변1

여기서는 일반 디스크 로컬 파일 시스템이 아니라 OCFS2 클러스터 파일 시스템에 대해 이야기하고 있다는 것을 방금 깨달았습니다. 이 섹션은 특히 OCFS2에 적용됩니다. 아래의 공통 파일 시스템을 참조하세요.

새로운 빈 1GiB OCFS2 파일 시스템을 생성하고 마운트하면 사용된 inode 수가 36378로 표시됩니다.

100개의 빈 파일을 만든 후에는 이 숫자가 증가하는 것을 볼 수 없습니다.

10000개의 파일을 만든 후에는 72730으로 증가한 것을 볼 수 있습니다.

이 파일들을 모두 삭제해도 숫자는 줄어들지 않지만, FS를 제거하고 다시 설치하면 45634로 바뀌는 것을 볼 수 있습니다.

따라서 제가 이 파일 시스템에 익숙하지 않기 때문에 왜 IUsed반환된 개수가 dfinode 수와 일치하지 않거나 inode가 해당 파일 시스템의 파일 이상의 용도로 사용되는지는 알 수 없습니다. 또는 시스템은 매우 대략적인 경우를 제외하고는 사용된 또는 사용 가능한 i-node 수를 추적하지 않습니다.

o2info --freeinodeocfs2-tools 1.8.2 이상에서 실행 하면 예상에 가까운 숫자를 얻을 수 있습니다.

$ du -ax ///mnt/1 | grep -c ///
102
$ df -i /mnt/1
Filesystem     Inodes IUsed  IFree IUse% Mounted on
/dev/loop0     262144 45634 216510   18% /mnt/1
$ o2info --freeinode /mnt/1
Slot            Space           Free
  0             10240          10129
  1                 0              0
Total           10240          10129
$ echo $((10240-10129))
111

$ touch /mnt/1/a{1..100}
$ o2info --freeinode /mnt/1
Slot            Space           Free
  0             10240          10029
  1                 0              0
Total           10240          10029
$ o2info --freeinode /mnt/1 | awk 'END{print $2-$3}'
211

$ touch /mnt/1/b{1..20000}
$ o2info --freeinode /mnt/1
Slot            Space           Free
  0             20480            259
  1                 0              0
Total           20480            259
$ o2info --freeinode /mnt/1 | awk 'END{print $2-$3}'
20221

이제 기존 파일 시스템의 경우...

디렉터리 항목을 크롤링하여 inode 수와 일치하는 항목을 찾으려면 inode 번호를 기준으로 표시되는 파일을 추적해야 합니다.

find /u -xdev -printf '%i\n' | sort -u | wc -l

du(적어도 GNU 구현에서는) 동일한 파일(하드 링크)의 여러 인스턴스를 건너뛰므로 다음을 사용할 수 있습니다.

 du -xa ///u | grep -c ///

이것 은 당신 에게 동일한 결과 를 줄 것입 니다 find.

df -i일부 파일 시스템(포함 ext4)에는 내부적으로 사용되는 디렉터리에 연결되지 않은 일부 특수 inode가 있기 때문에 결과가 개수보다 약간 작을 것으로 예상했습니다 .

lsof +aL1 /u또한 삭제되었지만 일부 프로세스에 의해 아직 열려 있는 파일( 목록은 참고자료 참조)과 그 안에 마운트된 다른 파일 시스템에 의해 차단된 파일(예제에서는 그렇지 않음) 도 계산하지 못합니다 .

`...`당신처럼 명령 대체( )를 사용하는 것은 잘못되었습니다. 이는 기본적으로 공백을 분할하고 결과 단어에 대해 글로빙 작업을 수행하는 분할+글로브 연산자를 호출합니다. 따라서 파일 이름에 공백, 탭, 줄 바꿈 또는 문자가 포함되지 않은 경우에만 *의미 있는 ?결과가 제공됩니다 [.

ls -a.항목 자체는 제외하고 이미 계산한 일부 inode에 대한 하드 링크이기 때문에 계산하지 않으려는 및 항목을 포함합니다 . 마찬가지로 다른 하드 링크도 여러 번 계산하게 됩니다..../u

답변2

inf inode를 사용하지만 파일 시스템을 통과하는 사용자에게 표시되지 않는 열려 있지만 삭제된 파일이 있기 때문에 이러한 숫자를 일치시킬 수 없습니다.

명령으로 볼 수 없는 숨겨진 inode도 있습니다(예: ACL 정의 및 확장 속성 파일에서 사용) find.

반면에 하드 링크를 여러 번 계산하지 않도록 해야 합니다. 이는 다음을 통해 달성할 수 있습니다.

find /u -xdev -ls | sort -n -u +0 | wc -l

그러나 이렇게 하면 파일 수가 너무 적어지는 경우가 많습니다(위 참조).

관련 정보