欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

Linux系统中创建大文件,并作为文件系统使用

程序员文章站 2023-10-16 21:48:11
在LInux系统的使用过程中,有时候会遇到诸如某个磁盘分区的大小不够用了,导致其下的文件系统不能正常写入数据。亦或者是系统swap分区太小,不够用或者不满足条件而导致的其他一系列问题。如果我们系统上挂载的有富余的磁盘空间,这样就简单多了,直接在现成的磁盘上划出一个分区,格式化并挂载就完事了。但是也有 ......

  在linux系统的使用过程中,有时候会遇到诸如某个磁盘分区的大小不够用了,导致其下的文件系统不能正常写入数据。亦或者是系统swap分区太小,不够用或者不满足条件而导致的其他一系列问题。如果我们系统上挂载的有富余的磁盘空间,这样就简单多了,直接在现成的磁盘上划出一个分区,格式化并挂载就完事了。但是也有些时候限于条件,没有富余的磁盘空间,怎么办的呢?我们可以在现有的系统中,看看有没有其他分区的空间比较大,并且分出去一部分后,仍然不影响改分区系统的正常使用。如果存在这种情况,就可以实现间接的扩展磁盘空间了。

  1,我们需要先在有富余空间的磁盘分区上创建一个大文件,文件的大小根据你的实际需要和所要划出空间分区实际大小来决定。创建大文件,可以使用如下3个命令:

    1.1 dd

      创建大文件首选的会是dd命令,dd是 device driver 的缩写,可以用来读取设备、文件中的内容,并原封不动地复制到指定位置。因此dd本质上是copy一个文件副本,

    它强制你编写每个数据块,并初始化文件内容,但是初始化会占用大量的i / o时间,因此使用dd命令创建大文件的速度是比较缓慢的。使用dd创建大文件的命令如下:

      dd if=/dev/zero of=/home/disk0 bs=2g count=1

    这个命令将在/home根目录下创建一个名为disk0的空文件,其中用到了如下四个选项:

      if=文件名:指定输入文件名或者设备名,如果省略“if=文件名”,则表示从标准输入读取。

      of=文件名:指定输出文件名或者设备名,如果省略“of=文件名”,则表示写到标准输出。

      bs:指定单个文件的块block大小。

      count:想要创建文件的个数。

    1.2 fallocate

      fallocate的功能是为文件预分配物理空间,而不是生成一个空洞文件,fallocate分配的空间在磁盘的扇区上是连续的,它减少后续写入和读取文件时的磁盘寻道开销;

    并且是迅速直接占用空间,而不是想空洞文件那样“假装”战=占有那么多空间,这样就可以保证随着磁盘空间的使用,而不会出现该段磁盘空间不足。由于fallocate

    并不是标准的posix接口,并不是所有的文件系统都是支持的,目前主流的ext4和xfs都是可以的。

      fallocate -l 20g /home/disk00

      -l:--length,指定分配文件的长度,即文件的大小;

      disk00:所分配文件名称

    1.3 truncate

      truncate和lseek是将文件的末尾位置“扩展到”一个固定位置而生成的一个空洞文件,也即是稀疏文件。该文件并不占用实际磁盘空间,只是逻辑上看起来那么大而已。

    使用ls -l命令可以查看其逻辑大小,即你希望分配的大小。使用du命令可以看到其实际占用的磁盘空间大小。使用od -c命令可以看到文件中间是用“\0”填充的。

      truncate -s 10g /home/disk000

      -s:指定文件的大小

  2,将第一步中得到的大文件进行格式化并挂载到文件系统

    由上述可知,如果所要分配的文件大小不大,比如2g以下,我们可以优选dd命令,当文件大小非常大时,就可以使用fallocate了,由于truncate命令生成的文件并不是看起

  来那么大,如果非必要,我们还是尽量不选它。

    比如我们使用dd或者fallocate创建一个1g大小的文件:
    dd -if=/dev/zero of=/home/disk00 bs=1024 count=1000000

    fallocate -l 1g /home/disk00

    2.1 扩展一般的文件系统空间

      2.1.1 格式化

      以格式化为ext4文件系统为例

      mkfs.ext4 /home/disk00       ----执行该命令后,系统会提示“disk00 is not a block special device”,直接输入“y”确认继续就行。

      2.1.2 挂载到文件系统

      由于disk00并不是一个block device,所以挂载到文件系统时并不能像普通磁盘分区、格式化后那样直接挂在,我们需要用到loop伪设备。在执行loop挂载前,我们需要

    确认系统中有哪些loopback设备,并且那些是已经被使用的。

      确认系统中有那些loopback设备:

        ls -l /dev/loop*

      确认那些loopback是已经被使用的:

        cat /proc/mount

      确认上述两个事项后,就可以执行如下挂在命令:

        mount -o loop=/dev/loop0 /home/disk00 /opt/backup_db

        -o loop=:使用 loop 模式用来将一个档案当成硬盘分割挂上系统

      2.1.3 将挂载关系写入/etc/fstab,防止系统重启后挂载关系丢失。

        echo "/home/disk00 /opt/backup_db ext4 defaults,loop 0 0" >> /etc/fstab

    2.2 挂载交换分区

      2.2.1 格式化,将其变成一个swap文件

        mkswap /home/disk00

      2.2.2 启用这个swap文件

        swapon /home/disk00

      2.2.3 写入/etc/fstab,在系统重启时能够自动挂载

        echo "/home/disk00 swap swap defaults 0 0" >> /etc/fstab

  3,操作实例

    下面以我一个项目中的实际操作为例进行说明:

    我们的mysql数据库安装在/home分区下,该分区大小为3.5t,由于我们没有外挂磁阵,也没有独立的备份服务器,所以只能将数据库的备份存放在本地,遵循备份和原始

  数据不能放在同一分区,我们把备份放在了/opt分区,该分区大小为50g。我们库目前大小为12g,每天产生的数据量为350-400m之间,每两周数据总量大致增加1g。备份策

  略是每周一全备,然后周二到周日都是基于周一的全备进行增量(这样的目的是恢复时方便)。备份的保留策略是全备保留3周,之前的全备进行删除;每周的增量在下一周一

  全备前打包压缩转移到/home/old_db_backup下。由于数据量不断增多,大概到每周的周六时/opt的占用量就已经达到接近90%了,所以我们考虑将/opt下暂时存放增量备份的

  目录进行单独挂载一个分区进行扩容,减轻/opt分区的空间压力,方案操作如下:

    3.1 由于/home分区的目录非常大,所以选取/home分区做为分割对象。考虑到后续数据量增加,给予30g空间扩展:

      fallocate -l 30g /home/old_db_backup/backup_disk/disk0_in

    3.2 我们的文件系统为ext4,所以将改数据文件格式化为ext4

      mkfs.ext4 /home/old_db_backup/backup_disk/disk0_in

    3.3 挂载到待增加独立空间的增量备份目录

      mount -o loop=/dev/loop0 /home/old_db_backup/backup_disk/disk0_in /opt/db_backup/incremental_backup

    3.4 挂载关系写入/etc/fstab

      echo "/home/old_db_backup/backup_disk/disk0_in /opt/db_backup/incremental_backup ext4 defaults,loop, 0 0" >> /etc/fstab