운영 체제는 하드 드라이브에 저장된 파일에 어떻게 액세스합니까?

운영 체제는 하드 드라이브에 저장된 파일에 어떻게 액세스합니까?

나는 운영 체제가 하드 디스크에서 가장 먼저 액세스하는 것이 슈퍼블록이라는 것을 알고 있습니다.

그런데 그러면 어쩌죠?

답변1

운영 체제는 읽기/쓰기를 위해 다양한 파일 시스템용 드라이버를 사용하는 커널에 의존합니다. 파일 처리는 드라이버 및 시스템 호출을 통해 인터페이스를 통해 추상화되므로 open("file.txt")파일이 디스크 등에 저장되는 방법을 알 필요가 없습니다. 다양한 종류의 파일 시스템이 있으며 각각 고유한 작업 방식이 있습니다. 이것은 ext 시스템의 일반적인 스니펫입니다.


확장 예시.

  1. 빌딩 블록: 디스크는 다음과 같이 나누어져 있습니다.빌딩 블록연속적인 공간.
  2. 블록 그룹: 블록은 그룹으로 나누어집니다.
  3. 인덱스 노드: 항목(예: 파일, 디렉터리 등)에 대한 구조화된 정보 집합입니다.
  4. 목차: inode <–> 이름 목록

블록 그룹이 그룹에 속하는 inode 구조 테이블이 있습니다.


핵심 레이아웃:

                     Padding  1024 bytes
                 Super-Block  1 block          *
Block Group Descriptor Table  many blocks      *
                    Reserved  many blocks
           Data Block Bitmap  1 block          *
                inode Bitmap  1 block          *
                 inode Table  many blocks      *
                 Data Blocks  many more blocks *

슈퍼 블록다음 정보가 포함되어 있습니다.

  • 총 인덱스 노드 수
  • 총 블록 수
  • 그룹의 블록 수
  • 그룹의 inode 수

중복 복사본은 블록 그룹 0에 저장되는 것 외에도 백업(손상 시)으로 다른 곳에 저장됩니다.


블록 그룹 설명자 테이블직접적으로슈퍼블록. 여기에는 다음이 포함됩니다.

  • 수량블록 그룹분할 중
  • 각 설명자블록 그룹

각 설명자는 설명자의 데이터 구조에 대한 정보를 포함합니다.블록 그룹눕다.


블록 그룹무엇보다도 다음과 같이 확립되었습니다.

  • inode 테이블이 시작되는 블록 주소
  • 그룹의 디렉터리 수

비트맵사용량에 대한 정보를 저장합니다. 0미사용 및 1중고.


인덱스 노드(인덱스 노드)

inode 구조의 기능은 다음과 같습니다.아니요잡다:

  • 이름
  • 파일 데이터

인덱스 노드에는 다음 정보가 포함됩니다.

  • 유형, 권한, 사용자, 날짜...데이터에 대한 포인터

파일의 데이터는 블록에 저장됩니다. inode에는 파일이 차지하는 블록에 대한 정보가 들어 있습니다. 이는 inode의 포인터를 통해 수행됩니다. 하나 이상이 있습니다유형바늘. 데이터 PTR에 대한 포인터를 호출하면 다음과 같습니다.

[PTR] 데이터 블록의 주소

  • 12 - 직접 포인터:
    • [PTR] 데이터 블록의 주소
  • 1 - 단일 간접 포인터:
    • [S_PTR] PTR 목록이 포함된 블록 주소
  • 1 - 이중 간접 포인터:
    • [D_PTR] S_PTR 목록이 포함된 블록 주소
  • 1 - 삼중 간접 포인터:
    • [T_PTR] D_PTR 목록이 포함된 블록 주소

포인터의 수막힌에 따라블록 크기.


목차

디렉터리는 인덱스 노드입니다. 해당 데이터에는 파일에 대한 정보가 들어 있습니다. 각 항목은 이름 및 색인 노드에 연결됩니다. 각 디렉토리에는 상위 디렉토리에 효과적으로 연결된 .고유한 디렉토리도 있습니다 . ..이는 삭제할 수 없습니다.

루트 디렉터리에는 항상 확장자에 inode 2가 있습니다. 해보 stat /거나 cd /; stat .해보세요. 그 ..링크는.

파일이 생성되면 올바른 디렉터리에 방향적으로 추가됩니다.


inode 번호는 인덱스입니다. 이는 inode 테이블에서 인덱스-인덱스-노드 구조로 정렬됩니다. 인덱스 노드 구조의 크기는 고정되어 있으므로 인덱스 노드 구조의 위치를 ​​계산할 수 있다.

슈퍼블록에는각 그룹의 인덱스 노드블록 그룹은 다음을 통해 찾을 수 있습니다.

block_group = (inode - 1) / inodes_per_group;

그런 다음 색인을 찾으십시오.

inode_index = (inode - 1) % inodes_per_group;

구조 및 데이터 연결에 대해 읽어보세요. 데이터를 읽습니다.

디버그 파일

debugfs파일 시스템에 대한 다양한 정보를 추출하는 데 사용할 수 있습니다 .

-w데이터에 관심이 있다면 해당 플래그를 사용하지 마십시오.

가지고 놀 수 있는 작은 샘플을 만드는 옵션이 있습니다.

truncate -s 2M test
mkfs.ext4 -F test
mkdir x
sudo mount test x
sudo chown me x
cd x
echo "Hello Disk" >hello.txt
mkdir a b c
echo "Hello Bee" >b/hib.txt
sudo unount x
debugfs test

?명령 목록을 입력합니다 .


debugfs: stats(축소)

Inode count:              256
Block count:              2048
Reserved block count:     102
Free blocks:              953
Free inodes:              240
First block:              1
Block size:               1024
Fragment size:            1024
Group descriptor size:    64
Blocks per group:         8192
Inodes per group:         256
Inode blocks per group:   32
First inode:              11
Inode size:               128
Directories:              5
 Group  0: block bitmap at 18, inode bitmap at 34, inode table at 50
           953 free blocks, 240 free inodes, 5 used directories, 240 unused inodes
           [Checksum 0x055a]
...
debugfs:  imap hello.txt
Inode 12 is part of block group 0
    located at block 51, offset 0x0180

다른 예: https://www.cs.montana.edu/courses/309/topics/4-disks/debugfs_example.html

관련 정보