我读过一些问题,询问如何rsync
有效地稀疏文件,提到文件/var/log/lastlog
和/var/log/faillog
. 事实上,我自己也发现这些文件是一个“问题”,因为它们通过 rsync 进行备份会使它们变得“不稀疏”。
因此,我想知道的是,将这些文件设为稀疏、巨大的文件(在我的情况下是 1.1TB)的需求/背景动机是什么?
同样与此相关的是:由于我假设它们是日志文件,所以我不太关心我截断了这些文件,我是否因为截断这些文件而损坏了任何东西?
我读过一些问题,询问如何rsync
有效地稀疏文件,提到文件/var/log/lastlog
和/var/log/faillog
. 事实上,我自己也发现这些文件是一个“问题”,因为它们通过 rsync 进行备份会使它们变得“不稀疏”。
因此,我想知道的是,将这些文件设为稀疏、巨大的文件(在我的情况下是 1.1TB)的需求/背景动机是什么?
同样与此相关的是:由于我假设它们是日志文件,所以我不太关心我截断了这些文件,我是否因为截断这些文件而损坏了任何东西?
我已经将一个磁盘克隆成一个大约 80G 但确实只需要大约 12G 的稀疏文件,即使没有压缩它也适合我的内存,但是为了节省一些资源,我想使用zram:
sudo modprobe zram num_devices=1
echo 79999997952 | sudo tee /sys/block/zram0/disksize
sudo fdisk -c=dos --sector-size 512 /dev/zram0
但是,当我创建分区时,它使用 4096 扇区大小,即使我告诉fdisk使用 512。
它不允许我根据 512 扇区大小键入分区的大小,它不是一个确切的数字,我可以除以 8 以获得基于 4096 的分区,所以我在稀疏mbr上做了:
truncate -s79999997952 /tmp/block
fdisk -c=dos --sector-size 512 /tmp/block
# o, n, p, 1, 63, 156232124, t, 7, a, w
sudo dd if=/tmp/block of=/dev/zram0 count=1 bs=512
似乎对于常规文件,fdisk认为使用 512 扇区大小没有问题!但是zram还是很奇怪,不知道能不能用,因为在512模式下会显示不同的磁盘大小:
$ sudo fdisk -lu /dev/zram0
Disk /dev/zram0: 74.5 GiB, 80000000000 bytes, 19531250 sectors
Units: sectors of 1 * 4096 = 4096 bytes
Sector size (logical/physical): 4096 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: dos
Disk identifier: 0x5f8b6465
Device Boot Start End Sectors Size Id Type
/dev/zram0p1 * 63 156232124 156232062 596G 7 HPFS/NTFS/exFAT
$ sudo fdisk -lu --sector-size 512 /dev/zram0
Disk /dev/zram0: 9.3 GiB, 10000000000 bytes, 19531250 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 4096 bytes
Disklabel type: dos
Disk identifier: 0x5f8b6465
Device Boot Start End Sectors Size Id Type
/dev/zram0p1 * 63 156232124 156232062 74.5G 7 HPFS/NTFS/exFAT
理解,一旦156232062 / 8 = 19529007.75
它无法适应 4096 扇区大小。
如何强制fdisk或zram本身使用 512 扇区大小?
所以我的设置是这样的。
$ truncate -s 1T volume
$ losetup -f --show volume
/dev/loop0
$ mkfs.ext4 /dev/loop0
$ ls -sh volume
1.1G volume
$ mount /dev/loop0 /mnt/loop
正如预期的那样,现在我有一个 1.1TB 的卷。ext4 的开销将稀疏文件扩展为 1.1G,但这很好。现在添加一个文件。
$ dd if=/dev/urandom of=/mnt/loop/file bs=1M count=10240
$ ls -sh volume
12G volume
酷,现在我不想要这个文件了。
$ rm /mnt/loop/file
$ ls -sh volume
12G volume
正如预期的那样,可用空间仍在占用空间,并$ fallocate -d volume
释放了 1gb。
我的问题是,如何在不将卷扩展到完整大小的情况下将此处的可用空间归零?$ dd if=/dev/zero
会将其扩展为完整大小,并conv=sparse
使其在卷内创建一个无用的稀疏文件。
TL;DR:有没有办法losetup
忽略将空块写入空扇区,同时允许其他所有内容?
简单的问题。我有一个 200G 的 qcow2 或原始磁盘映像,但 200G 只使用了 30G。如果我做
rsync -avP
将所有 200G 复制到 U 盘或网络上,浪费时间、空间和网络带宽。是不是可以只复制30G?