stat命令输出中的总大小是指物理或逻辑大小?

时间:2013-12-24 05:35:32

标签: linux

stats命令提供以下输出 -

bash-3.2$ stat myfile.zip
  File: `myfile.zip'
  Size: 80195           Blocks: 168        IO Block: 4096   regular file
Device: fd00h/64768d    Inode: 24675915    Links: 1
Access: (0644/-rw-r--r--)  Uid: (  501/meghadata)   Gid: (  500/   megha)
Access: 2013-12-24 10:53:39.000000000 +0530
Modify: 2013-10-01 18:00:58.000000000 +0530
Change: 2013-12-24 10:51:39.000000000 +0530

“尺寸”是指物理尺寸还是逻辑尺寸?

1 个答案:

答案 0 :(得分:0)

我认为Size指的是逻辑大小。

看,stat使用系统调用lstat(如strace所示)。

lstat("myfilename.txt", {st_mode=S_IFREG|0644, st_size=1000000, ...}) = 0
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 4), ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f52e3d08000
write(1, "  File: `myfilename.txt'\n", 25) = 25
write(1, "  Size: 1000000   \tBlocks: 1968 "..., 68) = 68
write(1, "Device: 1eh/30d\tInode: 908841   "..., 44) = 44

man lstat:

  

这些系统调用返回一个stat结构,其中包含   以下字段:

     

off_t st_size; / *总大小,以字节为单位 / blkcnt_t   的st_blocks; / 分配的512B块数* /

     

st_size字段给出文件的大小(如果它是常规文件)   或以字节为单位的符号链接。 st_blocks字段表示数字   分配给文件的块,512字节单位。 (这可能更小   当文件有漏洞时,比st_size / 512。)

所以“st_blocks字段表示分配给文件的块数,512字节单位。”我的文件长度为1,000,000字节。但它有1968个块,意味着1,007,616个字节。

此外还有带孔的文件“当文件有空洞时,这可能小于st_size / 512”。因此,您可以创建一个文件系统在文件系统上使用的空间比ls -l显示的文件少。例如,在这个答案中https://stackoverflow.com/a/5315473/184968 它显示了如何创建一个带孔的文件:

>dd if=/dev/urandom bs=4096 count=2 of=file_with_holes
>dd if=/dev/urandom bs=4096 seek=7 count=2 of=file_with_holes

>stat file_with_holes
File: `file_with_holes'
Size: 36864           Blocks: 40         IO Block: 65536  regular file

其逻辑大小为36,864字节,而文件系统只占用20,480字节(40 * 512 = 20480字节)。