Самый точный отчет об использовании диска?

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

Если файл размером 1025 байт находится в файловой системе, где пространство в файловой системе выгружается в единицах 1024 байтовых блоков, этот файл потребляет два целых блока. Это кажется более точным, чем сказать, что этот файл потребляет 1025 байт пространства.

Изменить: файловая система, о которой идет речь, – ext4, без дедуплирования, без сжатия, fwiw.

Это моя попытка:

def getDirUsage(filepath, block_size=1024): # block_size as reported by os.statvfs() ''' return the number of blocks consumed by a directory ''' total_size = int(math.ceil(os.path.getsize(filepath)/block_size)) # debatable whether this should be included in the size allfiles = os.listdir(filepath) for f in allfiles: p = os.path.join(filepath,f) if os.path.isdir(p): total_size += getDirUsage(p,block_size) else: total_size += int(math.ceil(os.stat(p).st_size/block_size)) return total_size 

  • Два веб-сервера работают на одном Linux-машине?
  • Скопируйте и получите файлы с одной машины, которая связана через ssh с другим
  • ViM и Python говорят, что кодировка ANSI_X3.4-1968
  • Как установить cctrlapp на debian?
  • Один лайнер для включения некоторых SCL и виртуальной среды python?
  • Установите virtualenv на Fedora 16
  • python Импорт запросов error
  • Невозможно использовать python speech_recognition lib Класс микрофона из-за ALSA
  • 3 Solutions collect form web for “Самый точный отчет об использовании диска?”

    Да, блоки лучше, поскольку они являются физическим диском, но вам нужно получить их по-другому

    Используйте поле os.stat st_blocks * 512 . https://docs.python.org/2/library/os.html#os.stat

    os.stat(path)
    Выполните эквивалент системного вызова stat() по данному пути. (Эта функция следует за символическими ссылками, чтобы установить символическую ссылку lstat() .)

    В некоторых системах Unix (например, Linux) могут быть доступны следующие атрибуты:

    st_blocks – количество 512-байтовых блоков, выделенных для файла
    st_blksize – блокирование файловой системы для эффективного ввода / вывода файловой системы

    Обычно вы будете иметь размер как кратный st_blksize если вы не используете одну из них – новые файловые системы с файловыми системами, которые могут иметь переменные размеры блоков или обход. Вы могли бы надеяться, что де-dupe в упомянутых файловых системах может быть учтен в подсчете блоков при внедрении файловой системы, но, думая об этом, обман подобен мягким / жестким ссылкам, но физическим данным. Может быть, FS может разделить блоки по всем файлам или только блоки отчетов для одного файла? Возможно нет.

    Вам также нужно учитывать мягкие / жесткие ссылки. В настоящее время вы добавите размер целевых ссылок (попробуйте lstat для них). Один простой способ дублирования жестких ссылок состоит в том, чтобы разделить размер блока на количество жестких ссылок ( st_nlink ), поэтому на общем диске вы считаете только st_nlink inode, в противном случае вам нужно отслеживать номера индексных номеров.

    Если вы не участвуете в учении … как упоминает Оуки, просто используйте du как уже думали другие люди об этом.

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

    Как насчет:

    • жесткая ссылка?
    • экзотическая файловая система – внутренний способ выделения дискового пространства (выделение половинного блока)?
    • сжатая файловая система?
    • например, «дедупликация» ?

    Если вы добавите все это, задача будет почти невозможна без правильного внутреннего знания о том, как все работает (так что определенно не простой stat в файле).

    Системные инструменты

    Однако существует множество системных инструментов, предназначенных для этого, или с вариантами «занятых блоков». Вот два наиболее используемых:

    • дю

      От человека du (от FreeBSD, будучи более подробным):

       DESCRIPTION The du utility displays the file system block usage for each file argument and for each directory in the file hierarchy rooted in each directory argument. If no file is specified, the block usage of the hierarchy rooted in the current directory is displayed. 
    • ls -s

      От человека ls :

       -s, --size print the allocated size of each file, in blocks 

      (кажется, что «блоки» – это, по сути, старомодные 1024 байта, а не реальные блоки диска)

    Пример :

     $ dumpe2fs /dev/mapper/vg_centurion-lv_root |head -20 |grep ^Block dumpe2fs 1.41.12 (17-May-2010) Block count: 13107200 Block size: 4096 

    Таким образом, наша корневая файловая система имеет 4k блоков.

     $ ls -l total 88 -rw-------. 1 root root 2510 Mar 20 18:00 anaconda-ks.cfg -rw-r--r--. 1 root root 67834 Mar 20 17:59 install.log -rw-r--r--. 1 root root 12006 Mar 20 17:57 install.log.syslog 

    С du:

     $ du -h anaconda-ks.cfg 4.0K anaconda-ks.cfg 

    И ls:

     $ ls -ls total 88 4 -rw-------. 1 root root 2510 Mar 20 18:00 anaconda-ks.cfg 72 -rw-r--r--. 1 root root 67834 Mar 20 17:59 install.log 12 -rw-r--r--. 1 root root 12006 Mar 20 17:57 install.log.syslog 

    И не забывайте разреженные файлы:

     $ dd if=/dev/null of=MEAN_FILE bs=1024k seek=1024k 0+0 Datensätze ein 0+0 Datensätze aus 0 Bytes (0 B) kopiert, 1,0298e-05 s, 0,0 kB/s $ ls -lh MEAN_FILE -rw-r--r-- 1 yeti yeti 1,0T Apr 3 09:44 MEAN_FILE $ du MEAN_FILE 0 MEAN_FILE 
    Linux и Unix - лучшая ОС в мире.