如何在不清除使它成为交换文件的情况下对/ swapfile进行零填充?


8

我有一个脚本可以运行,以便在备份虚拟客户机之前优化磁盘空间(使用哪个虚拟机管理程序确实没有太大关系)。

现代的Ubuntu版本(例如18.04)似乎默认使用/swapfile而不是分区。也可以

但是,我想对交换文件以及包含它的根分区进行零填充。

对于交换分区,这相对比较容易,因为总有一种方法可以$UUID从交换分区中提取现有分区,并在对分区进行零填充后运行mkswap -U $UUID以重新创建所述交换分区。

但是,/swapfile我不知道该怎么做。虽然我意识到您无法通过挂载/swapfileUUID /etc/fstab,但我仍然想保留UUID。

因此,我认为需要执行以下操作之一:

  1. 我需要一种方法,该方法可以将交换文件填满零,而无需擦除使它成为交换分区的那些结构(即避免运行mkswap -U $UUID
  2. 我需要一种方法来从交换检索现有的UUID 文件(而不是一个分区,我可以使用任何来自blkid于看/dev/disk/by-uuid/$UUID...)

Answers:


15
  1. 这不会像重新创建文件一样彻底清除交换文件,但是如果您跳过第一个4KiB(严格来说,第一页,具体取决于您的体系结构)之后清除了交换文件,则您不会触摸任何结构标识交换文件。

  2. blkid 在交换文件上也可以正常工作:

    $ mkswap swap
    Setting up swapspace version 1, size = 512 MiB (536866816 bytes)
    no label, UUID=7916b81f-1faa-4b7d-84ef-b0bf2f75dbbc
    
    $ blkid swap
    swap: UUID="7916b81f-1faa-4b7d-84ef-b0bf2f75dbbc" TYPE="swap"
    

标头格式是在内核中定义的:旧格式在第一页的末尾具有一个神奇的值,新格式将其与1KiB可用区域结合在一起,然后合并了多个字段(版本,大小,错误页面,UUID,标签),它们都适合放在首页中。


哇,放下我在任何StackExchange网站上收到的最快答案。谢谢。坦白地说,我从未使用blkid过参数。猜猜我应该这样做,而不是例如使用dd偏移量。
0xC0000022L

3
正确,读取UUID并重新创建交换文件可能是更简单的选择。
斯蒂芬·基特

@ 0xC0000022L还会查看的输出格式选项blkid。根据版本,您也许可以blkid swap -o value -s uuid提取UUID。
muru

@muru谢谢,已经做了,并选择了blkid -o export <file>我通过它sed添加local 到每行的开头,然后eval使用Bash。这样,我可以立即在函数中将值作为局部环境变量。
0xC0000022L
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.