ext2/ext3/ext4文件系统调试器
debugfs [-Vwc] [-b blksz] [-s superblk] [-f cmdfile] [-R request] [device]
debugfs是一个交互方式的文件系统调试器。可用于考察、修改或维护ext2、ext3或ext4文件系统的状态。其中,device是文件系统分区的设备文件名,如/dev/sdb2。
利用debugfs命令,可以恢复误删的文件等,这是debugfs命令最常见的用法。
debugfs命令使用DEBUGFS_PAGER或PAGER环境变量设置分页显示程序,默认的程序是less。许多交互命令,如ls、stat和stats均使用分页显示程序,逐页显示。由于less退出时总是清屏,故其并非理想的分页显示程序。如果喜欢使用其他分页程序,可在调用debugfs命令之前设置上述两个变量之一。
-b blksize 强制使用指定大小的文件系统逻辑数据块,而不是根据磁盘分区的容量,按照常规方法确定数据块的大小。
-c 假定文件系统已严重受损,可以使用这个选项,以只读方式尝试打开指定的文件系统。
-f cmdfile 采用批处理的方式,从指定的脚本文件中读取并执行debugfs交互命令。执行结束后立即退出debugfs命令。
-R request 执行指定的单个命令请求,然后立即结束debugfs命令的执行。
-s superblk 按照给定的数据块地址读取文件系统的超级块(而不是读取位于文件系统起始位置偏移值1024字节的主超级块)。注意,“-s”选项要求同时使用“-b”选项指定文件系统数据块的大小。
-V 显示debugfs命令的版本信息,然后退出。
-w 以读写方式打开文件系统。如果未指定这个选项,只能以只读方式打开文件系统。在文件系统调试期间发生的任何改动,无法写入文件系统。
进入debugfs交互处理环境之后,可以使用其支持的交互子命令操作文件系统。许多debugfs交互命令使用filespec参数指定文件。filespec参数具有两种表示方式:一是在信息节点号前后增加书名号,如“<2>”表示根目录;二是采用常规的路径名,如“/abc”。如果路径名的第一个字符是斜线“/”,则解释为相对于debugfs当前打开的文件系统根目录的绝对路径名,否则把路径名解释为相对于debugfs维护的当前工作目录的相对路径名。
下面是debugfs命令支持的交互子命令。
bmap filespec logicblk 显示指定信息节点中与指定逻辑数据块号对应的物理数据块号。利用这个命令,可以找出一个文件的实际数据存储位置。
cat filespec 显示指定文件的数据内容。
cd filespec 进入指定的目录,作为当前工作目录。
chroot filespec 把指定的目录作为虚拟根目录。
close [-a] 关闭当前打开的文件系统。如果指定了“-a”选项,还要把调试期间所做的任何修改写入文件系统的超级块(包括主超级块与所有的备份超级块)及其数据块组描述的数据结构中。
clri file 清除指定文件中的数据内容。
dirty 设置超级块的state状态字段,表示文件系统未同步或未正常卸载。
dump [-p] filespec outfile 把指定文件中的数据写入指定的输出文件。如果加了“-p”选项,还要按照源文件信息节点中的属主、用户组和访问权限等属性设置输出文件。注意,输出文件位于调用debugfs命令之前所在的文件系统,而非当前正在调试的文件系统。因此,如果给出的是相对路径名,则输出文件应当是相对于运行debugfs命令时所处的工作目录。
dump_unused 显示未用的数据块。
expand_dir filespec 扩充指定目录文件的容量,即再为目录文件分配一个数据块。
feature [fs_feature] [-fs_feature] ... 显示、设置或清除超级块中的各种文件系统特性。在设置或清除指定的任何文件系统特性之后,显示文件系统特性集的当前状态。
ffb [count [goal]] find_free_block子命令的简化形式,用于找出第一个空闲数据块的地址(数据块号),或者从指定的数据块位置goal开始,找出指定数量count的空闲数据块地址。
ffi [dir [mode]] find_free_inode子命令的简化形式,用于找出第一个可分配的空闲信息节点。如果指定的目录dir存在,则从其信息节点开始找出空闲的信息节点。选用的模式参数用于指定新分配的信息节点的访问权限。
freeb block [count] 把指定的数据块标记为未分配的空闲数据块。如果给出了数据块计数,则从指定的数据块开始标记指定数量的数据块。
freei filespec 释放指定的信息节点。
help 列出debugfs命令支持的交互子命令。
icheck blocks 显示占用了一个或多个指定数据块的信息节点(列表)。
imap filespec 输出指定文件信息节点在信息节点区中的位置。
init_filesys dev blksz 在指定的设备上,使用指定的数据块数量,创建一个ext2文件系统。注意,这种做法只是调用低级的库函数,设置超级块和数据块组描述而已,没有完全初始化所有的数据结构。
kill_file filespec 释放指定文件的信息节点及其数据块。但这种文件删除方式并不能删除指定文件在目录文件中占用的目录项。
lcd dir 把debugfs的当前工作目录改换到系统中的指定目录(而非当前正在调试的文件系统中的某个目录)。
ln filespec destfile 使用指定的文件filespec创建一个硬链接文件destfile。注意,这种做法不会调整文件的链接计数。
logdump[-acs] [-b block] [-i <inode>] [-f journal] [outfile] 转储ext3文件系统中的日志信息。通常,日志的信息节点是由超级块确定的,但可以利用“-i”选项指定日志实际使用的信息节点。“-f”选项用于指定包含日志数据的文件。“-s”选项表示利用超级块中的备份信息确定日志的存储位置。“-a”选项表示输出所有数据块组描述所在数据块中的内容。“-b”选项表示输出指定数据块涉及的所有日志记录。“-c”选项意味着输出“-a”和“-b”选项选择的所有数据块中的内容。
ls [-dlp] filespec 列出指定目录中的文件。其中的“-l”选项表示以长列表的形式显示更多的文件属性信息。“-d”选项表示列出删除的文件。“-p”选项表示采用脚本容易解析的格式输出文件列表。
lsdel 显示删除的信息节点。
mi filespec modify_inode子命令的简化形式,用于修改指定文件信息节点结构中的数据。这是一种交互式操作,可以逐一审查系统提示的信息节点数据,必要时予以适当的修改。
mkdir filespec 在当前目录中创建指定的子目录。
mknod filespec [p | [[c | b] major minor]] 创建一个指定的特殊文件(如命名的管道文件、字符特殊文件或块特殊文件等)。如果想要创建字符或块设备文件,还需要指定主次设备号。
ncheck inodes 显示与指定信息节点号对应的文件名(列表)。
open [-cefiw] [-b blksize] [-s superblk] device 进入debugfs交互命令环境之后,打开准备调试的文件系统。其中的“-w”选项表示以写方式打开文件系统。“-f”选项表示强制打开文件系统,即使文件系统存在问题,无法正常打开。“-e”选项表示以排他方式打开,“-b”、“-c”、 “-i”和“-s”具有与debugfs命令同名选项相同的功能。
pwd 显示当前的工作目录。
quit 退出debugfs命令。
rdump srcdir destdir 把指定目录及其中的所有文件(包括普通文件、符号链接文件以及子目录等)递归地复制到指定的目的目录位置(非当前调试的文件系统)。注意,在使用这个子命令之前,目的目录必须已经存在。
rm file 删除指定的文件。如果删除文件时导致信息节点的链接计数为0,则释放相应的信息节点。这个子命令的功能等同于unlink()系统调用。
rmdir filespec 删除指定的目录。
setb block [count] 把指定的数据块标记为已分配的数据块。如果给出了数据块计数,则从指定的数据块开始,把指定数量的数据块均标记为已分配的数据块。
set_bg bg# field value set_block_group子命令的简化形式,用于修改指定的数据块组描述,把其中的指定字段设置为指定的值。此外,还可以利用“set_bg -l”命令,列出set_bg能够设置的数据块组描述中的所有字段。
seti filespec 把指定的信息节点标记为已分配的信息节点。
sif filespec field value set_inode_field子命令的简化形式,用于修改指定的信息节点,把指定的字段设置为指定的值。此外,还可以利用“sif -l”命令,列出sif能够设置的所有信息节点字段。
ssv field value set_super_value子命令的简化形式,用于修复超级块,把指定的字段设置为指定的数值。此外,还可以利用“ssv -l”命令,列出ssv能够设置的所有超级块字段。
stats [-h] show_super_stats子命令的简化形式,用于显示超级块和数据块组描述中的数据。如果给出了“-h”选项,仅显示超级块中的数据。
stat filespec show_inode_info子命令的另外一种形式,用于显示指定信息节点中的数据内容。
testb block [count] 测试指定的数据块是否已经分配。如果同时给出了数据块计数,则从指定的数据块开始,测试指定数量的数据块是否均已分配。
testi filespec 测试指定的信息节点是否已经分配。
undel <inode> [dir] undelete子命令的简化形式,用于恢复删除的信息节点号,把指定的信息节点及其存储数据块标记为当前正在使用的信息节点和数据块,同时把恢复的信息节点链接到指定的目录(如果指定了目录参数dir)。在使用undel命令恢复误删的文件之后,应当总是运行e2fsck命令修复文件系统。注意,如果是恢复大量误删的文件,把信息节点连接到一个目录有可能需要扩展目录的存储空间,导致分配的数据块取自某个已删的文件,使相应的文件无法恢复。因此,比较安全的做法是在恢复所有的信息节点时不要指定目的目录,最后再单独使用debugfs 的ln子命令,把信息节点链接到一个目的目录,或使用e2fsck命令修复文件系统,把恢复的所有信息节点链接到lost+found目录。
unlink path 删除指定的文件。注意,如果删除的是一个硬链接文件,debugfs命令不会调整信息节点中的链接计数字段。
write srcfile outfile 把文件系统内指定文件srcfile中的数据复制到新建的文件outfile中。注意,新建文件指的是调试文件系统中的文件。
在使用命令行界面访问Linux系统时,如果使用rm等命令删除文件,一经执行,便会立即释放文件的信息节点和数据块,回收站在此不起任何作用。如果误删了文件,仅当满足下列条件时,才能利用debugfs命令挽救删除的文件:
1. 删除文件后,系统或用户没有在文件系统中创建任何新的文件(包括目录、符号链接文件等各种文件)。这个条件表示因删除文件而释放的信息节点和数据块没有再次分配使用。
2. 删除文件后,系统或用户也没有在文件系统中扩充原有的任何文件。这个条件表示删除文件时释放的数据块没有再次分配使用。
如果满足上述两个条件,可以立即卸载文件系统,仿照下列步骤,利用debugfs命令恢复误删的文件:
1. 利用ffi(find_free_inode)子命令,找出第一个空闲的信息节点。
2. 利用stat子命令,检查信息节点数据结构中的BLOCKS字段(Ext2/Ext3文件系统)。如果其中数据块指针的数据为空,说明当前的信息节点根本没有用过。如果其中给出了数据块号——单个数据块号或数据块号范围,说明相应的信息节点是一个删除的文件。
3. 利用cat子命令,检查其中的数据是否为误删的文件。
4. 如果是,利用dump子命令,把数据保存到系统中指定的文件。文件恢复过程结束。
5. 否则,利用seti子命令,在信息节点位图中,把指定的信息节点标记为已分配。
6. 从步骤1开始重复执行上述过程。
假定1.44MB软盘的Ext3文件系统中存在下列文件,在操作过程中不慎误删了其中的重要文件security:
$ sudo mount /dev/fd0 /mnt [sudo] password for gqxing: $ ls -l /mnt total 71 drwx------ 2 root root 12288 Feb 11 13:02 lost+found -rw-r--r-- 1 gqxing gqxing 21822 Feb 11 13:03 schedule -rw-r--r-- 1 gqxing gqxing 10560 Feb 11 13:03 security -rw-r--r-- 1 gqxing gqxing 23666 Feb 11 13:03 typescript $ rm /mnt/security $
由于发现及时,没有在文件系统中再做其他操作,故文件系统满足文件恢复的要求。此时可以立即卸载文件系统,调用debugfs命令,执行文件的恢复过程。示例如下:
$ sudo umount /mnt $ sudo debugfs -w /dev/fd0 debugfs 1.41.9 (22-Aug-2009) debugfs: ls -l 2 40777 (2) 0 0 1024 11-Feb-2010 13:28 . 2 40777 (2) 0 0 1024 11-Feb-2010 13:28 .. 11 40700 (2) 0 0 12288 11-Feb-2010 13:02 lost+found 12 100644 (1) 1000 1000 21822 11-Feb-2010 13:03 schedule 14 100644 (1) 1000 1000 23666 11-Feb-2010 13:03 typescript (END) debugfs: ffi Free inode found: 13 debugfs: stat <13> Inode: 13 Type: regular Mode: 0644 Flags: 0x0 Generation: 507723457 Version: 0x00000000 User: 1000 Group: 1000 Size: 10560 File ACL: 0 Directory ACL: 0 Links: 0 Blockcount: 22 Fragment: Address: 0 Number: 0 Size: 0 ctime: 0x4b739573 -- Thu Feb 11 13:28:19 2010 atime: 0x4b738fb7 -- Thu Feb 11 13:03:51 2010 mtime: 0x4b738fb7 -- Thu Feb 11 13:03:51 2010 dtime: 0x4b739573 -- Thu Feb 11 13:28:19 2010 BLOCKS: (0-10):70-80 TOTAL: 11 (END) debugfs: cat <13> # This is a testing file for debugfs # # There is a lot of important data in this file debugfs: dump <13> rescued debugfs: quit $ ls –l rescued -rw-r--r-- 1 root root 10560 Feb 11 13:32 recured $ cat rescured # This is a testing file for debugfs # # There is a lot of important data in this file $
注意,恢复的文件rescured位于调用debugfs命令之前用户所在的工作目录,而非当前调试的文件系统,且由其输出数据可见,恢复后的文件rescured与原文件security的内容完全相同。
索引:A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z