AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1070725
Accepted
ParoX
ParoX
Asked: 2021-07-27 14:46:04 +0800 CST2021-07-27 14:46:04 +0800 CST 2021-07-27 14:46:04 +0800 CST

删除文件时挂载的 .img 文件不会清理磁盘空间

  • 772

我需要使用比大多数文件系统上通常可用的更多的 inode。因此,我创建并挂载了一个带有自定义 inode 设置的 ext4 文件系统:

dd if=/dev/zero of=loop0.img bs=1MB count=5000
losetup --find --show `pwd`/loop0.img
mkfs -t ext4 -i 1024 /dev/loop0
mount /dev/loop0 /mnt

这将在磁盘上创建一个 5000MB 的文件(通过ls /mnt),但是当我检查使用df它时显示磁盘未被占用(磁盘空间没有增加 5000MB)。我怀疑是因为它在磁盘上归零并且看起来像未使用的空间。

随着磁盘已满,我有一个程序会尝试删除最近最少使用的文件,直到磁盘空间压力消除。事实证明,尽管删除了 中的文件/mnt,但它仍然注册为占用我的磁盘空间,至少根据df和其他磁盘空闲系统调用。

那么有没有一种特殊的方法需要rm这个虚拟磁盘上的文件来注册空间是可用的?还是我需要以非标准方式查询可用空间?

编辑:完整的命令和输出,注意磁盘使用量/dev/vda1不会增加 5000MB。

root@localhost:~# df
Filesystem     1K-blocks    Used Available Use% Mounted on
udev              490064       0    490064   0% /dev
tmpfs             101092    3188     97904   4% /run
/dev/vda1       19343152 2699088  15660656  15% /
tmpfs             505448       0    505448   0% /dev/shm
tmpfs               5120       0      5120   0% /run/lock
tmpfs             505448       0    505448   0% /sys/fs/cgroup
tmpfs             101088       0    101088   0% /run/user/0
root@localhost:~# dd if=/dev/zero of=loop0.img bs=1MB count=5000
5000+0 records in
5000+0 records out
5000000000 bytes (5.0 GB, 4.7 GiB) copied, 6.20117 s, 806 MB/s
root@localhost:~# losetup --find --show `pwd`/loop0.img
/dev/loop0
root@localhost:~# mkfs -t ext4 -i 1024 /dev/loop0
mke2fs 1.44.5 (15-Dec-2018)
Discarding device blocks: done
Creating filesystem with 1220703 4k blocks and 4884000 inodes
Filesystem UUID: 4f308a54-6ddd-4ef6-b685-c193dfec8b84
Superblock backups stored on blocks:
        8176, 24528, 40880, 57232, 73584, 204400, 220752, 400624, 662256,
        1022000

Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done

root@localhost:~# mount /dev/loop0 /mnt
root@localhost:~# df
Filesystem     1K-blocks    Used Available Use% Mounted on
udev              490064       0    490064   0% /dev
tmpfs             101092    3216     97876   4% /run
/dev/vda1       19343152 2769404  15590340  16% /
tmpfs             505448       0    505448   0% /dev/shm
tmpfs               5120       0      5120   0% /run/lock
tmpfs             505448       0    505448   0% /sys/fs/cgroup
tmpfs             101088       0    101088   0% /run/user/0
/dev/loop0       3594900   45080   3289556   2% /mnt
hard-drive linux debian mount mkfs
  • 1 1 个回答
  • 173 Views

1 个回答

  • Voted
  1. Best Answer
    Tom Yan
    2021-07-30T04:11:37+08:002021-07-30T04:11:37+08:00

    您可以使用fstrim:

    $ rm /tmp/test.img
    rm: cannot remove '/tmp/test.img': No such file or directory
    $ truncate -s 1G /tmp/test.img
    $ sudo losetup --show -f /tmp/test.img 
    /dev/loop0
    $ sudo mkfs.ext4 -E root_owner=1000:1000 /dev/loop0
    mke2fs 1.46.2 (28-Feb-2021)
    Discarding device blocks: done                            
    Creating filesystem with 262144 4k blocks and 65536 inodes
    Filesystem UUID: 70f9b205-0ada-43b1-8636-36983ad79394
    Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376
    
    Allocating group tables: done                            
    Writing inode tables: done                            
    Creating journal (8192 blocks): done
    Writing superblocks and filesystem accounting information: done
    
    $ sudo mount /dev/loop0 /tmp/meh/
    $ openssl enc -pbkdf2 -aes-256-ctr -in /dev/zero -pass file:/dev/urandom -nosalt 2>/dev/null | dd of=/tmp/meh/fill iflag=count_bytes count=768M
    1572864+0 records in
    1572864+0 records out
    805306368 bytes (805 MB, 768 MiB) copied, 2.15669 s, 373 MB/s
    $ sudo umount /tmp/meh/
    $ sudo mount /dev/loop0 /tmp/meh/
    $ rm /tmp/meh/fill 
    $ sudo umount /tmp/meh/
    $ sudo mount /dev/loop0 /tmp/meh/
    $ du -h /tmp/test.img 
    802M    /tmp/test.img
    $ sudo fstrim -v /tmp/meh/
    /tmp/meh/: 973.4 MiB (1020678144 bytes) trimmed
    $ du -h /tmp/test.img 
    33M /tmp/test.img
    

    未使用的(就图像上的文件系统而言)空间将被转换为“孔”(在稀疏文件意义上)。

    正如您可能已经猜到的那样,您也可以安装-o discard- 只需注意结果可能会稍微延迟。

    • 0

相关问题

  • 你最喜欢的 Linux 发行版是什么?[关闭]

  • 更改 PHP 的默认配置设置?

  • 保护新的 Ubuntu 服务器 [关闭]

  • 为什么添加新驱动器后我的磁盘驱动器访问速度如此之慢?

  • (软)Ubuntu 7.10 上的 RAID 6,我应该迁移到 8.10 吗?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve