파일은 순차적으로 디스크에 저장되나요?

파일은 순차적으로 디스크에 저장되나요?

내가 이해한 바에 따르면 "스파스 파일"은 파일에 "간격"이 있을 수 있으므로 사용되는 실제 데이터가 논리 파일 크기보다 작을 수 있음을 의미합니다.

Linux 파일 시스템은 어떻게 디스크에 파일을 저장합니까? 저는 주로 ext4에 관심이 있습니다. 하지만:

  1. 파일을 저장할 수 있나요?아니요디스크에 순서대로? 즉, 파일의 일부는 물리적 주소 X에 있고 다음 부분은 물리적 주소 Y(X + 오프셋에 가깝지 않음)에 있습니다.
  2. 어떻게든 파일 순서를 제어할 수 있나요?
    10GB 파일을 할당하고 싶습니다. 서로 다른 오프셋으로 나누는 대신 디스크에서 연속적으로 표시되기를 원합니다.
  3. 종류별로 효과가 다른가요?

답변1

파일을 저장할 수 있나요?아니요디스크에 순서대로? 즉, 파일의 일부는 물리적 주소 X 아래에 있고 다른 부분은 X + 오프셋에 가깝지 않은 물리적 주소 Y 아래에 있습니다.

예, 이는 파일 조각화라고 하며 특히 대용량 파일의 경우 흔히 발생합니다. 대부분의 파일 시스템은 필요에 따라 공간을 다소 순차적으로 할당하지만 향후 동작을 추측할 수는 없습니다. 따라서 파일에 200MiB를 쓴 다음 100MiB를 추가하면 두 데이터 세트가 모두 나타날 가능성이 있습니다. 0이 아닌 값은 다음과 같습니다. 디스크의 다른 영역에 저장됩니다(기본적으로 첫 번째 쓰기 후와 두 번째 쓰기 전에 발생하는 더 많은 디스크 공간이 필요한 다른 쓰기가 그 사이에 발생할 수 있음). 파일 시스템이 거의 가득 차면 상황은 더 악화되는 경우가 많습니다. 새 파일을 수용할 만큼 충분한 연속 여유 공간이 없을 수 있으므로 조각화해야 합니다.

어떻게든 파일 순서를 제어할 수 있나요? 10GB의 대용량 파일을 할당하고 싶습니다. 서로 다른 오프셋으로 나누는 대신 디스크에서 연속적으로 사용되기를 원합니다.

파일을 생성할 때 파일 시스템에 파일의 대상 크기를 알려줄 수 있습니다. 이는 파일 시스템이 파일을 최적으로 저장하는 데 도움이 됩니다. 많은 최신 파일 시스템은 지연 할당이라는 기술을 사용합니다. 이 기술에서는 새 파일의 디스크 레이아웃을 가능한 한 늦게 계산하여 계산 수행 시 사용 가능한 정보를 최대화합니다. 다음을 사용하여 이 프로세스를 도울 수 있습니다.posix_fallocate(3)이 함수는 할당해야 하는 총 디스크 공간의 양을 파일 시스템에 알려줍니다. 최신 파일 시스템은 이 할당을 순차적으로 수행하려고 시도합니다.

종류별로 효과가 다른가요?

다른 파일 시스템은 다르게 동작합니다. 그렇습니다. 저널 기반 파일 시스템(예: NILFS2)은 확장 기반 파일 시스템(예: Ext4)과 동일한 방식으로 스토리지를 할당하지 않습니다. 이는 변경 사항의 한 예일 뿐입니다.

답변2

이 명령은 filefrag파일이 장치에 물리적으로 어떻게 저장되는지 알려줍니다.

# filefrag -v /var/log/messages.1 
Filesystem type is: ef53
File size of /var/log/messages.1 is 41733 (11 blocks, blocksize 4096)
 ext logical physical expected length flags
   0       0  2130567               1 
   1       1 15907576  2130568      1 
   2       2 15910400 15907577      1 
   3       3 15902720 15910401      7 
   4      10  2838546 15902727      1 eof
/var/log/messages.1: 5 extents found

한 번에 파일을 작성하면 파일이 조각화되지 않을 것 같습니다.

(1)의 매뉴얼 페이지는 fallocate매우 명확합니다.

fallocate 파일에 블록을 사전 할당하는 데 사용됩니다. 시스템 호출을 지원하는 파일 시스템 의 경우 fallocate데이터 블록에 대한 IO를 요구하지 않고 블록을 할당하고 초기화되지 않은 것으로 표시하여 이를 신속하게 수행할 수 있습니다. 이는 파일을 0으로 채워서 생성하는 것보다 훨씬 빠릅니다.

Linux Kernel v2.6.31부터 fallocatebtrfs, ext4, ocfs2 및 xfs 파일 시스템에 대한 시스템 호출이 지원됩니다.

순차적인가요? 시스템은 먼저 블록을 순차적으로 할당하려고 시도합니다. 그렇지 않으면 경고하지 않습니다.

답변3

희소 파일을 언급했지만 다른 답변에서는 언급하지 않았습니다.

대부분의 파일은 희박하지 않습니다. 파일을 만드는 가장 일반적인 방법은 처음부터 끝까지 한 번에 쓰는 것입니다. 거기에는 구멍이 없습니다.

그러나 "1,000,000,000,000 위치로 이동하여 거기에 바이트를 씁니다"라고 말할 수 있습니다. 이렇게 하면 에타바이트 크기로 보이는 파일이 생성되지만 실제로는 디스크에서 (아마도) 4k만 사용합니다. 이것은 스파스 파일입니다.

동일한 파일에서 이 작업을 여러 번 수행하여 방대한 공백에 소량의 데이터를 분산시킬 수 있습니다.

이는 유용하지만 두 가지 단점이 있습니다.

첫 번째는 파일이 조각화될 것이라는 점입니다. 이것이 바로 여러분이 걱정하는 것입니다.

두 번째는 모든 프로그램이 이러한 파일을 잘 처리하는 것은 아니라는 것입니다. 예를 들어, 일부 백업 소프트웨어는 공백 백업을 시도하여 필요한 것보다 훨씬 더 큰 백업을 생성합니다.또한백업 미디어에 적합합니다.

답변4

이것이 일회성이고 파일이 원래 어떻게 저장되었는지는 중요하지 않고 결과만 중요하다면 파일을 정상적으로 저장한 다음 운영 체제의 조각 모음을 실행할 수 있습니다. 그러면 확인할 수 있습니다이 답변파일이 완성되었다면, 그렇지 않다면 반복하세요. 이는 명령이나 외부 프로그램을 사용하지 않는 가장 간단한 방법이지만 전체 디스크 조각 모음을 수행하므로 가장 빠른 방법은 아닙니다.

관련 정보