나는 OS가 하드디스크에서 가장 먼저 접근하는 것이 슈퍼블록이라는 것을 알고 있다.
그런데 그러면 어쩌죠?
답변1
OS는 읽기/쓰기를 위해 다양한 파일 시스템용 드라이버를 사용하는 커널에 의존합니다. 파일 처리는 인터페이스를 통해 드라이버 및 시스템 호출을 통해 추상화되므로 open("file.txt")
파일이 디스크 등에 저장되는 방법을 알 필요가 없습니다. 각각 고유한 방식을 가진 다양한 파일 시스템이 있습니다. 물건을 다루는 것. 다음은 ext 시스템의 일반적인 스니펫입니다.
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 수
- 총 블록 수
- 그룹의 블록 수
- 그룹의 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