Relatório de uso de disco mais preciso? [duplicado]

0

Como o espaço em disco é alocado em blocos, é uma representação mais precisa do espaço real consumido por um diretório para relatá-lo em blocos versus bytes?

Se um arquivo de tamanho 1.025 bytes residir em um sistema de arquivos em que o espaço no sistema de arquivos é distribuído em unidades de blocos de 1.024 bytes, esse arquivo consome dois blocos inteiros. Isso parece mais preciso do que dizer que esse arquivo consome 1.025 bytes de espaço.

Editar: O sistema de arquivos em questão é ext4, sem desduplicação, sem compactação, fwiw.

Esta é minha tentativa:

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
    
por John Schmitt 03.04.2014 / 08:44

3 respostas

1

Sim, os blocos são melhores, pois são usados no disco físico, mas você precisa obtê-los de uma maneira diferente

Use o os.stat field st_blocks * 512 . link

os.stat(path)
Perform the equivalent of a stat() system call on the given path. (This function follows symlinks; to stat a symlink use lstat().)

On some Unix systems (such as Linux), the following attributes may also be available:

st_blocks - number of 512-byte blocks allocated for file
st_blksize - filesystem blocksize for efficient file system I/O

Geralmente, você terá um tamanho como um múltiplo de st_blksize , a menos que você esteja usando um desses novos sistemas de arquivos que podem ter tamanhos de blocos variáveis ou duplicados. Você esperaria que o desdobramento dos sistemas de arquivos fosse contabilizado na contagem de blocos pela implementação do sistema de arquivos, mas pensando nisso, o dupe é como links físicos / físicos, mas para dados físicos. Talvez o FS pudesse dividir os blocos em todos os arquivos, ou apenas reportar blocos para um único arquivo ?? Provavelmente não.

Você também precisa considerar os links físicos / físicos. Atualmente, você adicionará o tamanho do alvo dos links (tente lstat para esses links). Uma maneira simples de duplicar hard links é dividir o tamanho do bloco pelo número de hard links ( st_nlink ), então, em um drive total, você só conta o inode uma vez, senão você tem que rastrear os números de inode.

A menos que você esteja em um exercício de aprendizado ... como Ouki menciona, use du , já que outras pessoas já pensaram sobre essas coisas.

    
por 03.04.2014 / 09:52
1

Contar exatamente o que um arquivo realmente ocupa no disco não é trivial, já que uma resposta completa é mais complexa do que apenas arredondar o tamanho do arquivo para o próximo bloco de disco.

E sobre:

  • link físico?
  • maneira interna do sistema de arquivos exótico de alocar espaço em disco (alocação de meio bloco)?
  • sistema de arquivos compactado?
  • recurso sofisticado, como "desduplicação"

Se você adicionar tudo isso, a tarefa é quase impossível sem um conhecimento interno adequado de como as coisas estão realmente funcionando (então definitivamente não é uma estatística simples no arquivo).

Ferramentas do sistema

Existem, no entanto, muitas ferramentas de sistema projetadas para isso, ou com opções de "blocos ocupados". Aqui estão 2 dos mais usados:

  • du

    De man du (do FreeBSD, como sendo mais detalhado):

    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

    De man ls :

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

    (parece que ls "blocos" são de fato blocos antiquados de 1024 Bytes, não os blocos de disco reais)

Exemplo :

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

Portanto, nosso sistema de arquivos raiz tem 4k blocos.

$ 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

Com du:

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

E 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
    
por 03.04.2014 / 08:59
0

E não esqueça de arquivos esparsos:

$ 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
    
por 03.04.2014 / 09:49