我正在使用脚本对正在运行的基于 Debian Stretch 的 Linux 发行版 (NextCloudPi) 进行备份
脚本中执行备份的方法使用 rsync。
backup()
{
mntimg
sync
rsync -aDH --partial --numeric-ids --delete --force --exclude "${MNTPATH}" --exclude '/dev' --exclude '/lost+found' --exclude '/media' --exclude '/mnt' \
--exclude '/proc' --exclude '/run' --exclude '/sys' --exclude '/tmp' --exclude '/var/swap' --exclude '/etc/udev/rules.d/70-persistent-net.rules' \
--exclude '/var/lib/asterisk/astdb.sqlite3-journal' "${OPTIONS[@]}" / "${MNTPATH}/"
..
..
}
当我运行脚本时,我指示将备份 .img 文件保存到外部连接的 USB-HDD 驱动器。
该驱动器为 EXT4 格式,并且已安装。我可以从 Manjaro 文件资源管理器中浏览它。它是可写的,并且有 2.3TB 的可用空间。
备份文件大约有 7.8GB,而我在备份的 SD 卡上的 rootfs (/) 上有 22GB 的可用空间。
每次运行脚本时都会出现错误rsync: write failed on.. no space left on device
:
root@NEXTCLOUDPI:~# image-backup
Image file to create? /media/4TB2/nextcloudpi18Nov2021v3.img
Initial image file ROOT filesystem size (MB) [7526]? 7800
Added space for incremental updates after shrinking (MB) [0]?
Create /media/4TB2/nextcloudpi18Nov2021v3.img (y/n)? y
Starting full backup (for incremental backups, run: /usr/local/bin/image-backup /media/4TB2/nextcloudpi18Nov2021v3.img)
rsync: write failed on "/tmp/img-backup-mnt/usr/src/linux-headers-4.14.93-Re4son-v7+/include/linux/suspend.h": No space left on device (28)
rsync error: error in file IO (code 11) at receiver.c(393) [receiver=3.1.2]
Unable to create backup
root@NEXTCLOUDPI:~#
即使我添加了 rsync 选项,问题仍然存在,--inplace
因此这并不能解决我的问题。
我做了一个sudo du -sh /usr/src
,大小是 150MB。/usr/src
中有 37,000 个文件和 12,000 个子文件夹,所以我想也许我的 inode 用完了,但是...我做了一个df -i
,我的 inode 使用率在根目录 (/) 中是 14%。
问题似乎发生在接近尾声的时候。在这种情况下,创建了一个 7.9GiB 文件。我尝试使用 Etcher 将其刷入 SD 卡,但没有启动。
知道这里出了什么问题吗?我的 rootfs 上有足够的空间供 rsync 根据需要将内容保存到 /tmp。但即使我使用该--inplace
选项,它仍然显示:rsync: write failed on "/tmp/... blah blah... No space left on device (28)
答案1
现在根据您最近的评论,我可以说它很可能只是运行了我们的 inode。当您创建 ext4 fs 时,默认情况下 mkfs 根据分区/图像大小分配 inode。因此,图像大小越小,inode 数量就越少。您可以编辑此脚本以分配更多 inode,只需找到执行 mkfs.ext4 的行,然后使用-i
或-N
选项更改它分配的 inode 数量。
在 image-backup 中找到此行:
mkfs.ext4 -q -b 4096 "${LOOP}p2" > /dev/null
并将其更改为:
mkfs.ext4 -q -b 4096 -i 4096 "${LOOP}p2" > /dev/null
这将使 inode 数量比默认设置多 4 倍。
我不认为你的服务器中存在什么因素会产生这样的影响。虽然稀疏文件也可能是原因,但你可以使用-S
rsync 选项来缓解这种情况,该选项将正确处理稀疏文件。但它与--inplace
选项相冲突。