使用 fuse 编写文件系统 (2)

读写文件

在第一个程序的基础上增加读写 hello-world 的功能:

#define FUSE_USE_VERSION 26

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <fuse.h>

#define BUFFSIZE 8192

static int content_size;
static char content[BUFFSIZE];
static const char* fname = "hello-world";

static int ou_readdir(const char* path, void* buf, fuse_fill_dir_t filler,
                      off_t 

阅读全文…

使用 fuse 编写文件系统 (1)

FUSE 的全称是“Filesystem in Userspace”,即“用户空间的文件系统”,这是一个内核模块,能够让用户在用户空间实现文件系统并且挂载到某个目录,就像在内核实现的文件系统一样。使用 FUSE 有几个好处:一是因为在用户空间实现,开发和调试都比较方便;二是可以把一些常用的服务以文件系统的形式展现,方便操作,如 ftpfs,sshfs,mailfs 等;另外可以避免一些版权问题,如 Linux 上对 ntfs,zfs 的操作都是通过 FUSE 实现的。当然用户空间的实现也有缺点,最明显的就是由多次在用户态/内核态切换带来的性能下降。

根据参考资料 [1] 的介绍,用户通过 FUSE 和内核的通信过程如下:

                   +----------------+
                   | myfs /tmp/fuse |
                   +----------------+
                          |   ^
+--------------+          v   |
| ls /tmp/fuse |    +--------------+
+--------------+    |    libfuse   |
      ^  

阅读全文…

linux 文件系统之 vfs (1)

unix 有一句口号“一切都是文件”,说的是普通文件,外设甚至网络都可以当成一个文件来看待:从磁盘上的文件中读取数据,从鼠标/键盘等外设获得输入,接收网络信息等就是从“文件”中读取数据;把数据保存到文件,将文字显示在屏幕上,播放音乐和电影,发送网络信息等可以认为向“文件”写入数据。这个高度统一的接口为操作提供了巨大的便利,用户不需知道实际的对象是什么,只使用系统提供的 read/write 接口就能完成几乎所有的 IO 操作。

既然所有的设备都能被抽象成文件并且用统一的接口进行操作,而且个人觉得在操作系统的几个组成部分(内存管理,进程调度等)中文件系统是相对简单的部分,从这个统一的接口开始了解其内部工作机制或许是个不错的选择。

虚拟文件系统(Virtual Filesystem Switch)

早在 1985 年 SUN 发表了一篇论文(参考资料 [1]),提出了一个用于 Sun OS 的文件系统接口。论文开头说明了设计的目的:

  • 将与文件系统实现相关的部分和与实现无关的部分分开,两者之间由一个经过良好设计的接口连接;
  • 这些接口需要支持 unix 文件系统的操作原语(如创建/删除文件和目录等操作),并且支持各种各样的文件系统;
  • 接口要满足远程文件系统对于 client 的请求操作(例如一些连接/断开的操作,对应于 open/close);
  • 接口提供的操作都是原子性的,锁操作留给具体实现。

整个接口所在的位置和提供的功能如下:

                            +--------------+
                            | System Calls |
                            +--------------+
                                   |
                            +--------------+
                            | Vnode Layer  

阅读全文…

以前写的一个玩具文件系统

这是大三小学期的时候做的,不知不觉快 3 年了,转过来留个纪念。

发信人: Xer (小x|SL小分队), 信区: Linux
标  题: [分享][操作系统小学期]模拟文件系统
发信站: 北邮人论坛 (Sat Sep  5 21:41:41 2009), 站内

============
写在前面的话
============

这个程序是我的操作系统小学期做的文件管理部分,磁盘布局是抄minix的,但是内存数据结构是自己想的(越往下写越感觉自己设计的不对)。从8月24号到熄灯前的那段时间基本是每天晚上2点上床7点起床,其它时间除了吃饭上厕所基本就是在查资料写代码,整个疯狂的程序员。既然抄了GPL的东西,就遵循GPL的规定开源了。

数据结构跟vfs的出入挺大,所以写出来的东西不是很好,大牛们轻拍~

====
简介
====

文件系统用一个文件模拟,默认大小是32M(由ofs.h中的OFS_SIZE定义),默认块大小为4K(由ofs.h中的PAGE_SIZE定义)。程序由ANSI C写成,可以在Windows和Linux上运行。

模拟文件系统总共分六大部分,分别是引导块(MBR),超级块(super block),索引节点位图(inode bitmap),数据块位图(data block bitmap),索引节点表(inode table)和数据区(data area)。各个部分的大致情况如下图所示:

+-------------+
|     MBR     | 

阅读全文…

交换 ctrl 和 caps lock

因为 ctrl 键在笔记本键盘的左下角,对于经常使用 ctrl 键的人来说是个痛苦的事情。在网上搜了下有几种交换键位的方法,在这里记录一下。

第一种方法是使用 xmodmap(参考资料 [1])。建立一个新文件 ~/.Xmodmap,添加以下内容:

remove Lock = Caps_Lock
remove Control = Control_L
keysym Control_L = Caps_Lock
keysym Caps_Lock = Control_L
add Lock = Caps_Lock
add Control = Control_L

然后执行

xmodmap ~/.Xmodmap 2>/dev/null

就行了。如果不想每次启动都手动输入命令,可以把命令写到 ~/.xinitrc 中。注意如果把命令写到 …

阅读全文…

linux 内核编译脚本

上一次编译内核已经是三年前倒腾 LFS 的事了。这两天心血来潮编译了最新的内核,写个脚本备份一下。这个脚本在 debian 6.0 下成功编译 3.2.0-rc5 并配置好 grub,在别的系统上可能不好使,所以这里更多的是一个过程记录。注释掉的部分是 grub 相关的,因为经实验发现这个工作 update-grub 已经做了。

#!/bin/bash

function display_usage()
{
   echo "Usage: $0 [install src | uninstall version]" >&2
}

if [ $# -ne 2 ]; then
   display_usage
   exit 1
fi

if [ 

阅读全文…