![운영 체제는 하드 드라이브에 저장된 파일에 어떻게 액세스합니까?](https://linux55.com/image/191867/%EC%9A%B4%EC%98%81%20%EC%B2%B4%EC%A0%9C%EB%8A%94%20%ED%95%98%EB%93%9C%20%EB%93%9C%EB%9D%BC%EC%9D%B4%EB%B8%8C%EC%97%90%20%EC%A0%80%EC%9E%A5%EB%90%9C%20%ED%8C%8C%EC%9D%BC%EC%97%90%20%EC%96%B4%EB%96%BB%EA%B2%8C%20%EC%95%A1%EC%84%B8%EC%8A%A4%ED%95%A9%EB%8B%88%EA%B9%8C%3F.png)
나는 운영 체제가 하드 디스크에서 가장 먼저 액세스하는 것이 슈퍼블록이라는 것을 알고 있습니다.
그런데 그러면 어쩌죠?
답변1
운영 체제는 읽기/쓰기를 위해 다양한 파일 시스템용 드라이버를 사용하는 커널에 의존합니다. 파일 처리는 드라이버 및 시스템 호출을 통해 인터페이스를 통해 추상화되므로 open("file.txt")
파일이 디스크 등에 저장되는 방법을 알 필요가 없습니다. 다양한 종류의 파일 시스템이 있으며 각각 고유한 작업 방식이 있습니다. 이것은 ext 시스템의 일반적인 스니펫입니다.
확장 예시.
- 빌딩 블록: 디스크는 다음과 같이 나누어져 있습니다.빌딩 블록연속적인 공간.
- 블록 그룹: 블록은 그룹으로 나누어집니다.
- 인덱스 노드: 항목(예: 파일, 디렉터리 등)에 대한 구조화된 정보 집합입니다.
- 목차: 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