如何使用 tar --one-file-system 包含或添加 /dev

kev*_*ler 6 ssh tar backup udev devices

我在一个完整的远程文件系统上运行 tar 使用

ssh -n <hostname> 'sudo tar -cpvzf - --one-file-system /' | cat > Bak.tar.gz
Run Code Online (Sandbox Code Playgroud)

这给了我一个 tarball。我尝试将此 tarball 导入我正在使用的另一个服务中,但遇到了一个问题,因为它似乎不包含/dev目录。我想知道我是否可以在初始 tar.gz 之后做类似--include="/dev"/dev之后的事情。这里需要一些指导。

fro*_*utz 6

您可以简单地将它添加到要包含的路径名中。

tar -cf - --one-file-system / /dev/
Run Code Online (Sandbox Code Playgroud)

然而,这通常根本不是您真正想要的,因为动态/dev将包括太多完全错误或不相关的设备节点。

一个更好的方法(在实际获得原始根文件系统的完整副本的意义上更好,包括被其他挂载隐藏的文件)是做另一个文件系统的挂载,它不受子挂载的阻碍,等等tar

这样您就可以获得/dev/实际存储在根文件系统上的(以及其他所有内容)。这通常应该只包括/dev最初在安装时创建的一组标准节点,并且只在启动时需要,直到系统在其/dev/上设置动态。

mkdir /mnt/root
mount --bind / /mnt/root
cd /mnt/root
tar -cpvzf - .
cd /
umount /mnt/root
Run Code Online (Sandbox Code Playgroud)

正如mount联机帮助页所述,bind mount 调用仅附加(部分)单个文件系统,而不是可能的 submounts。这就是--one-file-system不再需要的原因:在此结构下没有其他文件系统。


win*_*ner 5

只需添加/dev到要存档的文件列表中:

ssh -n <hostname> sudo tar -cpvzf - --one-file-system / /dev > Bak.tar.gz
Run Code Online (Sandbox Code Playgroud)

--one-file-system仅防止递归到不同文件系统上的目录。您仍然可以将不同文件系统上的文件/目录直接作为 tar 的参数列出。