Os arquivos Valgrind / usr / lib não são arquivos regulares do Linux

2

O problema que encontrei hoje (em um dispositivo incorporado com o Linux) é que alguns arquivos (especificamente, os arquivos Valgrind /usr/lib ) estão se comportando de maneira muito estranha e não são copiáveis com scp (o erro é: not a regular file ).

Então:

$ ls -al /usr/lib/*valgrind*
drwxr-xr-x    2 root     root          4096 Sep 30 00:01 .
drwxr-xr-x   24 root     root         12288 Sep 30 00:00 ..
-rwxr-xr-x    1 root     root       1816444 Jun  6  2014 cachegrind-x86-linux
-rwxr-xr-x    1 root     root       1910732 Jun  6  2014 callgrind-x86-linux
-rw-r--r--    1 root     root         28429 Jun  6  2014 default.supp
-rwxr-xr-x    1 root     root       1884080 Jun  6  2014 drd-x86-linux
-rwxr-xr-x    1 root     root       1770688 Jun  6  2014 exp-bbv-x86-linux
-rwxr-xr-x    1 root     root       1852668 Jun  6  2014 exp-ptrcheck-x86-linux
-rwxr-xr-x    1 root     root       1910200 Jun  6  2014 helgrind-x86-linux
-rwxr-xr-x    1 root     root       1778880 Jun  6  2014 lackey-x86-linux
-rwxr-xr-x    1 root     root       1792524 Jun  6  2014 massif-x86-linux
-rwxr-xr-x    1 root     root       1942904 Jun  6  2014 memcheck-x86-linux
-rwxr-xr-x    1 root     root       1766560 Jun  6  2014 none-x86-linux
-rwxr-xr-x    1 root     root          2620 Jun  6  2014 vgpreload_core-x86-linux.so
-rwxr-xr-x    1 root     root         65296 Jun  6  2014 vgpreload_drd-x86-linux.so
-rwxr-xr-x    1 root     root         17904 Jun  6  2014 vgpreload_exp-ptrcheck-x86-linux.so
-rwxr-xr-x    1 root     root         37908 Jun  6  2014 vgpreload_helgrind-x86-linux.so
-rwxr-xr-x    1 root     root         15128 Jun  6  2014 vgpreload_massif-x86-linux.so
-rwxr-xr-x    1 root     root         26652 Jun  6  2014 vgpreload_memcheck-x86-linux.so

Primeiramente, observe que eles não têm a string "valgrind" em seus nomes.

Então, eles são mostrados como arquivos regulares (não pipes, não dispositivos). Mas, muito estranhamente, eles não são encontrados pelo simples ls :

$ ls -al /usr/lib/memcheck-x86-linux
ls: /usr/lib/memcheck-x86-linux: No such file or directory

Eles nem aparecem na listagem normal:

$ ls -al /usr/bin
(snipped)

O que no Linux pode causar esse comportamento?

Mais, não há nenhum utilitário como "arquivo" no dispositivo, mas duvido que isso possa me ajudar muito.

Saída de df :

$ df
Filesystem           1024-blocks    Used Available Use% Mounted on
/dev/root               980308    175548    754964  19% /
tmpfs                    10240       112     10128   1% /dev
tmpfs                   246728         0    246728   0% /tmp
tmpfs                     2048        12      2036   1% /var/log
tmpfs                   246728       128    246600   0% /dev/shm
tmpfs                   246728         0    246728   0% /run
tmpfs                   246728        20    246708   0% /var/run

Então, / é um dispositivo.

E:

$ whoami
root

Então, eu sou root.

Apenas para completar o quebra-cabeça:

$ ls -al /dev/root
ls: /dev/root: No such file or directory

Portanto, o dispositivo mapeado não existe realmente.

    
por user1284631 25.07.2014 / 10:17

2 respostas

7

Esta saída:

$ ls -al /usr/lib/*valgrind*
drwxr-xr-x    2 root     root          4096 Sep 30 00:01 .
drwxr-xr-x   24 root     root         12288 Sep 30 00:00 ..
-rwxr-xr-x    1 root     root       1816444 Jun  6  2014 cachegrind-x86-linux

indica que existe um diretório chamado /usr/lib/*valgrind* (provavelmente apenas /usr/lib/valgrind ) que você está listando. A maior dica é que você está vendo entradas de diretório para . e .. .

Isso explica por que ls -al /usr/lib/memcheck-x86-linux diz que o arquivo não existe - é porque o arquivo é chamado /usr/lib/valgrind/memcheck-x86-linux .

Se você não quiser listar diretórios e mostrá-los como uma entrada, adicione o -d flag a ls :

$ ls -ald /usr/lib/*valgrind*
drwxr-xr-x    2 root     root          4096 Sep 30 00:01 /usr/lib/valgrind

Quanto a por que scp está dizendo "não é um arquivo regular", já que você não forneceu a linha de comando ou saída scp , tenho que adivinhar, mas meu palpite é que essa é a saída de scp produz para um argumento que não é qualquer tipo de arquivo, porque não existe.

    
por 25.07.2014 / 10:42
1

Enquanto Michael Homer já escreveu o que aconteceu, aqui está porque aconteceu (dado o seu comentário sobre a resposta dele, acho que você já sabe, mas ).

O comando que você emitiu foi

ls -al /usr/lib/*valgrind*

As estrelas são interpretadas pelo shell mesmo antes de ls ser executado, substituindo-o por uma lista de nomes de arquivos correspondentes ao padrão. Agora, se houver apenas um nome correspondente (por exemplo, /usr/lib/valgrind ), é claro que a lista conterá apenas esse nome. Então o comando que realmente é executado é

ls -al /usr/lib/valgrind

Agora, ls verá que é dado um único argumento e a verificação desse único argumento revela que é um diretório. Como você não forneceu a opção -d , para nomes de diretório, ela não listará a entrada do diretório, mas o conteúdo do diretório. E desde que foi dado apenas um nome de diretório single , ele também não imprimirá o nome do diretório primeiro (desde que você forneça um único nome de diretório como argumento, não há dúvida de qual diretório os arquivos listados pertencem; lembre-se que ls não tem idéia de que o nome do diretório veio de uma expansão de nome de arquivo).

Se você quiser saber o nome real do diretório (lembre-se, o literal /usr/lib/valgrind foi um palpite (embora muito provável); pode ser também /usr/lib/valgrind-3.7 ), você pode usar

ls -ald /usr/lib/*valgrind*

Observe também que se houver um diretório oculto adicional .valgrind ou um arquivo oculto como .valgrind-foo in /usr/lib , ele não será mostrado pelo comando ls , apesar da opção -a , porque a expansão do shell não se importa com as opções que você deu a ls , e ls não terá idéia de que deseja ver esses arquivos também, já que eles não estão incluídos sua lista de arquivos. Então, se você quer ter certeza de que os arquivos de pontos também estão listados, você terá que usar:

ls -ld /usr/lib/*valgrind* /usr/lib/.*valgrind*

Note que -a é não necessário aqui, pois os arquivos de pontos dados como argumentos são listados incondicionalmente por ls . É claro que se você quiser listar o conteúdo de qualquer diretório com valgrind em seu nome, incluindo os arquivos de ponto, você precisará de -a , já que esses arquivos de ponto não aparecem no comando linha após a expansão. Ou seja, nesse caso, você usaria

ls -la /usr/lib/*valgrind* /usr/lib/.*valgrind*

Por outro lado, se você estiver interessado no conteúdo dos diretórios correspondentes a .*valgrind* , mas não nos arquivos de ponto contidos nele, você não usará -a .

Se você estiver usando bash (e possivelmente também para outros shells, mas não tenho certeza), você pode simplificar os dois comandos anteriores para

ls -ld /usr/lib/{,.}*valgrind*

respectivamente

ls -la /usr/lib/{,.}*valgrind*
    
por 25.07.2014 / 17:38