web-dev-qa-db-ja.com

rootへの可能なハードリンクディレクトリを削除するにはどうすればよいですか?

私は知っています ハードリンク ディレクトリへの接続は不可能であるはずですが、NASに非常によく似た何かがあります。このフォルダは元々 Linuxマシンであり、 dfm から来たようです。ある時点で、NTFS形式のUSBドライブにバックアップされ、SynologyNASに転送されました。

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;マウント

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)

ls -lai / ; ls -lai /volume1/usbcopy/USBCopy_1303012145/.linktorootdir | headを使用したiノードのチェック(@paboukによる推奨による)

      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でこのフォルダを削除するにはどうすればよいですか?

3
dwj

解決

_.linktorootdir_ディレクトリ内のファイルとディレクトリは、ルートディレクトリからコピーされます。たとえば、_rm -rf /volume1/usbcopy/USBCopy_1303012145/.linktohomedir_を使用して簡単に削除できます。

説明は以下の通りです。

ディレクトリのハードリンク

ハードリンク ディレクトリへの接続は理論的には可能ですが、 複数の理由 Linuxを含む多くのシステムでは無効になっています。これは、 unlink() syscallで許可されないため、ディレクトリへのハードリンクを削除できないことも意味します。

デモンストレーション

_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)
_

2種類のリンクを認識する

  • softlink-_ls -l_は、タイプ/許可フィールドの最初の文字としてlを示します。 statの出力は_symbolic link_を示しています。
  • ハードリンク-ハードリンクは相互に区別できません。元のファイルと新しく作成されたハードリンクは、パス/ファイル名を除いてまったく同じように見えます。ハードリンクは、あるファイルシステムから別のファイルシステムを指すことはできません。 _ls -i_は、同じデータにハードリンクされたすべてのファイルの同じiノード番号を示します(iノードで表されます)。 _ls -l_の2番目の列は、iノードへのハードリンクの数を示しています。
_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_ディレクトリ[〜#〜] dfm [〜#〜]で、最初の起動時にいくつかのリンクを作成します。これらのリンクは、デスクトップにアイコンとして表示されます。リンク間には、ディレクトリへの2つのリンクがあります。_.linktorootdir_ as symlink システムのルートディレクトリ[〜#〜] dfm [〜#〜 ]が実行されており、_.linktohomedir_も実行されています。 DFMドキュメント および DFMソース を参照してください。

あなたの場合、ディレクトリ_/_と_/volume1/usbcopy/USBCopy_1303012145/.linktohomedir_は異なるファイルシステム(_/dev/root_と_/dev/vg1000/lv_)にあるため、同じiノードへのハードリンクにすることはできません。 (ハードリンクは、単一のファイルシステムのスコープ内を指すことができます。)

あなたが説明した問題がどのように発生したかを推測できます。 NTFSにはこの機能があるため、おそらくNTFSへのバックアップでシンボリックリンクを保持できたはずです。後でUSBドライブからバックアップをコピーしたときに、コピーツールがシンボリックリンクを期待どおりに処理しませんでした。ツールは、シンボリックリンク自体だけをコピーするのではなく、ソースドライブ上のシン​​ボリックリンクをたどり、それらのコンテンツ(_.linktorootdir_の場合はルートディレクトリ)をコピーしました。同様の問題は、Synologyフォーラムでも説明されています: SBCopyはHDDのコピー中に無限ループで発生しました

解決策は最初に説明されています。

3
pabouk