如何删除可能与根目录硬链接的目录?

如何删除可能与根目录硬链接的目录?

我知道硬链接目录不应该是可能的,但我的 NAS 上有一些奇怪的东西,看起来很像目录。这个文件夹最初来自一台 Linux 机器,似乎来自动态性能模型。在某个时间点,它被备份到 NTFS 格式的 USB 驱动器上,然后传输到 Synology NAS。

dwj$ ls -la
drwx------  1 dwj  staff  16384 Mar  2 19:17 .linktorootdir

dwj$ ls -la .linktorootdir/
total 3460
drwx------  1 shennis  staff    16384 Mar  2 19:17 .
drwx------  1 shennis  staff    16384 Jul 25 23:29 ..
drwx------  1 shennis  staff    16384 Feb 26 20:20 .system_info
drwx------  1 shennis  staff    16384 Feb 26 20:20 bin
drwx------  1 shennis  staff    16384 Mar  2 19:15 dev
drwx------  1 shennis  staff    16384 Mar  2 19:17 etc.defaults
-rwx------  1 shennis  staff  1589952 Dec 11  2012 linuxrc
drwx------  1 shennis  staff    16384 Feb 26 20:20 sbin
drwx------  1 shennis  staff    16384 Mar  2 04:49 tmp
drwx------  1 shennis  staff    16384 Mar  2 19:17 usr
drwx------  1 shennis  staff    16384 Mar  2 19:17 volume1
drwx------  1 shennis  staff    16384 Mar  1 21:44 volumeUSB2

pwd; stat .linktorootdir; mount 的输出

DiskStation> pwd

/volume1/usbcopy/USBCopy_1303012145

DiskStation> ls -a

.                       .linktorootdir
..                      Data
.DS_Store

DiskStation> stat -f .linktorootdir/ /

  File: ".linktorootdir/"
    ID: 1a03a45c0ea41689 Namelen: 255     Type: ext2/ext3
Block size: 4096
Blocks: Total: 719905408  Free: 654479     Available: 628879
Inodes: Total: 182845440  Free: 180250664

  File: "/"
    ID: 6a3b023a9a57044b Namelen: 255     Type: ext2/ext3
Block size: 4096
Blocks: Total: 612766     Free: 503152     Available: 477552
Inodes: Total: 155648     Free: 139669

DiskStation> 挂载

/dev/root on / type ext4 (rw,relatime,barrier=0,journal_checksum,data=ordered)
/tmp on /tmp type tmpfs (0) none on /dev/pts type devpts (gid=4,mode=620) /sys on
/sys type sysfs (0) /proc/bus/usb on /proc/bus/usb type usbfs (0)
/dev/vg1000/lv on /volume1 type ext4 (usrjquota=aquota.user,grpjquota=aquota.gro up,jqfmt=vfsv0,synoacl)

检查 inode(根据 @pabouk 的建议)ls -lai / ; ls -lai /volume1/usbcopy/USBCopy_1303012145/.linktorootdir | head

      2 drwxr-xr-x   23 root     root          4096 Jul 28 19:13 .
      2 drwxr-xr-x   23 root     root          4096 Jul 28 19:13 ..
     38 drwxr-xr-x    3 root     root          4096 Apr  1 11:35 .old_patch_info

   1829 -rw-------    1 root     root          1024 Feb 26 20:21 .rnd
     32 drwxr-xr-x    3 root     root          4096 Apr  1 11:33 .syno
  15315 drwxr-xr-x    2 root     root          4096 Feb 26 20:20 .system_info
     12 drwxr-xr-x    2 root     root          4096 Apr  1 11:35 bin
     89 drwxr-xr-x   10 root     root         36864 Jul 28 19:13 dev
   1784 drwxr-xr-x   18 root     root          4096 Jul 29 09:36 etc
   3380 drwxr-xr-x   17 root     root          4096 Jul 28 19:13 etc.defaults
81143042 drwxrwxrwx    6 admin    root          4096 Jul 29 14:50 .
30671002 drwxrwxrwx    9 root     root          4096 Jul 25 23:29 ..
145895896 drwxrwxrwx    2 admin    root          4096 Feb 26 20:20 bin
145895092 drwxrwxrwx   15 admin    root          4096 Mar  2 19:17 etc.defaults
145753038 -rwxrwxrwx    1 admin    root       1589952 Dec 11  2012 linuxrc
145753040 drwxrwxrwx    2 admin    root          4096 Feb 26 20:20 sbin
145895963 drwxrwxrwx    3 admin    root          4096 Jul 29 14:50 volume1

如何删除 NAS 上的该文件夹?

答案1

解决方案

目录中的文件和目录.linktorootdir是从根目录复制的。您可以简单地使用例如 删除它们rm -rf /volume1/usbcopy/USBCopy_1303012145/.linktohomedir

解释如下。

目录的硬链接

硬链接理论上可以,但由于有多种原因它们在许多系统(包括 Linux)中被禁用。这也意味着您将无法删除目录的硬链接,因为unlink()系统调用不允许这样做。

示范

root@x:~/testdir# ln -F dir1 dir1link
ln: failed to create hard link `dir1link' => `dir1': Operation not permitted
root@x:~/testdir# unlink dir1
unlink: cannot unlink `dir1': Is a directory

所示的拒绝是 Linux 内核中硬编码的(fs/namei.c)。系统调用的结果如下:

linkat(AT_FDCWD, "dir1", AT_FDCWD, "dir1link", 0) = -1 EPERM (Operation not permitted)
unlink("dir1")                          = -1 EISDIR (Is a directory)

识别两种类型的链接

  • 软链接-ls -l显示l为类型/权限字段的第一个字符。stat输出显示symbolic link
  • 硬链接- 硬链接相互之间无法区分。原始文件和新创建的硬链接除了路径/文件名之外看起来完全相同。硬链接不能从一个文件系统指向另一个文件系统。ls -i显示所有硬链接到相同数据(由 inode 表示)的文件的 inode 编号相同。第二列ls -l显示指向 inode 的硬链接数。

user1@x:~/testdir$ ls -li
total 12
6865008 drwxrwxr-x 2 user1 user1 4096 Jul 30 00:50 dir1
6822146 lrwxrwxrwx 1 user1 user1    4 Jul 30 01:44 dir1symlink -> dir1
6822155 -rw-rw-r-- 2 user1 user1   64 Jul 30 01:44 file1
6822155 -rw-rw-r-- 2 user1 user1   64 Jul 30 01:44 file1hardlink

user1@x:~/testdir$ stat * | grep -E '((File)|(Size)|(Device)):'
  File: `dir1'
  Size: 4096        Blocks: 8          IO Block: 4096   directory
Device: 807h/2055d  Inode: 6865008     Links: 2
  File: `dir1symlink' -> `dir1'
  Size: 4           Blocks: 0          IO Block: 4096   symbolic link
Device: 807h/2055d  Inode: 6822146     Links: 1
  File: `file1'
  Size: 64          Blocks: 8          IO Block: 4096   regular file
Device: 807h/2055d  Inode: 6822155     Links: 2
  File: `file1hardlink'
  Size: 64          Blocks: 8          IO Block: 4096   regular file
Device: 807h/2055d  Inode: 6822155     Links: 2

起源.linktorootdir

.dfmdesk目录中可制造性制造首次启动时会创建一些链接。这些链接将在桌面上显示为图标。链接之间将有两个目录链接:.linktorootdir作为符号链接到系统根目录可制造性制造正在运行.linktohomedir。请参阅DFM 文档DFM源

在您的情况下,目录//volume1/usbcopy/USBCopy_1303012145/.linktohomedir位于不同的文件系统(/dev/root/dev/vg1000/lv),因此它们不能是指向同一 inode 的硬链接。(硬链接只能指向单个文件系统的范围。)

我们可以猜测您所描述的问题是如何出现的。很可能备份到 NTFS 能够保留符号链接,因为 NTFS 具有此功能。稍后当您从 USB 驱动器复制备份时,复制工具没有按预期处理符号链接。该工具不是只复制符号链接本身,而是跟踪源驱动器上的符号链接并复制它们的内容(在这种情况下是根目录.linktorootdir)。Synology 论坛中也描述了类似的问题:USBCopy 在复制 HDD 时陷入无限循环

解决方案在开头描述。

相关内容