Por que os arquivos de imagem de CD não são listados quando montados no diretório atual?

3

Ao montar uma imagem de disco no diretório atual usando:

sudo mount -o loop -t iso9660 wall.iso ./

Listar arquivos no diretório atual retorna apenas wall.iso.
Para visualizar os arquivos reais na imagem de disco, devo primeiro cd sair do diretório e voltar a usá-lo.

Nota: se eu já conhecia wall.iso countainted um diretório chamado subdir , mesmo que ls não tenha listado o diretório eu já poderia cd subdir .

Por que o ls não retorna os arquivos quando eu os chamo pela primeira vez? O ls lê a partir de um cache que só é atualizado ao alterar o diretório?

    
por danjjl 18.05.2013 / 10:32

1 resposta

7

É porque você está no diretório em que você está se conectando. Então você ainda está referenciando o conteúdo do diretório original através do diretório original.

Você pode ver exatamente o mesmo efeito quando estiver em cd em um diretório que será excluído.

$ pwd
/home/saml/dirtodel

$ rmdir ../dirtodel

$ pwd
/home/saml/dirtodel

Como isso pode ser? Ainda estou dentro de um diretório que acabou de ser excluído. O que está acontecendo?

No shell que ainda é cd to /home/saml/dirtodel , execute este comando para descobrir o PID (id do processo) para sua sessão do bash:

$ echo $$
32619

Agora, se você entrar no diretório PID / proc, podemos ver o que está acontecendo:

$ ls -l /proc/32619/ | head -10
total 0
dr-xr-xr-x 2 saml saml 0 May 18 07:40 attr
-r-------- 1 saml saml 0 May 18 07:40 auxv
-r--r--r-- 1 saml saml 0 May 18 07:40 cgroup
--w------- 1 saml saml 0 May 18 07:40 clear_refs
-r--r--r-- 1 saml saml 0 May 18 02:06 cmdline
-rw-r--r-- 1 saml saml 0 May 18 07:40 comm
-rw-r--r-- 1 saml saml 0 May 18 07:40 coredump_filter
-r--r--r-- 1 saml saml 0 May 18 07:40 cpuset
lrwxrwxrwx 1 saml saml 0 May 18 07:31 cwd -> /home/saml/dirtodel (deleted)

Listando os primeiros arquivos, vemos um chamado cwd , que significa diretório de trabalho atual. Observe que está apontando para o nosso nome antigo e que ele foi "excluído".

Isso nos dá uma ideia do que está acontecendo, mas onde estamos?

Curiosamente, se cd /proc/32619/cwd pudermos mudar de diretório para esse local mágico. Se executarmos o comando df . , poderemos ver que ainda estamos na partição /home :

$ pwd
/proc/32619/cwd
[saml@grinchy cwd]$ df -h .
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/vg_grinchy-lv_home
                      245G  125G  108G  54% /home

Então, o que está acontecendo?

Mesmo que nosso diretório tenha sido excluído, o inode que o compõe não foi. Você pode ver isso com o comando stat . No shell que ainda está dentro do diretório, excluímos:

$ stat .
  File: '.'
  Size: 0           Blocks: 8          IO Block: 4096   directory
Device: fd02h/64770d    Inode: 10486487    Links: 0
Access: (0775/drwxrwxr-x)  Uid: (  500/    saml)   Gid: (  501/    saml)
Access: 2013-05-18 07:48:52.674081972 -0400
Modify: 2013-05-18 07:48:44.378900038 -0400
Change: 2013-05-18 07:50:54.189747426 -0400

Podemos ver que ainda existe um inode, 10486487, em uso por nós, mas observe que ele tem 0 links. Isso é o que acontece quando algo é deletado. Todos os links para ele são removidos e, portanto, o sistema operacional pode excluir esse inode paritural.

    
por 18.05.2013 / 13:54