首页 > 其他分享 >20201311陈子昂第十一章学习笔记

20201311陈子昂第十一章学习笔记

时间:2022-10-02 12:55:53浏览次数:59  
标签:count name 第十一章 文件系统 索引 u32 陈子昂 20201311 节点

第十一章学习笔记

EXT2文件系统

EXT2第二代扩展文件系统second extended filesystem,缩写为ext2,是LINUX内核所用的文件系统。它开始由Rémy Card设计,用以代替ext,于1993年1月加入linux核心支持之中。ext2 的经典实现为LINUX内核中的ext2fs文件系统驱动,最大可支持2TB的文件系统,至linux核心2.6版时,扩展到可支持32TB。其他的实现包括GNU Hurd,Mac OS X ,Darwin ,BSD。ext2为数个LINUX发行版的默认文件系统,如Debian、Red Hat Linux等。

其单一文件大小与文件系统本身的容量上限与文件系统本身的簇大小有关,在一般常见的 x86 电脑系统中,簇最大为 4KB, 则单一文件大小上限为 2048GB, 而文件系统的容量上限为 16384GB。

但由于目前核心 2.4 所能使用的单一分割区最大只有 2048GB,实际上能使用的文件系统容量最多也只有 2048GB。

至于Ext3文件系统,它属于一种日志文件系统,是对ext2系统的扩展。它兼容ext2,并且从ext2转换成ext3并不复杂。

EXT2文件系统数据结构

1.通过mkfs创建虚拟磁盘
在 Linux下,命令

mke2fs [-b blksize -N ninodes] device nblocks

在设备上创建一个带有nblocks个块(每个块大小为blksize字节)和 ninodes 个索引节点的EXT2文件系统。设备可以是真实设备,也可以是虚拟磁盘文件。如果未指定blksize.则默认块大小为1KB。如果未指定ninoides,mke2fs将根据 nblocks计算一个默认的ninodes数。得到的 EXT2文件系统可在 Linux 中使用。举个具体的例子,下面的命令

dd if=/dev/zero of=vdisk bs=1024 count=1440

mke2fs vdisk 1440

可在一个名为vdisk的虚拟磁盘文件上创建一个EXT2文件系统,有1440个大小为1KB 的块。

2.Block#0:引导块 B0是引导块,文件系统不会使用它。它用来容纳一个引导程序,从磁盘引导操作系统。
3.Block#1:超级块(在硬盘分区中字节偏移量为1024) B1是超级块,用于容纳整个文件系统的信息。
struct ext2_guper_block {

u32 s_inodes_count; /* Inodes count */

u32 s_blocks_count; /* Blocks count*/

u32 s_r_blocks_count; /* Reserved blocks count */

u32 s_free_blocks_count; / * Free blocks count */

u32 s_free_inodes_count; /* Free inodes count */

u32 s_first__data_blook; /* First Data Block */

u32 s_log_block_size; /* Block size */

u32 s_log_cluster_size; /* Allocation cluster size */

u32 s_blocks_per_group; /* # Blocks per group*/

u32 s_clusters_per_group; /*# Fragments per group */

u32 s_inodes_per_group; /* # Inodes per group*/

u32 s_mtime;u32 s_wtime; /* Mount time */

u16 s_mnt_count; /* Write time */

s16 s_max_mnt_count; /_Mount_count/L

u16 8_magic; /* Magic signature */

// more non-essential fields

u16 s_inode_size; /* size of inode structure*/

}

4.Block#2∶块组描述符块(硬盘上的s first data block+1)EXT2将磁盘块分成几个组。每个组有8192个块(硬盘上的大小为32K)。每组用一个块组描述符结构体来描述。
struct ext2_group_desc {

u32 bg_block_bitmap; // Bmap block number

u32 bg_inode_bitmap; // Imap block number

u32 bg_inode_table; // Inodes begin block number

u16 bg_free_blocks_count; // THESE are OBVIOUS

u16 bg_free_inodes_count;

ul6 bg_used_dirs_count;

u16 bg_pad; // ignore these

u32 bg_reserved[3];

};

5.Block#8∶块位图(Bmap)(bg block bitmap)位图是用来表示某种项的位序列,例如磁盘块或索引节点。位图用于分配和回收项。在位图中,0位表示对应项处于FREE状态,1位表示对应项处于IN USE状态。一个软盘有1440个块,但是 Block#0未被文件系统使用。所以,位图只有1439个有效位。无效位被视作INUSE,设置为1。
Block#9∶索引节点位图(Imap)(bg inode bitmap)一个索引节点就是用来代表一个文件的数据结构。EXT2文件系统是使用有限数量的索引节点创建的。各索引节点的状态用B9的Imap 中的一个位表示。在EXT2 FS中,前10个索引节点是预留的。所以,空 EXT2 FS的Imap 以10个1开头,然后是0。无效位再次设置为1。
6.Block#10∶索引(开始)节点(bg inode table)每个文件都用一个128字节(EXT4中是256字节)的唯一索引节点结构体表示。
struct ext2_inode {

u16 i_mode; // 16 bits=|tttt |ugs|rwx|rwx|rwxl

ul6 i_uid; // owner uid

u32 i_size; // file size in bytes

u32 i_atime; // time fields in seconds

u32 1_ctime; // since 00:00:00,1-1-1970

u32 i_mtime;

u32 i_dtime;

i_gid; // group ID u16

u16 i_links_count; // hard-link count

u32 i_blocks;u32 i_flags; // number of 512-byte sectors

u32 i_reservedl; // IGNORE // IGNORE

u32 i_block[15]; // See details below

u32 i_pad[7]; // for inode size = 128 bytes

}

直接块: block[0]至iblock[11],指向直接磁盘块。
间接块:iblock[12]指向一个包含256个块编号(对于1KB BLKSIZE)的磁盘块,每个块编号指向一个磁盘块。
双重间接块:i block[13]指向一个指向 256个块的块,每个块指向256个磁盘块。
三重间接块:iblock[14]是三重间接块。对于"小型"EXT2文件系统,可以忽略它。
7.数据块
紧跟在索引节点块后面的是文件存储数据块。

8.目录条目
struct ext2_dir_entry_2{

u32 inode; // inode number; count from 1,NOT 0

u16 rec_len; // this entry's length in bytes

u8 name_len; // name length in bytes

u8 file_type; // not used

char name[EXT2_NAME_LEN]; // name:1-255 chars,no ending NULL ;

};
目录包含dir_entry 结构,dir_entry 是一种可扩充结构。名称字段包含1到255个字符,不含终止NULL。所以dir entry 的 rec len也各不相同。

11.3 邮差算法

一个城市有M个街区,编号从0到M-1.每个街区有N座房子,编号从0到N-1.每座房子有一个唯一的街区地址,用(街区,房子)表示。已知某个街区地址BA=(街区,房子),怎么把它转换为线性地址LA,或者已知线性地址,怎么转换为街区地址?

Linear_address LA=N*block + house;

Block_address BA=(LA/N,LA%N);

1.C语言中的Test-Set-Clear位
struct bits{

unsigned int bit0 : 1; //bit0 field is a single bit

unsigned int bit123 : 3; // bit123 field is a range of 3 bits

unsigned int otherbits :27; // other bits field has 27 bits

unsigned int bit31 :1; // bit31 is the highest bit

}var;

2.将索引节点号转换为磁盘上的索引节点
在 EXT2文件系统中,每个文件都有一个唯一的索引节点结构。在文件系统磁盘上,索引节点从inode table块开始。每个磁盘块包含

INODES_PER_BLOCK = BLoCK_SIZE/sizeof(INODE)

个索引节点。每个索引节点都有一个唯一的索引节点号,ino=1,2,…,从1开始线性计数。已知一个ino,如1234,那么哪个磁盘块包含该索引节点,以及哪个索引节点在该块中呢?我们需要知道磁盘块号,因为需要通过块来读/写一个真正的磁盘。

11.4编程示例

安装ext2fs开发包:sudo apt-get install ext2fs-dev

11.5遍历EXT2文件系统树

(1)读取超级块。检查幻数s_magic(0xEF53),验证它确实是 EXT2 FS。
(2)读取块组描述符块(1 + s_first_data_block),以访问组0描述符。从块组描述符的bg_inode_table条目中找到索引节点的起始块编号,并将其称为InodesBeginBlock。
(3)读取 InodeBeginBlock,获取/的索引节点,即 INODE#2。
(4)将路径名标记为组件字符串,假设组件数量为n。例如,如果路径名 =/a/b/c,则组件字符串是"a""b""c",其中n=3。用name[0],name[1],…,name[n-1]来表示组件。
(5)从(3)中的根索引节点开始,在其数据块中搜索 name[0]。为简单起见,我们可以假设某个目录中的条目数量很少,因此一个目录索引节点只有12个直接数据块。有了这个假设,就可以在12个(非零)直接块中搜索 name[0]。目录索引节点的每个数据块都包含以下形式的 dir entry 结构体;
[ino rec_len name_len NAME] [ino rec_len name_len NAME]....
其中NAME是一系列nlen字符,不含终止NUL。对于每个数据块,将该块读入内存并使用 dir_entry dp指向加载的数据块。然后使用 name_len将NAME提取为字符串,并与name[0]进行比较。如果它们不匹配,则通过以下代码转到下一个dir_entry:
dp =(dir_entry
)((char *)dp + dp->rec_len);
继续搜索。如果存在 name[0],则可以找到它的 dir_entry,从而找到它的索引节点号。
(6)使用索引节点号ino来定位相应的索引节点。回想前面的内容,ino 从1开始计数。使用邮差算法计算包含索引节点的磁盘块及其在该块中的偏移量。

blk =(ino - 1) / INODE8_PER_BLOCK + InodesBeginBlock;
offset = (ino - 1) % INODES_PER_BLOCK;
然后在索引节点中读取/a,从中确定它是否是一个目录(DIR)。如果/a不是目录,则不能有/a/b,因此搜索失败。如果它是目录,并且有更多需要搜索的组件,那么继续搜索下一个组件 name[1]。现在的问题是∶在索引节点中搜索/a的 name[1],与第(5)步完全相同。
(7)由于(5)~(6)步将会重复n次,所以最好编写一个搜索函数∶

u32 search (INODE *inodePtr, char *name)
{
// search for name in the data blocks of current DIR inode
// if found, return its ino; else return 0 )
}
然后我们只需调用 search()n次,如下所示。

Assume:n,name[0],....,name[n-1] are globals
INODE *ip points at INODE of /
for(i=0; i<n; i++)
{
ino = search(ip, name[4])
if(!ino){ // can't find name[i], exit;}
use ino to zead in INODE and let ip point to INODE
}

如果搜索循环成功结束,ip必须指向路径名的索引节点。遍历有多个组的大型 EXT2/3 文件系统也是类似操作。

11.6EXT2文件系统的实现

1.文件系统的结构
(1)当前运行进程的PROC结构体;

(2)文件系统的根指针;

(3)一个openTable条目;

(4)内存索引节点;

(5)已挂载的文件系统表。

2.文件系统的级别
第1级别实现了基本文件系统树,以实现指定函数,第2级别实现了文件内容的读/写函数,第3级别实现了文件系统的挂载、卸载和文件保护。

11.7基本文件系统

1.type.h文件
这类文件包含EXT2文件系统的数据结构类型,比如超块、组描述符、索引节点和目录条目结构。此外,它还包含打开文件表、挂载表、PROC结构体和文件系统常数。

2.global.c文件
这类文件包含文件系统的全局变量。全局变量的例子有:
MINODE minode [NMINODE]; // in memory INODEs

MTABLE mtable [NMTABLE]; // mount tables

OFT oft [NOFT]; // Opened file instance

PROC proc[NPROC]PROC ] // PROC structures

PROC *running; // current executing

代码实践

创建磁盘:dd if=/dev/zero of=20201311 bs=1024 count=1440
image

格式化为EXT2文件系统
mke2fs 20191331d 1440
image

使用df命令查看各个分区挂在情况
image

标签:count,name,第十一章,文件系统,索引,u32,陈子昂,20201311,节点
From: https://www.cnblogs.com/charliecza/p/16748592.html

相关文章

  • 第十一章读书笔记
    第十一章读书笔记11.1EXT2文件系统EXT2:Linux一直在用的默认文件系统EXT3:在EXT2之上拓展了任务日志功能EXT4:EXT4不再分配不连续的磁盘块,而是分配连续的磁盘块,称为区段......
  • 20201220蔡笃俊《信息安全系统设计与实现》第十一章学习笔记
    ext2文件系统一、任务内容自学教材第11章,提交学习笔记(10分)知识点归纳以及自己最有收获的内容(3分)问题与解决思路(2分)实践内容与截图,代码链接(3分)...(知识的结构化,知识......
  • Spring MVC框架:第十一章:Ajax
    AjaxAjax程序和服务器数据传输在进行Ajax操作时,SpringMVC会需要将JSON数据和Java实体类进行相互转换,为了实现这个效果需要额外加入jackson-all-1.9.11.jar1.从浏览器发......
  • 第十一章学习笔记
    第十一章本章描述了EXT2文件系统在Linux中的历史地位以及EXT3/EXT4文件系统的当前状况;用编程示例展示了各种EXT2数据结构以及如何遍历EXT2文件系统树;介绍了如何实现支持Li......
  • 12第十一章:Docker微服务实战
    一、创建微服务模块1、建Module通过IDEA新建一个普通微服务模块,docker_boot2、改POM<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apa......
  • 第十一章 awk命令
    一、awk简介1)awk介绍awk命名源自于它的三大作者名字的首字母,分别是AlfredAho、BrianKernighan、PeterWeinberger。(gawk是awk的GNU版本,它提供了Bell实验室和GNU的一些......
  • 第十一章 Ansible-playbook变量注册和Facts缓存
    一、变量注册概述当absible的模块在运行之后,其实都会返回一些result结果,就像是执行脚本,我们有的时候需要脚本给我们一些return返回值,我们才知道,上一步是否可以执行成功,但......
  • 第十一章 Redis分布式主从搭建
    一、redis主从原理1.从库配置主从同步2.从库像主库发起sync命令3.主库接收sync命令,执行bgsave,生成持久化rdb文件4.主库将新的数据临时写入缓冲区5.主库将rdb文件推送......
  • 9/1 深入理解计算机系统笔记 第十一章
    11.3全球因特网因特网的客户端和服务器混合使用套接字接口函数和UNIXI/O函数来进行通信。通常将套接字函数实现为系统调用,这些系统调用会陷入内核,并调用内核模式的TCP/IP......
  • 8/31 深入理解计算机系统 第十一章 网络编程
    第十一章网络编程11.1客户端-服务器编程模型包含一个服务器进程和多个客户端进程。服务器管理某种资源,并通过操作这种资源给客户端提供某种服务。基本操作是:事务一个......