常规系统更新(Linux Mint 19)失败,错误提示无法备份文件。文件的所有者和组非常奇怪,lsattr 行为也很奇怪。无法以 root 身份删除文件。
$ ls -lah
total 64K
drwxr-xr-x 2 root root 4.0K Sep 14 00:41 .
drwxr-xr-x 15 root root 4.0K Jul 20 06:18 ..
-rw-r--r-- 1 root root 18K Jul 17 03:41 cs-xlet-danger.svg
-rw-r--r-- 1 root root 13K Jul 17 03:41 cs-xlet-running.svg
-rw-r--r-- 1 root root 19K Jul 17 03:41 cs-xlet-system.svg
-rw-r--r-- 1 2558197760 2848915456 0 Jul 17 03:41 cs-xlet-update.svg
$ sudo rm -f cs-xlet-update.svg
rm: cannot remove 'cs-xlet-update.svg': Operation not permitted
$ lsattr .
--------------e--- ./cs-xlet-danger.svg
--------------e--- ./cs-xlet-system.svg
lsattr: No data available While reading flags on ./cs-xlet-update.svg
--------------e--- ./cs-xlet-running.svg
然后我启动实时 CD 来检查文件系统。
$ sudo e2fsck -f /dev/sda1
e2fsck 1.44.1 (24-Mar-2018)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/sda1: 291836/1310720 files (0.4% non-contiguous), 2935417/5242624 blocks
确认文件系统良好后,我安装驱动器并尝试从实时 CD 操作系统(Linux Mint)中删除该文件。
$ ls -lah
total 64K
drwxr-xr-x 2 root root 4.0K Sep 14 04:41 .
drwxr-xr-x 15 root root 4.0K Jul 20 10:18 ..
-rw-r--r-- 1 root root 18K Jul 17 07:41 cs-xlet-danger.svg
-rw-r--r-- 1 root root 13K Jul 17 07:41 cs-xlet-running.svg
-rw-r--r-- 1 root root 19K Jul 17 07:41 cs-xlet-system.svg
-rw-r--r-- 1 2558197760 2848915456 0 Jul 17 07:41 cs-xlet-update.svg
$ sudo rm -f cs-xlet-update.svg
rm: cannot remove 'cs-xlet-update.svg': Operation not permitted
$ lsattr .
--------------e--- ./cs-xlet-danger.svg
--------------e--- ./cs-xlet-system.svg
lsattr: No data available While reading flags on ./cs-xlet-update.svg
--------------e--- ./cs-xlet-running.svg
最后我尝试通过 inode 删除它,但没有成功:
$ ls -i cs-xlet-update.svg
220926 cs-xlet-update.svg
$ find . -inum 220926 -exec sudo rm -i {} \;
rm: remove regular empty file './cs-xlet-update.svg'? y
rm: cannot remove './cs-xlet-update.svg': Operation not permitted
我怎样才能删除这个文件?
答案1
强制执行 fsck(使用其-f
标志)后,它仍然看起来干净……用户/组数不正常,一般来说,我认为它们低于 10000,20 亿看起来不对,而且它们为零字节……有些奇怪。如果这些不起作用,可能还需要检查一些扩展属性。
也许尝试按 inode 列出
ls -il
然后使用 find 和 rm 按 inode 删除
find . -inum [inode-number] -exec rm -i {} \;
或者另一个例子推荐一些查找“安全”和查找的-delete
find . -maxdepth 1 -type f -inum [inode-number] -delete
为了更加“安全”,首先通过省略 -delete 来验证 find 找到了哪个文件,使用默认的“print”
find . -inum [inode-number]
如果这些仍然不起作用,debugfs
有一些命令应该可以,而且它的许多命令都以 inode 作为参数
rm pathname
Unlink pathname. If this causes the inode pointed to by pathname to have
no other references, deallocate the file. This command functions as the
unlink() system call.
或者可能
unlink pathname
Remove the link specified by pathname to an inode. Note this does not
adjust the inode reference counts.
即使扩展属性导致问题,您也可以尝试getfacl
列出它们并setfacl
进行更改,这个-b, --remove-all
选项听起来很方便。或者在attr
包中,还有getfattr
和setfattr
。
或者 debugfs 也有一些扩展属性命令例如:
ea_get [-f outfile] filespec attr_name
Retrieve the value of the extended attribute attr_name in the file file‐
spec and write it either to stdout or to outfile.
ea_list filespec
List the extended attributes associated with the file filespec to stan‐
dard output.
ea_set [-f infile] filespec attr_name attr_value
Set the value of the extended attribute attr_name in the file filespec to
the string value attr_value or read it from infile.
ea_rm filespec attr_names...
Remove the extended attribute attr_name from the file filespec.