请问linux系统中inode和block的关系?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请问linux系统中inode和block的关系?相关的知识,希望对你有一定的参考价值。

目前我正在学习linux操作系统,现在在学习ext2文件系统原理,看的鸟哥的linux一书,书上开始谈到一个文件系统中inode和block的关系,说的是inode中存着指向block的指针。书上说一个文件占用一个inode,如果文件太大会占用多个block.我这里就有个问题,为什么用 mke2fs格式化文件系统的时候输入一个inode和block的比例?假设我设置的比例是1比4,假设我这里的文件都是小文件,占用一个inode的同时也只占用一个block,那且不是到最后会有3/4的block剩余,inode却一个也没有了?这样是不是等于会造成空间有剩余,但是我缺不能新建文件了?

1. inode和block
---------------------------------

提到inode,我们不得不先介绍硬盘的整体结构。硬盘中包含多个硬盘盘片,硬盘盘片为圆形,每个硬盘盘片都有一个可以读写的磁头(Head),将这个磁
头固定,使硬盘盘片旋转一周,所走轨迹就是磁道(Track)。硬盘内所有盘片的相同磁道号的集合成为磁柱(Cylinder)。每一磁道被划分成许多区
域,每个区域叫一个扇区(Sector)。扇区是硬盘的最小存储物理量,一个扇区的存储容量大约是512字节(约0.5K)。

知道了硬盘的大体结构之后,再来谈谈怎么进行硬盘分区。进行硬盘分割的最小单位是磁柱,分割完之后自然就是格式化(format)。在Linux中进行格式化必须考虑Block与inode,Block还好理解,它是磁盘可以记录的最小单位,是由数个扇区组成,所以大小通常为n*512Bytes,例如4K。

那么inode是什么呢Block是记录文件内容的区域,inode则是记录该文件的属性及其放置在哪个Block之内的信息。所
以,每个文件都会占用一个inode。当Linux系统要查找某个文件时,它会先搜索inode
table找到这个文件的属性及数据存放地点,然后再查找数据存放的Block进而将数据取出。inode数量在一开始已被设定好,其设定方式通常是"硬
盘大小/一个容量",这个容量比Block大一些较佳,例如刚才将Block设为4K,那么这个容量可以设为8K左右。所以,一块1GB的硬盘如果以8K
大小划分它的inode数,则会有131072个inode。一个inode的大小为128Byte,这样,我们就可以清楚地知道,一个分区被格式化为一个文件系统之后,基本上它一定会有inode table与数据区域两大块,一个用来记录文件的属性信息与该文件存放的Block块,一个用来记录文件的内容。

2. 硬链接
---------------------------------
刚才说过,当系统要读取某个文件时,它会先读inode
table,然后根据inode的信息到数据区域将数据取出备用。硬链接就是再建立一个inode链接到文件放置的Block块。也就是说,进行硬链接
时,实际上您的文件内容不会改变,只是原来的inode与后来添加的inode均可指定到该文件存放的地点,因此,读取两个inode的结果都是读取同一
个文件的内容。不过,这样一来就有个问题,因为inode会链接到Block块,而"目录"本身仅消耗inode,这样,硬链接就不能链接目录。所以,硬
链接有两个最大的限制:
(1) 不能跨文件系统,因为不同的文件系统有不同的inode table;
(2) 不能链接目录。

3. 软链接(符号链接)
---------------------------------
相对于硬链接,符号链接比较好理解,基本上,它是再建立一个独立文件,而这个文件会让数据读取操作指向它链接的那个文件。由于只是利用文件作为指向的动作,所以,当源文件被删除,符号链接的文件就打不开了,屏幕会显式"无法开启某文件"。
因此,硬链接比较安全,因为即某一个inode被删除,只要还有一个inode,该文件就能被找到。

4. 分区和文件系统
---------------------------------
磁盘分割的重点了: 也就是记录每一个分割区(Partition)的起始与结束磁柱。好了,那么这个分割区的起始与结束磁柱的信息放在哪里呢? 存放在Master Boot Recorder(MBR)

告知系统分割区所在的起始与结束磁柱之后,接着需要将分割区格式化为操作系统认识的文件系统(Filesystem)。因为每个操作系统认识的文件系统并不相同,所以要针对操作系统来格式化分割区 。

一个分割区就是一个文件系统。硬盘的最小储存单位是扇区(Sector),不过数据储存的最小单位并不是扇区,因为用
扇区来存储数据效率低下。因为一个扇区只有512Bytes,而磁头是一个扇区一个扇区地读取数据,如果文件有10MBytes,那么为了读这个文件,磁
头必须要进行20480次读取(I/O)操作。

为了克服这个效率上的困扰,引入了逻辑区块(Block)。逻辑区块是在对分割区进行格式化时,所指定的数据最小储存单位,这个最小储存单位是建立在扇区
的大小之上的(因为扇区是硬盘的最小物理储存单位),所以,逻辑区块的大小为扇区
的2的次方倍数。此时,磁头一次可以读取一个逻辑区块(若干个连续的扇区),如果在格式化时,指定逻辑区块为4KBytes(亦8个连续的扇区构成一个逻
辑区块),那么同样一个10MBytes的文件,磁头要读取的次数则为2560次,可以大幅提高文件的读取效率。

不过,逻辑区块单位的规划并不是越大越好。因为一个逻辑区块最多仅能容纳一个文件。假如逻辑区块规划为4KBytes,而一个文件大小为
0.1KBytes,这个小文件将占用一个逻辑区块的空间,该逻辑区块虽然可以容纳4Kbytes的容量,然而由于文件只占用了0.1Kbytes,所
以,实际上剩下的3.9KBytes是不能再被使用了。在考虑逻辑区块的规划时,需要同时考虑到:
* 文件读取的效率
* 文件大小可能造成的硬盘空间浪费

因此,在规划磁盘时,需要根据主机的用途来进行规划较佳。例如BBS主机由于文章较短, 逻辑区块小一点的好;而如果主机主要用在储存大容量的文件,那么考虑到效率,逻辑区块规划的大一点会比较妥当。
参考技术A 因为inode的数量决定了文件的数量,所以是不能新建文件了。
另外,这样的设置也同时限制了文件的大小?追问

没有限制文件大小,block之前设置的是4k,mke2fs命令里面要我输入一个inode对应的空间大小,我输入的是16k,那就是inode和block是1比4的关系.不知道是我理解错了还是怎么样,我觉得不管设置的是几比几,反正不可能最终inode和block都刚好用完,要么inode先用完,要么block先用完. 我感觉这里怪怪的,难道linux系统就这么死板么...

追答

16K只是设定了单个block的大小,而不是inode节点可以使用block的数量。

文件可以使用的block数量是动态的。
浪费是说,一个block中虽然有空闲空间,但也不能被别的文件占用。同一个block只能属于一个文件。

本回答被提问者采纳
参考技术B

推荐资料:inode和block分别指什么?

linux文件系统和日志分析

inode和block概述一:

1、文件数据包括源信息与实际数据

文件存储在硬盘上,硬盘最小存储单位是“扇区。每个扇区存储512字节”

block (块):

连续的八个扇区组成一个block(4k)

!是文件存取的最小单位,扇区是最小的存储单位

2、inode:

(索引节点,也叫i节点)

用于存储文件元信息

备注:一个文件必须占用一个inode,但是至少占用一个block(就是说只能同时拥有一个inode号,可以拥有多个block)

3、目录文件的结构:

目录也是一种文件,此外目录文件的结构如下图所示


4、重点:
每个文件都有一个inode号码,操作系统使用inode号码来识别不同的文件
linux系统内部不使用文件名,而是使用inode号进行识别文件
对于用户,文件名只是inode号码便于识别的别称


inode和block概述二:

文件是存储在硬盘上的,硬盘的最小存储单位叫做扇区,每个扇区存储512字节

一般连续八个扇区组成一个块,一块是4k大小,是文件存取的最小单位,操作系统读取硬盘时候,是一次性连续读取多个扇区,就是一个块一个块地读取的。

文件数据包括实际数据与元信息,文件数据存储在“块中,存储文件元信息的区域叫做inode。因此,一个文件必须占用一个inode,并且至少占用一个block

inode不包含文件名,文件名是存放在目录当中的,linux系统中一切皆为文件,因此目录也是一种文件

每个inode都有一个号码,操作系统用inode号来识别不同的文件,linux系统内部不使用文件名去识别文件的(是使用inode号码去识别文件的,每一个inode号码一一对应一个文件名)。

所以,当用户在linux系统中试图访问一个文件,系统会先根据文件名去查找它对应的inode号码,通过inode号码,获取inode信息。根据inode信息,查看该用户是否具有访问该文件的权限,如果有就指向相应的数据block,并且读取数据。如果没有就拒绝


inode包含的元信息

文件的字节数

文件拥有者的USER ID

文件的GROUP ID

文件的读、写、执行权限

文件时间戳

用stat命令可以查看某个文件的inode信息

比如: stat 123.txt ;查看123.txt文件的inode号

实操:使用stat命令


备注:
1、以上两图是一份英文语言一份是中文语言对照
2、change time (ctime):最后一次改变文件或者目录属性的时间
3、access time (atime):最后一次访问文件或者目录的时间
4、modify time(mtime): 最后一次修改文件或者目录内容的时间

inode号码

用户通过文件名打开文件时,系统内部的过程
1、系统找到这个文件名对应的inode号码
2、通过inode号码,获取inode信息
3、根据inode信息,找到文件数据所在的block,并读出数据
查看inode号码的方法:
1、ls -i命令:查看文件对应的inode号码
ls -i 文件名

2、stat命令:查看文件inode信息中的inode号码
stat 文件名
inode的大小
inode也会消耗磁盘空间
每个inode的大小一般为128字节或者256字节
格式化文件系统时确定inode的总数
使用df -i命令可以查看每个硬盘分区的inode总数与已经使用的数量
补充:
1、inode也会消耗硬盘空间,所以格式化的时候,操作系统会自动将硬盘分成两个区域,一个是数据区域,存放文件数据;另一个是inode区域,存放inode包含的信息。,每个inode的大小,一般是128字节或者256个字节。
通常情况下不需要关注单个inode的大小,而是需要重点关注inode的总数,inode的总字节在格式化的时候就给定了,执行“df -i”命令即可查看每个硬盘分区对应的inode总数和已经使用的inode数量。
2、由于inode号码与文件名称分离,导致linux系统具备以下几特有的现象
a、文件名包含特殊字符,可能无法正常删除,这时候直接删除inode,能起到删除文件的作用
b、移动文件或者重命名文件,只是改变文件名字,不影响inode号
c、开打一个文件后,系统以inode号来识别这个文件,且不再考虑文件名
4、文件数据被保存修改后,会生成一个新的inode号
删除inode号的两种方式
find ./ -inum (inode号) -exec rm -i {} \\;
find ./ -inum (inode号) -delete

inode号的特殊作用

由于inode号码与文件名分离,导致一些linux系统具有以下的现象:
1、当文件名包含特殊字符,可能无法正常删除文件,直接删除inode,也可以删除文件
2、移动或者重命名文件时,只改变文件名,不影响inode号码
3、打开一个文件后,系统通过inode号码来识别文件,不再考虑文件名
4、使用vi编辑器修改文件数据保存后,会生成一个新的inode号码。但是,如果使用ehco进行“>”的追加内容。则不会变更inode号。

小结

1、硬盘分区后的结构


注意:元信息和数据为文件数据的组成
2、linux系统中系统访问文件的过程

链接文件

为文件或者目录建立链接文件
链接文件的分类(下图所示)

链接文件的命令:
1、硬链接
ln 源文件 目标位置; 用的很少
2、软连接!
ln -s 源文件 目标位置; 实际工作环境经常使用!

实验:inode号节点耗尽故障处理

使用fdisk创建分区sdb1,大小30M即可

fdisk /dev/sdb1

mkfs -t ext4 /dev/sdb1

mkdir /test

mount /dev/sdb1 /test

df -i

模拟inode节点耗尽

for ((i=1; i<=7680; i++)); do touch /test/file$i;done

或者 touch {1..7680}.txt

df -i

df -hT

删除文件恢复

rm -rf /test/*

df -i

df -hT
实验操作:




注备:实验结束后,如果不是虚拟机的话,直接rm -rf /test/*全部删除就行

实验:EXT类型文件恢复

extundelete是一个开源的linux数据恢复工具,支持ext3、ext4文件系统。(备注:ext4只能运行在centos6版本恢复)
步骤:
1、使用fdisk创建分区/dev/sdc1,格式化成ext3系统文件
fdisk /dev/sdc
partprobe /dev/sdc ;此项命令是可以不重启系统,直接添加磁盘
mkfs -t ext3 /dev/sdc1
mkdir /test
mount /dev/sdc1 /test
df -h

2、安装依赖包
yum install -y e2fsprogs-devel e2fsprogs-libs
接着编译安装extundelete(网上先自己下压缩包)

3、进行模拟删除并恢复的操作
cd /test
echo a>a
echo a>b
echo a>c
echo a>d
ls
extundelete /dev/sdc1 --inode 2 ;查看文件系统/dev/sdc1下存放在哪些文件,此外i节点从2开始的,2代表该文件系统最开始的目录
rm -rf a b
extundelete /dev/sdc1 --inode 2
cd ~
umount /test
extundelete /dev/sdc1 --restore-all ;恢复/dev/sdc1文件系统下的所有内容
#最后:在当前目录下会出现一个RECOVERED_FILES/目录,里面保存了已经恢复的文件
ls RECOVERED_FILES/ ;查看里面的目录
操作:如上图步骤所示 (注意:自己先网上下载好extundelete-0.2.4.tar.bz2
后再进行试验)




实验:恢复XFS类型的文件

Centos 7系统默认采用xfs类型文件,xfs类型的文件可以使用xfsdump、xfsdump工具进行备份恢复。
1、xfsdump命令格式
xfsdump -f 备份存放位置 要备份的路径或者设备文件
xfsdump的备份等级(默认为0)
0 : 完全备份
1-9 :增量备份
xfsdump常用选项:
-f:指定备份文件目录
-L:指定标签session label
-M:指定设备标签 media label
-s:备份单个文件,- s 后面不能直接跟路径
xfsdump的使用限制:
a、只能备份已挂载的文件系统
b、必须使用root的权限才能操作
c、只能备份XFS文件系统
d、备份后的数据只能给xfsrestore解析
e、不能备份两个具有相同UUID的文件系统
2、xfsrestore命令格式
xfsrestore -f 恢复文件位置 存放恢复后文件的位置

操作:
1、使用fdisk创建分区 /dev/sdb1,并格式化成xfs文件系统。最后挂载mount /dev/sdb1 /data/
cd /data
cp /etc/passwd ./
mkdir test
touch abc.txt /test
2、使用xfsdump备份整个分区
rpm -qa | grep xfsdump
yum install -y xfsdump
xfsdump -f /opt/dump_sdb1 /dev/sdb1 [-L dump_sdb1 -M sdb1]
3、模拟数据丢失并使用xfsrestore
cd /data/
rm -rf /data/*
ls ;此时发现数据全部消失
xfsrestore -f /opt_sdb1 /data/ ;对data目录进行数据恢复

日志文件

日志的功能:

用于记录系统、程序运行中发生的各种事件

通过阅读日志,有助于诊断和解决系统故障

日志文件的分类

内核及系统日志

由系统服务rsyslog统一进行管理,日志格式基本相似

主配置文件/etc/rsyslog.conf

用户日志

记录系统用户登录与退出系统的相关信息

程序日志

由各种应用程序独立管理的日志文件,记录格式不统一

如何去书写日志

日志保存的位置

默认位于:/var/log ;系统或者用户日志

主要日志内容介绍

补充:系统服务rsyslog的安装包与主程序

常见的一些日志

1、内核与公共消息日志(排障用)

/var/log/messages: 记录linux内核消息的各种应用程序的公共日志信息,包括启动、IO错误、网络错误、程序故障等。对于未使用独立日志文件的应用程序或者服务,一般都可以从该日志中获得相关的日志记录信息

2、极化任务日志

/var/log/cron :记录crond极化任务产生的时间信息

3、系统引导日志

/var/log/dmesg :记录linux系统在引导过程中的各种事件信息

4、邮件登录日志

/var/log/maillog : 记录进入或者发出系统电子邮箱活动

5、用户登录日志

/var/log/secure :记录用户认证相关的安全事件信息

/var/log/lastlog :记录每个用户最近的登录事件(采用二进制,需要相关转码工具)

/var/log/wtmp :记录每个用户登录、注销与系统启动和停机事件(采用二进制,需要相关转码工具)

/var/run/btmp :记录失败的、错误的登录尝试以及验证事件、二进制格式

vim /etc/rsyslog.conf ;查看rsyslog.conf配置文件
之后开打后如下图所示{设备.级别
动作}

设备字段的说明:
auth:用户认证时产生的日志
authpriv:ssh、ftp等登录信息的验证日志
daemon:一些守护进程产生的日志
ftp:FTP产生的日志
lpr:打印相关活动
mark:rsyslog内部服务的信息,事件标识
news:网络新闻传输协议(nntp)产生的消息
syslog:系统日志
uucp:两个unix之间的相关通讯
console:针对系统控制台的消息
cron:系统执行定时任务产生的日志
kern:系统内核日志
local0~local7:自定义程序使用
mail:邮件日志
user:用户进程

linxu系统内核消息的优先级别

0 EMERG(紧急) 如系统崩溃
1 ALERT(警告) 如数据库被破坏
2 CRIT (严重) 如硬盘错误
3 ERR (错误) 不是非常紧急的
4 WARNING (提醒) 需要提醒用户的主要事件
5 NOTICE (注意) 需要注意的事件,无需处理
6 INFO (信息) 一般信息
7 DEBUG (调试) 调试程序时使用
none 没有优先级,不记录任何消息
日志的一般格式

公共日志 /var/log/messages文件的记录格式
事件标签:消息发出的日期和时间
主机名:生成消息的计算机名称
子系统名称:发出消息的应用程序
消息:消息的具体内容
此外:程序自己维护日志记录,httpd网站服务程序使用两个日志文件:
access_log ;记录客户访问时间
erro_log ;记录错误事件

用户日志分析

保存了用户登录、退出系统等相关信息
/var/log/lastlog;最近的用户登录事件
/var/log/wtmp;用户登录、注销与开关机的事件
/var/run/utmp:当前挡路的每一个用户的详细信息
/var/log/secure;与用户验证相关的安全事件
分析工具
users 、who、w、last、lastb
last命令用于查询成功登录系统的用户记录
lastb命令用于查询登录失败的用户记录
由相应的应用程序独立进行管理
awk、sed、vim 是三大主要使用的工具
日志管理策略
及时做好备份与归档
a、命令/脚本+crontab
b、rsyslog
c、ELK/EFK
延长日志保存期限
控制日志访问权限:各类敏感信息如账户、口令等
集中管理日志:
1、将服务器的日志统一发送到日志文件服务器
2、便于日志信息的统一收集、整理和分析
3、杜绝日志信息的意外丢失、恶意篡改与删除

实验:配置日志服务器

rsyslog是一个C/S架构,可以通过套接字来进行监听记录工作。可以基于TCP和UDP工作。默认的监听端口时514,只需要在MODULES打开即可
发送服务器:客户端 192.168.206.20
收集服务器:192.168.206.30

步骤:
1、先关闭服务端和客户端防火墙、selinux
setenforce 0
systemctl stop firewalld
systemctl disable firewalld

2、修改客户端配置文件,并启动服务
vim /etc/rsyslog.conf
进入文本后将下面四行的注释取消掉

接着添加以下内容

$template myFormat, "%timestamp% %hostname% %syslogseverity-text% %syslogtag% %msg%\\n"
$ActionFileDefaultTemplate myFormat
*.info;mail.none;authpriv.none;cron.none @@192.168.80.30:514

#%timestamp% :时间戳
#%fromhost-ip告 : 接收的信息来自于哪个节点的IP
#hostname号: 主机名
#%syslogseverity-text% : 日志等级
#%syslogtag% :服务进程br/>#%msg%:日志内容
#接收方IP前面一个@表示TCP传输,两个@表示UDP传输
systemcrl restart rsyslog

修改服务端配置文件,并启动服务
vim /etc/rsyslog.conf
#将下面四行前的注释取消掉
$ModLoad imudp
$UDPServerRun 514
$ModLoad imtcp
$InputTCPServerRun 514
#添加以下内容
$AllowedSender tcp, 192.168. 80.0/24 #允许192.168.80.0网段内的主机以tcp协议来传输
$template Remote,"/data/1og/%romhost-ip%/&fromhost-ip%_%$YEAR%-%$MONTH%-%$DAY8.1og"
#定义模板,接受日志文件路径,区分了不同主机的日志
:fromhost-ip, !isequal, "127.0.0.1" ?Remote #过滤掉server 本机的日志
systemcrl restart rsyslog

//在服务端创建/data/log目录,以接受大量日志信息,配置文件中的路径应当与该路径一致
mkdir -p /data/log
//验证
客户端的终端命令输入或者重启一个服务
logger "hello world"
在服务端查看日志文件
tree /data/log/
(如果是最小化安装,请使用yum本地安装tree)

Centos7 专有日志管理工具

1、查看内核日志(不显示应用日志)
journalctl -k
2、查看系统本次启动的日志
journalctl -b [-0] ;"0"指上上次启动的日志
3、查看上一次启动的日志
journalctl -b -1
4、显示尾部指定行数的日志
journalctl -n 20 [-f]
备注:查看的是/var/log/messages的日志。但是格式上有所调整。如主机名格式不一样而已
5、!查看某个服务的日志
journalctl -u httpd.service [-f]

6、查看指定进程的日志
journalctl _PID=1 ;此处的是查看init进程(详情见我的开机引导那篇)
7、查看指定用户的日志
journalctl _UID=0 --since today ;查今天的root用户的日志,用户UDP=0的就是root用户
或者
journalctl -xe
-x :是目录的意思,在报错的信息下会附加解决问题的网址
-e:(pager-end)从末尾开始看
8、!查看所有日志(默认情况下,只保留本次启动的日志)
journalctl
journalctl -r :r表示倒叙

以上是关于请问linux系统中inode和block的关系?的主要内容,如果未能解决你的问题,请参考以下文章

linux运维必了解的日志文件系统

Linux——深入理解linux文件系统与日志分析

Linux inode 详解

Linux学习笔记10-文件目录与磁盘格式三

linux_inode和block

深入理解Linux文件系统与日志分析