目錄,inode學習筆記

目錄,inode學習筆記

1. 關于目錄,文件,數據塊 
對于使用計算機的人而言,經常有一種 錯誤的認知目錄(或者說,文件夾)里面存放著文件。實際上,目錄里面并不存放文件,以及文件數據。

實際上,目錄是一個特殊的文件,針對這個特殊的文件也存在一些特殊的規則,比如利用命令cp /dev/null <your directory>并不能夠銷毀這個特殊的文件,因為目錄的一些特殊的比特位保證了這一安全性,降低了人工操作帶來的風險。在一些老版本的Unix系統里面,用戶可以利用cat命令打開目錄,查看里面的信息,在一些衍生于Debian系統的發行版linux里面,也可以利用vi工具打開目錄,查看一些信息。

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

  1. 數據塊(data block)當中

  2. inode當中

硬盤的最小存儲單位叫做“扇區”(Sector)。每個扇區儲存512字節(相當于0.5KB)。操作系統讀取磁盤的時候,不會一個個扇區“挨個讀取”,而是一次讀取多個扇區,即一次讀取一個“塊”(block),這種由多個扇區組成的”塊”,是文件存取的最小單位?!眽K”的大小,最常見的是4KB,即連續八個 sector組成一個 block。data block當中存放了文件的真實內容,而文件的元數據信息,被存放到了inode當中。data blockinode文件系統有效地組織到了一起。

文件系統被創建之后,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個文件:

1
2
3
4
5
6
[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目錄(如上文所說,目錄也是一種特殊的文件)

1
2
3
4
5
6
7
8
9
[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結構體如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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命令。

1
2
3
4
5
6
7
8
9
[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分區:

1
2
3
[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分區:

1
2
3
4
5
6
7
8
9
10
[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


4. 參考鏈接

  1. 阮一峰的網絡日志:理解inode

  2. Linux struct inode結構

  3. Inodes – an Introduction

原創文章,作者:jiangche00,如若轉載,請注明出處:http://www.www58058.com/72294

(0)
jiangche00jiangche00
上一篇 2017-04-01
下一篇 2017-04-01

相關推薦

  • 進程管理,計劃任務(2)

    二、作業管理     Linux的作業控制         前臺作業:通過終端啟動,且啟動后一直占據終端;         后臺作業:可通過終端啟動,但啟動后即…

    Linux干貨 2016-09-18
  • 二、(3)Linux的文件與數據之:元數據

    文件的元數據 在Linux的文件系統中,數據可分為兩大類:數據和元數據 數據:泛指普通文件中的實際數據 元數據:用來描述一個文件的特征的系統數據 這樣抽象的描述并不能很清楚地表示元數據的定義,所以下面將借助stat命令進行舉例說明: stat命令 stat – display file or file system status(用于展示文件或文…

    2018-01-11
  • vim編輯器及練習題

    命令用法: vim [OPTION]… FILE…  +#: 打開文件后,直接讓光標處于第#行的行首                   &nbs…

    Linux干貨 2016-08-11
  • N25 The first week –Yorick

    1.計算機的組成及功能 ENIARC:馮諾依曼體系 1.1.運算器(所屬CPU)     進行計算 1.2.控制器(所屬CPU)     控制部件之間的協調,包括尋址操作     輔助性存儲(加速與提升CPU性能)     寄存器(鎖存數據)     緩存(緩…

    Linux干貨 2016-12-04
  • n28 第二周作業

    n28 第二周作業

    Linux干貨 2017-12-09
  • 位置變量;if;for循環

    向腳本傳遞參數就是用位置參數變量實現 傳遞給命令的參數稱為位置參數  ls  /etc/var Myscript.sh  argu1 argu2 ….${10}  ${11}…   引用方式 :$1就是引用整個腳本位置參數的第一個,第一個會自動保存在$1中  &nb…

    Linux干貨 2016-08-15

評論列表(1條)

  • renjin
    renjin 2017-04-05 14:43

    內容總結的非常詳細尤其在查看內核的inode結構體這塊,排版也很不錯,繼續努力

欧美性久久久久