首页 > 系统相关 >Unix/Linux系统编程学习笔记-5

Unix/Linux系统编程学习笔记-5

时间:2022-10-02 21:22:41浏览次数:82  
标签:算法 文件 编程 文件系统 索引 Unix Linux 挂载 节点

笔记

第十一章 EXT2文件系统

EXT2文件系统

The Second Extended File System (ext2)文件系统是Linux系统中的标准文件系统,是通过对Minix的文件系统进行扩展而得到的,其存取文件的性能极好。 在ext2文件系统中,文件由inode(包含有文件的所有信息)进行唯一标识。

EXT2文件系统数据结构

通过mkfs创建虚拟键盘

在Linux下,命令: 
mke2fs [-b blksize -N ninodes] device nblocks

虚拟磁盘布局

  • Block#0:引导块,文件系统不使用它,用于容纳从磁盘引导操作系统的引导程序。
  • Block#1:超级块,用于容纳关于整个文件系统的信息。
  • Block#2:块组描述符块,EXT2将磁盘分成几个组(每组8192块),每组用一个块组描述符结构体描述。
  • Block#8:块位图,用来表示某种项的位序列。
  • Block#9:索引节点位图,用来代表一个文件的数据结构。
  • Block#10:索引节点,每个文件都用一个128字节(EXT4的是256字节)的独特索引节点结构体表示。
  • 直接块:i_block[0]至i_block[11]指向直接磁盘块
  • 间接块:i_block[12]指向一个包含256个块编号的磁盘块
  • 双重间接块:i_block[13]指向一个指向256个块的块
  • 重间接块:i_block[14],对于“小型”EXT2文件系统可以忽略
  • 数据块紧跟在索引节点块后面的是文件存储数据块
  • 目录条目:包含dir_entry,dir_entry是一种可扩充结构。

邮差算法

Linear_address LA = N*block + house;
Block_address  BA = (LA / N, LA % N);

C语言中的Test-Set-Clear位

  • 最小的可寻址单元是一个字符或字节。

将索引节点号转换为磁盘上的索引节点

  • 在EXT2文件系统中,每个文件都有一个唯一的索引节点结构。在文件系统磁盘上,索引节点从inode_table块开始。
  • 每个磁盘块包含:
  INODES_PER_BLOCK = BLOCK_SIZE/sizeof(INODE)

示例:

  • 显示超级块
  • 显示位图
  • 显示根索引节点
  • 显示目录条目

遍历EXT2文件系统树

遍历算法

  • (1)读取超级块。
  • (2)读取块组描述符块(1 + s_first_data_block),以访问组0描述符。
  • (3)读取InodeBeginBlock,获取/的索引节点,即INODE#2。
  • (4)将路径名标记为组件字符串,假设组件数量为n。
  • (5)从(3)中的根索引节点开始,在数据块中搜索name[0]。
  • (6)使用索引节点号ino来定位相应的索引节点
  • (7)由于(5)~(6)步将会重复n次,所以最好编写一个搜索函数

将路径名转换为索引节点

已知一个包含EXT2文件系统和路径名的设备:

  INODE *path2inode(int fd, char *pathname) // assume fd=file descriptor

显示索引节点磁盘块

  • 编写一个C程序showblock,可打印文件的所有磁盘块。

EXT2文件系统的实现

文件系统的结构

  • (1)是当前运行进程的PROC结构体
  • (2)是文件系统的根指针
  • (3)是一个openTable条目
  • (4)是内存索引节点
  • (5)是已挂载的文件系统表

文件系统的级别

文件系统的实现分为三个级别:

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

基本文件系统

  • type.h:包含了超块、组描述符、索引节点、目录条目结构;打开文件表、挂载表、PROC结构体和文件系统常数
  • global.c:包含文件系统全局变量
  • 实用程序函数:get_block/put_block函数、iget(dev,ino)函数、The iput(INODE *mip)函数、getino()函数
  • mount-root.c:用于挂载根文件系统

1级文件系统函数

  • mkdir算法:创建一个带路径名的新目录
  • create算法:创建一个空的普通文件
  • rmdir算法:删除目录
  • link算法:创建从new_file到old_file的硬链接(只能用于普通文件,不能用于目录)
  • unlink算法:取消文件链接
  • sylink算法:创建一个从新文件到旧文件的符号链接
  • readlink算法:读取符号文件的目标文件名并返回目标文件名的长度

2级文件系统函数

  • open算法:打开一个文件进行读或写
  • lseek算法:将打开的文件描述符在OFT中的偏移量设置为从文件开头开始或当前位置开始的字节位置
  • close算法:关闭文件描述符
  • read系统调用:将n个字节从打开的文件描述符读入用户空间的缓冲区
  • write系统调用:将n个字节从用户空间的缓冲区写入打开的文件描述符
  • opendir-readdir

3级文件系统函数

  • 挂载算法:
    挂载操作命令mount filesys mount_point可将某个文件系统挂载到mount_point目录上
  • 卸载算法:将挂载的文件系统与挂载点分开
  • 交叉挂载点:修改getino(pathname)函数,来支持交叉挂载点
  • 文件保护:通过文件索引节点中的权限位实现文件保护
  • 实际uid和有效uid:每个进程都有一个实际uid和一个有效uid
  • 文件锁定:文件锁定机制允许进程对一个文件或文件的某些部分设置文件锁,以防止在更新文件时出现竞态条件

问题和解决思路:

问题:EXT2fs.h头文件安装失败:

解决思路:

根据此网址方法即可:https://developer.aliyun.com/article/842521

实践内容与截图,代码链接:

尝试使用df:

标签:算法,文件,编程,文件系统,索引,Unix,Linux,挂载,节点
From: https://www.cnblogs.com/wu-zhuohang/p/16740164.html

相关文章

  • Scratch少儿编程系列:(十二)数字接水果
    一、程序说明数字接水果,是一个用scratch2.0实现的一个数字小游戏。点击绿旗,程序开始运行:1、屏幕下方出现一个篮子,用来接水果,可以通过鼠标控制左右移动;该篮子上面有一个......
  • kali linux 环境配置
    kalilinux环境配置起源于一次hadoop的安装和环境配置因为环境调了很久,具体的细节记不清了,一直在几个文件中反复横跳vim~/.local_profilevim/etc/profilevim~/.z......
  • 【Linux】学习-03-文件属性查看及修改
       以上命令中,最左边的一列,第一个字母【d】表示文件类型为【目录文件】,之后的字母,三个字母为一组,其意义如下图所示:第一个字母如果是【l】表示该文件类型为【连接文......
  • Linux进阶(三)
    目录架构图IPtables简介防火墙的分类包过滤防火墙Iptables如何过滤“四表”“五链”Iptables流程架构图IPtables简介IPtablesLinux防火墙工具,真正实现防火墙功能......
  • 【Linux】学习-02-Linux基础命令
    注意:Linux下,所有的命令可以组合使用,如以下的【ls-al】,就是【ls-a】和【ls-l】的组合ls:显示文件夹下的内容ls-a:显示文件夹下的全部文件,包括隐藏文件ls-l:以竖......
  • 【Linux】学习-01-Linux概述
    1、KailLinux:安全渗透测试使用,黑客等安全相关的人员所擅长的技术。2、补天:漏洞响应平台。https://www.butian.net/3、红帽认证工程师:Linux领域广为认可的专业技术认证......
  • 如何在 Linux 上创建可启动的 U 盘
    注意:以下命令需在root权限下执行,使用不当可能会损坏硬盘数据以及操作系统使用下列命令行请将<usb_drive>替换为设备名称,将<file.iso>替换为镜像文件的路径。您可用df、......
  • 主机访问不了Linux虚拟机
    一、检查防火墙systemctlstatusfirewalldsystemctlstopfirewalldsysytemctldeablefirewalld二、检查是否ip冲突#试着关闭NetworkManagersystemctlstopNetworkmanag......
  • 在Linux环境下添加应用快捷方式
    以添加intellij快捷方式为例ref:https://blog.csdn.net/baidu_24285051/article/details/107451136创建intellij-idea.desktop文件[DesktopEntry]Encoding=UTF-8V......
  • 约一个月linux办公环境使用体验
    规划由于实际工作的需要,我在今年9月份就开始规划给主机重新进行系统的配置,由原先的单win10转向linux+win10双系统。作出这样的考虑主要是由于我目前开发所需要使用的eda工......