1. 程式人生 > >Linux inode相關知識

Linux inode相關知識

這篇文章主要講一下Linux底下inode相關的一些知識,同時介紹一下,檔案系統上的inode數目是如何計算,如何管理的。

一、什麼是inode?

inode是檔案系統(File System)上的一個概念,是檔案系統上用來儲存檔案資訊的一種結構。

從根本上講, inode 中包含有關檔案的所有資訊(除了檔案的實際名稱以及實際資料內容之外),inode包含了如下基本資訊(只列出了常用的):

inode 編號

用來識別檔案型別,

以及用於 stat C 函式的模式資訊

檔案的連結數目

屬主的 UID

屬主的組 ID (GID)

檔案的大小

檔案所使用的磁碟塊的實際數目

最近一次修改的時間

最近一次訪問的時間

最近一次更改的時間

下圖為inode的結構圖: inode structure

二、Linux下對inode進行檢視的方式

1、df命令檢視剩餘inode數量

1 [email protected]:~$ df -i -h
2 檔案系統            Inode (I)已用 (I)可用 (I)已用% 掛載點
3 /dev/sda6               3.6M    346K    3.3M   10% /
4 none                    212K     914    211K    1% /dev
5 none                    214K      10    214K    1% /dev/shm
6 none                    214K      78    214K    1% /var/run
7 none                    214K       4    214K    1% /var/lock
8 none                    214K       1    214K    1% /lib/init/rw
9 /dev/sda7               4.8M    301K    4.5M    7% /home

這個命令-i的意思是列出inode數目,-h是以一種人們易於理解的方式呈現結果,我們通過這個命令可以看到各個分割槽inode數目的使用情況。有一個你必須要清楚的是,一旦inode用完,你的檔案系統將無法建立任何內容,就算有剩餘的空間。這點我相信應該道理很清楚

2、stat命令檢視指定檔案資訊

1 [email protected]:~$ stat /bin/bash
2 File: "/bin/bash"
3 Size: 818232      Blocks: 1600       IO Block: 4096   普通檔案
4 Device: 806h/2054d  Inode: 131084      Links: 1
5 Access: (0755/-rwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
6 Access: 2010-10-20 10:22:38.041508828 +0800
7 Modify: 2010-04-19 09:51:35.000000000 +0800
8 Change: 2010-05-15 20:06:53.468309411 +0800

使用這個命令,我們可以找到特定檔案的索引編號,以及其他的 inode 專案,如許可權、檔案型別、UID、GID、連結的數目(非符號連結)、檔案大小和最近一次更新、最近一次修改以及最近一次訪問的時間戳。

3、ls命令

在我們的日常工作中總會碰到這樣的情況,難以刪除或者管理某些檔案,因為這些檔案的檔名中使用了短橫線或者其他特殊字元、或者其檔名完全不正確。這很可能是有人對該檔案進行了錯誤命名。

因為 UNIX 中的大多數命令,包括開關或者選項在內,都是以連字元 (-) 或者雙連字元 (–) 開頭的,很難使用諸如 rm、mv 和 cp 之類常用的命令來操作這些檔案。幸運的是,某些命令提供了一些選項,以用來顯示相關檔案所關聯的 inode 的索引編號。ls 命令就提供了一個這樣的選項:

1 [email protected]:~$ ls -i
2 4456450 examples.desktop  4589605 workspace  4456466 圖片  4456460 桌面
3 267055 lyrics            4456463 公共的     4456464 文件
4 4721446 Tencent Files     4456462 模板       4456461 下載
5 132716 Ubuntu One        4456467 視訊       4456465 音樂

4、find命令
使用 UNIX find 命令,我們可以完成使用 ls 命令所開始的工作。對於要進行操作的檔案,您已經知道了它們的索引編號,那麼就可以開始進行相應的操作了!
要刪除看似無名的檔案,我們只需要使用 find 和 -inum 開關對索引編號和檔案進行定位。然後,在找到該檔案之後,使用 find 和 -exec 開關刪除該檔案:

1 [email protected]:~$ find . -inum 38988 -exec rm {} /;

要對該檔案進行重新命名,可以再次進行相同的操作,但這一次使用 mv 而不是 rm:

1 [email protected]:~$ find . -inum 38989 -exec mv {} fileM /;

5、fsck命令

不幸的是,硬體裝置不可能一直使用下去,系統可能會在使用多年後出現故障。當發生這種情況,以及由於電源故障或者某些其他問題而導致作業系統異常關閉的時候,您可能會在還原系統備份時碰到一些在崩潰期間處於開啟狀態的檔案,並且現在需要對其加以處理。此時,您可能會碰到一些需要修復 inode 或者存在錯誤的訊息。如果發生這種狀況,那麼 fsck 命令可以用來救急!您可以使用 fsck 來修復檔案系統或者修正受損的 inode ,而不是還原系統、或者甚至重新構建作業系統。

1 [email protected]:~$ fsck -t ext4 /dev/sda6 -a

fsck時候需要用-t來指定分割槽檔案系統的型別,-a是自動修復,沒有這個選項,你可以手動更改inode資訊

二、如何計算inode

當我們在格式化一個檔案系統的時候,格式化程式mkfs會根據blocks數目和每個inode所佔的位元組數來計算inode數目,具體如何計算的,現在讓我們來做一個實驗,我們用dd命令建立一個1G大小的磁碟img

1 [email protected]:/tmp$ dd if=/dev/zero of=/test.img bs=1M count=1024
2 記錄了1024+0 的讀入
3 記錄了1024+0 的寫出
4 1073741824位元組(1.1 GB)已複製,17.0225 秒,63.1 MB/秒

上面這個命令中bs的意思是指blocksize,為1MB,block數目為1024塊,總共加起來是1GB
好我們現在用mkfs來建立一個ext3的檔案系統,我們可以用-N來指定inode數目,我們可以指定一個很大的值

1 [email protected]:/tmp$ mkfs.ext3 -N 21420000 test.img
2 mke2fs 1.41.11 (14-Mar-2010)
3 test.img is not a block special device.
4 無論如何也要繼續? (y,n) y
5 mkfs.ext3: inode_size (256) * inodes_count (21420000) too big for a
6 filesystem with 262144 blocks, specify higher inode_ratio (-i)
7 or lower inode count (-N).

我們可以看到提示我們指定的inode數目過於大,使得無法建立檔案系統。其中有一個重要資訊是inode_size是256,也就是說inode數目最大值應該為:硬碟大小/inode_size。這個inode_size我們可以用-i這個選項來指定,ext3檔案系統預設使用256,最小值為128,那麼我們來計算一下我們的inode值最大為多少:
1024x1024x1024/256=4194304
理論上來說我們可以指定這麼多inode,但是用於檔案系統同時需要super block所以我們不可能create這麼多inode,不過可以不指定super block試試:

1 [email protected]:/tmp$ mkfs.ext3 -m 0 -n -N 4194303 test.img
2 mke2fs 1.41.11 (14-Mar-2010)
3 test.img is not a block special device.
4 無論如何也要繼續? (y,n) y
5 test.img: Cannot create filesystem with requested number of inodes while setting up superblock

失敗,那麼我們把inode值改為最大的一半,再試試

01 [email protected]:/tmp$ mkfs.ext3 -N 2097152 test.img
02 mke2fs 1.41.11 (14-Mar-2010)
03 test.img is not a block special device.
04 無論如何也要繼續? (y,n) y
05 檔案系統標籤=
06 作業系統:Linux
07 塊大小=4096 (log=2)
08 分塊大小=4096 (log=2)
09 Stride=0 blocks, Stripe width=0 blocks
10 2097152 inodes, 262144 blocks
11 13107 blocks (5.00%) reserved for the super user
12 第一個資料塊=0
13 Maximum filesystem blocks=268953600
14 64 block groups
15 4120 blocks per group, 4120 fragments per group
16 32768 inodes per group
17 Superblock backups stored on blocks:
18 4120, 12360, 20600, 28840, 37080, 103000, 111240, 201880
19
20 正在寫入inode表: 完成
21 Creating journal (8192 blocks): 完成
22 Writing superblocks and filesystem accounting information: 完成
23 This filesystem will be automatically checked every 22 mounts or
24 180 days, whichever comes first.  Use tune2fs -c or -i to override.

從上面的輸出資訊我們可以看出ext3檔案系統的塊大小為4096,總共262144個塊,其中13107為超級塊,64個塊組,每個塊組有4120個塊,然後我們可以看到super block是位於哪些塊上。

我們掛載這個img之後可以看到還剩下410.3MB的剩餘空間,這個我們可以知道inode有一個部分需要儲存檔案資訊,所以剩下夠用的空間就只有一部分,所以在inode數目上我們應該有一個權衡,畢竟inode數目太多,可能能夠利用的空間就小了

相關推薦

Linux inode相關知識

這篇文章主要講一下Linux底下inode相關的一些知識,同時介紹一下,檔案系統上的inode數目是如何計算,如何管理的。 一、什麼是inode? inode是檔案系統(File System)上的一個概念,是檔案系統上用來儲存檔案資訊的一種結構。 從根本上講, inode

find不區分大小查找文件名 find -inum按inode查找 inode相關知識

1.4 權限 ica 是否 for day 所屬組 mkfs clas 1.2、netstat -lntup 檢查服務端口1.3、總結幫助方法03. 總結幫助方法 1)man 命令 查看普通命令幫助信息 2)help 命令 查看內置命令幫助信息

Linux Raid相關知識

一、基本原理 RAID ( Redundant Array of Independent Disks )即獨立磁碟冗餘陣列,通常簡稱為磁碟陣列。簡單地說, RAID 是由多個獨立的高效能磁碟驅動器組成的磁碟子系統,從而提供比單個磁碟更高的儲存效能和資料冗餘的技術

uboot的基礎知識linux啟動相關知識

uboot本質是一個裸機程式 ***uboot在啟動時的作用: 主要是用來啟動作業系統的核心。 部署整個系統。 操作Flash等板子上硬體的驅動,初始化一部分硬體。 提供一個命令列介面供人進行互動操作。 PC機的啟動:上電後先執行BIOS程式(實際上就是Norf

Linux,Unix相關知識的整理

(1)linux是unix的克隆,或稱unix的山寨版,Linux並沒有包括Unix原始碼.它是按照公開的POSIX標準重新編寫的.Linux大量使用了由麻省劍 橋免費軟體基金的GNU軟體,同時Linux自身也是用它們構造而成。 (2)Unix是現在做關鍵業務的, Unix+oracle可是

[轉] Linux Xorg 相關知識

https://blog.csdn.net/qq_39101111/article/details/78775434 Xorg驅動

Linux 字元裝置驅動結構(三)—— file、inode結構體及chardevs陣列等相關知識解析

       先看下面這張圖,這是Linux 中虛擬檔案系統、一般的裝置檔案與裝置驅動程式值間的函式呼叫關係;         上面這張圖展現了一個應用程式呼叫字元裝置驅動的過程, 在裝置驅動程式的設計中,一般而言,會關心 file 和 inode 這兩個結構體  

linux系統檔案描述符file descriptor與inode相關知識

每個程序在Linux核心中都有一個task_struct結構體來維護程序相關的 資訊,稱為程序描述符(Process Descriptor),而在作業系統理論中稱為程序控制塊 (PCB,Process Control Block)。task_struct中有一個指標(

Linux 字元裝置驅動結構(三)—— file、inode結構體及chardevs陣列等相關知識解析[轉載]

       先看下面這張圖,這是Linux 中虛擬檔案系統、一般的裝置檔案與裝置驅動程式值間的函式呼叫關係;        上面這張圖展現了一個應用程式呼叫字元裝置驅動的過程, 在裝置驅動程式的設計中,一般而言,會關心 file 和 inode 這兩個結構體       

linux系統程式設計之基礎必備(三):檔案描述符file descriptor與inode相關知識

       每個程序在Linux核心中都有一個task_struct結構體來維護程序相關的 資訊,稱為程序描述符(Process Descriptor),而在作業系統理論中稱為程序控制塊 (PCB,Process Control Block)。task_struct中有一

linux性能優化2-內存相關知識

如何 pac 物理內存 1.5 頁緩存 64位 linux性能 多少 1.2 1.Linux內存體系結構一個進程執行時,Linux內核給其分配一個部分內存區域。進程使用這個內存區域作為工作區執行必要的操作。1.1.物理內存和虛擬內存系統的內存管理是非常復雜的,一般由內核來完

3. file、inode結構體及chardevs數組等相關知識解析

內核源碼 art 結構 是否 pri lse 區分 功能 好的 https://blog.csdn.net/zqixiao_09/article/details/50850004 下圖描述了Linux中虛擬文件系統,一般的設備文件與設備驅動程序間的函數調用關系 上圖展現了

Linux下的網絡管理相關知識

iproute2 管理工具 ifcfg 激活 改ip 相關 pro 所有 示例 Linux下的網絡管理相關知識 linux下的網絡管理工具,大致分成了三個系列,最古老的ifcfg系列、iproute2系列以及nm系列。我們會就三個命令進行分析和講解,接著會講一下更改IP地址

Linux的基相關知識

Linux 簡介(見百度百科吧哈哈哈) Linux作業系統是基於UNIX作業系統發展而來的一種克隆系統,它誕生於1991 年的 [Linux桌面] 10 月5 日(這是第一次正式向外公佈的時間)。以後藉助於Internet網路,並通過全世界各地計算機愛好者的共同努力,已成為今天世界上使用最多

Linux 字元裝置驅動結構(一)—— cdev 結構體、裝置號相關知識解析

一、字元裝置基礎知識 1、裝置驅動分類       linux系統將裝置分為3類:字元裝置、塊裝置、網路裝置。使用驅動程式: 字元裝置:是指只能一個位元組一個位元組讀寫的裝置,不能隨機讀取裝置記憶體中的某一資料,讀取資料需要按照先後資料。

Linux程序相關入門基礎知識

​​​​  計算機實際上可以做的事情實質上非常簡單,比如計算兩個數的和,再比如在記憶體中尋找到某個地址等等。這些最基礎的計算機動作被稱為指令(instruction)。所謂的程式(program),就是這樣一系列指令的所構成的集合。通過程式,我們可以讓計算機完成複雜的操作。程式大多數時候被儲存為可執行的檔案。

linux訊號處理相關知識

    因為要處理最近專案中碰上的多個子程序退出訊號同時到達,導致程式不當產生core的情況,今天我花了時間看了一些關於linux訊號處理的部落格。 總結一下:(知識未經實踐)   1 1 linux訊號分兩種,一種實時訊號(也叫可靠訊號),一種非實時訊號

C語言資料型別表示式相關知識Linux

#include<stdio.h> int main(int argc,char**argv) { printf(“Hello Word\n"); printf(“argv[%d],%s\n”,i,argv[i]); return 0; } 計算

Linux核心入門: IPsec相關知識及其定義

struct ip_auth_hdr { __u8 nexthdr; __u8 hdrlen; /* This one is measured in 32 bit units! */ __be16 reserved; __be32 spi; __be32 se

Linux 字元裝置驅動結構(一)—— cdev 結構體、裝置號相關知識解析[轉載]

一、字元裝置基礎知識1、裝置驅動分類      linux系統將裝置分為3類:字元裝置、塊裝置、網路裝置。使用驅動程式:字元裝置:是指只能一個位元組一個位元組讀寫的裝置,不能隨機讀取裝置記憶體中的某一資料,讀取資料需要按照先後資料。字元裝置是面向流的裝置,常見的字元裝置有滑鼠