Linux创造固定的文件大小-预分配磁盘空间

一、课前预习

写本篇文章的目的很简单,防止采坑、防止采坑、防止采坑
我们在开发程序的过程中,往往需要预分配磁盘空间,防止因磁盘空间不够而引发程序异常问题(已踩过坑), 现网查阅资料,有些预分配磁盘空间的方法不正确,在这里特别记录一下, 除此之外,把正确的预分配的方法和大家分享一下,如果其他人有建议,欢迎拍砖狠砸

二、假:磁盘预分配---ftruncate

1. 使用lseek、ftruncate到一个固定位置生成的“空洞文件”是不会占据真正的磁盘空间的。

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <stdint.h>

uint64_t file_size = 10*1024*1024*1024ULL;

int main()
{
    int fd = -1;

    fd = open("test.data.fruncate.txt", O_RDWR | O_CREAT, 0666);
    if(fd < 0){
      printf("open failed\n");
      return -1;
    }

    if(ftruncate(fd, file_size)){
        printf("ftruncate error\n");
        return -1;
    }

    lseek(fd, file_size - 1,SEEK_CUR);
    write(fd, "1", 1);

    close(fd);
    return 0;
}

测试结果

2. fseek fputs填充文件的最后一个字节

#include <stdio.h>
#include <unistd.h>

int main()
{
    FILE *f = fopen("test.data", "w");
    fseek(f, 256*1024*1024 - 1, SEEK_CUR);
    fputc(0,f);
    return 0;
}

3. dd命令

         dd if=/dev/zero of=test bs=1M count=0 seek=1024

测试结果

4. 额外补充:

1 .ls显示文件的“逻辑上”的size, 这不是文件真正占用磁盘空间大小,这部分空间也会被其他进程使用。
2 .du显示文件“物理上”的size,即du显示的size是文件在硬盘上占据了多少个block计算出来的

三、真:磁盘预分配---fallocate

1. 使用fallocate 或者posix_fallocate函数

请求tlinux内核大神后,原来还存在fallocate 和 posix_fallocate这样的函数, 还是自己太low, 其实fallocate 和 posix_fallocate两个最大的区别:

This is a nonportable, Linux-specific system call

废话也不多说, 还是直接上代码比较好一点, 一目了然

#define _GNU_SOURCE             /* See feature_test_macros(7) */
#include <fcntl.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <string.h>
#include <stdint.h>

uint64_t file_size = 10*1024*1024*1024ULL;

//int fallocate(int fd, int mode, off_t offset, off_t len);
//int posix_fallocate(int fd, off_t offset, off_t len);

int main()
{
   int fd = -1;
   int ret = -1;   

   fd = open("tmp.txt", O_CREAT|O_RDWR, 0666);
   if(fd < 0){
     printf("fd < 0");
     return -1;
   } 

   //ret = fallocate(fd, 0, 0, file_size);
   ret = posix_fallocate(fd, 0, file_size);
   if(ret < 0 ){
      printf("ret = %d, errno = %d,  %s\n", ret, errno, strerror(errno));
      return -1;
   }

   printf("fallocate create %.2fG file\n", file_size/1024/1024/1024.0);

   close(fd);

   return 0;
}

测试结果:

[email protected]:/data6#time ./posix_fallocate
fallocate create 10.00G file

real    0m0.014s
user    0m0.000s
sys 0m0.014s
[email protected]:/data6#ll -h posix_fallocate.file.txt
-rw-r--r-- 1 root root 10G Oct 25 15:45 posix_fallocate.file.txt
[email protected]:/data6#du -sh posix_fallocate.file.txt
11G posix_fallocate.file.txt


不仅可以占住空间,而且速度非常快, 之前有过一个愚蠢的想法, 用dd命令直接创建10G文件,但是会造成IO毛刺,肯定不能这么玩,要是创造100G文件岂不是凉凉了。dd命令还是安安静静压测下磁盘性能或者创造一些小文件比较好。

2. 额外补充

  1. 磁盘空间预分配,不是所有linux系统都支持,有时候就分配失败,这就没有办法了。如下

    ret = -1, errno = 95,  Operation not supported
  2. linux命令磁盘预分配---fallocate
    [email protected]:/data6#fallocate -l 10G  2.txt
    [email protected]:/data6#ll -h 2.txt
    -rw-r--r-- 1 root root 10G Oct 25 15:33 2.txt
    [email protected]:/data6#du -sh 2.txt
    11G 2.txt

原文地址:http://blog.51cto.com/10114285/2311140

时间: 2024-10-29 05:06:41

Linux创造固定的文件大小-预分配磁盘空间的相关文章

Linux基本命令(2)有关磁盘空间的命令

有关磁盘空间的命令 命令 功能 mount 挂载文件系统 umount 卸载已挂载上的文件系统 df 检查各个硬盘分区和已挂上来的文件系统的磁盘空间 du 显示文件目录和大小 fsck 主要是检查和修复Linux文件系统 2.1 mount命令 mount命令的功能是挂载文件系统,可以挂载硬盘.光盘.软盘,也可以挂载NFS网络文件系统.这个命令的标准用法如下: mount –t 设备类型 存放目录 mount IP地址:/所提供的目录 存放目录 选项 说明 (无) 不加任何参数,直接输入命令可以

Linux服务器CPU、内存、磁盘空间、负载情况查看python脚本

网上搜,东拼西凑,组装了一个可以查Linux服务器CPU使用率.内存使用率.磁盘空间占用率.负载情况的python脚本. 脚本内容如下: # -*- coding:utf-8 -*- - import os, time last_worktime=0 last_idletime=0 def get_cpu(): global last_worktime, last_idletime f=open("/proc/stat","r") line=""

为Linux主机用户设定特定的磁盘空间大小——Ubuntu12.04配置磁盘限额实战配置

使用软件:quota 操作系统:Ubuntu 12.04_x86_64 针对分区:/home下的用户 一.安装quota # apt-get install -y quota 二.配置磁盘配额分区 配置设备目录支持相应quota # vi /etc/fstab    重启后生效 /dev/sda7   /home  ext4   defaults,usrquota,grpquota  1 2 重现挂载/home分区 #mount -o remount,usrquota,grpquota /hom

Linux 系统(Centos版本)磁盘空间占满的解决办法。

这两天 ,服务器借给了朋友 搭建  三端合一的 游戏,结果没弄成. 还给我服务器的时候,卧槽!!! ,40G的硬盘,使用率 百分百,这是放种子了??? 算了 ,自己借出去的服务器,含着泪也要修好. 本来是准备重装系统 搞定的.想想,服务器用的久了,服务器的内容也多了,一个SVN版本控制器的内容,就让你舍不得重装了. 还是查查资料,想想其他办法吧. 解决开始: 先命令查一查磁盘,使用率吧.别是宝塔面板的问题.那也不是不可能. 1 [[email protected] /]# df -l 2 文件系

linux 故障:df -h统计磁盘空间占用太多,但又du -h找不到大的文件

用lsof / | grep -i delete 从根目录定位打开的被删除的文件 如果定位到某文件占用空间很大 主要是因为我们在删除这个日志文件的时候是用rm -rf *.log这样的命令删除的,删除日志之后又没有重启相应的进程,导致inode节点不被释放,空间一直被占用.如果我们用echo “ ” > /logpath/201109.log这样的命令来清空日志 相关工具: df -h du -h du -sh du -h --max-depth=1 lsof / | grep -i delet

linux查找系统中占用磁盘空间最大的文件

Q:下午有一客户磁盘空间占用很大,使用df查看磁盘剩余空间很小了,客户想知道是哪些文件占满了文件. Q1:在Linux下如何查看系统占用磁盘空间最大的文件? Q2:在Linux下如何让文件夹下的文件让文件按大小排序? A: 不知您是否遇到过这样的问题,服务器上架没多长时间磁盘怎么装满了. 分析:大多是由于日志没有轮滚,可以使用脚本或logrotate将日志定期备份删除或直接关闭不需要的日志记录功能.51开源社区帖子有相关各种服务器日志的处理方法.接下来你会想起来去apache和mysql或其他应

Linux命令(27):df&du命令-磁盘空间查看

Linux df命令用于检查系统磁盘空间占用情况 Linux du命令用于显示目录或文件的大小 Linux df命令 语法:df [OPTION]... [FILE]... 常用选项: -h 以K,M,G为单位,提高信息的可读性. -k 以KB大小为单位显示 -m 以MB大小为单位显示 -a 列出所有的文件系统分区,包含0大小的文件系统分区 -i 列出文件系统分区的inode信息 -T 显示磁盘分区的文件系统类型 常用选项:-hT,查看系统分区情况,并显示文件系统类型           -ih

【Azure】 Linux VM扩大操作系统磁盘空间

Azure Linux VM扩大操作系统磁盘空间 目前Azure 针对Linux VM提供了增加操作系统磁盘空间的新功能,目前支持的虚拟机主要包括DS, DSV2和FS系列虚拟机.这样有助于帮助客户应用日志保持在SDA文件增加磁盘空间. 1. 创建虚拟机的时候选择 2. 进入操作系统可以看到磁盘空间已经增加到对应大小. 3. 重新分区 [[email protected] ~]# fdisk /dev/sda The device presents a logical sector size t

linux磁盘空间使用问题

linux磁盘空间用满的处理方法 linux下空间满可能有两种情况 可以通过命令 df -h  查看磁盘空间占用,实际上是查看磁盘块占用的文件(block) df -i  查看索引节点的占用(Inodes) 磁盘块和索引节点其中之一满,都会导致无法创建文件,提示磁盘空间已满. 所以请注意,查看磁盘还有空间,但是创建文件提示空间满,可能是inodes节点已满 通过命令:find / -size +100M |xargs ls -lh 列出系统内大于100M的文件 du -h --max-depth