Chinaunix首页 | 论坛 | 博客
  • 博客访问: 157768
  • 博文数量: 42
  • 博客积分: 996
  • 博客等级: 准尉
  • 技术积分: 705
  • 用 户 组: 普通用户
  • 注册时间: 2012-01-09 19:41
文章分类
文章存档

2012年(42)

我的朋友

分类: LINUX

2012-04-26 12:29:09

 前几天上机的时候遇见了一件奇怪的事情,我将320GB的移动硬盘(3个分区,1个为FAT32格式,2个为NTFS格式)挂载到RHEL5中,准备复制36GB的数据,却发现FAT32分区的可用空间只有20GB,记得自己刚刚清理了硬盘,应该至少还有40GB的空间啊。卸载硬盘后拿到Windows环境下查看,果真还有40GB。很是奇怪,后来想先复制一下试一试,结果到了20GB的时候就提示空间已满,更奇怪的是将刚复制的文件转移走后,在RHEL下df -h查看空间,居然可用空间仍然为0!

上网搜寻,却原来是inode的缘故。磁盘在分区格式化的时候inode已经分配好,总的数目是一定的。如果将磁盘分区比做一本书的话,文件的索引inode就如同目录,而文件的内容就如同书的正文部分。需要注意的是inode是不可再分配的(ext4除外,它可以动态分配inode),如果目录用光了,则即使仍有空白页,也无法继续存储数据。

1. inode 是作甚么的? 
 
  一个 filesystem 可以粗略地分成 inode table 与 data area 两部份. 
  inode table 上有许多的 inode, 每个 inode 分别 记录一个档案的属性, 
  与这个档案分布在哪些 datablock 上 
 
2. 一个 inode 有多大呢? 
 
  128 byte! 
 
3. inode 和 data area 的关系 
 
  在 new filesystem 时, 通常会有一个参数, 用来描述要分配多少比例的空间给 
  inode table. 举例来说, 
 
  newfs -i 2048 
 
  是指 file system 中, 每分配 2048 byte 给 data area, 就分配一个 inode 
  但是一个 inode 就并不是一定就用掉 2048 byte, 也不是说 files allocation 
  的最小单位是 2048 byte, 它仅仅只是代表 filesystem 中 
  inode table/data area 分配空间的比例是 128/2048 也就是 1/16 
  (换个角度想, 我们可以想成是预估 filesystem 中 file 平均大小是 2048 byte) 
 
  如果 inode table 太小, 那么在每个档案都很小的时候, 就会发生 inode 用光 而 
  datablock 还剩一堆的情形. 
 
4. file allocation 的最小单位 和 inode 多少有没有关系呢? 
 
  没有关系! 
 
  FFS 中真正的最小单位是 fragment size 也就是我们在 new filesystem 时用的 
 
  newfs -b 8192 -f 1024 
 
  ps: -b 8192 代表 blocksize=8192, 这种"较大单位"是用来加速大档案的存取用的 
 
在 FreeBSD 中, 内定的是 -i 4096 -b 8192 -f 1024. 如果您要架 bbs/new 的话 
可以考虑用 -i 1024 -b4096 -f1024

5、inode的分类及其具体涵义
  inode分为内存中的inode和文件系统中的inode,为了避免混淆,我们称前者为VFS inode, 而后者以EXT2为代表,我们称为Ext2 inode。

   (1)、VFS inode包含文件访问权限、属主、组、大小、生成时间、访问时间、最后修改时间等信息。它是linux管理文件系统的最基本单位,也是文件系统连接任何子目录、文件的桥梁。inode结构中的静态信息取自物理设备上的文件系统,由文件系统指定的函数填写,它只存在于内存中,可以通过inode缓存访问。虽然每个文件都有相应的inode结点,但是只有在需要的时候系统才会在内存中为其建立相应的inode数据结构,建立的inode结构将形成一个链表,我们可以通过遍历这个链表去得到我们需要的文件结点,VFS也为已分配的inode构造缓存和哈希表,以提 高系统性能。inode结构中的struct inode_operations *i_op为我们提供了一个inode操作列表,通过这个列表提供的函数我们可以对VFS inode结点进行各种操作。每个inode结构都有一个i结点号i_ino,在同一个文件系统中每个i结点号是唯一的。

 (2)、EXT2 inode用来定义文件系统的结构以及描述系统中每个文件的管理信息,每个文件都有且只有一个inode,即使文件中没有数据,其索引结点也是存在的。每个文件用一个单独的Ext2 inode结构来描述,而且每一个inode都有唯一的标志号。Ext2 inode为内存中的inode结构提供了文件的基本信息,随着内存中inode结构的变化,系统也将更新Ext2 inode中相应的内容。Ext2 inode对应的是Ext2_inode结构。

 (3)、对VFS inode与ext2 inode做出比较:
   位置:VFS inode结构位于内存中,而Ext2_inode位于磁盘。
   生存期:VFS inode在需要时才会被建立,如果系统断电,此结构也随之消失。Ext2_inode的存在与系统是否上电无关,而且无论文件是否包含数据,Ext2_inode都是存在的。
   唯一性:两者在自己的作用域中都是唯一的。
   关系:VFS inode是Ext2 inode的抽象、映射与扩充,而后者是前者的静态信息部分,也是对前者的具体化、实例化和持久化。
   操作:对VFS inode的操作具有通用性,对文件系统inode的操作则是文件系统相关的,依赖于特定的实现。
   组织管理:系统通过VFS inode链表来对其进行组织,并且为了提高访问效率相应地构造了inode构造缓存和hash table。Ext2 inode的信息位于EXT2文件系统的划分的块组中,在每个块组中包含相应的inode位图、inode表指定具体的inode信息,每个inode对应Ext2_inode结构。

6、inode的分配 (对应ext2 inode)
  1、每个inode的大小为128个字节,下面具体介绍哪几个字节代表什么内容。
  0~1 表示文件的类型和属性(2 bytes)0x41ed (rwxr-xr-x) 0x8180 (-rw-------)
  2~3 表示文件的长度(2 bytes)
  4~7 表示文件宿主用户id(4 bytes)
  8~19 表示三个时间属性,每4个字节代表一个时间,分别是atime,ctime,mtime(12B)
  20~23 表示Deletion Time 即删除的时间。
  24~25 表示用户组id (2 bytes)
  26~27 表示硬链接的个数。
  28~31 表示Blockcount 的大小
  32~39 暂不清楚??
  40~99 这60个字节就是inode中的15个指针,每个指针占4个字节。
  100~103 暂不清楚??
  104~107 表示文件访问控制表号(File ACL)
  108~111 表示(Directory ACL)
  112~127 暂不清楚??
  2、在分割扇区时,系统会先做出一堆inode以供以后使用,inode 的数量关系着系统中可以建立的档案及目录总数。有时候,这些inode或许会不够用,例如当一个程序产生大量小文件的时候,此时文件系统就需要增加索引节点。
  同样,如果我们事先知道此文件系统只用来存放少数大文件,我们就可以通过减少索引节点的数目来达到节省磁盘空间的目的——毕竟每个索引节点占用128字节。
  创建文件系统的时候,可以使用newfs命令的-i选项来增加或者减少索引节点的数目。
  3、newfs -i 2048 -b 8192 -f 1024
  newfs创建新的文件系统
  -i 2048更改inode每2KB创建一个
  -b 8192设置block size的大小为8kB
  -f 1024设置fragments的大小为1KB

7、inode与ln (对于ext2 inode)
  1、当我们用ls 查看某个目录或文件时,如果加上-i 参数,就可以看到inode节点了;
  [root@localhost ~]# ls -li lsfile.sh
  2408949 -rwxr-xr-x 1 root root 7 04-21 12:47 lsfile.sh
  可见lsfile.sh 的inode值是2408949 ;
  2、创建硬链接,硬链接和源文件关系;
  用ln创建文件硬链接的语法:
  [root@localhost ~]#ln 源文件 目标文件
  下面我们举一个例子,在这个例子中,我们要为sun.txt创建其硬链接sun002.txt。然后看一下 sun.txt和sun002.txt的属性的变化;
  [root@localhost ~]# ls -li sun.txt 注:查看sun.txt的属性;
  2408263 -rw-r--r-- 1 root root 29 04-22 21:02 sun.txt 注:这是sun.txt的属性;
  [root@localhost ~]# ln sun.txt sun002.txt 注:我们通过ln 来创建sun.txt的硬链接文件sun002.txt
  [root@localhost ~]# ls -li sun* 注:我们列一下sun.txt 和sun002.txt
  2408263 -rw-r--r-- 2 root root 29 04-22 21:02 sun002.txt
  2408263 -rw-r--r-- 2 root root 29 04-22 21:02 sun.txt
  我们可以看到sun.txt在没有创建硬链接文件sun002.txt的时候,其链接个数是1(也就是-rw-r--r--后的那个数值),创建了硬链接 sun002.txt创建后,这个值变成了2。也就是说,我们每次为sun.txt创建一个新的硬链接文件后,其硬链接个数都会增加1。
  inode值相同的文件,他们的关系是互为硬链接的关系。当我们修改其中一个文件的内容时,互为硬链接的文件的内容也会跟着变化。如果我们删除互为硬链接关系的某个文件时,其它的文件并不受影响。比如我们把sun.txt删除后,我们还是一样能看到sun002.txt的内容,并且sun02.txt仍是存在的。
  可以这么理解,互为硬链接关系的文件,他们好像是克隆体,他们的属性几乎是完全一样;
  下面的例子,我们把sun.txt删除,然后我们看一下sun002.txt是不是能看到其内容。
  [root@localhost ~]# rm -rf sun.txt
  [root@localhost ~]# more sun002.txt
  注意:硬链接不能为目录创建,只有文件才能创建硬链接。
  3、软链接的创建,及软接与源文件的关系;
  创建软链接(也被称为符号链接)的语法;
  [root@localhost ~]# ln -s 源文文件或目录 目标文件或目录
  软链接也叫符号链接,他和硬链接有所不同,软链接文件只是其源文件的一个标记。当我们删除了源文件后,链接文件不能独立存在,虽然仍保留文件名,但我们却不能查看软链接文件的内容了。
  [root@localhost ~]# ls -li linuxsir001.txt
  2408274 -rw-r--r-- 1 root root 29 04-22 21:53 linuxsir001.txt
  [root@localhost ~]# ln -s linuxsir001.txt linuxsir002.txt
  [root@localhost ~]# ls -li linuxsir001.txt linuxsir002.txt
  2408274 -rw-r--r-- 1 root root 29 04-22 21:53 linuxsir001.txt
  2408795 lrwxrwxrwx 1 root root 15 04-22 21:54 linuxsir002.txt -> linuxsir001.txt
  上面的例子,首先我们查看 linuxsir001.txt 的属性,比如inode、所属文件种类、创建或修改时间等... ...我们来对比一下:
  首先 对比一下节点:两个文件的节点不同;
  其次 两个文件的归属的种类不同 linuxsir001.txt是-,也就是普通文件,而linuxsir002.txt 是l,它是一个链接文件;
  第三 两个文件的读写权限不同 linuxsir001.txt 是rw-r--r-- ,而linuxsir002.txt的读写权限是 rwxrwxrwx
  第三 两者的硬链接个数相同;都是1
  第四 两文件的属主和所归属的用户组相同;
  第五 修改(或访问、创建)时间不同;
  我们还注意到了linuxsir002.txt 后面有一个标记 ->,这表示linuxsir002.txt 是linuxsir001.txt的软链接文件。
  值得我们注意的是:当我们修改链接文件的内容时,就意味着我们在修改源文件的内容。当然源文件的属性也会发生改变,链接文件的属性并不会发生变化。当我们把源文件删除后,链接文件只存在一个文件名,因为失去了源文件,所以软链接文件也就不存在了。这一点和硬链接是不同的;
  [root@localhost ~]# rm -rf linuxsir001.txt 注:删除linuxsir001.txt
  [root@localhost ~]# ls -li linuxsir002.txt 注:查看linuxsir002 的属性;
  2408795 lrwxrwxrwx 1 root root 15 04-22 21:54 linuxsir002.txt -> linuxsir001.txt
  [root@localhost ~]# more linuxsir002.txt 注:查看linuxsir002.txt的内容;
  linuxsir002.txt: 没有那个文件或目录 注:得到提示,linuxsir002.txt不存在。
  上面的例子告诉我们,如果一个链接文件失去了源,就意味着他已经不存在了;
  我们可以看到软链接文件,其实只是源文件的一个标记,当源文件失去时,他也就是存在了。软链接文件只是占用了inode来存储软链接文件属性等信息,但文件存储是指向源文件的。
  软链接,可以为文件或目录都适用。无论是软链接还是硬链接,都可以用rm来删除。rm工具是通用的。

阅读(1486) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~