最も正確なディスク使用量レポートは何ですか? [コピー]

最も正確なディスク使用量レポートは何ですか? [コピー]

ディスク領域はブロック単位で割り当てられているため、ディレクトリが消費する実際の領域をバイト単位ではなくブロック単位で報告する方が正確ですか?

1,025バイトのファイルが1,024バイトのブロックとしてスペースが割り当てられているファイルシステムに存在する場合、そのファイルは2つのブロック全体を占めます。ファイルが1,025バイトのスペースを占めると言うよりも、これはより正確に見えます。

編集:問題のファイルシステムは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

答え1

はい、ブロックは物理ディスク使用であるため、より良いですが、別の方法でインポートする必要があります。

os.statフィールドを使用してくださいst_blocks * 512https://docs.python.org/2/library/os.html#os.stat

os.stat(path)
stat()指定されたパスでシステムコールと同等の操作を実行します。 (この関数はシンボリックリンクに従います。シンボリックリンクの数を計算するにはを使用します lstat()。)

一部のUnixシステム(Linuxなど)では、次の属性も使用できます。

st_blocks- ファイルに割り当てられた512バイトブロックの数
st_blksize- 効率的なファイルシステムI / Oのためのファイルシステムブロックサイズ

st_blksize可変ブロックサイズまたは重複排除機能を備えた新しい高度なファイルシステムのいずれかを使用しない限り、通常サイズは倍数に増えます。ファイルシステムの実装によっては、ファイルシステムの重複排除がブロック数に反映されると予想できますが、これを念頭に置いて重複排除はソフト/ハードリンクに似ていますが、物理データに関するものです。 FSはブロックをすべてのファイルに分割できますか、それとも単一のファイルのブロックのみを報告できますか?おそらくそうではありません。

ソフト/ハードリンクも考慮する必要があります。現在ソフトリンクターゲットのサイズを追加します(lstatこのリンクを試してください)。ハードリンクを複製する簡単な方法は、ブロックサイズをハードリンク数(st_nlink)で割ることです。その後、ドライブ全体に対して一度だけinodeを計算します。それ以外の場合は、inode番号を追跡する必要があります。

学習の練習をしていない場合... Oukiが述べたように、du他の人がすでにこれを考慮したように使用してください。

答え2

ファイルが実際にディスク上のどのくらいのスペースを占めるかを正確に計算するのは簡単ではありません。徹底的な答えは、ファイルサイズを次のディスクブロックに丸めるよりも複雑です。

何について:

  • ハードリンク?
  • ファイルシステムが内部的にディスク容量を割り当てる奇妙な方法(ハーフブロック割り当て)はありますか?
  • 圧縮ファイルシステム?
  • 次のエキゾチックな特徴があります。「データ重複排除」

すべてを合計すると、作業が実際にどのように機能するかについての適切な内部理解がなければ、作業はほとんど不可能です(したがって、ファイルに関する単純な統計ではありません)。

システムツール

ただし、この目的のために、または「占有ブロック」オプションを使用して設計された多くのシステムツールがあります。最も一般的に使用される2つの方法は次のとおりです。

  • ~から男性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
    

    ls(「ブロック」は実際には実際のディスクブロックではなく古い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

答え3

そして、まれなファイルも忘れないでください。

$ 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

関連情報