20211301 学习笔记5

20211301 学习笔记5

教材知识点总结

11.1 EXT2文件系统

  • EXT2:linux的默认文件系统

  • EXT3:扩展,增加了日志文件

  • EXT4:磁盘块的分配

11.2 EXT2文件系统数据结构

  • 创建虚拟磁盘:创建指定个块和索引节点的文件系统,可以在虚拟磁盘也可以在真实设备上

  • 虚拟磁盘布局:

  • 超级块:容纳整个文件系统的信息

  • 常用块:小文件系统1kb,大文件系统4kb

  • 块组件描述符:将磁盘块分为几个组,每组用一个块组件描述符结构来描述,指向块组的快位图、索引节点位图、索引节点起始块。

  • 块位图:Bmap 位图用来表示某种项的位序列,分配和回收项

  • 索引节点位图:一个索引节点用来代表一个文件的数据结构

  • 索引节点:每个文件都用一个128字节的唯一索引节点结构体表示

直接块:指向直接磁盘块
间接块:指向一个包含256个块编号的磁盘块,每个块指向1个磁盘块
双重间接块:指向一个指向256个块的快,每个块指向256个磁盘块

  • 数据块:紧跟在索引节点块后面

  • 目录条目:包含dir——entry结构(可扩充结构,不含终止NULL)

  • 邮差算法:线性地址转换为街区地址

  • 邮差算法应用:

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

11.10

  • 三级文件系统:支持文件系统的挂载、卸载和文件保护

  • 挂载算法mount filesys mount_point可将某个文件系统挂载在mount——point目录上,允许文件系统包含其他文件系统作为现有文件系统的一部分

  • 卸载算法:卸载文件系统操作可卸载已经挂载的文件系统,将挂载文件与挂载点分开

  • 交叉挂载点:挂载必须修改函数,遍历一个路径名可能出现交叉

向下遍历:跟随指针来定位挂载表条目,将根索引节点放入内存,然后在挂载设备的根索引节点下搜索x
向上遍历:向上级目录遍历,会与挂载点交叉,切换根目录

  • 文件保护:通过文件索引节点的权限位实现文件保护

  • 实际uid:当某进程执行setuid程序时,该程序打开文件的setuid位,有效uid就变成了uid

  • 有效uid: 简单起见,忽略

  • 文件锁定:允许进程对一个文件设置文件锁,防止在更新文件时出现竟态条件

代码实现

  • 用一个c程序实现linux中who的功能
#include <stdio.h>
#include <stdlib.h>
#include <utmp.h>
#include <fcntl.h>
#include <unistd.h>
#include <time.h>

int main() {
    struct utmp current_record;
    int utmpfd;
    int reclen = sizeof(current_record);

    if ((utmpfd = open(UTMP_FILE, O_RDONLY)) == -1) {
        perror(UTMP_FILE);
        exit(1);
    }

    while (read(utmpfd, &current_record, reclen) == reclen) {
        if (current_record.ut_type == USER_PROCESS) {
            printf("%-8.8s", current_record.ut_user);
            printf(" ");
            printf("%-8.8s", current_record.ut_line);
            printf(" ");
            long t = current_record.ut_time;
            printf("%12.12s", ctime(&t) + 4);
            printf(" ");
            #ifdef SHOWHOST
            printf("(%s)", current_record.ut_host);
            #endif
            printf("\n");
        }
    }

    close(utmpfd);
    return 0;
}
  • 交叉挂载
int dev;
if(pathname[0]=='\')
  dev = root->dev;
else
  dev = runnig->cwd->dev;
int ino=getino(pathname,&dev)
  • man-k用法

问题与解决方案

  • 问题一:不太清楚grep作为筛选条件的其他用法,例如怎么查找文件后输出
  • 问题一与解决方案:

苏格拉底提问









参考网站

https://zhuanlan.zhihu.com/p/585475479#目录

posted @ 2023-10-15 18:07  20211301郑润芃  阅读(41)  评论(0)    收藏  举报