数据恢复(四)-debugfs命令使用详解

数据恢复(四)-debugfs命令使用详解

ext2/ext3/ext4 文件系统调试器

debugfs

在不依赖第三方数据恢复软件的情况下,linux自带适用于常规数据恢复的程序当属debugfs。该命令功能强大,在我数据恢复系列的前几篇文章中频繁提到。但是国内对debugfs详细使用介绍较少且不全面。故专门用一篇文章来介绍debugfs使用,可以对数据恢复有更深刻的理解。

实验环境

  • 腾讯云CVM
  • 系统环境 Ubuntu 18.04.4 LTS
  • debugfs 1.44.1 (24-Mar-2018)
  • /debugfsTest 为单独挂载的云硬盘 /dev/vdb
root@VM-8-15-ubuntu:/# cd /debugfsTest/
root@VM-8-15-ubuntu:/debugfsTest# touch {1..10}.txt
root@VM-8-15-ubuntu:/debugfsTest# ls
1.txt  10.txt  2.txt  3.txt  4.txt  5.txt  6.txt  7.txt  8.txt  9.txt

debugfs 常用选项

-V

查看当前debugfs版本

root@VM-8-15-ubuntu:/debugfsTest# debugfs -V
debugfs 1.44.1 (24-Mar-2018)
        Using EXT2FS Library version 1.44.1

-w

指定文件系统应该以写模式打开。没有这个选项,文件系统是以只读模式打开,在执行部分写的子命令时会报错。

root@VM-8-15-ubuntu:/debugfsTest# debugfs /dev/vda1 
debugfs 1.44.1 (24-Mar-2018)
debugfs:  rm /debugfsTest/1.txt 
rm: Filesystem opened read/only     #没有加-w参数,提示文件系统只有只读权限
root@VM-8-15-ubuntu:/debugfsTest# debugfs -w /dev/vda1
debugfs 1.44.1 (24-Mar-2018)
debugfs:  rm /debugfsTest/1.txt     #执行成功

-f cmd_file

debugfs从cmd_file文件读取命令并执行它们。当debugfs完成执行命令完成后退出。

root@VM-8-15-ubuntu:/debugfsTest# echo pwd > testDebugfs.sh
root@VM-8-15-ubuntu:/debugfsTest# debugfs  /dev/vda1 -f testDebugfs.sh 
debugfs 1.44.1 (24-Mar-2018)
debugfs: pwd
[pwd]   INODE:      2  PATH: /
[root]  INODE:      2  PATH: /

-R request

使用debugfs执行单个命令request后退出。

root@VM-8-15-ubuntu:/debugfsTest# debugfs  /dev/vdb -R "pwd"
debugfs 1.44.1 (24-Mar-2018)
[pwd]   INODE:      2  PATH: /
[root]  INODE:      2  PATH: /

-z undo_file

在覆盖文件系统块之前,将块的旧内容写入撤消文件。此撤消文件可以与 e2undo一起使用,以在出现问题时恢复文件系统的旧内容。

root@VM-8-15-ubuntu:/debugfsTest# debugfs -w /dev/vdb -z /tmp/undo
debugfs 1.44.1 (24-Mar-2018)
Overwriting existing filesystem; this can be undone using the command:
    e2undo /tmp/undo /dev/vdb

debugfs 指定文件

许多 debugfs 命令以 filespec 作为参数来指定 debugfs 当前打开的文件系统中的 inode(而不是路径名)。filespec 参数可以以两种形式指定。

  1. 第一种形式是 inode 编号,由尖括号,例如 <2>。
  2. 第二种形式是路径名;如果路径名以正斜杠 (‘/’) 为前缀,则相对于 debugfs 当前打开的文件系统的根进行解释。

debugfs 常用子命令

help

打印所有子命令的帮助信息。

debugfs:  help
show_debugfs_params, params    显示 debugfs 参数
open_filesys, open    打开一个文件系统
close_filesys, close    关闭文件系统
freefrag, e2freefrag    报告可用空间碎片
feature, features    设置/打印超级块功能
dirty_filesys, dirty    将文件系统标记为脏
init_filesys    初始化文件系统(DESTROYS DATA)
show_super_stats, stats    显示超级块统计信息
ncheck    做  inode->name    翻译
icheck    做  block->inode    翻译
change_root_directory,chroot    更改根目录
change_working_directory, cd    更改工作目录
list_directory, ls    列出目录
show_inode_info, stat    显示inode信息
dump_extents,  extents,  ex    转储范围信息
blocks    打印 inode 使用的块
filefrag    报告一个 inode 的碎片信息
link, ln    创建目录链接
unlink    删除目录链接
mkdir    创建目录
rmdir    删除目录
rm    删除文件(如果合适,取消链接和 kill_file)
kill_file    释放一个 inode 和它的block
copy_inode    复制inode结构
clri    清除一个 inode 的内容
freei    清除一个 inode 的    in-use    标志
seti    设置一个 inode 的    in-use    标志
testi    测试一个 inode  的    in-use    标志
freeb    清除块的使用中标志
setb    设置块的使用中标志
testb    测试一个块的使用中标志
modify_inode,mi    按结构修改一个inode
find_free_block,ffb    查找空闲块
find_free_inode,ffi    查找空闲    inode
print_working_directory, pwd    打印当前工作目录
expand_dir,展开展开目录
mknod    创建一个特殊文件
list_deleted_inodes, lsdel    列出已删除的 inode
undelete, undel    取消删除文件
write    从你的本地文件系统复制一个文件
dump_inode,dump    将一个 inode 转储到一个文件中
cat    将一个 inode 内容输出到    stdout
lcd    更改本机文件系统上的当前目录
rdump    递归地将目录转储到本机文件系统
set_super_value, ssv    设置超级块值
set_inode_field, sif    设置 inode 字段
set_block_group, set_bg    设置块组描述符字段
logdump    转储日志的内容
htree_dump, htree    转储一个哈希索引目录
dx_hash, hash    计算一个文件名的目录哈希
dirsearch    在目录中搜索特定文件名
bmap    计算一个 inode 的逻辑->物理块映射
fallocate    将未初始化的块分配给一个 inode
punch, truncate    通过解除分配从一个 inode  中打孔(或截断)块
symlink    创建符号链接
imap    计算一个inode的位置
dump_unused    转储未使用的块
set_current_time    设置文件系统字段时使用的当前时间
supported_features    此版本的    e2fsprogs    支持的打印功能
dump_mmp    转储 MMP 信息
set_mmp_value, smmp    设置    MMP    值
extent_open, eo    打开用于范围操作的    inode
zap_block、zap    Zap    块:填充    0、模式、翻转位等。
block_dump,bdump, bd    转储块的内容
ea_list    列出一个    inode    的扩展属性
ea_get    获取一个inode的扩展属性
ea_set    设置一个inode的扩展属性
ea_rm    移除一个inode的扩展属性
list_quota, lq    列出配额
get_quota, gq    获取配额
inode_dump,idump, id    以十六进制转储    inode    结构
journal_open, jo    打开日志
journal_close, jc    关闭日志
journal_write, jw    将事务写入日志
journal_run, jr    恢复日志
help    显示有关命令或主题的信息。
list_requests, lr, ?    列出可用的命令。
quit, q    离开子系统。

params

显示 debugfs 参数

root@VM-8-15-ubuntu:~# debugfs /dev/vdb -w
debugfs 1.44.1 (24-Mar-2018)
debugfs:  params 
Open mode: read-write
Filesystem in use: /dev/vdb

blocks filespec

输出 inode 文件指向的block块。

root@VM-8-15-ubuntu:~# ls -i /etc/passwd
270146 /etc/passwd
root@VM-8-15-ubuntu:~# debugfs /dev/vda1 -R "blocks <270146>"
debugfs 1.44.1 (24-Mar-2018)
1124527 

这里获取的blocks的值,就是文件在磁盘上的真实位置。

open , close

打开/关闭文件系统。通常使用debugfs时,都是在后面直接跟文件系统。也可以进入到debugfs后再打开/关闭指定文件系统。

root@VM-8-15-ubuntu:~# debugfs
debugfs 1.44.1 (24-Mar-2018)
debugfs:  ls
ls: Filesystem not open
debugfs:  open /dev/vdb
debugfs:  ls
debugfs:  close
debugfs:  ls
ls: Filesystem not open

freefrag

报告可用空间碎片。

debugfs:  freefrag
Device: /dev/vdb
Blocksize: 4096 bytes
Total blocks: 10485760
Free blocks: 10243382 (97.7%)

Min. free extent: 16 KB 
Max. free extent: 2064256 KB
Avg. free extent: 1241620 KB
Num. free extent: 33

HISTOGRAM OF FREE EXTENT SIZES:
Extent Size Range :  Free extents   Free Blocks  Percent
   16K...   32K-  :             1             4    0.00%
   64M...  128M-  :             4         97140    0.95%
  128M...  256M-  :             5        322529    3.15%
  256M...  512M-  :             2        187354    1.83%
  512M... 1024M-  :             2        391156    3.82%
    1G...    2G-  :            19       9245198   90.26%

dirty

将文件系统状态设置为dirty,mount时候会深入检查每个文件的完整性。执行后没有任何返回。

debugfs:  dirty

init_filesys

初始化文件系统,删除数据。

root@VM-8-15-ubuntu:~# debugfs /dev/vdb -w
debugfs 1.44.1 (24-Mar-2018)
debugfs:  init_filesys
init_filesys: Usage: initialize <device> <blocks>
debugfs:  init_filesys /dev/vdb 33798
init_filesys: Filesystem /dev/vdb is still open.  Close it first.
root@VM-8-15-ubuntu:~# umount /dev/vdb
root@VM-8-15-ubuntu:~# debugfs
debugfs 1.44.1 (24-Mar-2018)
debugfs:  blocks /passwd
blocks: Filesystem not open
debugfs:   init_filesys /dev/vdb 33798
root@VM-8-15-ubuntu:~# mount /dev/vdb /debugfsTest/
mount: /debugfsTest: mount(2) system call failed: Structure needs cleaning.

初始化文件系统后,再次挂载报错。mount挂载失败出现Structure needs cleaning,使用命令 fsck.ext4 /dev/vdb 进行修复。

root@VM-8-15-ubuntu:~# fsck.ext4 /dev/vdb
e2fsck 1.44.1 (24-Mar-2018)
ext2fs_check_desc: Corrupt group descriptor: bad block for block bitmap
fsck.ext4: Group descriptors look bad... trying backup blocks...
Block bitmap for group 0 is not in group.  (block 0)
Relocate<y>? yes
Inode bitmap for group 0 is not in group.  (block 0)
......
Free inodes count wrong (8479, counted=8469).
Fix<y>? yes
/dev/vdb: ***** FILE SYSTEM WAS MODIFIED *****
/dev/vdb: 11/8480 files (0.0% non-contiguous), 1083/33798 blocks
root@VM-8-15-ubuntu:~# mount /dev/vdb /debugfsTest/
root@VM-8-15-ubuntu:~# cd /debugfsTest/
root@VM-8-15-ubuntu:/debugfsTest# ls
lost+found

文件系统修复后数据丢失,这个操作非常危险。

stats

显示超级快统计信息

root@VM-8-15-ubuntu:~# debugfs /dev/vdb -R "stats" |more
debugfs 1.44.1 (24-Mar-2018)
Filesystem volume name:   <none>
Last mounted on:          /debugfsTest
Filesystem UUID:          5841c171-06b9-4ea4-9030-597236944d37
Filesystem magic number:  0xEF53
Filesystem revision #:    0 (original)
Filesystem features:      (none)
Filesystem flags:         signed_directory_hash 
Default mount options:    (none)
Filesystem state:         not clean
Errors behavior:          Continue
Filesystem OS type:       Linux

这个和执行 dumpe2fs /dev/vdb 看到的信息是差不多的。

ncheck, icheck

ncheck inode号翻译成文件名
icheck 块号翻译成inode号

root@VM-8-15-ubuntu:~# ls -i /etc/passwd
270146 /etc/passwd
root@VM-8-15-ubuntu:~# debugfs /dev/vda1 -R "ncheck 270146"
debugfs 1.44.1 (24-Mar-2018)
Inode   Pathname
270146  /etc/passwd
root@VM-8-15-ubuntu:~# debugfs /dev/vda1 -R "blocks /etc/passwd"
debugfs 1.44.1 (24-Mar-2018)
1124527 
root@VM-8-15-ubuntu:~# debugfs /dev/vda1 -R "icheck 1124527"
debugfs 1.44.1 (24-Mar-2018)
Block   Inode number
1124527 270146

stat

打印inode信息,原理是从磁盘上读取inode的表结构。记录了文件的几个时间戳,比shell命令中的stat命令看到的信息更加详细。其中EXTENTS记录的是该inode对应的block的值。

Inode: 270146   Type: regular    Mode:  0644   Flags: 0x80000
Generation: 1919007159    Version: 0x00000000:00000001
User:     0   Group:     0   Project:     0   Size: 1954
File ACL: 0
Links: 1   Blockcount: 8
Fragment:  Address: 0    Number: 0    Size: 0
 ctime: 0x623033ec:cfb832f4 -- Tue Mar 15 14:36:28 2022
 atime: 0x6243fa8d:997af09c -- Wed Mar 30 14:37:01 2022
 mtime: 0x623033ec:cfb832f4 -- Tue Mar 15 14:36:28 2022
crtime: 0x623033ec:cfb832f4 -- Tue Mar 15 14:36:28 2022
Size of extra inode fields: 32
Inode checksum: 0xcde2ce28
EXTENTS:
(0):1124527

赞赏

微信赞赏支付宝赞赏

Zgao

愿有一日,安全圈的师傅们都能用上Zgao写的工具。

发表评论