`
cocos
  • 浏览: 393613 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

linux文件系统—inode及相关概念

阅读更多

 

一.inode size 定义
单位:Byte

inode table sample

inode table sample

inode table是data area的索引表。

Inode分为内存中的inode和文件系统中的inode,我们这里说的是文件系统中的inode。

1. linux FS 可以简单分成 inode table与data area两部份。inode table上有许多的inode, 每个inode分别记录一个档案的属性与这个档案分布在哪些datablock上(也就是我们说的指针)。
inode两个功能:记录档案属性和指针

2. inode table中红色区域即inode size,是128Byte,在liunx系统上通过命令我们可以看到,系统就是这么定义的。
Inode size是指分配给一个inode来记录文档属性的磁盘块的大小。

dumpe2fs -h /dev/hda6 | grep node
Inode size:128

3. data ares中紫色的区域block size,就是我们一般概念上的磁盘块。这块区域是我们用来存放数据的地方。

4. 还有一个逻辑上的概念:FS中每分配2048 byte给data area, 就分配一个inode。但一个inode就并不一定就用掉2048 byte, 也不是说files allocation的最小单位是2048 byte, 它仅仅是代表filesystem中inode table/data area分配空间的比例是128/2048,也就是1/16。

mkfs.ext3 -i 2048 这条命令中的-i参数就是我们所说的逻辑概念,它的大小决定inode count的大小,redhat5默认-i最小为可设置为1024.

网上很多介绍关于inode的文章,把inode size的定义搞错了,他们把-i参数这个值或block size解读为inode size 所以很多文章令人费解。

5. inode参数是可以通过mkfs.ext3 命令改变的:

mkfs.ext3 -i 2048 -b 8192 -f 1024 /dev/sdb2

-i 2048 更改inode为每2KB创建一个
-b 8192 设置block size的大小为8kB
-f 1024 设置fragments的大小为1KB

mkfs.ext3 –N 2939495  /dev/sdb2


–N 2939495
更改inode count。

二.更改一个分区inode参数的完整操作过程:

1. 卸载硬盘分区:

[root@localhost ~]# umount /dev/hda7

2. 调整inode参数

[root@localhost ~]# mkfs.ext3 -i 1024 -b 8192 /dev/hda7

mke2fs 1.39 (29-May-2006)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
2048256 inodes, 512064 blocks
25603 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=525250560
63 block groups
8240 blocks per group, 8240 fragments per group
32512 inodes per group
Superblock backups stored on blocks:
        8240, 24720, 41200, 57680, 74160, 206000, 222480, 403760

Writing inode tables: done                           
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 30 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

3.修改/etc/fstab
修改前

[root@localhost ~]# vi /etc/fstab

LABEL=/       /              ext3    defaults  1 1
LABEL=/boot /boot        ext3    defaults  1 2
devpts         /dev/pts   devpts  gid=5,mode=620  0 0
tmpfs          /dev/shm   tmpfs   defaults  0 0
LABEL=/opt  /opt          ext3    defaults          1 2
proc           /proc         proc    defaults          0 0
sysfs          /sys          sysfs   defaults          0 0
LABEL=/usr  /usr          ext3    defaults          1 2
LABEL=/var  /var          ext3    defaults          1 2
LABEL=SWAP-hda8   swap   swap    defaults        0 0
~

修改后:

[root@localhost ~]# vi /etc/fstab   

LABEL=/      /       ext3    defaults    1 1
LABEL=/boot /boot ext3    defaults   1 2
devpts   /dev/pts  devpts  gid=5,mode=620  0 0
tmpfs   /dev/shm tmpfs   defaults    0 0
/dev/hda7 /opt   ext3    defaults   1 2
proc  /proc  proc    defaults   0 0
sysfs  /sys   sysfs   defaults  0 0
LABEL=/usr   /usr    ext3    defaults  1 2
LABEL=/var  /var     ext3    defaults  1 2
LABEL=SWAP-hda8  swap  swap   defaults  0 0

4.挂载分区

mount -a

5.完成后,参数-i 最小值是1024,这个值的大小决定inode count的大小,他们之间的对应关系是:

i=2048 Inode count:1025024
i=1024 Inode count:2048256

inode size的值在这是没有变化的,这也可以证明我上面定义的inode size。
让我们更加清晰的这几个定义之间的关系。
Inode size
Block size
Inode conut

[root@localhost ~]# dumpe2fs -h /dev/hda7
dumpe2fs 1.39 (29-May-2006)
Filesystem volume name:   <none>
Last mounted on:          <not available>
Filesystem UUID:          440696ad-80e7-4810-8648-a9efda177ea9
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      has_journal resize_inode dir_index filetype needs_recovery sparse_super
Default mount options:    (none)
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              2048256
Block count:              1024128
Reserved block count:     51206
Free blocks:              873767
Free inodes:              2048245
First block:              0
Block size:               2048
Fragment size:            2048
Reserved GDT blocks:      512
Blocks per group:         8176
Fragments per group:      8176
Inodes per group:         16256
Inode blocks per group:   1016
Filesystem created:       Fri Jul 11 18:10:33 2008
Last mount time:          Fri Jul 11 18:11:02 2008
Last write time:          Fri Jul 11 18:11:02 2008
Mount count:              1
Maximum mount count:      34
Last checked:             Fri Jul 11 18:10:33 2008
Check interval:           15552000 (6 months)
Next check after:         Wed Jan  7 18:10:33 2009
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:               128
Journal inode:            8
Default directory hash:   tea
Directory Hash Seed:      ad1b7c40-6978-49e9-82f6-2331c5cac122
Journal backup:           inode blocks
Journal size:             32M

由于时间关系:关于mkfs.ext3 -i 2048 -b 8192 -f 1024 /dev/sdb2 中这个-i参数的定义,我是根据对应关系推断,给了它只是个逻辑概念的定义。

欢迎大虾们有更有力的论据来解释一下,或推翻我的观点。

三.读取一个树状目录下的文件/etc/crontab 的流程

1.操作系统根据根目录( / )的相关资料可取得 /etc 这个目录所在的 inode ,并前往读取 /etc 这个目录的所有相关属性;

2.根据 /etc 的 inode 的资料,可以取得 /etc 这个目录底下所有文件的关连数据是放置在哪一个 Block 当中,并前往该 block 读取文件的关连性容;

3.由上个步骤的 Block 当中,可以知道 crontab 这个文件的 inode 所在地,并前往该 inode ;

4.由上个步骤的 inode 当中,可以取得 crontab 这个文件的所有属性,并且可前往由 inode 所指向的 Block 区域,顺利的取得 crontab 的文件内容


四.硬链接

Hard Link 只是在某个目录下新增一个该档案的关连数据而已!

1.举个例子来说,我的 /home/vbird/crontab 为一个 hard link 的档案,他连结到 /etc/crontab 这个档案,也就是说,其实 /home/vbird/crontab 与 /etc/crontab 是同一个档案,只是有两个目录( /etc 与 /home/vbird )记录了 crontab 这个档案的关连数据罢了!也就是说,我由 /etc 的 Block 所记录的关连数据可知道 crontab 的 inode 放置在 A 处,而由 /home/vbird 这个目录下的关连数据,contab 同样也指到 A 处的 inode !所以, crontab 这个档案的 inode 与 block 都没有改变,有的只是有两个目录记录了关连数据.

2.使用 hard link 设定连结文件时,磁盘的空间与 inode 的数目都不会改变!由上面的说明来看,我们可以知道, hard link 只是在某个目录下的 block 多写入一个关连数据,所以当然不会用掉 inode 与磁盘空间。

3.当我们修改其中一个文件的内容时,互为硬链接的文件的内容也会跟着变化。如果我们删除互为硬链接关系的某个文件时,其它的文件并不受影响.

4.由于 hard link 是在同一个 partition 上面进行数据关连的建立,所以 hard link 是有限制的:
a. 不能跨 Filesystem.
b. 不能 link 目录。

五.软链接

1.软链接也叫符号链接,他和硬链接有所不同,软链接文件只是其源文件的一个标记。当我们删除了源文件后,链接文件不能独立存在,虽然仍保留文件名,
但我们却不能查看软链接文件的内容了.

2.Symbolic Link 与 Windows 的快捷方式可以给他划上等号,由 Symbolic link 所建立的档案为一个独立的新的档案,所以会占用掉 inode 与 block

3.所以可用使用软链接解决某个分区inode conut不足的问题(软链接到另一个inode count足够多的分区)

 

tune2fs -l

  • 档案系统 volume 名称 (Filesystem volume name)   - 即是档案系统标签 (Filesystem label) ,用作简述该档案系统的用途或其储存数据。现时  GNU/Linux   都会用 USB 手指/IEEE1394 硬盘等可移除储存装置的档案系统标签作为其挂载目录的名称,方便使用者识别。而个别  GNU/Linux distribution  FedoraRHEL    CentOS   等亦在  fstab   取代传统装置档案名称 (即 /dev/sda1 和 /dev/hdc5 等) 的指定开机时要挂载的档案系统 ,避免偶然因为 BIOS 设定或插入次序的改变而引起的混乱。可以使用命令e2label    tune2fs -L   改变
  • 上一次挂载于 (Last mounted on)'  - 上一次挂载档案系统的挂载点路径,此栏一般为空,很少使用。可以使用命令   tune2fs -M   设定。
  • 档案系统 UUID (Filesystem UUID)   - 一个一般由乱数产生的识别码,可以用来识别档案系统。个别GNU/Linux distribution    Ubuntu ] 等亦在  fstab   取代传统装置档案名称 (即 /dev/sda1 和 /dev/hdc5 等) 的指定开机时要挂载的档案系统 ,避免偶然因为 BIOS 设定或插入次序的改变而引起的混乱。可以使用命令  tune2fs -U   改变
  • (Filesystem magic number)   - 用来识别此档案系统为 Ext2/Ext3/Ext3 的签名,位置在档案系统的 0x0438 - 0x0439 (Superblock 的 0x38-0x39),现时必定是 0xEF53。
  • 档案系统版本编号 (Filesystem revision #)   - 档案系统微版本编号,只可以在格式化时使用mke2fs -r   设定。现在只支援[1]
    • 0 - 原始格式,Linux 1.2 或以前只支援此格式[2]
    • 1 (dymanic) - V2 格式支援动态 inode 大小 (现时一般都使用此版本)
  • 档案系统功能 (Filesystem features)   - 开启了的档案系统功能,可以使用合令  tune2fs -O   改变。现在可以有以下功能:
    • has_journal - 有日志 (journal),亦代表此档案系统必为  Ext3    Ext4
    • ext_attr - 支援 extended attribute
    • resize_inode - resize2fs 可以加大档案系统大小
    • dir_index - 支援目录索引,可以加快在大目录中搜索档案。
    • filetype - 目录项目为否记录档案类型
    • needs_recovery - e2fsck 检查 Ext3/Ext4 档案系统时用来决定是否需要完成日志纪录中未完成的工作 ,快速自动修复档案系统
    • extent - 支援 Ext4 extent 功能,可以加快档案系系效能和减少 external fragmentation
    • flex_bg
    • sparse_super - 只有少数 superblock 备份,而不是每个区块组都有 superblock 备份,节省空间。
    • large_file - 支援大于 2GiB 的档案
    • huge_file
    • uninit_bg
    • dir_nlink
    • extra_isize
  • 档案系统旗号 (Filesystem flags)   - signed_directory_hash
  • 缺省挂载选项 (Default mount options)   - 挂载此档案系统缺省会使用的选项
  • 档案系统状态 (Filesystem state)   - 可以为 clean (档案系统已成功地被卸载)、not-clean (表示档案系统挂载成读写模式后,仍未被卸载) 或 erroneous (档案系统被发现有问题)
  • 错误处理方案 (Errors behavior)   - 档案系统发生问题时的处理方案,可以为 continue (继续正常运作) 、remount-ro (重新挂载成只读模式) 或 panic (即时当掉系统)。可以使用  tune2fs -e   改变
  • 作业系统类型 (Filesystem OS type)   - 建立档案系统的作业系统,可以为 Linux/Hurd/MASIX/FreeBSD/Lites[1]
  • Inode 数目 (Inode count)   - 档案系统的总 inode 数目,亦是整个档案系统所可能拥有档案数目的上限
  • 区块数目 (Block count)   - 档案系统的总区块数目
  • 保留区块数目 (Reserved block count)   - 保留给系统管理员工作之用的区块数目
  • 未使用区块数目 (Free blocks)   - 未使用区块数目
  • 未使用 inode 数目 (Free inodes)   - 未使用 inode 数目
  • 第一个区块编数 (First block)   - Superblock 或第一个区块组开始的区块编数。此值在 1 KiB 区块大小的档案系统为 1,大于1 KiB 区块大小的档案系统为 0。(Superblock/第一个区块组一般都在档案系统 0x0400 (1024) 开始)[1]
  • 区块大小 (Block size)   - 区块大小,可以为 1024, 2048 或 4096 字节 (Compaq Alpha 系统可以使用 8192 字节的区块)
  • Fragment(碎片;片断或不完整部分 大小 (Fragment size)   - 实际上 Ext2/Ext3/Ext4 未有支援 Fragment,所以此值一般和区块大小一样
  • 保留 GDT 区块数目 (Reserved GDT blocks)   - 保留作在线 (online) 改变档案系统大小的区块数目。若此值为 0,只可以先卸载才可脱机改变档案系统大小[3]
  • 区块/组 (Blocks per group)   - 每个区块组的区块数目
  • Fragments/组 (Fragments per group)   - 每个区块组的 fragment 数目,亦用来计算每个区块组中 block bitmap 的大小
  • Inodes/组 (Inodes per group)   - 每个区块组的 inode 数目
  • Inode 区块/组 (Inode blocks per group)   - 每个区块组的 inode 区块数目
  • (Flex block group size)   - 16
  • 档案系统建立时间 (Filesystem created)   - 格式化此档案系统的时间
  • 最后挂载时间 (Last mount time)   - 上一次挂载此档案系统的时间
  • 最后改动时间 (Last write time)   - 上一次改变此档案系统内容的时间
  • 挂载次数 (Mount count)   - 距上一次作完整档案系统检查后档案系统被挂载的次数,让 fsck 决定是否应进行另一次完整档案系统检查
  • 最大挂载次数 (Maximum mount count)   - 档案系统进行另一次完整检查可以被挂载的次数,若挂载次数 (Mount count) 大于此值,fsck 会进行另一次完整档案系统检查
  • 最后检查时间 (Last checked)   - 上一次档案系统作完整检查的时间
  • 检查间距 (Check interval)   - 档案系统应该进行另一次完整检查的最大时间距
  • 下次检查时间 (Next check after)   - 下一次档案系统应该进行另一次完整检查的时间
  • 保留区块使用者识别码 (Reserved blocks uid)   - 0 (user root)
  • 保留区块群组识别码 (Reserved blocks gid)   - 0 (group root)
  • 第一个 inode (First inode)   - 第一个可以用作存放正常档案属性的 inode 编号,在原格式此值一定为 11, V2 格式亦可以改变此值[1]
  • Inode 大小 (Inode size)   - Inode 大小,传统为 128 字节,新系统会使用 256 字节的 inode 令扩充功能更方便
  • (Required extra isize)   - 28
  • (Desired extra isize)   - 28
  • 日志 inode (Journal inode)   - 日志档案的 inode 编号
  • 缺省目录 hash 算法 (Default directory hash)   - half_md4
  • 目录 hash 种子 (Directory Hash Seed)   - 17e9c71d-5a16-47ad-b478-7c6bc3178f1d
  • 日志备份 (Journal backup)   - inode blocks
  • 日志大小 (Journal size)   - 日志档案的大小
分享到:
评论

相关推荐

    linux文件系统—inode及相关概念.pdf

    linux文件系统—inode及相关概念.pdf

    linux 文件系统 关系图

    一些关于文件系统关键概念的关系图,很有用处

    linux-inode

    linux 接触学习inode是一个重要概念,是理解Unix/Linux文件系统和硬盘储存的基础。 我觉得,理解inode,不仅有助于提高系统操作水平,还有助于体会Unix设计哲学,即 如何把底层的复杂性抽象成一个简单概念,从而大大...

    Linux文件系统详解

    从操作系统的角度详解Linux文件系统层次、文件系统分类、文件系统的存储结构、不同存储介质的区别(RAM、ROM、Flash)、存储节点inode。在LINUX系统中有一个重要的概念:一切都是文件。其实这是UNIX哲学的一个体现,而...

    详细分析Linux文件系统

    本片文章针对Linux文件系统从原理到运行机制做了非常详细的理论分析,有助于读者对此深入的理解,以下是具体内容: Linux上的文件系统一般来说就是EXT2或EXT3,但这篇文章并不准备一上来就直接讲它们,而希望结合...

    操作系统课程设计-文件系统的模拟设计.doc

    操作系统课程设计报告 题 目: 文件系统的模拟设计 一、设计目的 本课程设计是学习完"操作系统原理"课程后进行的一次全面的综合训练,通过课程 设计,更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和...

    Linux编程从入门到精通

    7.2.7 VFS文件系统的inode缓存 87 7.2.8 目录缓存 88 7.3 缓冲区缓存 88 7.3.1 bdflush内核守护进程 90 7.3.2 update进程 90 7.4 /proc文件系统 91 7.5 特殊设备文件 91 第8章 网络 92 8.1 TCP/IP网络概述 92 8.2 ...

    LINUX编程白皮书 (全集)

    7.2.2 VFS文件系统的inode节点 84 7.2.3 注册文件系统 85 7.2.4 装配文件系统 85 7.2.5 在虚拟文件系统中查找文件 87 7.2.6 卸载文件系统 87 7.2.7 VFS文件系统的inode缓存 87 7.2.8 目录缓存 88 7.3 缓冲区缓存 88 ...

    linux编程白皮书

    对内存管理、进程及其通信机制、PCI、内核模块编程及内核系统结构作了详细的解释,且附有很多程序代码实例。对深入研究Linux下的编程有很大的帮助。 目 录 雷蒙序 简介 Linux文档工程小组“公告” 译者序 第一部分...

    linux网络编程-宋敬彬-part3

    3.1 Linux下的文件系统 61 3.1.1 Linux下文件的内涵 61 3.1.2 文件系统的创建 62 3.1.3 挂接文件系统 64 3.1.4 索引节点inode 65 3.1.5 普通文件 66 3.1.6 设备文件 66 3.1.7 虚拟文件系统VFS 68 ...

    linux网络编程-宋敬彬-part2

    3.1 Linux下的文件系统 61 3.1.1 Linux下文件的内涵 61 3.1.2 文件系统的创建 62 3.1.3 挂接文件系统 64 3.1.4 索引节点inode 65 3.1.5 普通文件 66 3.1.6 设备文件 66 3.1.7 虚拟文件系统VFS 68 ...

    Linux系统连接的概念及删除原理

     在Linux文件系统中,多个文件名指向同一个索引节点,硬连接文件相当于文件的另外一个接口。  硬连接小结:  1、具有相同inode节点号的多个文件是互为硬连接文件。  2、删除硬连接文件或者删除源文件任意一...

    LINUX编程白皮书

    7.2.7 VFS文件系统的inode缓存 87 7.2.8 目录缓存 88 7.3 缓冲区缓存 88 7.3.1 bdflush内核守护进程 90 7.3.2 update进程 90 7.4 /proc文件系统 91 7.5 特殊设备文件 91 第8章 网络 92 8.1 TCP/IP网络概述 92 8.2 ...

    Linux编程白皮书

    7.2.2 VFS文件系统的inode节点 84 7.2.3 注册文件系统 85 7.2.4 装配文件系统 85 7.2.5 在虚拟文件系统中查找文件 87 7.2.6 卸载文件系统 87 7.2.7 VFS文件系统的inode缓存 87 7.2.8 目录缓存 88 7.3 缓冲区缓存 88 ...

    Linux编程资料

    7.2.2 VFS文件系统的inode节点 84 7.2.3 注册文件系统 85 7.2.4 装配文件系统 85 7.2.5 在虚拟文件系统中查找文件 87 7.2.6 卸载文件系统 87 7.2.7 VFS文件系统的inode缓存 87 7.2.8 目录缓存 88 7.3 缓冲区缓存 88 ...

Global site tag (gtag.js) - Google Analytics