数据恢复(四)-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 参数可以以两种形式指定。
- 第一种形式是 inode 编号,由尖括号,例如 <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赞赏
微信赞赏支付宝赞赏
发表评论