使用 find/ls/stat 和 df 正确预测磁盘使用量?

使用 find/ls/stat 和 df 正确预测磁盘使用量?

我正在尝试以编程方式计算驱动器上可容纳的文件数量。该驱动器使用 LUKS/ext4,块大小为 4096。下面是驱动器的 df 打印输出。

Filesystem                       1K-blocks  Used       Available Use% Mounted on
/dev/mapper/vg_server-lv_storage 7260987808 6258809672 633341120 91% /storage

我遇到的问题是找到一个可以准确计算文件在此磁盘上占用的空间的命令。例如:

[root@server ~]# ls -l test.t
-rw-r--r-- 1 root root 2 May 27 11:34 test.t

[root@server ~]# ls -l test2.t
-rw-r--r-- 1 root root 6301 Jul 18  2011 test2.t

“ls”报告2个字节和6301个字节。

[root@server ~]# stat test.t
  File: `test.t'
  Size: 2               Blocks: 8          IO Block: 4096   regular file
Device: fd03h/64771d    Inode: 20185186    Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2013-05-27 11:34:55.244368861 -0400
Modify: 2013-05-27 11:34:47.560446365 -0400
Change: 2013-05-27 11:34:47.654445417 -0400

[root@server ~]# stat test2.t
  File: `test2.t'
  Size: 6301            Blocks: 16         IO Block: 4096   regular file
Device: fd05h/64773d    Inode: 177345663   Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2013-05-27 11:06:28.363664283 -0400
Modify: 2011-07-18 16:18:56.000000000 -0400
Change: 2013-05-12 17:05:09.968897077 -0400

“stat”报告正在使用 8 个块(以 512 为增量,因此 8*512 = 4096)和 16 个块(8192)。

[root@server ~]# find . -xdev -printf '%p %k %b\n' |grep test.t
./test.t 4 8

[root@server ~]# find . -xdev -printf '%p %k %b\n' |grep test2.t
./test2.t 8 16

“find” 报告 4K/8 块(也是以 512 为增量,所以是 4096)和 8K/16 块。到目前为止一切顺利。

“df”,我使用来确定可用 1K 块(上面的 7260987808)的命令,对于第二次测试报告了不同的数字。

[root@server ~]# /bin/df -P |grep lv_storage; cp /root/test.t /storage/ttt.txt;/bin/df -P |grep lv_storage; rm /storage/ttt.txt; /bin/df -P |grep lv_storage;
/dev/mapper/vg_server-lv_storage 7260987808 6258809672 633341120      91% /storage
/dev/mapper/vg_server-lv_storage 7260987808 6258809680 633341112      91% /storage
/dev/mapper/vg_server-lv_storage 7260987808 6258809672 633341120      91% /storage

[root@server ~]# /bin/df -P |grep lv_storage; cp /root/test2.t /storage/ttt.txt;/bin/df -P |grep lv_storage; rm /storage/ttt.txt; /bin/df -P |grep lv_storage;
/dev/mapper/vg_server-lv_storage 7260987808 6258809672 633341120      91% /storage
/dev/mapper/vg_server-lv_storage 7260987808 6258809684 633341108      91% /storage
/dev/mapper/vg_server-lv_storage 7260987808 6258809672 633341120      91% /storage

这显示第一个文件为 633341120-633341112 = 8。

然后第一个文件显示 633341120-633341108 = 12。错误。应该是 16。

我以为这只是 df 的一个问题,也许是一些安全储备,以防止人们填满驱动器,但是当我使用 find 的 %k 计算出驱动器上可容纳的文件数量,然后减去一些填充以确保安全时,它过度填充了驱动器并且 rsync 出错了。

作为参考,%k 定义为:

          %k     The amount of disk space used for this file in 1K blocks. Since disk space is allocated in multiples of the filesystem block size this is usually greater than %s/1024, but it can also be
                 smaller if the file is a sparse file.

有任何想法吗?

答案1

如果我正确理解了你的问题,目的是知道你可以在服务器上放置多少个文件。

我猜这台服务器还没有投入生产,所以我会在驱动器中填满一堆垃圾文件,然后对它们进行计数。

一旦 df -i 给出 100%,就表示您已达到最大值。

相关内容