debugfs 是一个 ext2、ext3、ext4 文件系统的调试工具,它允许用户直接与文件系统元数据(如 inode、块位图、inode 位图等)进行交互,而无需通过标准的文件系统 API,这意味着你可以用它来检查、修改甚至修复文件系统在文件系统驱动程序无法处理时出现的问题。

⚠️ 重要警告:
debugfs 是一个非常危险的工具,它绕过了文件系统的所有安全检查。错误使用它可能会彻底损坏你的文件系统,导致数据永久丢失! 在对生产系统或任何包含重要数据的文件系统使用 debugfs 之前,请务必备份数据,建议只在挂载为只读的文件系统或文件系统副本上使用。
基本语法
debugfs [ -w ] [ -s superblock ] [ -b blocksize ] [ -i ] [ -f cmd_file ] [ -R request ] [ -V ] [ device ]
常用选项:
device: 指定要调试的文件系统设备,/dev/sdb1或一个磁盘镜像文件。-w: 以读写模式打开文件系统,默认是只读模式。使用此选项要格外小心!-R request: 直接执行一个单次命令,然后退出,这对于脚本化操作非常有用。-f cmd_file: 从一个指定的文件中读取并执行debugfs命令。-V: 显示debugfs的版本信息。
如何启动 debugfs
启动 debugfs 最简单的方式是指定一个设备文件。
# 以只读模式打开 /dev/sdb1 sudo debugfs /dev/sdb1 # 以读写模式打开 /dev/sdb1 (极度危险!) sudo debugfs -w /dev/sdb1
启动后,你会进入一个 debugfs> 命令行提示符。

核心命令分类详解
debugfs 的命令可以分为几大类:信息查询、文件操作、元数据操作和实用工具。
A. 帮助和信息类
-
help [command_name]- 显示所有可用命令的帮助信息,或者特定命令的详细用法。
debugfs> help ls
-
ls- 列出当前目录(默认是根目录 )下的文件和子目录,类似于
ls -l。
- 列出当前目录(默认是根目录 )下的文件和子目录,类似于
-
stats
(图片来源网络,侵删)显示文件系统的统计信息,如总块数、空闲块数、inode 数、空闲 inode 数等。
B. 文件和目录操作类
-
cd pathname- 切换到指定的目录,
cd /lost+found。
- 切换到指定的目录,
-
ls -l pathname- 显示文件或目录的详细信息,包括权限、所有者、大小、时间戳和inode 号。
-
cat pathname显示文件的内容。
-
lsdel列出所有被删除的文件(通过检查 inode 位图),这对于恢复意外删除的文件非常有用,它会显示 inode 号和原始文件名(如果还能找到)。
-
dump <inode_num> [filename]将指定 inode 的内容转储到标准输出或一个文件中,这对于从损坏的 inode 中恢复数据很有用。
C. Inode 和元数据操作类 (核心功能)
-
stat <inode_num>显示指定 inode 的详细信息,包括块指针,这是检查文件数据块是否损坏的关键命令。
-
lsinode列出所有 inode 的状态(已使用、未使用、坏等)。
-
icat <filesystem> <inode_num>- 将指定 inode 的内容打印到标准输出,与
dump类似,但更专注于内容提取。
- 将指定 inode 的内容打印到标准输出,与
-
ncheck <inode_num...>根据 inode 号查找对应的文件或目录路径。
-
set_block_superblock <block_num>尝试从指定的块号读取超级块,如果主超级块损坏,这可以帮你找到备份超级块的位置。
D. 恢复和修复类 (高级且危险)
-
undel <inode_num>- 将一个已删除的 inode 标记为“未使用”,这会使该 inode 及其数据块再次被文件系统使用,这不是传统的“恢复”命令,它更像是一个“取消删除”操作,可能会覆盖你真正想恢复的数据。请谨慎使用。
-
link <old_inode> <new_path>为一个已存在的 inode 创建一个新的硬链接。
-
ln <old_inode> <new_path>link命令的别名。
-
mkdir pathname创建一个新目录。
-
touch pathname创建一个新文件或更新现有文件的时间戳。
-
rm pathname- 删除一个文件或目录。这会永久删除数据!
E. 实用工具类
-
feature [list | set | clear]- 查看或修改文件系统的特性(如
has_journal,extent等)。修改特性可能导致文件系统无法挂载!
- 查看或修改文件系统的特性(如
-
htree_dump <pathname>显示目录的 B+树结构(用于 ext3/ext4 的大目录)。
-
zap_block <block_num>- 将指定的数据块清零! 这是一个非常危险的命令,可能会导致数据丢失。
实战场景示例
查找并查看已删除的文件
假设你不小心删除了一个重要文件,但还没有写入太多新数据。
-
以只读模式挂载文件系统:
sudo debugfs /dev/sdb1
-
列出所有被删除的文件:
debugfs> lsdel Deleted inodes: inode has_dtime deleted_by deleted_at 12345 1678886400 1000 2025-03-15 10:00:00
你会看到一个 inode 号
12345。 -
检查这个 inode 的信息:
debugfs> stat 12345 Inode: 12345 Type: regular Mode: 0644 Size: 1024 ... Blocks: (0-2): 4567, 4568, 4569
这告诉你这个 inode 对应的是一个普通文件,大小为 1024 字节,数据存储在块 4567, 4568, 4569。
-
输出到屏幕或保存到另一个文件:
# 输出到屏幕 debugfs> dump 12345 # 保存到另一个文件 (/tmp/recovered_file.txt) debugfs> dump 12345 /tmp/recovered_file.txt
-
退出:
debugfs> quit
检查文件系统块损坏
如果一个文件无法读取,怀疑是文件系统块损坏。
-
启动
debugfs:sudo debugfs /dev/sdb1
-
找到损坏文件的 inode 号(可以通过
ls -l或find命令在系统层面找到)。 -
检查该 inode 的块信息:
debugfs> stat <inode_number> ... Blocks: (0-1): 7890, 7891
假设块
7891损坏了。 -
尝试读取文件内容:
debugfs> cat <inode_number>
你可能会在某个位置看到乱码,或者在读取到损坏块时程序中断。
-
手动读取好的块:
# 使用 dd 从设备中读取好的块 7890 # (注意:这需要你知道块大小,通常是 4KB) dd if=/dev/sdb1 bs=4096 skip=7890 count=1 | hexdump -C
替代方案
虽然 debugfs 功能强大,但在很多情况下,有更安全、更高级的工具:
dumpe2fs/tune2fs: 用于查看和修改文件系统参数(超级块信息),而不是文件内容。e2fsck: ext 文件系统的标准检查和修复工具,它才是修复文件系统问题的首选,而不是手动修改元数据。grep/fgrep/egrep: 在文件系统中搜索字符串内容。photorec/TestDisk: 专业的数据恢复软件,它们通过分析原始数据来恢复文件,比debugfs更安全,尤其是在文件系统结构严重损坏时。
| 命令 | 功能 | 危险等级 |
|---|---|---|
ls, cd, cat |
基本文件浏览 | 低 |
stat, ncheck, icat |
查看元数据,提取数据 | 中 |
lsdel, undel |
查找/取消删除文件 | 高 |
rm, mkdir, touch |
修改文件系统结构 | 极高 |
zap_block |
物理破坏数据块 | 灾难性 |
debugfs 是一把“手术刀”,精确但危险,它应该被看作是最后手段,当 e2fsck 和其他工具都无能为力时,才由经验丰富的系统管理员谨慎使用,对于普通用户,请务必远离 -w 选项。
