OS는 하드 디스크에 저장된 파일에 어떻게 액세스합니까?

OS는 하드 디스크에 저장된 파일에 어떻게 액세스합니까?

나는 OS가 하드디스크에서 가장 먼저 접근하는 것이 슈퍼블록이라는 것을 알고 있다.

그런데 그러면 어쩌죠?

답변1

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


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 수
  • 총 블록 수
  • 그룹의 블록 수
  • 그룹의 inode 수

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


블록 그룹 설명자 테이블바로 뒤에 있습니다슈퍼블록. 이는 무엇보다도 다음과 같은 내용을 담고 있습니다:

  • 블록 그룹파티션에서
  • 각각에 대한 설명블록 그룹

각 설명자가 해당 데이터 구조의 위치에 대한 정보를 포함하는 경우블록 그룹위치.


블록 그룹특히 다음 사항을 보유합니다.

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

비트맵사용에 대한 정보를 보유하고 있습니다. 0미사용 및 1중고용.


아이노드(인덱스 노드)

inode 구조는 다음과 같습니다.~ 아니다잡고 있다:

  • 이름
  • 파일 데이터

inode에는 다음과 같은 정보가 들어 있습니다.

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

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

[PTR] DATA로 차단할 주소

  • 12 - 직접 포인터:
    • [PTR] DATA로 차단할 주소
  • 1 - 단일 간접 포인터:
    • [S_PTR] PTR 목록으로 차단할 주소
  • 1 - 이중 간접 포인터:
    • [D_PTR] S_PTR 목록으로 차단할 주소
  • 1 - 삼중 간접 포인터:
    • [T_PTR] D_PTR 목록으로 차단할 주소

하나의 포인터 수차단하다에 의존한다블록 크기.


예배 규칙서

디렉토리는 inode입니다. 해당 데이터에는 파일에 대한 정보가 들어 있습니다. 각 항목은 이름과 inode를 연결합니다. 각 디렉토리에는 .자체적으로 ..상위 디렉토리에 효과적으로 연결되는 가 있습니다. 이는 삭제할 수 없습니다.

루트 디렉토리에는 항상 ext에 inode 2가 있습니다. 해보 stat /거나 cd /; stat .해보세요. ..에 대한 링크 입니다.

파일이 생성되면 적절한 디렉토리에 방향적으로 추가됩니다.


Inode 번호는 인덱스입니다. 이는 inode 테이블의 inode 구조에 대한 정렬된 인덱스입니다. inode 구조의 크기는 고정되어 있으므로 inode 구조의 위치를 ​​계산할 수 있습니다.

슈퍼블록에는inodes_per_group다음을 통해 블록 그룹을 찾을 수 있습니다.

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

관련 정보