硬链接的实现和debugfs工具

来源:互联网 发布:淘宝优惠券内容怎么写 编辑:程序博客网 时间:2024/06/13 07:51

有兴趣想研究下文件系统硬链接的实现。硬链接在linux文件系统里,就是给一个普通文件起一个别名。跟软连接(符号链接symbolic link)不同,硬链接要求源文件、目标文件必须在同一个挂载点下面,新建一个硬链接,磁盘文件系统的inode并不会增加,例如123.txt跟321.txt互为硬链接,具有相同的inode号:

 

查看了VFS的代码,文件的name是存在struct dentry中的:

dentry只是VFS构造的内存数据结构,并不会持久化存储在磁盘文件系统上。

因此这个inode两个不同的name,很可能是存在文件的父目录中。证明着一点需要一个小工具:debugfs

首先得到123.txt和321.txt的父目录的inode为26935302,然后利用debugfs把inode为26935302的文件的content导出到一个文件dir.dmp中:

用hexdump工具查看文件26935302中究竟有哪些东西。

可以看到,123.txt跟321.txt两个文件名都是以asc方式存储的。

两个文件的inode号26935303,转换为16进制,以小字节序方式表示,刚好是中间的红色方框里面的数据:

01 9B 00 07。

在类似ext2、ext3的文件系统中,通过pathname打开一个文件时,需要对文件全路径名做lookup。最简单的情况假如一层目录,那么要做的事情是根据顶层目录的inode,把目录的content导入到内存,然后在这个content中查根据文件的名字做查找,最后才能找到匹配的name的inode号。如果每次lookup一个pathname都这样做,效率实在太低,因此VFS才有了dcache(dentry cache)的机制。

这里还发现debugfs的另外一个作用:

linux:~/201303/link_test # debugfs -R "bmap <26935303> 0"  /dev/sda3
debugfs 1.41.9 (22-Aug-2009)
107753475

查看inode文件在文件系统中的的LBA(logical block address),其实就是这个文件的data部分在文件系统中的逻辑块号。

有了这个逻辑块号,通过直接访问文件系统的设备文件/dev/sda3,就可以读取文件的内容,下面是部分代码,有兴趣可以试下。

       x = 107753475;
        y = 4096;
        off_set = x*y;

        printf("off_set:%llu,%lld\n",off_set,off_set);

        fd = open("/dev/sda3",O_RDONLY);
        if(fd > 0)
        {

                printf("open success\n");
                res = lseek64(fd,off_set,SEEK_SET);
                if( res == off_set)
                {
                        printf("res:%lld\n",res);
                        printf("lseek success!\n");
                        res = read(fd,buf,10);
                        if(res == 10)
                        {
                                printf("read sucess!%s\n",buf);
                                for( i=0;i<10;i++)
                                        printf("%x\n",buf[i]);
                        }






原创粉丝点击