玩 e2fsprogs debugfs
,由于更改/意外,filen/ame
创建了一个名为的文件。显然,正斜杠字符/
用作路径名中的特殊分隔符。
仍在使用debugfs
我想删除名为 的文件filen/ame
,但我没有成功,因为该/
字符没有被解释为文件名的一部分?
debugfs 是否提供删除包含斜杠的文件的方法?如果是这样怎么办?
我用了:
cd /tmp
echo "content" > contentfile
dd if=/dev/zero of=/tmp/ext4fs bs=1M count=50
mkfs.ext4 /tmp/ext4fs
debugfs -w -R "write /tmp/contentfile filen/ame" /tmp/ext4fs
debugfs -w -R "ls" /tmp/ext4fs
Run Code Online (Sandbox Code Playgroud)
输出:
debugfs 1.43.4 (31-Jan-2017)
2 (12) . 2 (12) .. 11 (20) lost+found 12 (980) filen/ame
Run Code Online (Sandbox Code Playgroud)
我尝试了以下方法来删除filen/ame
文件:
debugfs 1.43.4 (31-Jan-2017)
2 (12) . 2 (12) .. 11 (20) lost+found 12 (980) filen/ame
Run Code Online (Sandbox Code Playgroud)
但这不起作用,只会产生:
debugfs …
Run Code Online (Sandbox Code Playgroud) 我在删除空目录时遇到问题,strace 显示错误:
rmdir("empty_dir") = -1 ENOTEMPTY (Directory not empty)
Run Code Online (Sandbox Code Playgroud)
并且ls -la empty_dir
什么都不显示。所以我用 debugfs 连接到 fs (ext4) 并看到这个目录中的隐藏文件:
# ls -lia empty_dir/
total 8
44574010 drwxr-xr-x 2 2686 2681 4096 Jan 13 17:59 .
44573990 drwxr-xr-x 3 2686 2681 4096 Jan 13 18:36 ..
debugfs: ls empty_dir
44574010 (12) . 44573990 (316) ..
26808797 (3768) _-----------------------------------------------------------.jpg
Run Code Online (Sandbox Code Playgroud)
为什么会发生这种情况?有没有机会在不卸载和全面检查 fs 的情况下解决这个问题?
附加信息:
“隐藏”文件只是一个普通的 jpg 文件,可以通过图像查看器打开:
debugfs: dump empty_dir/_-----------------------------------------------------------.jpg /root/hidden_file
# file /root/hidden_file
/root/hidden_file: JPEG image data, JFIF standard 1.02
Run Code Online (Sandbox Code Playgroud)
rm -rf …
目录 inode 与常规文件的 inode 没有本质区别,我从Ext4 磁盘布局中理解的是:
目录条目:因此,更准确地说,目录是一系列数据块,每个数据块包含目录条目的线性数组。
目录条目将文件名与指向其 inode 的指针一起存储。因此,如果文档说每个块都包含目录条目,为什么debugfs
报告存储在目录 inode 中的文件名不同呢?这是 ext4 格式的闪存驱动器上的调试会话:
debugfs: cat /sub
?
.
..?
spam?spam2?spam3??spam4
Run Code Online (Sandbox Code Playgroud)
我不认为inode_i_block
可以存储这些文件名,我创建了文件名非常长的文件,大小超过 60 个字节。cat
在 inode 上运行也debugfs
显示了文件名,因此长文件名再次出现在 inode 中!
根据 inode 描述的文件类型,
inode.i_block
可以以不同方式使用60 字节的存储空间。一般而言,普通文件和目录会将其用于文件块索引信息,而特殊文件则会将其用于特殊用途。
此外,没有对在哈希树目录 部分中存储文件名的 inode 的引用, 这是较新的实现。我觉得我错过了该文件中的某些内容。
主要问题是如果目录的 inode 包含文件名,那么它的数据块存储什么?
我的/dev/sdb1
文件系统分区ext3
安装在 /mnt/folder
.
我触摸一个文件/mnt/folder
并删除该文件。然后我使用debugfs /dev/sdb1
然后输入lsdel
,但它说“找到 0 个已删除的 inode”。
什么是问题?我如何使用debugfs恢复我的文件?
我想知道 2020 年是否有方法复制或恢复 Linux 中 inode/文件/目录的 crtime(创建时间)。我不小心删除了一个文件夹,而我仍然有完整的磁盘备份,但 cp -a 和 rsync 都没有可以恢复/复制文件/目录crtimes。
我找到了一种使用 debugfs 来实现它的方法,但它非常复杂,我需要自动化它(我有数百个已删除的文件/目录)。
对于源磁盘,您可以执行以下操作:
# debugfs /dev/sdXX
# stat /path
Inode: 432772 Type: directory Mode: 0700 Flags: 0x80000
Generation: 3810862225 Version: 0x00000000:00000006
User: 1000 Group: 1000 Project: 0 Size: 4096
File ACL: 0
Links: 5 Blockcount: 8
Fragment: Address: 0 Number: 0 Size: 0
ctime: 0x5db96479:184bb16c -- Wed Oct 30 15:22:49 2019
atime: 0x5b687c70:ee4dff18 -- Mon Aug 6 21:50:56 2018
mtime: 0x5db96479:184bb16c -- Wed Oct 30 15:22:49 2019 …
Run Code Online (Sandbox Code Playgroud)