statvfs構造体プロファイリング
テスト中、f_bfreeの値比f_frsizeの値が10%より大きいサイズは、16 Gのディスクを意味します.
f_bfreeテストの結果は17 G,f_frsizeテストの結果は15 G
struct statvfs {
unsigned long f_bsize;/*file system block size*/ファイルシステムブロックサイズ
unsigned long f_frsize;/*fragment size*/フラグメントサイズ
fsblkcnt_t f_blocks; /* size of fs in f_frsize units */
fsblkcnt_t f_bfree;//*#free blocks*/空きブロック
fsblkcnt_t f_bavail;//*#free blocks for unprivileged users*/ユーザーレベルのアイドルノード
fsfilcnt_t f_files;/*#inodes*/ノード
fsfilcnt_t f_ffree;//*#free inodes*/空きノード
fsfilcnt_t f_favail;//*#free inodes for unprivileged users*/ユーザーレベルのアイドルノード
unsigned long f_fsid; /* file system ID */
unsigned long f_flag; /* mount flags */
unsigned long f_namemax; /* maximum filename length */
};
テスト環境:ext 4
1)解析f_bsizeとf_frsizeの異同
ブロックあたりのバイト数
印刷結果は4096バイトで、明らかに同じです.
2)分析f_bfreeとf_bavail
ディスクの空き容量を示す
印刷結果は
ディスクが16 Gの場合、f_bfree比f_Bavail大809 MB
ディスクが1.5 Tの場合、f_bfree比f_Bavail大2585 MB
私たちが想像していたような線形成長はありません
実際にdf-Thを採用
f_Bavailが表示に近い値
3)f_blocksはディスク全体のスペースを表します
4)ディスクの各方面の数値を計算するのは以下の通りである.
ディスク全体のスペース:(buf.f_blocks*buf.f_frsize)/1024/1024)MB
ディスクの空き容量:(buf.f_bfree*buf.f_frsize)/1024/1024)MB
ディスクのユーザレベル空き容量:(buf.f_bavail*buf.f_frsize)/1024/1024)MB
f_bfreeテストの結果は17 G,f_frsizeテストの結果は15 G
struct statvfs {
unsigned long f_bsize;/*file system block size*/ファイルシステムブロックサイズ
unsigned long f_frsize;/*fragment size*/フラグメントサイズ
fsblkcnt_t f_blocks; /* size of fs in f_frsize units */
fsblkcnt_t f_bfree;//*#free blocks*/空きブロック
fsblkcnt_t f_bavail;//*#free blocks for unprivileged users*/ユーザーレベルのアイドルノード
fsfilcnt_t f_files;/*#inodes*/ノード
fsfilcnt_t f_ffree;//*#free inodes*/空きノード
fsfilcnt_t f_favail;//*#free inodes for unprivileged users*/ユーザーレベルのアイドルノード
unsigned long f_fsid; /* file system ID */
unsigned long f_flag; /* mount flags */
unsigned long f_namemax; /* maximum filename length */
};
テスト環境:ext 4
1)解析f_bsizeとf_frsizeの異同
ブロックあたりのバイト数
印刷結果は4096バイトで、明らかに同じです.
2)分析f_bfreeとf_bavail
ディスクの空き容量を示す
印刷結果は
ディスクが16 Gの場合、f_bfree比f_Bavail大809 MB
ディスクが1.5 Tの場合、f_bfree比f_Bavail大2585 MB
私たちが想像していたような線形成長はありません
実際にdf-Thを採用
f_Bavailが表示に近い値
3)f_blocksはディスク全体のスペースを表します
4)ディスクの各方面の数値を計算するのは以下の通りである.
ディスク全体のスペース:(buf.f_blocks*buf.f_frsize)/1024/1024)MB
ディスクの空き容量:(buf.f_bfree*buf.f_frsize)/1024/1024)MB
ディスクのユーザレベル空き容量:(buf.f_bavail*buf.f_frsize)/1024/1024)MB
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<mntent.h>
#include<sys/statvfs.h>
//pszDevicePath ,pszDeviceMountPoint
intGetDeviceMountPoint(constchar*pszDevicePath,char*pszDeviceMountPoint)
{
structmntent*pent;
FILE*pFile;
pFile=setmntent("/proc/mounts","r");
if(pFile==NULL){
perror("setmntent");
return-1;
}
while(NULL!=(pent=getmntent(pFile)))
{
if(strcmp(pent->mnt_fsname,pszDevicePath)==0)
{
sprintf(pszDeviceMountPoint,"%s",pent->mnt_dir);
printf("Device:%smountpointis:%s
",pszDevicePath,pszDeviceMountPoint);
}
}
endmntent(pFile);
return0;
}
// statvfs
intGetDeviceRoomSize(constchar*pszDeviceMountPoint)
{
structstatvfsbuf;
intrv=statvfs(pszDeviceMountPoint,&buf);
if(!rv)
{
printf("wholespace:%uMbytes
",(buf.f_blocks*buf.f_frsize)/1024/1024);
printf("availspace:%uMbytes
",(buf.f_bavail*buf.f_frsize)/1024/1024);
}
else
{
perror("statvfs");
return-1;
}
return(buf.f_blocks*buf.f_frsize)/1024/1024;
}
intmain(intargc,char*argv[])
{
intnDiskRoomSize=0;
charszMountPoint[32]={0};
GetDeviceMountPoint(argv[1],szMountPoint);
nDiskRoomSize=GetDeviceRoomSize(szMountPoint);
printf("DiskRoomSize=%dMB
",nDiskRoomSize);
return0;
}