无法以 root 身份删除文件

无法以 root 身份删除文件

常规系统更新(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包中,还有getfattrsetfattr

或者 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.

相关内容