11.1深入理解Linux文件系统
在处理Liunx系统出现故障时,故障的症状是最易发现。数学LInux系统中常见的日志文件,可以帮助管理员快速定位故障点,并及时解决各种系统问题。
11.1.1 inode与block详解
文件系统通常会将这两部分内容分别存放在inode和block中
1.inode和block概述
- 操作系统读取硬盘时,多个扇区(每个扇区512字节)组成的块,最常见的是4KB及连续8个扇区组成一个block
- 在块中必须找到一个地方储存文件的元信息,这个区域叫inode。一个文件必须占用一个inode,但至少占用一个block。
2.inode的内容
使用stat命令即可查看某个文件的inode信息
[root@localhost ~]# stat anaconda-ks.cfg 文件:"anaconda-ks.cfg" #文件名字大小:1592 块:8 IO 块:4096 普通文件 #文件大小
设备:fd00h/64768d Inode:268632130 硬链接:1
权限:(0600/-rw-------) Uid:( 0/ root) Gid:( 0/ root)
环境:system_u:object_r:admin_home_t:s0
最近访问:2024-05-27 21:33:26.425066604 +0800 #是最后一次改变文件或目录的时间
最近更改:2024-05-27 21:33:26.434067124 +0800 #是最后一个访问文件或目录的时间
最近改动:2024-05-27 21:33:26.434067124 +0800
#是最后一个修改文件或目录的时间
创建时间:-
3.inode的号码
用户在访问文件时,表面上是用户通过文件名来打开文件,而实际系统内部的过程分成以下三步:
- 系统找到这个文件名对应的inode号码
- 通过inode号码,获取inode信息
- 根据inode信息,找到文件数据所在的block,并读出数据。
常见的查看inode号码方式有两种
-
- ls -i命令:直接查看文件名所对应的inode号码
- stat命令:通过查看文件inode信息而查看到inode号码
[root@localhost ~]# stat anaconda-ks.cfg 文件:"anaconda-ks.cfg" 大小:1592 块:8 IO 块:4096 普通文件
设备:fd00h/64768d Inode:268632130 硬链接:1 #inode号268632130
权限:(0600/-rw-------) Uid:( 0/ root) Gid:( 0/ root)
环境:system_u:object_r:admin_home_t:s0
最近访问:2024-05-27 21:33:26.425066604 +0800
最近更改:2024-05-27 21:33:26.434067124 +0800
最近改动:2024-05-27 21:33:26.434067124 +0800
创建时间:-
[root@localhost ~]# ls -i anaconda-ks.cfg #inode号268632130
268632130 anaconda-ks.cfg
硬盘分区后的结构则是如图:
4.inode的大小
inode也会消耗硬盘空间,所以格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据;另一个是inode区,存放inode所包含的信息。inode总数在格式化时就给定了,执行“df -i”命令即可查看每个硬盘分区对应的的inode总数和已经使用的inode数量。
[root@localhost ~]# df -i
文件系统 Inode 已用(I) 可用(I) 已用(I)% 挂载点
devtmpfs 116635 446 116189 1% /dev
tmpfs 120245 2 120243 1% /dev/shm
tmpfs 120245 606 119639 1% /run
tmpfs 120245 19 120226 1% /sys/fs/cgroup
/dev/mapper/centos-root 100661248 64569 100596679 1% /
/dev/sda2 2097152 331 2096821 1% /boot
/dev/sr0 0 0 0 - /media/cdrom
tmpfs 120245 1 120244 1% /run/user/0
[root@localhost ~]#
- 文件名包括特殊字符,可能无法正常删除,这时直接删除inode,能够起到文件的作用
- 移动文件或一个重名名文件,只是改变文件名,不影响inode号码
- 打开一个文件以后,系统就以inode号码来识别这个文件,不再考虑文件名
11.1.2 硬链接与软连接
- 硬链接允许多个文件指向一个同一个inode号,但不能跨分区。其命令格式为
ln 源文件 目标
- 软连接是再创建一个独立文件,因此可以跨分区。其命令格式为
ln -s 源文件或目录 目标文件或目录
11.1.3 EXT类型文件恢复
EXT类型文件恢复主要涉及在Linux系统中,当使用如
rm命令误删除EXT(如EXT3)文件系统上的文件时,采取的一系列步骤和工具来尝试恢复这些文件。以下是关于EXT3类恢复误删除文件。
-
EXT3数据恢复
[root@localhost ~]# http://nchc.dl.sourceforge.net/project/extundelete/extundelete/0.2.4/extundelete-0.2.4.tar.bz2 #下载tar包 [root@localhost ~]# yum -y install e2fsprogs-devel e2fsprogs-libs gcc* #下载依赖 [root@localhost ~]# tar -xvf extundelete-0.2.4.tar.bz2 #解压下载的安装包 [root@localhost extundelete-0.2.4]# make #编译 [root@localhost extundelete-0.2.4]# makeinstall #编译加载 [root@localhost extundelete-0.2.4]# fdisk /dev/sdb #分区 [root@localhost ~]# mkdir aaa #创建挂载点 [root@localhost ~]# mkfs.ext3 /dev/sdb1 #初始化成ext3类型 [root@localhost ~]# mount /dev/sdb1 aaa #挂载到aaa [root@localhost ~]# cd aaa #cd得到aaa文件下并创建 [root@localhost aaa]# echo a>a [root@localhost aaa]# echo b>b [root@localhost aaa]# echo c>c [root@localhost aaa]# echo d>d [root@localhost aaa]# ls a b c d lost+found [root@bogon ~]# extundelete /dev/sdb1 [root@bogon ~]# cd aaa [root@bogon aaa]# rm -rf a b [root@bogon aaa]# cd [root@bogon ~]# umount aaa [root@bogon ~]# extundelete /dev/sdb1 --restore-all [root@bogon ~]# cd RECOVERED_FILES/ [root@bogon RECOVERED_FILES]# ls file.12 file.13 [root@bogon RECOVERED_FILES]#
11.2.4日志管理
在Linux中,设置和配置一个日志服务器通常涉及到多个步骤,包括安装必要的软件包、配置日志文件的传输和存储等。以下是一个简化的步骤,使用rsyslog(或syslog-ng)和logrotate来管理日志,以及(可选的)使用Elasticsearch, Logstash, Kibana (ELK Stack) 来进行日志的集中存储、分析和可视化。
1. 使用rsyslog或syslog-ng收集日志
以rsyslog为例,你可以编辑/etc/rsyslog.conf
或相关的配置文件来设置日志的接收和转发。以下是一个简化的配置示例,用于接收来自其他系统的UDP日志:
# /etc/rsyslog.conf 示例 # 允许接收UDP日志 $ModLoad imudp $UDPServerRun 514 # 允许接收TCP日志(可选) #$ModLoad imtcp #$InputTCPServerRun 514 # 设置默认的日志文件路径和模板(可选) $template RemoteLogs,"/var/log/remote/%HOSTNAME%/%PROGRAMNAME%.log" & ~ ?RemoteLogs
重启rsyslog服务以应用更改:
systemctl restart rsyslog
2. 使用logrotate管理日志文件大小
你可以编辑/etc/logrotate.conf或/etc/logrotate.d/目录下的文件来设置日志文件的轮转策略。以下是一个示例:
# /etc/logrotate.d/remote 示例 /var/log/remote/*/*.log{ missingokmonthlycreate 0664 root utmpminsize 10Mrotate 2
} }