Почему `du` в действии WSL дает размер каталога больше, чем машинная память?

383
bballdave025

Я столкнулся с вопросом, пытаясь выяснить, какие файлы на моем компьютере занимают больше всего места. Вот информация об общем объеме памяти компьютера, найденная в подсистеме Windows для Linux (WSL) /bash

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

Обратите внимание, что мой вопрос не о том, как очистить пространство.

Я начал с проверки 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/ 

Главный выпуск

Мой WSL bash duговорит мне, что на моей машине (которая имеет 239GBпамяти,) мой Program Filesкаталог принимает до 2.5TB из 239GBдоступной памяти. Как будто я держу две пинты воды во рту, не глотая. (Это просто, чтобы показать соотношение размеров - моя проблема не связана с водой.)

Кстати, у меня нет прав администратора - нет, sudo !!чтобы решать любые вопросы. Я оставлю вне Permission deniedошибки (которые будут приходить без реального sudo ), как я продолжаю писать этот пост. Также обратите внимание, что я работаю на компьютере, поэтому есть вещи, к которым у меня нет доступа.

Основной вопрос: существует ли относительно простой способ проверить использование диска в моей ситуации, то есть проверить использование диска на C:диске Windows с помощью подсистемы Windows для Linux?

Вторичный вопрос: какого черта здесь происходит? Почему я получаю сообщение о том, что мой Program Filesкаталог занимает в 10 раз больше места, чем на моем компьютере?

Кстати ... Windows говорит мне, что Program Filesимеет размер 4.83 GB, факт, который я нашел, используя File Explorer, щелкнув правой кнопкой мыши на Program Filesпапке и выбрав «Свойства»


Мои попытки найти решение

Моей первой мыслью было, что могут быть какие-то символические ссылки или материалы для отображения дисков для программного обеспечения компании, антивирусной программы или чего-то еще, поэтому я зашел на manстраницу du. Я нашел следующие два флага, которые, как я думал, могут помочь.

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

Однако du -shP /mnt/c/Program\ Files/, du -shx /mnt/c/Program\ Files/и даже du -shPx /mnt/c/Program\ Files/дал мне 2.5T. В этом отношении, так же вариант, который должен следовать по символическим ссылкам, du -shL. Это вывод 2.5T. То же самое для других, возможно, связанных вариантов, которые я пробовал, du -shDи du -shHдал то же самое - 2.5Tдля всех них.

Моя следующая мысль состояла в том, что, возможно, ярлыки Windows портят вещи, поэтому я постарался исключить их. (Я не знаю, действительно ли этот код предотвращает следующие ярлыки, но я подумал, что стоит попробовать.) Никаких кубиков.

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

Я мог оставить позади предрассудки и попробовать что-нибудь из <shudder> Windows Command Line </shudder>своих старых PowerShellнавыков. Я думаю, я мог бы даже прикусить пулю и перейти к каждому каталогу в File Explorerграфическом интерфейсе, щелкнуть каждую папку, выбрать «Свойства», найти, какой подкаталог занимает больше места, войти в каталог с наибольшим использованием памяти и повторить щелчок по каждой папке ... [спать] ...

... Однако меня интересует, почему я получаю этот странный результат. Когда я смотрю на это Program Files (x86), я получаю результат, который похож на то, как я засунул в рот футбольный мяч (неамериканский). (Еще раз, я говорю с точки зрения соотношения размеров; объем моего рта не связан с моей проблемой.)

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

(Windows / File Explorerсообщил о размере 22,8 ГБ ... после того, как я подождал 30 секунд.)

Источники и попытки

Из этого ответа суперпользователя у меня появилась идея проверить, что моя ситуация не

Удаленные файлы, вероятно, все еще открыты процессом.

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

Поскольку не было никакого вывода, я предполагаю, что никакие файлы, которые я удалил, все еще не открыты процессом.

Я также посмотрел на этот вопрос и ответил о разных duрезультатах на Linux и Cygwin. Однако расхождения в размере, описанные в этом вопросе, были крошечными, поэтому я не считаю, что проблема похожа. Хотя я уверен, что

Тогда нет ничего удивительного в том, что один и тот же набор файлов использует диск разного размера [sic] при хранении в разных файловых системах.

Я действительно думаю, что это сюрприз для того же набор файлов, чтобы использовать любого отличающегося размера диска, когда они действительно хранится в одном месте, даже если существует различные базовые способы доступа к ним.

Следующие шаги

Я решил создать папку на моем C:диске, положить небольшой файл и убедиться, что размер файла соответствует ожидаемому.

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/ 

17KB кажется большим для этого маленького текстового файла. Если у нас есть байт на символ, это даст нам 31 байт. Я не знаю, duпоможет ли это упражнение - создание текстового файла и проверка - ответить на вопрос, но это было частью моих усилий.

Я застрял. Я действительно не хочу нажимать на папки. Я также хочу знать, почему у меня такое странное поведение. Есть идеи?


Сведения о системе

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 
1
Я мог бы оставить свои предубеждения позади и попробовать что-то от Командная строка Windows или даже стереть мои старые навыки PowerShell. Я думаю, я мог бы даже прикусить пулю и перейти к каждому каталогу в графическом интерфейсе «Проводник», щелкнуть каждую папку, выбрать «Свойства», найти, какой подкаталог занимает больше места, войти в каталог с наибольшим использованием памяти и повторить щелчок по каждому из них. папка ... [sleep] ... Я предпочитаю решение `bash` (более мощное, более быстрое), и мне также любопытно странное поведение. bballdave025 6 лет назад 0
WSL наследует разрешение (вроде) от учетной записи Windows. Поэтому, если вы откроете wsl.exe от имени администратора, вы можете получить доступ к ProgramFiles с помощью инструментов Linux. Этот вопрос на 90% типа суперпользователя. Biswapriyo 6 лет назад 0
Спасибо за вашу помощь. Я не видел ссылку, которой поделился @KamilMaciorowski. Я собираюсь удалить вопрос из StackOverflow. На самом деле, я собираюсь посмотреть, возможно ли объединить комментарии из обоих постов. Если есть модератор, который видит это, вы могли бы сделать это или дайте мне знать, как? Если он не был объединен / перенесен к завтрашнему утру, я собираюсь удалить вопрос SO. Еще раз спасибо. bballdave025 6 лет назад 0
[Похоже, об этой ошибке сообщалось полтора года назад] (https://github.com/Microsoft/WSL/issues/1894), затем еще несколько раз (см. Внизу страницы). [У Sysinternals есть собственная версия du для Windows, которая должна работать] (https://docs.microsoft.com/en-us/sysinternals/downloads/du), хотя в последний раз я пробовал ее где-то в Vista / Seven. dave_thompson_085 6 лет назад 2
Хороший вопрос, @KamilMaciorowski. Я уже удалил другой, потому что был только один комментарий, и он был скорее юмористическим. Спасибо, что помогли мне понять сайт и использовать его лучше. bballdave025 6 лет назад 0

0 ответов на вопрос