我读过这篇文章 -如何在本地机器上使用SSH添加远程磁盘并保存到本地磁盘
但是,以下代码不起作用:
"dd if=/dev/sda | gzip -1 -" | dd of=image.gz
因为我没有任何/dev/sda
目录。我假设这是因为我使用的是 Debian 7.0。
非常感谢任何帮助获取我的 vps 的完整副本。
答案1
磁盘的设备名称取决于磁盘的类型(更准确地说,取决于磁盘连接到的总线和控制器的类型以及处理它们的驱动程序)。/dev/sda
是 PC 中第一个磁盘的典型名称(可以根据驱动程序使用其他名称,例如对于某些旧类型的磁盘控制器或某些硬件 RAID 控制器)。在VPS中,磁盘通常是虚拟的,设备名称取决于虚拟化技术,例如/dev/vda
或/dev/xvda
。您可以使用df
或查找系统上的块设备名称lsblk
。
但不要用它来从实时系统进行备份!您很可能会得到不可读的备份。如果在进行备份时磁盘内容发生变化(这在实时系统上是不可避免的(例如,日志被写入某处)),那么您的映像将不一致 - 一点旧状态,一点新状态 -并且可能无法恢复。
进行备份的首选方法是创建一个快照,即文件系统的视图被冻结并且即使真实系统不断变化也不会改变。如何做到这一点以及是否可能,取决于您的系统的设置方式。某些文件系统类型(例如 btrfs 和 zfs)具有内置快照功能。 LVM 还可以制作卷的快照。
如果您无法制作快照(或者即使可以)制作一个文件级备份。来自发生更改的系统的文件级备份将不一致,但如果您不进行“重要”更改,则备份将可用。例如,如果您移动文件,如果它们碰巧从备份程序尚未遍历的目录移动到已遍历的目录,则它们可能会从备份中被忽略。另一方面,如果日志文件持续增长,您将拥有该文件的一些中间版本,但不会有损坏的文件系统映像。如果删除一个文件并创建另一个文件,您可能没有这些文件中的任何一个,或者只有其中之一,或者两者都有,但是您不会有旧文件的目录条目指向新文件中的某些数据。
您可以使用 GNU tar(作为 root!)来备份包含重要元数据的 Linux 系统。
ssh root@vps 'tar -cJf - --acls --selinux --one-file-system /' >vps.tar.xz
答案2
/dev/sda
是直接通过 SCSI 驱动程序与磁盘进行通信时的约定。在评论中,您说您的磁盘位于/dev/vda
:这样的命名在虚拟化解决方案中有些常见。如果我猜的话,我会说您正在谈论 KVM 管理的 VPS。
如果你想备份你的/dev/vda
磁盘,只需使用 slm 的建议:
ssh user@remote "dd if=/dev/vda | gzip -1 -" | dd of=image.gz
这将/dev/vda
完全备份,并且稍后您可以将dd
其重新复制到另一个磁盘上,前提是那里有足够的空间。
fdisk -l
工作正常,我的设备文件是/dev/vda1
,但是它包含我的整个系统吗?
你读得太快了。/dev/vda1
是磁盘的一个分区(一块)/dev/vda
。需要注意三点:
- 如果您的系统仅由位于 的根分区组成
/dev/vda1
,则备份/dev/vda1
就足够了。您不需要备份整个驱动器(其中还包括磁盘“标头”)。 - 如果您的系统跨越 上的多个分区
/dev/vda
,那么您必须获取dd
所有分区才能获取所有内容(或者dd
像上面那样获取整个磁盘)。 - 您的系统可能还使用多个磁盘!这种情况比较少见,但我想它可能会发生。您可以将
/
和分区(例如,在和)/var
上,并将主目录 ( ) 放在另一个驱动器 ( ) 上。/dev/vda
/dev/vda1
/dev/vda2
/home
/dev/vdb1
/dev/vdb
就您而言,我想说lsblk
这是理解您的设置的正确工具。运行它并查看该MOUNTPOINT
列。只要那里有东西,您的系统就会使用该行上的分区。如果您想备份整个内容,您必须:
- 将所有使用的分区 (
/dev/vdXY
) 下载到文件。当分区安装在某个地方时,就会使用它。 - 将所有使用过的磁盘 (
/dev/vbX
) 下载到文件。当磁盘至少包含一个已用分区时,该磁盘就被使用。
换句话说,您可以运行:
ssh user@remote "dd if=/dev/vda | gzip -1 -" | dd of=disk1.gz
ssh user@remote "dd if=/dev/vdb | gzip -1 -" | dd of=disk2.gz
# ... and so on, once per used disk.
或(使用上面我的 2 磁盘示例):
ssh user@remote "dd if=/dev/vda1 | gzip -1 -" | dd of=root.gz
ssh user@remote "dd if=/dev/vda2 | gzip -1 -" | dd of=var.gz
ssh user@remote "dd if=/dev/vdb1 | gzip -1 -" | dd of=home.gz
# ... and so on, once per used partition.
单独备份分区的一个优点是,在需要时可以更轻松地在本地探索它们:
$ gzip -d home.gz # decompress the backup
$ sudo mkdir /mnt/home_bak # create a mount point
$ sudo mount -o loop home /mnt/home_bak # mount the backup
$ cd /mnt/home_bak # explore the home backup
最后,请记住,lsblk
仅列出已安装的分区。如果您设置了额外的分区(启动时不会自动安装的分区),请记住包含这些分区。您很可能会记得在安装 VPS 时是否已这样做。