Como faço para remover um possível diretório de hard-link para root?

3

Eu sei que hard links para diretórios não deveriam ser possíveis, mas eu tenho algo estranho no meu NAS que parece muito parecido com um. Esta pasta veio originalmente de uma máquina linux e parece ter vindo de dfm . Em algum momento foi feito o backup em uma unidade USB formatada em NTFS que foi então transferida para um 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

Saída de pwd; stat .linktorootdir; montar

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 > montar

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

Verificando inodes (por recomendação de @pabouk) com 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

Como faço para remover esta pasta no meu NAS?

    
por dwj 28.07.2013 / 05:43

1 resposta

2

Solução

Os arquivos e diretórios no diretório .linktorootdir são copiados do diretório raiz. Você pode simplesmente excluí-los usando, por exemplo, rm -rf /volume1/usbcopy/USBCopy_1303012145/.linktohomedir .

A explicação está abaixo.

Hardlinks de diretórios

Hardlinks para diretórios são teoricamente possíveis, mas por causa de vários motivos eles estão desabilitados em muitos sistemas, incluindo o Linux. Isso também significa que você não poderá remover um link físico para o diretório, pois o unlink() syscall não permitirá isso.

Demonstração

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

A negação mostrada é programada no kernel do Linux ( fs/namei.c ) . Aqui estão os resultados de syscalls:

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

Reconhecendo os dois tipos de links

  • softlink - ls -l mostra l como o primeiro caractere do campo de tipo / permissão. stat output mostra symbolic link .
  • hardlink - Os hardlinks são indistinguíveis entre si. Tanto o arquivo original quanto o hardlink recém-criado são exatamente iguais, exceto o caminho / nome do arquivo. Hardlinks não podem apontar de um sistema de arquivos para outro. ls -i mostra o mesmo número de inode para todos os arquivos vinculados aos mesmos dados (representados por inode). A segunda coluna de ls -l mostra o número de hardlinks para o 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

Origem de .linktorootdir

No diretório .dfmdesk DFM cria alguns links durante a primeira inicialização. Esses links serão mostrados como ícones na área de trabalho. Entre os links, haverá dois links para diretórios: .linktorootdir como link simbólico para o diretório raiz do sistema DFM está em execução e também .linktohomedir . Veja a documentação do DFM e o Fonte DFM .

No seu caso, os diretórios / e /volume1/usbcopy/USBCopy_1303012145/.linktohomedir estão em sistemas de arquivos diferentes ( /dev/root e /dev/vg1000/lv ), portanto, eles não podem ser hardlinks para o mesmo inode. (Hardlinks podem apontar apenas no escopo de um único sistema de arquivos.)

Podemos adivinhar como surgiu o problema que você descreve. Muito provavelmente, o backup para NTFS foi capaz de manter o link simbólico como NTFS tem esse recurso. Mais tarde, quando você copiou o backup da unidade USB, a ferramenta de cópia não manipulou links simbólicos conforme o esperado. Em vez de copiar apenas o próprio link simbólico, a ferramenta seguia os links simbólicos na unidade de origem e copiava o conteúdo deles (diretório raiz no caso de .linktorootdir ). O problema semelhante é descrito também no fórum Synology: USBCopy cought em loop infinito ao copiar o HDD .

A solução é descrita no começo.

    
por 29.07.2013 / 20:39