Por que o 'du' no WSL está agindo dando um tamanho de diretório maior que a memória da máquina?

1

Eu encontrei a minha pergunta enquanto tentava descobrir quais arquivos no meu computador estavam ocupando mais espaço. Aqui estão as informações sobre a memória total da máquina, encontradas no Windows Subsystem para Linux (WSL) / bash

bballdave025@WORK:~$ df -h /mnt/c
Filesystem      Size  Used Avail Use% Mounted on
C:              239G  231G  7.8G  97% /mnt/c

Note que a minha pergunta não é sobre como limpar o espaço.

Eu comecei verificando o diretório Program Files .

bballdave025@WORK:~$ du -sh /mnt/c/Program\ Files/
du: cannot read directory '/mnt/c/Program Files/Microsoft Policy Platform/authorityDb': Permission denied
du: cannot read directory '/mnt/c/Program Files/Microsoft SQL Server/130/Shared/ErrorDumps': Permission denied
du: cannot read directory '/mnt/c/Program Files/WindowsApps': Permission denied
2.5T    /mnt/c/Program Files/

O problema principal

Meu bash du do WSL está me dizendo que, no meu computador (que tem 239GB da memória), meu diretório Program Files está ocupando 2,5 TB do 239GB de memória disponível. É como se eu estivesse segurando dois copos de água na minha boca sem engolir. (Isso é apenas para mostrar a proporção de tamanhos - o meu problema não envolve água.)

A propósito, eu não tenho direitos de administrador - não há sudo !! para resolver qualquer problema. Deixarei de fora os erros Permission denied (que irá vir sem um real sudo ) enquanto continuo a escrever este post. Observe também que estou em um computador de trabalho, então há coisas que não consigo acessar.

Pergunta principal: Existe uma maneira relativamente simples de verificar o uso do disco na minha situação, ou seja, verificar o uso do disco em uma unidade C: do Windows usando o Windows Subsystem para Linux?

Pergunta secundária: O que diabos está acontecendo aqui? Por que estou recebendo um relatório informando que meu diretório Program Files está ocupando 10 vezes mais espaço do que existe em minha máquina?

A propósito ... O Windows me diz que Program Files tem um tamanho de 4.83 GB , um fato que achei usando File Explorer , clicando com o botão direito do mouse na pasta Program Files e selecionando "Propriedades"

Minhas tentativas de solução

Meu primeiro pensamento foi que pode haver alguns links simbólicos ou informações sobre mapeamento de unidades para softwares de codificação da empresa ou um programa antivírus ou algo assim. Por isso, verifiquei a man page de du . Eu encontrei os dois sinalizadores a seguir, o que achei que poderia ajudar.

-P, --no-dereference
              don't follow any symbolic links (this is the default)
-x, --one-file-system
              skip directories on different file systems

No entanto, du -shP /mnt/c/Program\ Files/ , du -shx /mnt/c/Program\ Files/ e até du -shPx /mnt/c/Program\ Files/ me deram 2.5T . Para essa questão, o mesmo aconteceu com a opção que deveria seguir links simbólicos, du -shL . Ele gera 2.5T . Mesmo para as outras opções, talvez relacionadas, que eu tentei, du -shD e du -shH , deram o mesmo - 2.5T para todas elas.

Meu próximo pensamento foi que talvez os atalhos do Windows estivessem atrapalhando as coisas, então tentei excluí-los. (Eu não sei se esse código realmente impede os seguintes atalhos, mas eu achei que valeria a pena tentar.) Sem dados.

bballdave025@WORK:~$ du -sh --exclude=*.lnk /mnt/c/Program\ Files/
2.5T    /mnt/c/Program Files/

Eu poderia deixar os preconceitos para trás e tentar algo do <shudder> Windows Command Line </shudder> ou até tirar o pó das minhas antigas habilidades de PowerShell . Eu acho que eu poderia até mesmo morder a bala e ir para cada diretório no File Explorer GUI, clique em cada pasta, selecione 'Propriedades', encontrar qual subdiretório ocupa mais espaço, digite o diretório com mais uso de memória e repita clicando em cada pasta ... [dormir] ...

... No entanto, estou interessado em saber porque estou obtendo esse resultado estranho. Quando olho para Program Files (x86) , obtenho um resultado que é como encher uma bola de futebol (não americana) na minha boca. (Mais uma vez, estou falando em termos de proporção de tamanhos; o volume da minha boca não está relacionado ao meu problema.)

bballdave025@WORK:~$ du -sh /mnt/c/Program\ Files\ \(x86\)/
11T     /mnt/c/Program Files (x86)/

(Windows / File Explorer relatou um tamanho de 22,8 GB ... depois que eu esperei 30 segundos.)

Fontes e tentativas

De esta resposta de superusuário , tive a ideia de verificar se minha situação não era

The files you removed are probably still opened by a process.

bballdave025@WORK:~$ lsof -a +L1 /mnt/c/Program\ Files/
bballdave025@WORK:~$

Como não houve saída, presumo que nenhum arquivo removido ainda esteja aberto por um processo.

Eu também consultei esta pergunta e resposta sobre diferentes resultados de du no Linux e no Cygwin. No entanto, as discrepâncias de tamanho descritas nessa questão eram minúsculas, por isso não acredito que o problema seja semelhante. Enquanto eu tenho certeza que

There is then no surprise for the same set of files to use differring [sic] disk size when stored on different file systems.

Eu faço acho que é uma surpresa para o mesmo conjunto de arquivos usar qualquer tamanho de disco diferente quando eles são realmente armazenados em um lugar, mesmo se houver diferentes formas subjacentes de acessá-los.

Próximas etapas

Eu decidi criar uma pasta na minha unidade C: , colocar em um arquivo pequeno e verificar se o tamanho do arquivo era o esperado.

bballdave025@WORK:~$ mkdir -p /mnt/c/Users/bballdave025/little_guy
bballdave025@WORK:~$ echo "This should make a small file." > /mnt/c/Users/bballdave025/little_guy/small_file.txt
bballdave025@WORK:~$ du -sh /mnt/c/Users/bballdave025/little_guy/small_file.txt
17K     /mnt/c/Users/bballdave025/little_guy/small_file.txt
bballdave025@WORK:~$ du -shPx /mnt/c/Users/bballdave025/little_guy/
17K     /mnt/c/Users/bballdve025/little_guy/

17 KB parece grande para esse arquivo de texto pequeno. Se tivermos um byte por caractere, isso nos dará 31 bytes. Eu não sei se esse exercício - fazer um arquivo de texto e verificar du - ajudará a responder a pergunta, mas tem sido parte do meu esforço.

Estou preso. Eu realmente não quero clicar em pastas. Eu também quero saber porque eu tenho esse comportamento estranho. Alguma idéia?

Detalhes do sistema

bballdave025@WORK:~$ uname -a | head -n 1
Linux WORK 4.4.0-43-Microsoft #1-Microsoft Wed Dec 31 14:42:53 PST 2014 x86_64 x86_64 x86_64 GNU/Linux
bballdave025@WORK:~$ bash --version | head -n 1
GNU bash, version 4.3.46(1)-release (x86_64-pc-linux-gnu)
bballdave025@WORK:~$ systeminfo.exe | sed -n 's/^OS\ *//p'
Unable to translate current working directory. Using C:\Windows\System32
Name:                   Microsoft Windows 10 Enterprise
Version:                10.0.15063 N/A Build 15063
Manufacturer:           Microsoft Corporation
Configuration:          Member Workstation
Build Type:             Multiprocessor Free
    
por bballdave025 07.09.2018 / 05:11

0 respostas