使用 bsdtar 完整备份/还原 Linux 系统
前几天小山在尝试更换 Linux 的系统分区格式,因为要格式化系统分区,所以要备份系统。Linux 下的备份工具是不少,但是既要方便使用又要在救援环境中可用,可选择的就没几个了,我当时选择了 tar。
tar 是 Linux 系统非常经典的一个工具,它可以将一个或多个文件打包成 tar 存档文件,并且支持使用其他压缩工具对 tar 文件进行压缩(tar 文件本身无任何压缩),同时它能保留 Linux 的文件权限等信息,用来备份/还原系统再合适不过了。
但当我使用 tar 还原系统之后,发现了一个问题,某些文件的特殊权限消失了,可我在备份/还原的时候明明使用了 --xattrs
参数,理论上它应该会保存特殊文件权限,但是并没有。搜索过后发现,这是 GNU tar 的一个错误:特殊属性的支持不完整,导致当前版本的 GNU tar 并不能很好的处理特殊属性(即使--xattrs-include=*
)。
难道就没有办法了吗?其实不然,大家可能见过 bsdtar 这个工具,bsdtar 是 libarchive 捆绑的 tar 实现,正如它的名字一样,一些 BSD 系统确实使用 libarchive 作为其 tar 实现,Linux 下的很多工具也使用 bsdtar 对 tar 文件进行操作,而不是 GNU tar。bsdtar 几乎与 GNU tar 拥有相同的的参数,并且对特殊文件属性有完整的支持,以及更好的稀疏文件处理。
于是我最后使用 bsdtar 备份并还原了系统,现在就跟大家分享一下使用 bsdtar 备份还原系统的步骤,以及注意事项。
无论是备份还是还原系统,都推荐在 Live 环境中执行,这样可以确保数据一致性。我使用的是 ArchLinux 的安装镜像,因为它内置 bsdtar,也可以选择其他系统的安装镜像,不过可能需要手动安装 bsdtar。
备份系统之前推荐清理下缓存、日志等不需要的文件,可以加快备份速度以及减少备份大小。
启动安装镜像之后,首先需要挂载分区,比如使用命令 mount /dev/sda1 /mnt
将 /dev/sda1
挂载到 /mnt
路径,具体要挂载那些分区以及挂载到那些路径,根据你的系统情况而定。
挂载分区之后,就可以使用 bsdtar 备份和还原系统了。
务必使用 root 执行这些命令,以及把 ${mountPath}
替换为系统分区挂载路径,${tarPath}
替换为 tar 文件存放目录,推荐放在其他分区。
备份命令:bsdtar -c -f ${tarPath}/linux-backup.tar -C ${mountPath} -v -B .
还原命令:bsdtar -x -f ${tarPath}/linux-backup.tar -C ${mountPath} -v
上述命令中的参数介绍:
# -C : 进行操作之前更改当前位置到指定路径
# -f : 存档文件路径
# -v : 详细输出模式 (省略可加快 bsdtar 执行)
# 仅备份
# -B : 不兼容其他 tar 实现
# -c : 创建存档文件
# . : 这个点代表当前目录
# 仅还原
# -x : 释放存档文件
# 你可以指定参数 -a,然后更改存档文件的后缀名为支持的压缩格式后缀名,bsdtar 会使用对应工具对存档文件进行压缩和解压,如果后缀名是未知的,默认使用 bzip2。
# 比如把存档文件名更改为 linux-backup.tar.gz,bsdtar 会使用 gzip 对存档文件进行压缩和解压。
# 如果使用了压缩,bsdtar 执行将需要更多的时间。
# 因为是以 root 权限执行,所以 bsdtar 默认会存储和释放文件权限等信息,不需要额外的参数。
bsdtar 手册页:https://man.archlinux.org/man/core/libarchive/bsdtar.1.en
如果你更换了硬盘或对引导分区进行了修改,那么还原系统后可能需要重建引导,最简单的方法就是重新安装引导管理程序(可能需要对应系统的安装镜像)。
评论由 giscus 驱动,基于 GitHub Discussions。