首页 > 其他分享 >第十一章读书笔记

第十一章读书笔记

时间:2022-09-29 16:45:48浏览次数:48  
标签:count EXT2 读书笔记 第十一章 sp 文件系统 print block

第十一章读书笔记

11.1EXT2文件系统

  • EXT2:Linux一直在用的默认文件系统
  • EXT3:在EXT2之上拓展了任务日志功能
  • EXT4:EXT4不再分配不连续的磁盘块,而是分配连续的磁盘块,称为区段

11.2EXT2文件系统数据结构

1.通过mkfs创建虚拟磁盘

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

2.虚拟磁盘布局

一个有1440大小为1kb的块的EXT2文件系统布局为:

下面简单介绍一下磁盘块的内容:
Block#0:引导快。B0是引导块,文件系统不会使用它。它用来容纳一个引导程序,从磁盘引导操作系统。
Block#1:超级快。在硬盘分区中字节偏移量为1024,B1是超级块,用于容纳整个文件系统的信息。下图说明了超级块结构中的一些重要字段:

  • s_first_data_block : 0表示4KB块大小,1表示 1KB块大小。它用于确定块组描述符的起始块,即s_first_data_block +1。
  • s_log_block_size :确定文件块大小,为1KB(2s_log_block_size),例如:0表示1KB块大小,1表示2KB块大小,2表示4KB块大小等。最常用的块大小是用于小文件系统的1KB*和用于大文件系统的4KB.
  • s_mnt_count : 已挂载文件系统的次数。当挂载计数达到max_mnt_count时,fsck 会话将被迫检查文件系统的一致性。
  • s_magic:标识文件系统类型的幻数。EXT2/3/4文件系统的幻数是0xEF53。

Blocak#2:块组描述符块。硬盘上的s_first_data_block+1,EXT2将磁盘块分成几个组。每个组有8192个块(硬盘上的大小为32K)。每组用一个块组描述符结构体来描述。下图说明了块组描述符中的一些重要字段:

由于一个虚拟软盘(FD)只有1440个块,B2就只包含一个块组描述符。其余的都是0。在有大量块组的硬盘上,块组描述符可以跨越多个块。块组描述符中最重要的字段是bg_block_bitap、bg_inode_bitmap和bg_inode_table,它们分别指向块组的块位图、索引节点位图和索引节点起始块。对于Linux格式的EXT2文件系统,保留了块3到块7。所以,bap=8,imap=9,inode_table=10。

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

直接块:i_block[0]至i_block[11]指向直接磁盘块。
间接块:i_block[12]指向一个包含256个块编号的磁盘块。
双重间接块:i_block[13]指向一个指向256个块的块,每个块指向256个块。
三重间接块:可忽略。
数据块:紧跟在索引节点后面的文件存储数据块

3.目录条目

目录包括dir_entry_2结构,即:

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);
但上述算法仅可用在从0计数的情况。

实践环节

-在一个名为vdisk的虚拟磁盘文件上创建一个EXT2文件系统,有1440个大小为1KB的块,并用书中给的程序显示EXT2文件系统中的超级块信息。

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

2.用书中给的程序显示EXT2文件系统中的超级块信息。

3.cs1.c代码如下

点击查看代码
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/io.h>
#include <ext2fs/ext2_fs.h>
// Cypedef u8, ul6, u32 SUPER for convenience typedef typedef typedef
typedef unsigned char u8;
typedef unsigned short ul6;
typedef unsigned int u32;
typedef struct ext2_super_block SUPER;
SUPER *sp;
char buf[1024];
int fd, blksize, inodesize;
int print(char *s, u32 x)
{
    printf("%-30s = %8d\n", s, x);
}
int super(char *device)
{
    fd = open(device, O_RDONLY);
    if (fd < 0) 
    {
        printf("open %s failed\n", device); 
        exit(1);
    }
    lseek(fd, (long)1024*1, 0);	// block 1 or offset 1024
    read(fd, buf, 1024);
    sp = (SUPER *)buf;	// as a super block structure
    // check for EXT2 FS magic number
    printf("%-30s = %8x ", "s_magic", sp->s_magic);
    if (sp->s_magic != 0xEF53)
    {
        printf("NOT an EXT2 FS\n"); exit(2);
    }
    printf("EXT2 FS OK\n"); 
    print("s_inodes_count",  sp->s_inodes_count);
    print("s_blocks _count", sp->s_blocks_count); 
    print("s_r_blocks_count", sp->s_r_blocks_count);
    print("s_free_inodes_count", sp->s_free_inodes_count);
    print("s_free_blocks_count", sp->s_free_blocks_count);
    print("s_first_data_blcok", sp->s_first_data_block); 
    print("s_log_block_s i z e", sp->s_log_block_size);
    print("s_blocks_per_group", sp->s_blocks_per_group); 
    print("s_inodes_per_group", sp-> s_inodes_per_group); 
    print("s_mnt_count", sp->s_mnt_count);
    print("s_max_mnt_count", sp-> s_max_mnt_count);
 
    printf("%-30s = %8x\n", "s_magic", sp->s_magic); 
    
    printf ("s_mtime = %s\n", ctime ((const time_t *)&sp->s_mtime)); 
    printf ("s_wtime = %s", ctime ((const time_t *)&sp->s_wtime)); 
    blksize = 1024 * (1 << sp->s_log_block_size);
    printf("block size = %d\n", blksize);
    printf("inode size = %d\n", sp->s_inode_size);
}

char *device = "vdisk";	// default device name
int main(int argc, char *argv[])
{
    if (argc>1)
        device = argv[1];
    super(device);
}

4.遇到的问题
在cs1.c的程序中,如果直接编译,会提示“ext2fs/ext2_fs.h找不到”,这是要我们安装
安装后,该头文件就可以调用了。

标签:count,EXT2,读书笔记,第十一章,sp,文件系统,print,block
From: https://www.cnblogs.com/wdys12138/p/16742072.html

相关文章

  • 20201220蔡笃俊《信息安全系统设计与实现》第十一章学习笔记
    ext2文件系统一、任务内容自学教材第11章,提交学习笔记(10分)知识点归纳以及自己最有收获的内容(3分)问题与解决思路(2分)实践内容与截图,代码链接(3分)...(知识的结构化,知识......
  • 读书笔记|择一城以定财富,择一行以定发展
    题记“最近个人财政吃紧,想着病急乱投医”,看看理财区有什么好的书籍,然后就用两天时间读完了这本——《钱从哪里来》。作者:香帅,本名唐涯,知名金融学者,香帅数字金融工作室创始人......
  • 《Go 精进之路》 读书笔记 (第一次更新)
    《Go精进之路》读书笔记。简要记录自己打五角星的部分,方便复习巩固。目前看到p120Go语言遵从的设计哲学为组合垂直组合:类型嵌入,快速让一个类型复用其他类型已经实现的......
  • 《软件测试的艺术》读书笔记(五)
    第5章模块(单元)测试对于完全没有编程基础的人来说,第五章和第四章一样难懂。不过好在都是比较简单明了的单词和运算符号组成的,差不多也能猜到是什么意思。作者同样使用......
  • 《被讨厌的勇气》读书笔记
    1、如果一味地关注过去的原因,企图仅仅靠原因去解释事物,那就会陷入“决定论”。也就是说,最终会得出这样的结论:我们的现在甚至未来全部都由过去的事情所决定,而且根本无法改......
  • Spring MVC框架:第十一章:Ajax
    AjaxAjax程序和服务器数据传输在进行Ajax操作时,SpringMVC会需要将JSON数据和Java实体类进行相互转换,为了实现这个效果需要额外加入jackson-all-1.9.11.jar1.从浏览器发......
  • 《程序员的 38 堂成长课》29-38 读书笔记
    如果一件事情必须做很多次,那么就写一个脚本来帮你做。尽早并经常向客户展示产品,这样你会很快发现是否在创建错误的产品。不要长时间加班,弄得自己筋疲力尽,这会让人们一......
  • 第十一章学习笔记
    第十一章本章描述了EXT2文件系统在Linux中的历史地位以及EXT3/EXT4文件系统的当前状况;用编程示例展示了各种EXT2数据结构以及如何遍历EXT2文件系统树;介绍了如何实现支持Li......
  • 第七/八章读书笔记
    第七章文件操作一、文件操作级别(五个阶别,5/6一个级别,由低到高)一、硬件级别文件操作大部分创建和维护系统必不可少的工具如fdisk二、操作系统内核的文件系统......
  • 12第十一章:Docker微服务实战
    一、创建微服务模块1、建Module通过IDEA新建一个普通微服务模块,docker_boot2、改POM<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apa......