1. 关于Linux目录,文件,数据块

对于使用计算机的人而言,经常有一种 错误的认知:目录(或者说,文件夹)里面存放着文件。实际上,目录里面并不存放文件,以及文件数据。

实际上,目录是一个特殊的文件,针对这个特殊的文件也存在一些特殊的规则,比如利用命令cp /dev/null 并不能够销毁这个特殊的文件,因为目录的一些特殊的比特位保证了这一安全性,降低了人工操作带来的风险。在一些老版本的Unix系统里面,用户可以利用cat命令打开目录,查看里面的信息,在一些衍生于Debian系统的发行版Linux里面,也可以利用vi工具打开目录,查看一些信息。

在Linux里面,一个文件的信息被存放于两个位置:

数据块(data block)当中

inode当中

硬盘的最小存储单位叫做“扇区”(Sector)。每个扇区储存512字节(相当于0.5KB)。操作系统读取磁盘的时候,不会一个个扇区“挨个读取”,而是一次读取多个扇区,即一次读取一个“块”(block),这种由多个扇区组成的”块”,是文件存取的最小单位。”块”的大小,最常见的是4KB,即连续八个 sector组成一个 block。data block当中存放了文件的真实内容,而文件的元数据信息,被存放到了inode当中。data block和inode被文件系统有效地组织到了一起。

当文件系统被创建之后,inode的数量以及data block的数量也被固定下来。我们不能够修改inode的数量,也不能够修改data block的数量。

当我们创建一个文件的时候,inode编号将作为该文件的唯一id,即,一个文件在同一时刻仅拥有一个inode编号。当我们向一个文件写入内容的时候,数据被存放到了data block当中。而该文件的文件名,被存放到了该文件所在的目录文件当中。

对于目录这种“特殊的文件”,可以简单地理解为是一张表,这张表里面存放了隶属于该目录的文件的文件名,以及所匹配的inode编号。

因此,在linux里面,文件被“拆分”到了3个地方,索引存于inode,文件名存于目录,数据存于data block。

2. 关于硬链接以及复制

基于上述内容对于目录的描述,可以比较容易解释linux里面的另外一个重要的概念: hard link(硬链接)。

对于文件而言,真正的ID是inode编号,而并非文件名。回忆一下目录文件: 一张含有文件名和inode编号的表。在这张表里面,我们暂定用一个如下结构表示一个文件: [directory : (filename, inode_number)],这里以/etc/passwd文件举例,假设其inode编号为123456(确实有点儿假……),则可以写为[/etc/ : (passwd, 123456)],假设我们在终端上面键入了如下命令:

[root@CentOS7-front1 ~]# ln /etc/passwd /root/hard_link_passwd则会在/root目录下面出现一个新的文件名,叫做hard_link_passwd。如果用上述结构表示这个文件,则为[/root/ : (hard_link_passwd, 123456)],因此,这种目录或文件名不同,但是inode编号相同的文件,称为硬链接。由于硬链接inode编号相同,而且对于同一个inode结构体,便会拥有相同的地址映射以及相同的块设备链表。因此,对于用户空间而言,修改/etc/passwd,就相当于修改了/root/hard_link_passwd,反之亦然。

同样基于上述内容对于目录的描述,针对i_device相同的mv操作,仅仅是删除了原目录里面对应的[directory : (filename, inode_number)],并且在目标目录新建了另一个[directory : (filename, inode_number)],由于并没有对于data block的任何操作,因此速度很快。

3. 初步查看inode

利用ls -i命令可以查看到当前目录下面的所有文件的inode编号,注意inode编号仅仅是inode结构体里面的一项,并不代表inode全部,下面截取/etc/目录下的前5个文件:

[root@centos7-front1 etc]# ls -i | head -n 5

768684 abrt

34370879 adjtime

33554592 aliases

35506331 aliases.db

100705463 alternatives

利用stat命令可以查看一个文件更加详细的inode信息,包括inode编号,占用的块数量,块大小,硬链接个数,atime, mtime, ctime, ……下面用stat命令查看/etc目录(如上文所说,目录也是一种特殊的文件)

[root@centos7-front1 /]# stat /etc

File: ‘/etc’

Size: 8192            Blocks: 24        IO Block: 4096  directory

Device: 803h/2051d      Inode: 33554561    Links: 85

Access: (0755/drwxr-xr-x)  Uid: (    0/    root)  Gid: (    0/    root)

Access: 2017-03-28 17:13:00.510221799 -0400

Modify: 2017-03-28 12:37:32.150999451 -0400

Change: 2017-03-28 12:37:32.150999451 -0400

Birth: -

从上述结果中,我们可以看出,针对/etc目录而言,其大小为8192kb,为该目录下的文件所分配的块数量为24个,类型为directory,设备名称为803h/2051d,其Inode编号为33554561,其硬链接个数为85个,权限为0755,Uid和Gid均为0,还有atime, mtime, ctime这些信息。

当然,利用stat命令查到的某个文件的inode信息并不是全部的inode结构体里面的信息。内核使用的inode结构体如下所示:

struct inode {

struct hlist_node      i_hash;      // 哈希表 */

struct list_head        i_list;        // 索引节点链表 */

struct list_head        i_dentry;    // 目录项链表 */

unsigned long          i_ino;      // 节点号 */

atomic_t                i_count;      // 引用记数 */

umode_t                i_mode;        // 访问权限控制 */

unsigned int            i_nlink;            // 硬链接数 */

uid_t                  i_uid;              // 使用者id */

gid_t                  i_gid;              // 使用者id组 */

kdev_t                  i_rdev;              // 实设备标识符 */

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

struct timespec        i_atime;            // 最后访问时间 */

struct timespec        i_mtime;            // 最后修改(modify)时间 */

struct timespec        i_ctime;            // 最后改变(change)时间 */

unsigned int            i_blkbits;          // 以位为单位的块大小 */

unsigned long          i_blksize;          // 以字节为单位的块大小 */

unsigned long          i_version;          // 版本号 */

unsigned long          i_blocks;            // 文件的块数 */

unsigned short          i_bytes;            // 使用的字节数 */

spinlock_t              i_lock;              // 自旋锁 */

struct rw_semaphore    i_alloc_sem;        // 索引节点信号量 */

struct inode_operations *i_op;              // 索引节点操作表 */

struct file_operations  *i_fop;              // 默认的索引节点操作 */

struct super_block      *i_sb;              // 相关的超级块 */

struct file_lock        *i_flock;            // 文件锁链表 */

struct address_space    *i_mapping;          // 相关的地址映射 */

struct address_space    i_data;              // 设备地址映射 */

struct dquot            *i_dquot[MAXQUOTAS]; // 节点的磁盘限额 */

struct list_head        i_devices;          // 块设备链表 */

struct pipe_inode_info  *i_pipe;            // 管道信息 */

struct block_device    *i_bdev;            // 块设备驱动 */

unsigned long          i_dnotify_mask;      // 目录通知掩码 */

struct dnotify_struct  *i_dnotify;          // 目录通知 */

unsigned long          i_state;            // 状态标志 */

unsigned long          dirtied_when;        // 首次修改时间 */

unsigned int            i_flags;            // 文件系统标志 */

unsigned char          i_sock;              // 可能是个套接字吧 */

atomic_t                i_writecount;        // 写���记数 */

void                    *i_security;        // 安全模块 */

__u32                  i_generation;        // 索引节点版本号 */

union {

void            *generic_ip;        // 文件特殊信息 */

} u;

};

4. inode使用情况以及大小

inode也会消耗硬盘空间,所以硬盘格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据;另一个是inode区(inode table),存放inode所包含的信息。

每个inode节点的大小,一般是128字节或256字节。inode节点的总数,在格式化时就给定,一般是每1KB或每2KB就设置一个inode。假定在一块1GB的硬盘中,每个inode节点的大小为128字节,每1KB就设置一个inode,那么inode table的大小就会达到128MB,占整块硬盘的12.8%。

查看每个硬盘分区的inode总数和已经使用的数量,可以使用df命令。

[root@centos7-front1 ~]# df -i

Filesystem      Inodes IUsed    IFree IUse% Mounted on

/dev/sda3      23860224 59694 23800530    1% /

devtmpfs        122809  367  122442    1% /dev

tmpfs            125170    1  125169    1% /dev/shm

tmpfs            125170  433  124737    1% /run

tmpfs            125170    13  125157    1% /sys/fs/cgroup

/dev/sda1        256000  329  255671    1% /boot

tmpfs            125170    1  125169    1% /run/user/0

查看某个分区的文件系统所分配的单个inode节点的大小,在ext文件系统下,可以使用dumpe2fs命令,例如CentOS6系统上,针对/dev/sda3分区:

[root@maCentos6 ~]# dumpe2fs -h /dev/sda3 | grep -i "inode size"

dumpe2fs 1.41.12 (17-May-2010)

Inode size:              256

在xfs文件系统下,可以使用xfs_info命令,例如CentOS7系统上,针对/dev/sda3分区:

[root@centos7-front1 ~]# xfs_info /dev/sda1

meta-data=/dev/sda1              isize=256    agcount=4, agsize=16000 blks

=                      sectsz=512  attr=2, projid32bit=1

=                      crc=0        finobt=0

data    =                      bsize=4096  blocks=64000, imaxpct=25

=                      sunit=0      swidth=0 blks

naming  =version 2              bsize=4096  ascii-ci=0 ftype=0

log      =internal              bsize=4096  blocks=853, version=2

=                      sectsz=512  sunit=0 blks, lazy-count=1

realtime =none                  extsz=4096  blocks=0, rtextents=0

linux inode目录,Linux目录与inode 深入理解相关推荐

  1. linux c readdir 顺序,Linux读取目录函数readdir以及inode结构简介

    readdir 语法: struct dirent* readdir(DIR* dir_handle); 返回值: dirent结构 函数种类: 文件存取 内容说明 本函数用来读取目录.返回目录中的文 ...

  2. Linux指令--文件和目录属性

    对于每一个Linux学习者来说,了解Linux文件系统的目录结构,是学好Linux的至关重要的一步.,深入了解linux文件目录结构的标准和每个目录的详细功能,对于我们用好linux系统只管重要,下面 ...

  3. 【AWSL】之Linux文件系统与日志分析(inode、恢复EXT类型的文件、恢复XFS类型的文件)

    序言 这里我主要介绍Linux文件系统与日志分析 文件系统与日志分析 序言 一.inode与block 1. 概述 ①inode的内容 ②inode号码 ③文件存储 ④inode的大小 ⑤inode的 ...

  4. linux 权限属性,linux 文件或目录的权限和属性

    1.windows 和linux文件类型的区别 windows 里是通过扩展名来区分文件类型的:linux里文件扩展名和文件类型没有关系,为了容易区分和箭筒用户使用的windows的习惯,我们也会用扩 ...

  5. Linux文件系统与日志分析(inode、inode节点耗尽故障处理、文件备份和恢复、日志文件管理)

    Linux文件系统与日志分析 一.inode和block概述 1.文件和扇区 2.块(block) 3.文件数据 二.inode(索引节点) 1.inode的内容 2.inode的号码 3.inode ...

  6. Linux链接文件包括,Linux操作系统——系统各目录有什么作用、以及文件链接过程...

    三. Linux 系统目录结构 /bin - 用来贮存用户命令.目录 /usr/bin 也被用来贮存用户命令. /sbin - 许多系统命令(例如 shutdown)的贮存位置.目录 /usr/sbi ...

  7. linux 如何赋值目录,Linux文件系统之目录的建立

    一:前言 在用户空间中,建立目录所用的API为mkdir().它在内核中的系统调用入口是sys_mkdir().今天跟踪一下 函数来分析linux文件系统中目录的建立过程. 二:sys_mkdir() ...

  8. Linux_linux基础命令(增删查,权限,Linux下的重要目录,重要命令(. du, df, top, free, pstack, su, sudo).安装gcc/g++, gdb, vim )

    r:表示可读w:表示可写x:表示可执行也可以用数字表示这一点我们会在修改文件权限说明.对于文件夹的rwx表示:r表示可读及可以查看文件夹内容可以ls查看w表示可写及可以向文件夹中传送内容如文件x表示可 ...

  9. linux关于权限、目录、重要的指令以及如何使用包管理器

    一.进入目录需要哪些权限, 在目录中执行增删查(cd, touch, ls, rm, mv等)改文件动作, 需要哪些权限. Linux的基本权限:r(读)/w(写)/x(可执行) 1.权限     a ...

最新文章

  1. 关系型数据库之Mysql备份(五)
  2. CentOS 7实战Kubernetes部署
  3. [Step By Step]SAP HANA创建层次结构的属性视图(Hierarchy Attribute View)
  4. 编程语言分类及python所属类型
  5. 英语中十二个月份的由来
  6. MongoDB查询性能分析—— explain 操作返回结果详解
  7. C++头文件中定义全局变量在多次引用时出现变量多次定义符号冲突的解决办法...
  8. 怎么判断自己启动的线程是否执行完成 java_Java面试笔记(上)
  9. stm32串口通信_STM32之串口通信
  10. python车辆型号识别_汽车型号和款式的识别 如何通过车架号来识别车的型号款式?查汽车型号...
  11. vue在开发环境怎么兼容ie_vue 配置兼容ie浏览器
  12. android 太阳系布局,Solar Walk太阳系模型软件-三维太阳系模型下载2.4.49安卓版-西西软件下载...
  13. Linux下vasp优化结构,VASP入门系列文章[6]结构优化
  14. python m4a转mp3_python脚本实现音频m4a格式转成MP3格式
  15. CTOR是否有助于BCH分片技术?
  16. AE怎么制作流体文字效果?这波教程我真学会了
  17. np.array与np.ndarray的区别
  18. VMware安装centOS镜像
  19. WorkFlow .Net 流程撤回
  20. python将10到1递减_程序在Python中找到最长严格递增然后递减的子列表的长度

热门文章

  1. ASP.NET上传文件的三种基本方法
  2. loding完美制作
  3. php latin1 转utf8,PHP-将UTF8转换为latin1_swedish_ci
  4. 如何选择滚珠丝杆的导程?
  5. java处理json特殊字符_如何处理JSON中的特殊字符
  6. macos M1 pro 使用 drupal 慢
  7. Python-mock
  8. 一个穷屌丝的艰辛创业路: 不怕失败,只求无悔
  9. 教学资源c语言1级,《c语言程序设计》课程的教学资源建设.doc
  10. C语言中的Doxygen注释模板