服务器强制断电后数据文件丢失严重,本地新建文件后断电也会丢失
从操作系统层面来看,假设读写的scsi设备为scsi disk设备,数据处理过程为:
1. 数据先通过文件系统,进入到文件系统的Cache;
2. 文件系统的pdflush daemon会将Cache住的数据刷新到磁盘,其根据buffer head的内容构造bio,然后调用块设备接口(submit_bio)将请求发送给块设备层。
3. bio在块设备层多次转发,最后被merge到块设备的请求队列中。
4. 请求可能会在请求队列滞留一段时间,然后在软中断或者用户上下文中调用request_fn去处理请求队列。
从raid卡层面分析:
预读取方式:在配置界面中一般体现为“Always Read Ahead”、“Read Ahead”、“Ahead”等字样。使用此策略后,从虚拟磁盘中读取所需数据时,会把后续数据同时读出放在Cache中,用户随后访问这些数据时可以直接在Cache中命中,将减少磁盘寻道操作,节省响应时间,提高了数据读取速度。要使用该策略,要求RAID卡支持数据掉电保护功能,且如果此时超级电容异常,可能导致数据丢失。
非预读取方式:使用此策略后,RAID卡接收到数据读取命令时,才从虚拟磁盘读取数据,不会做预读取的操作。
回写:在配置界面中一般体现为“Write Back”等字样。使用此策略后,需要向虚拟磁盘写数据时,会直接写入Cache中,当写入的数据积累到一定程度,RAID卡才将数据刷新到虚拟磁盘,这样不但实现了批量写入,而且提升了数据写入的速度。当控制器Cache收到所有的传输数据后,将给主机返回数据传输完成信号。要使用该策略,要求RAID卡支持数据掉电保护功能,且如果此时超级电容异常,可能导致数据丢失。
写通:在配置界面中一般体现为“Write Through”等字样。使用此策略后,RAID卡向虚拟磁盘直接写入数据,不经过Cache。当磁盘子系统接收到所有传输数据后,控制器将给主机返回数据传输完成信号。此种方式不要求RAID卡支持BBU,即使BBU故障,也无影响,缺点是写入速度较低。
与BBU相关的回写:在配置界面中一般体现为“Write Back with BBU”等。使用此策略后,当RAID卡BBU在位且状态正常时,RAID卡到虚拟磁盘的写操作会经过Cache中转(即回写方式);当RAID卡BBU不在位或BBU故障时,RAID卡到虚拟磁盘的写操作会自动切换为不经过Cache的直接写入(即写通方式)。
分析日志过程中发现,系统开机日志都存在于内核缓冲区中(dmesg文件),正常应该存在于系统日志message文件中。
写完新文件后运行sync命令,强制刷缓存到磁盘。然后断电重启服务器看文件是否存在。如若文件数据未丢失可采取去掉或调小系统写缓存。
如若更换硬件可解决可联系硬件厂商协助处理。
这个参数控制文件系统的文件系统写缓冲区的大小,单位是百分比,表示系统内存的百分比,表示当写缓冲使用到系统内存多少的时候,开始向磁盘写出数据。增大之会使用更多系统内存用于磁盘写缓冲,也可以极大提高系统的写性能。但是,当你需要持续、恒定的写入场合时,应该降低其数值
这个参数控制文件系统的pdflush进程,在何时刷新磁盘。单位是百分比,表示系统内存的百分比,意思是当写缓冲使用到系统内存多少的时候,pdflush开始向磁盘写出数据。增大之会使用更多系统内存用于磁盘写缓冲,也可以极大提高系统的写性能。但是,当你需要持续、恒定的写入场合时,应该降低其数值
3. /proc/sys/vm/dirty_writeback_centisecs
这个参数控制内核的脏数据刷新进程pdflush的运行间隔。单位是 1/100 秒。缺省数值是500,也就是 5 秒。如果你的系统是持续地写入动作,那么实际上还是降低这个数值比较好,这样可以把尖峰的写操作削平成多次写操作
4. /proc/sys/vm/dirty_expire_centisecs
这个参数声明Linux内核写缓冲区里面的数据多“旧”了之后,pdflush进程就开始考虑写到磁盘中去。单位是 1/100秒。缺省是 3000,也就是 30 秒的数据就算旧了,将会刷新磁盘。对于特别重载的写操作来说,这个值适当缩小也是好的,但也不能缩小太多,因为缩小太多也会导致IO提高太快
1、文件恢复原理
此处要介绍的命令是通过文件系统的 inode 值(一般是 2 )来获取文件系统信息。在 ext3 和 ext4 文件系统中,每个文件都是通过 inode 来描述其数据存放的具体位置,当文件被删除以后,inode 的数据指针部分被清零,文件目录区没有太多变化。文件的读写都是通过 inode 来实现,当 inode 数据指针被清零以后,即便文件内容还在,也没有办法把文件内容组合出来。当 ext3 和 ext4 文件系统中的元数据 metadata 发生变化时,相应的元数据 metadata 在日志文件会有一份拷贝。比如一个文件被删除了,它的 inode 信息会在日志文件中先保存一份,然后把要删除文件 inode 相关信息清零。这个日志文件是循环使用的,当操作过多时,删除的文件的 inode 日志记录会被新的数据替换,这就彻底丧失了根据 inode 找回数据的机会了。如果是大量文件的删除,这个日志文件会被反复循环利用多次,只留给最后删除的那些文件的恢复机会。
2、使用命令行工具恢复数据的方式介绍
formost 是一个基于文件头和尾部信息以及文件的内建数据结构恢复文件的命令行工具。这个过程通常叫做数据挖掘(data carvubg)。formost 可以分析由 dd、Safeback、Encase 等生成的镜像文件,也可以直接分析驱动器。文件头和尾可以通过配置文件设置,也可以通过命令行开关使用 formost 内建的文件类型。formost 最初是由美国空军特别调查室(Air Force Office of Special Investigations)和信息系统安全研究中心(The Center for Information Systems Security Studies and Research)开发的,现在使用 GPL 许可。Foremost 支持恢复如下格式:avi, bmp, dll, doc, exe, gif, htm, jar, jpg, mbd, mov, mpg, pdf, png, ppt, rar, rif, sdw, sx, sxc, sxi, sxw, vis, wav, wmv, xls, zip。
针对 Linux 下的 ext 文件系统来说,常用的 Linux 文件删除恢复工具有 debugfs、ext3grep、extundelete 等。extundelete 是一个开源的数据恢复工具,支持 ext3、ext4 文件系统,其官方站点位于http://extundelete.sourceforce.net/,目前最新稳定版本为 0.2.0。
上面介绍的两种命令行工具 foremost 和 extundelete 二者相比,foremost 支持的文件系统比较多(包括 ext2、 ext3 、vfat、NTFS、ufs、jfs 等)和 extundelete 支持的文件系统较少(ext3、ext4)文件系统。不过 foremost 只能支持恢复特定格式的文件。
3、使用foremost恢复文件
安装软件包(此处以V10 pro桌面系统为实验环境),执行命令#apt install foremost 。准备一个U盘/dev/sdb1中存放一张png图片名为test.png,然后接入系统中。挂载目录为/foremost_test。
删除该图片
# rm -f /foremost_test/test.png
恢复图片数据
# foremost -t png -i /dev/sdb1
恢复完成后会在当前目录建立一个 output 目录,在 output 目录下会建立 png 子目录下会包括所有可以恢复的 png 格式的文件。png 子目录下会包括的 png 格式的文件名称已经改变,另外 output 目录下的 audit.txt 文件是恢复文件列表。
恢复多个类型文件#foremost -v -T -t doc,pdf,jpg,gif -i /dev/sdb1
恢复完成后会在当前目录建立一个 output 目录,在 output 目录下会建立四个子目录(/doc,/pdf,/jpg,/gif),分别包括四种类型文件。另外 output 目录下的 audit.txt 文件是恢复文件列表。
4、使用extundelete
安装软件包,#apt install extundelete, 这里我们使用一个分区/dev/sdd1 挂在在/backupdata 上,建立一个测试目录/delete 并建立一文件:del1.txt 。
# mkdir –p /backupdata/deldata
# mkfs.ext4 /dev/sdd1
# mount /dev/sdd1 /backupdata
#cd /backupdata/deldata
# touch del1.txt
# echo " hello " > del1.txt
获取文件校验码
删除文件
# rm -fr /backupdata/*
卸载文件系统或者挂载为只读
# umount /backupdata
查询恢复数据信息,注意这里的--inode 2 这里会扫描分区 (查看要恢复的数据的文件夹的inode信息。#ll -i ,最前面一列即为inode信息):
# extundelete /dev/sdd1 --inode 2
上面标记为 Deleted 是已经删除的文件或目录,可选择恢复一个文件或者目录或者所有文件
# extundelete /dev/sdd1 --restore-file del1.txt
# extundelete /dev/sdd1 --restore-directory /backupdata/deldata
# extundelete /dev/sdd1 --restore-all
查看恢复的数据,恢复软件会在当前目录生成一个目录 RECOVERED_FILES里面就是我们的数据。