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


9

내가 할 때 :

ls -ls file

8 개의 블록과 같은 블록 수를 제공합니다.

내가 할 때 :

stat file

블록 수는 16이며 ls로 주어진 수의 두 배입니다.

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

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

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

답변:


9

많은 디스크의 섹터 크기는 512 바이트입니다. 즉, 디스크에서 읽거나 쓰면 전체 512 바이트 섹터가 한 번에 전송됩니다. 섹터가 파일로 분할되지 않은 파일 시스템을 디자인하는 것은 자연스러운 일입니다 (디자인을 복잡하게하고 성능을 저하시킬 수 있습니다). 따라서 파일 시스템은 파일에 512 바이트 청크를 사용하는 경향이 있습니다. 같은 따라서 기존의 유틸리티 ls와는 du512 바이트 청크 단위로 크기를 표시합니다.

인간의 경우 512 바이트 단위는 그다지 의미가 없습니다. 1kB는 크기가 같고 훨씬 더 의미가 있습니다. 파일 시스템 블록 (파일이 분할 된 가장 작은 단위)은 실제로 여러 섹터로 구성됩니다. 1kB, 2kB 및 4kB는 일반적인 파일 시스템 블록 크기입니다. 따라서 512 바이트 단위는 파일 시스템 설계에 의해 강력하게 정당화되지 않으며 디스크 드라이버 외부에서 512 바이트 단위를 사용하는 전통 이외의 다른 이유는 없습니다.

그래서 당신은 그것을 많이 가지지 않는 전통과 더 읽기 쉬운 규칙을 가지고 있습니다. 8 진수와 16 진수와 같은 것입니다. 옳고 그른 것은 없으며, 같은 숫자를 쓰는 다른 방법입니다.

많은 도구에는 표시 단위를 선택할 수있는 옵션이 있습니다. ls --block-size=512GNU의 ls경우 POSIXLY_CORRECT=1GNU df및 GNU 환경에서 du512 바이트 단위를 가져 오도록 설정 (또는 -k1kB 단위 강제로 전달 ) 옵션이 있습니다. statGNU coreutils 의 명령이“블록 크기”( %B값)로 표시하는 것은 내부 인터페이스의 OS 종속 값입니다. OS에 따라 파일 시스템 또는 디스크 코드에서 사용하는 크기와 관련이있을 수도 있고 아닐 수도 있습니다 (보통 그렇지 않습니다 — 블록 크기와 클러스터 크기의 차이 참조 ). Linux에서 기본 드라이버가 수행하는 작업에 관계없이 값은 512입니다. %B결코 가치가 없다. 그것은 그것이 존재하는 기발한 것일 뿐이다.


4

소스 코드와 POSIX 표준을 파헤친 후 @ antje-m과 @Gilles의 대답이 대부분 정확하다고 말합니다.

POSIX.1-2008 의 의견을 요약 하여 인용 할 가치가 있습니다 .

512 바이트 단위의 사용은 역사적 관행이며 POSIX.1-2008의이 볼륨에서 ls 및 기타 유틸리티와의 호환성을 유지합니다. 이것은 파일 시스템 자체가 512 바이트 블록을 기반으로하도록 요구하지는 않습니다. -k 옵션이 절충 조치로 추가되었습니다. 표준 개발자는 시스템 V에 대한 전체 기록 일관성 (BSD 시스템에서 혼합 된 512/1024 바이트 사용과 비교하여)이 512 바이트가 최고의 기본 단위이며 1024- 바이트 단위는 좋은 타협이었습니다. 보다 논리적 인 1024 바이트 수량을 선호하는 사용자는 512 바이트 단위에 의존하는 많은 히스토리 스크립트를 손상시키지 않고 df를 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 <jim@meyering.net>
Date:   Mon Jun 29 15:23:04 1998 +0000

커밋 메시지 자체는 숫자 1024에 대해 아무 말도하지 않았습니다.

그리고 사용 된 블록 크기 는 1024 du이며 블록 으로 구성되도록 선택했습니다. POSIX 표준 과 의 충돌 이지만 환경 변수 가 있습니다. 이것은 GNU 팀의 결정 인 것 같습니다 .이 논쟁에 대한 위키 백과 페이지 POSIX를 참조하십시오 .dflsdudfPOSIXLY_CORRECT

명령을 위해 stat.

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

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

stat명령은 stat시스템 호출 에 의해 제공된 정보를 표시하고 512 블록 크기를 거의 사용하지 않고 512 블록 크기를 사용합니다 (예 : HP-UX, IBM AIX 등은 Linux가 아닌 경우에 정의 된 매크로 참조 gnulib/lib/stat-size.h).

따라서 512 번은 역사적 선택과 리눅스 관습입니다.

GNU coreutils(따라서 ls명령) 리눅스 커널 (따라서의 일부가 아닌 stat전화), 서로 다른 시스템 측면을 목표로하고, GNU coreutils더 인간에 대한 (읽기 쉽게), 그리고 추상적 인 하드웨어 리눅스 커널 (따라서 가까운 하드웨어).

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


1

stat명령은 하드 디스크의 물리적 블록 크기를 사용합니다. 기본적으로 모든 하드 디스크는 1956 년에 시작된 이후 512 바이트 블록을 사용했습니다. 그러나 이것은 최근 고급 형식으로 변경되기 시작했습니다.

ls'1024byte-blocksize에도 역사적인 이유가 있다고 생각합니다 . 파일 시스템의 블록 크기가 1024 인 것이 일반적 이었거나 킬로바이트 단위의 크기를 제공하는 데 사용 된 것 같습니다. 그러나 (적어도 GNU coreutils) --block-size=옵션을 사용하여 블록 크기를 지정할 수 있습니다 .

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