Linux inode 学习Word文档下载推荐.docx

上传人:b****1 文档编号:3010875 上传时间:2023-05-01 格式:DOCX 页数:12 大小:20.12KB
下载 相关 举报
Linux inode 学习Word文档下载推荐.docx_第1页
第1页 / 共12页
Linux inode 学习Word文档下载推荐.docx_第2页
第2页 / 共12页
Linux inode 学习Word文档下载推荐.docx_第3页
第3页 / 共12页
Linux inode 学习Word文档下载推荐.docx_第4页
第4页 / 共12页
Linux inode 学习Word文档下载推荐.docx_第5页
第5页 / 共12页
Linux inode 学习Word文档下载推荐.docx_第6页
第6页 / 共12页
Linux inode 学习Word文档下载推荐.docx_第7页
第7页 / 共12页
Linux inode 学习Word文档下载推荐.docx_第8页
第8页 / 共12页
Linux inode 学习Word文档下载推荐.docx_第9页
第9页 / 共12页
Linux inode 学习Word文档下载推荐.docx_第10页
第10页 / 共12页
Linux inode 学习Word文档下载推荐.docx_第11页
第11页 / 共12页
Linux inode 学习Word文档下载推荐.docx_第12页
第12页 / 共12页
亲,该文档总共12页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

Linux inode 学习Word文档下载推荐.docx

《Linux inode 学习Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《Linux inode 学习Word文档下载推荐.docx(12页珍藏版)》请在冰点文库上搜索。

Linux inode 学习Word文档下载推荐.docx

创建实验文件和目录

[root@yufeitest]#ls-li

total4

977drwxr-xr-x.2rootroot4096Apr516:

48testdir

976-rw-r--r--.1rootroot0Apr516:

47testfile

查看到文件与目录的Inode和inodecount分别为

977&

lt;

-----&

gt;

2&

testdir

976&

1&

testfile

现在目录的链接数为2,文件的链接数为1。

为什么会这样呢?

其实很好理解。

对于目录而言,每个目录里面肯定会有两个特殊目录,那就是.和..这两个目录,我们前面的课程中也讲到,.表示当前的目录,而..则是表示上层目录。

我们也知道,在Linux系统中,是从根来开始查找的,要想找到某个目录,必需要先找到他的上层目录,所以说,空目录(严格的来说,不能叫空目录)是有两个链接到相应的Inodenumber的。

作为文件很明显,他只有一个链接到相应的Inodenumber。

也不用多说,

下面我们就来看看这个链接数是如何改变的。

继续上面的操作

[root@yufeitest]#lntestfiletestfile.hard

[root@yufeitest]#ln-stestfiletestfile.soft

对testfile建立一个硬链接和一个软链接

[root@yufeitest]#ls-il

976-rw-r--r--.2rootroot0Apr516:

47testfile.hard

978lrwxrwxrwx.1rootroot8Apr517:

03testfile.soft-&

再查看文件和目录的属性,我们就发现:

创建一个硬链接后,testfile的inodecount增加了一个。

而且testfile和testfile.hard这两个的Inodenumber是一样的。

这个硬链接就是重新创建了一个文件名对应到原文件的Inode。

实质就是在Directory中增加了一个新的对应关系。

通过这个例子,你是不是更清楚了,这个Inodecount的含义了。

他就是指,一个Inode对应了多少个文件名。

下面我们再来看看硬链接的其他特点

[root@yufei~]#watch-n1"

df-i;

df"

Every1.0s:

df-i;

dfTueApr521:

52:

532011

FilesystemInodesIUsedIFreeIUse%Mountedon

/dev/sda196099210541585557711%/

tmpfs639461639451%/dev/shm

Filesystem1K-blocksUsedAvailableUse%Mountedon

/dev/sda11511872827476121160311620%/

tmpfs25578402557840%/dev/shm

用上面的命令可以实时查看系统中所剩的block和inode的变化数量。

建议大家不要用deumpe2fs和tune2fs这两个命令,如果使用他们来查看的话,将会很郁闷——你会发现,你无论怎么创建文件或对文件写入内容,Inode和block的值都不会变,除非你每操作一次,重新启动一次系统,而用了上面的命令,就是第秒钟监视他们的变化情况。

关于df的命令使用,大家可以自行查看帮助进行学习。

当然还有du这个命令,他们都和文件系统有关。

我们再来创建一个硬链接

[root@yufeitest]#lntestfiletestfile.hard1

976-rw-r--r--.3rootroot0Apr516:

47testfile.hard1

可以再观察一下Inodecount和Inodenumber的对应关系。

下面再看看inodes和blocks的变化

53:

382011

我们发现,inodes和blocks是没有减少的,所以说,硬链接是不会占用磁盘的空间的。

如果说删除硬链接的话,就会改变Inodecount的数量。

硬链接还有其他的两个特性:

不能跨Filesystem也不能link目录。

下面再来看看这个软链接

[root@yufeitest]#ls-iltestfile.softtestfile

976-rw-r--r--.3rootroot0Apr521:

50testfile

978lrwxrwxrwx.1rootroot8Apr521:

52testfile.soft-&

他的Inodenumber和原文件不一样。

而且大小也发生了变化。

可见,这个软链接是重新建立了一个文件,而文件是指向到原文件,而不是指向原Inode。

当然他会占用掉inode与block。

当我们删除了源文件后,链接文件不能独立存在,虽然仍保留文件名,但我们却不能查看软链接文件的内容了。

但软链接是可以跨文件系统,而且是可以链接目录。

他就相当于windows系统下的快捷方式一样。

通过这个特性,我们可以通过软链接解决某个分区inodeconut不足的问题(软链接到另一个inodecount足够多的分区)。

接下来,我们再来分析一下复制文件、移动文件和删除文件对inode的影响

57:

976-rw-r--r--.3rootroot0Apr518:

54testfile

54testfile.hard

54testfile.hard1

我们先记录以上的信息

先看复制文件的情况

[root@yufeitest]#cptestfiletestfile.cp

979-rw-r--r--.1rootroot0Apr521:

58testfile.cp

我们只对比这两个文件,发现Inodenumber不一样,我们再来看看inodes和blocks的剩余情况

dfTueApr522:

02:

492011

/dev/sda196099210541685557611%/

/dev/sda11511872827476201160310820%/

发现inodes减少了一个,而blocks也少了,这就说明,复制文件是创建文件,并占Inode和Block的。

文件创建过程是:

先查找一个空的Inode,写入新的Inodetable,创建Directory,对应文件名,向block中写入文件内容

关于移动文件和删除文件的实验,大家可以自己动手来实践吧。

我直接给出相应的说明。

移动文件,他分两种情况:

在同一个文件系统中移动文件时

创建一个新的文件名和Inode的对应关系(也就是在Directory中写入信息),然后在Directory中删除旧的信息,更新CTIME,其他的信息如Inode等等均无任何影响

在不同文件系统移动文件时

先查找一个空的Inode,写入新的Inodetable,创建Directory中的对应关系,向block中写入文件内容,同时还会更改CTIME。

删除文件

他实质上就是减少linkcount,当linkcount为0时,就表示这个Inode可以使用,并把Block标记为可以写,但并没有清除Block里面数据,除非是有新的数据需要用到这个block。

最后我们来做个总结:

1、一个Inode对应一个文件,而一个文件根据其大小,会占用多块blocks。

2、更为准确的来说,一个文件只对应一个Inode。

因为硬链接其实不是创建新文件,只是在Directory中写入了新的对应关系而已。

3、当我们删除文件的时候,只是把Inode标记为可用,文件在block中的内容是没有被清除的,只有在有新的文件需要占用block的时候,才会被覆盖。

附录:

kernel部分inode数据结构列表

、*

*索引节点对象由inode结构体表示,定义文件在linux/fs.h中

*/

structinode{

structhlist_nodei_hash;

/*哈希表*/

structlist_headi_list;

/*索引节点链表*/

structlist_headi_dentry;

/*目录项链表*/

unsignedlongi_ino;

/*节点号*/

atomic_ti_count;

/*引用记数*/

umode_ti_mode;

/*访问权限控制*/

unsignedinti_nlink;

/*硬链接数*/

uid_ti_uid;

/*使用者id*/

gid_ti_gid;

/*使用者id组*/

kdev_ti_rdev;

/*实设备标识符*/

loff_ti_size;

/*以字节为单位的文件大小*/

structtimespeci_atime;

/*最后访问时间*/

structtimespeci_mtime;

/*最后修改(modify)时间*/

structtimespeci_ctime;

/*最后改变(change)时间*/

unsignedinti_blkbits;

/*以位为单位的块大小*/

unsignedlongi_blksize;

/*以字节为单位的块大小*/

unsignedlongi_version;

/*版本号*/

unsignedlongi_blocks;

/*文件的块数*/

unsignedshorti_bytes;

/*使用的字节数*/

spinlock_ti_lock;

/*自旋锁*/

structrw_semaphorei_alloc_sem;

/*索引节点信号量*/

structinode_operations*i_op;

/*索引节点操作表*/

structfile_operations*i_fop;

/*默认的索引节点操作*/

structsuper_block*i_sb;

/*相关的超级块*/

structfile_lock*i_flock;

/*文件锁链表*/

structaddress_space*i_mapping;

/*相关的地址映射*/

structaddress_spacei_data;

/*设备地址映射*/

structdquot*i_dquot[MAXQUOTAS];

/*节点的磁盘限额*/

structlist_headi_devices;

/*块设备链表*/

structpipe_inode_info*i_pipe;

/*管道信息*/

structblock_device*i_bdev;

/*块设备驱动*/

unsignedlongi_dnotify_mask;

/*目录通知掩码*/

structdnotify_struct*i_dnotify;

/*目录通知*/

unsignedlongi_state;

/*状态标志*/

unsignedlongdirtied_when;

/*首次修改时间*/

unsignedinti_flags;

/*文件系统标志*/

unsignedchari_sock;

/*可能是个套接字吧*/

atomic_ti_writecount;

/*写者记数*/

void*i_security;

/*安全模块*/

__u32i_generation;

/*索引节点版本号*/

union{

void*generic_ip;

/*文件特殊信息*/

}u;

};

/*

*索引节点的操作inode_operations定义在linux/fs.h中

structinode_operations{

int(*create)(structinode*,structdentry*,int);

/*VFS通过系统调用create()和open()来调用该函数,从而为dentry对象创建一个新的索引节点。

在创建时使用mode制定初始模式*/

structdentry*(*lookup)(structinode*,structdentry*);

/*该韩式在特定目录中寻找索引节点,该索引节点要对应于dentry中给出的文件名*/

int(*link)(structdentry*,structinode*,structdentry*);

/*该函数被系统调用link()电泳,用来创建硬连接。

硬链接名称由dentry参数指定,连接对象是dir目录中ld_dentry目录想所代表的文件*/

int(*unlink)(structinode*,structdentry*);

/*该函数被系统调用unlink()调用,从目录dir中删除由目录项dentry制动的索引节点对象*/

int(*symlink)(structinode*,structdentry*,constchar*);

/*该函数被系统电泳symlik()调用,创建符号连接,该符号连接名称由symname指定,连接对象是dir目录中的dentry目录项*/

int(*mkdir)(structinode*,structdentry*,int);

/*该函数被mkdir()调用,创建一个新鲁姆。

创建时使用mode制定的初始模式*/

int(*rmdir)(structinode*,structdentry*);

/*该函数被系统调用rmdir()调用,删除dir目录中的dentry目录项代表的文件*/

int(*mknod)(structinode*,structdentry*,int,dev_t);

/*该函数被系统调用mknod()调用,创建特殊文件(设备文件、命名管道或套接字)。

要创建的文件放在dir目录中,其目录项问dentry,关联的设备为rdev,初始权限由mode指定*/

int(*rename)(structinode*,structdentry*,

structinode*,structdentry*);

/*VFS调用该函数来移动文件。

文件源路径在old_dir目录中,源文件由old_dentry目录项所指定,目标路径在new_dir目录中,目标文件由new_dentry指定*/

int(*readlink)(structdentry*,char*,int);

/*该函数被系统调用readlink()调用,拷贝数据到特定的缓冲buffer中。

拷贝的数据来自dentry指定的符号链接,最大拷贝大小可达到buflen字节*/

int(*follow_link)(structdentry*,structnameidata*);

/*该函数由VFS调用,从一个符号连接查找他指向的索引节点,由dentry指向的连接被解析*/

int(*put_link)(structdentry*,structnameidata*);

/*在follow_link()调用之后,该函数由vfs调用进行清楚工作*/

void(*truncate)(structinode*);

/*该函数由VFS调用,修改文件的大小,在调用之前,索引节点的i_size项必须被设置成预期的大小*/

int(*permission)(structinode*,int);

/*该函数用来检查给低昂的inode所代表的文件是否允许特定的访问模式,如果允许特定的访问模式,返回0,否则返回负值的错误码。

多数文件系统都将此区域设置为null,使用VFS提供的通用方法进行检查,这种检查操作仅仅比较索引及诶但对象中的访问模式位是否和mask一致,比较复杂的系统,比如支持访问控制链(ACL)的文件系统,需要使用特殊的permission()方法*/

int(*setattr)(structdentry*,structiattr*);

/*该函数被notify_change调用,在修改索引节点之后,通知发生了改变事件*/

int(*getattr)(structvfsmount*,structdentry*,structkstat*);

/*在通知索引节点需要从磁盘中更新时,VFS会调用该函数*/

int(*setxattr)(stru

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2