파일 블록 크기 - stat와 ls의 차이

파일 블록 크기 - stat와 ls의 차이

나는 다음을 수행했을 때 그것을 발견했습니다.

ls -ls file

이는 블록 수(예: 8개 블록)를 제공합니다.

내가 할 때 :

stat file

나는 블록 수가 ls에 의해 주어진 숫자의 두 배인 16이라는 것을 알았습니다.

내 파일 시스템의 블록 크기는 4096입니다. ls에서 사용하는 임의의 블록 단위는 1024라는 것을 배웠습니다. stat가 블록을 보고할 때 임의의 단위인 512바이트를 사용한다고 말하는 것이 맞나요?

그렇다면 불일치의 이유가 있습니까?

저는 ext4 파일 시스템에서 Ubuntu 11.10을 실행하고 있습니다.

답변1

많은 디스크의 섹터 크기는 512바이트입니다. 이는 디스크에 대한 읽기 또는 쓰기가 한 번에 전체 512바이트 섹터를 전송한다는 것을 의미합니다. 파일 간에 섹터가 분할되지 않도록 파일 시스템을 설계하면(이로 인해 설계가 복잡해지고 성능이 저하됨) 파일 시스템이 512바이트 파일 블록을 사용하는 경향이 있습니다. 따라서 ls및 와 같은 레거시 유틸리티는 du크기를 512바이트 블록으로 표시합니다.

인간에게 512바이트 단위는 거의 의미가 없습니다. 1kB는 크기와 동일하며 더 의미가 있습니다. 파일 시스템 블록(파일 파티셔닝의 가장 작은 단위)은 실제로 여러 섹터로 구성됩니다. 1kB, 2kB 및 4kB는 일반적인 파일 시스템 블록 크기이므로 파일 시스템 설계는 512바이트 단위를 완전히 정당화하지 못합니다. 디스크 드라이버 외부에서 512바이트 단위를 사용하는 전통 외에는 타당한 이유가 없습니다.

따라서 장점이 많지 않은 전통이 있고, 더 읽기 쉬운 규칙이 등장하고 있습니다. 이는 8진수와 16진수와 약간 비슷합니다. 옳고 그름은 없으며 단지 같은 숫자를 쓰는 방법이 다를 뿐입니다.

많은 도구에는 표시 단위를 선택할 수 있는 옵션이 있습니다. ls --block-size=512GNU의 경우 GNU 및 GNU 환경에서 ls512바이트 단위를 얻도록 설정합니다(또는 1kB 단위를 강제로 전달하도록 전달). GNU coreutils의 명령이 "blocksize"(값)로 표시하는 것은 운영 체제에 따른 내부 인터페이스 값이며, 파일 시스템이나 디스크 코드에서 사용하는 크기와 관련될 수도 있고 그렇지 않을 수도 있습니다. (보통 그렇지 않습니다 - 참조POSIXLY_CORRECT=1dfdu-kstat%B블록 크기와 클러스터 크기의 차이점). Linux에서는 기본 드라이버가 수행하는 작업에 관계없이 값이 512입니다. 가치는 %B결코 중요하지 않습니다. 그 존재는 단지 별난 것일 뿐입니다.

답변2

소스 코드와 POSIX 표준을 자세히 살펴본 후 @antje-m과 @Gilles의 답변이 대부분 정확하다고 말하고 싶습니다.

인용할 가치가 있는 의견POSIX.1-2008,결론적으로:

512바이트 단위를 사용하는 것은 역사적 관례이며 이 POSIX.1-2008 볼륨에서 ls 및 기타 유틸리티와의 호환성을 유지합니다. 이는 파일 시스템 자체가 512바이트 블록을 기반으로 할 필요는 없습니다. 절충안으로 -k 옵션을 추가했습니다. 표준 개발자들은 512바이트가 System V에서 완전한 기록 일관성을 갖고(BSD 시스템에서 512/1024바이트를 혼합하여 사용하는 것과는 대조적으로) 가장 좋은 기본 단위라는 데 동의하며, -k 옵션은 1024바이트 단위로 전환할 수 있습니다. 좋은 타협. 보다 논리적인 1024바이트 숫자를 선호하는 사용자는 512바이트 단위를 사용하는 많은 기록 스크립트를 손상시키지 않고도 df -k로 쉽게 별칭을 지정할 수 있습니다.

블록 크기의 경우 ls -s:

POSIX설명하다-k옵션이 제공되지 않는 한 기본 블록 크기는 구현에 따라 정의됩니다 .

에서 구현된 기본 블록 크기는 GNU coreutils ls다음에서 정의됩니다 GNU gnulib. gnulib/lib/human.c

/* The default block size used for output.  This number may change in
   the future as disks get larger.  */
#ifndef DEFAULT_BLOCK_SIZE
# define DEFAULT_BLOCK_SIZE 1024
#endif

이전 커밋에서:

commit 96e78d1f64d7c8d2acc5ad27dc3e73b96ae80585
Author: Jim Meyering <[email protected]>
Date:   Mon Jun 29 15:23:04 1998 +0000

커밋 메시지 자체에는 숫자 1024에 대한 내용이 없습니다.

du그리고 에서 사용된 블록 크기 df도 1024이며 ls일관성을 유지하기 위해 선택되었습니다. POSIX 표준 dudf충돌 하기는 하지만 (여기에는 POSIXLY_CORRECT환경 변수가 있습니다). 이는 GNU 팀의 결정인 것 같습니다. Wikipedia 페이지를 참조하세요.POSIX이번 논란에 대해.

주문을 위해 stat.

POSIX 표준의 일부는 아니지만stat 시스템 호출예. 그러나 블록 크기의 단위는 표준화되어 있지 않습니다(sys_stat.h):

stat 구조의 st_blocks 멤버 단위는 POSIX.1-2008에 정의되어 있지 않습니다.

stat명령은 시스템 호출에 의해 제공되는 정보만 표시 stat하고 몇 가지 예외를 제외하고 512 블록 크기를 사용합니다(HP-UX, IBM AIX 등과 같은 비 Linux입니다. 에 정의된 매크로 참조 gnulib/lib/stat-size.h).

따라서 512라는 숫자는 역사적인 선택이자 Linux 규칙에 가깝습니다.

GNU coreutils(따라서 명령 ls)은 Linux 커널(따라서 이름 stat)의 일부가 아니며 다양한 시스템 측면을 대상으로 하며 GNU coreutils보다 인간 친화적인(읽기 쉬운) 반면 Linux 커널은 하드웨어 추상화(따라서 하드웨어에 더 가깝습니다)를 대상으로 합니다.

편집: 4096 블록 크기는 "IO 블록" 크기이며, 실제 물리적 블록 크기는 여전히 512바이트일 것입니다.이 질문이 설명 하듯이.

답변3

stat명령은 하드 디스크의 물리적 블록 크기를 사용합니다. 1956년 출시 이후 거의 모든 하드 드라이브는 512바이트 블록을 사용해 왔습니다. 그러나 최근 고급 형식이 도입되면서 이러한 상황이 바뀌기 시작했습니다.

ls1024바이트 블록 크기에도 역사적인 이유가 있을 것으로 생각됩니다 . 파일 시스템의 블록 크기는 1024로 일반적이었을 수도 있고 크기를 킬로바이트 단위로 제공하는 데 사용되었을 수도 있습니다. 그러나 (적어도 의 경우 GNU coreutils) options 를 사용하여 블록 크기를 지정할 수 있습니다 --block-size=.

관련 정보