大多数人会考虑使用dd
或sfill
通常用零擦除可用空间...但是,FAT32 驱动器的限制是最大文件大小只能为 4 GB。
我如何创建多个较小的文件来清除 FAT32 驱动器的可用空间,以克服此限制?
答案1
这听起来确实像XY问题。
sfill
或者shred
更普遍使用的(coreutils 的一部分)覆盖的内容现存的文件(如果一切顺利,例如文件系统就地覆盖,并查看其手册中提到的其他陷阱)。
如果您想要这个,您可以使用shred -n 1 --random-source /dev/zero
; 或者一个小型 shell 脚本来获取文件的大小,然后执行dd conv=notrunc if=/dev/zero of=the_file_to_be_zeroed_out bs=... count=...
。
但据我所知,这不是你所需要的。(除非你能确保只在将文件清零后删除它,这听起来真的很麻烦,而且几乎不可行。)你需要的是将当前没用过任何文件,这样就不会留下先前删除文件(仍然需要压缩)未使用的区域尽可能地可压缩,也就是说,最好充满零。
您应该创建一个尽可能大且全是零的新文件。使用类似 的操作dd if=/dev/zero of=tmpfile bs=1M
,等到它退出并显示错误消息“设备上没有剩余空间”,然后删除此文件。您的图像已准备好压缩 - 但不要忘记先压缩umount
!
答案2
这些说明已经过时了,如果您想可靠地将 FAT32 驱动器上的数据清零,请使用脚本。(如果可以,请随意编辑和更新这些说明)
始终确保已更新,并安装安全删除工具
sudo apt-get update sudo apt-get install secure-delete
安装 FAT32 驱动器
在 Linux 上
fdisk -l sudo mount -t vfat /dev/sdb1 /PATH/TO/MOUNTED/DRIVE
(
sdb1
您的sdxx
卷名在哪里)使用 WSL
sudo mount -t drvfs F: /PATH/TO/MOUNTED/DRIVE
(
F
您的驱动器号在哪里)此外,如果尝试挂载到 中的现有文件夹名称,则可能存在挂载不起作用的错误,
/mnt
在这种情况下,如果您尝试挂载,则需要通过 卸载sudo umount /mnt/f
,重新启动 WSL,删除文件夹(sudo rmdir /mnt/f
),重新创建文件夹(sudo mkdir /mnt/f
),最后再次挂载(
f
您的驱动器号应为小写)在驱动器根目录创建一个临时文件夹并移入其中
mkdir /PATH/TO/MOUNTED/DRIVE/tmp cd /PATH/TO/MOUNTED/DRIVE/tmp
找到可用空间然后创建虚拟文件
df -h /PATH/TO/MOUNTED/DRIVE for i in $(seq START ( END-1 )); \ do fallocate -l 1G emptyfile${i} && echo Created ${i} out of ( END-1 ); \ done
其中
START
1 GB 是END
可用空间,表示df -h
要写入多少 GB,例如for i in $(seq 1 ( 10-1 )); do \ fallocate -l 1G ${i} && echo Created ${i} out of ( 10-1 ); \ done
这将产生九个 1 GB 的“空文件”。
找到最后一点可用空间来写入
df /PATH/TO/MOUNTED/DRIVE fallocate -l ( REST-1 ) emptyfileEND
(其中 REST 是 中显示的可用空间
df -hB
)返回驱动器的根目录,然后使用
srm
(安全删除工具)删除 tmp 文件夹cd /PATH/TO/MOUNTED/DRIVE srm -llrvz /PATH/TO/MOUNTED/DRIVE/tmp
我创建了一个脚本,它无需使用 fallocate 而使用 truncate 即可运行,现在应该可以正常工作了。我没有分配 1 GB,而是让脚本分配了比 4 GiB 少一个字节的空间,这样我就可以更好地填充驱动器。(最后一次截断将使文件小于 4 GiB)
###Bash 脚本(与 WSL 兼容)(下载)