我有一个系统,我想创建一个完整的系统备份。备份应包括系统存储驱动器上的所有系统设置、驱动程序、用户数据等。一旦系统驱动器崩溃,在更换物理存储设备后,备份应该可用于恢复该特定 PC 的系统驱动器。
有一种情况是,我只有远程 ssh 访问权限才能创建备份。为了进行恢复,我显然必须(并且可以)亲自到达 PC(更换驱动器等)。此外,PC 无法直接访问互联网。我通过互联网连接到跳转主机,然后从那里通过以太网访问 PC。
通过物理访问,我可以通过 ventoy 启动棒启动 PC,启动到 gparted live 系统,并使用 dd 将系统分区克隆到一些映像文件中。但通过远程访问无法做到这一点。
还有其他选择吗?例如:是否可以使用以下备份策略
tar -cvpzf /backup.tar.gz --exclude=/backup.tar.gz --one-file-system
或者 https://help.ubuntu.com/community/BackupYourSystem/TAR
或者这不适合我的情况?或者这是不可能的,或者可能不够完整?
我可以远程将备份从该 PC 移动到 NAS 或跳转主机并从那里下载(或直接将备份生成到 NAS),因此这实际上是关于如何生成合适的备份,而不是关于如何确保系统崩溃时备份文件得以保留。此外,如果当前的 48% 太接近 > 50%(这可能会阻止将备份存储在驱动器本身上的任何策略),我将能够在创建备份之前将使用的磁盘空间减少到 30% 以下。
这些是相关分区:
/dev/sdf1 2048 1050623 1048576 512M EFI-System
/dev/sdf2 1050624 3705751551 3704700928 1,7T Linux-Dateisystem
/dev/sdf3 3705751552 3750748159 44996608 21,5G Microsoft Basisdaten
sdf
16,4T root disk brw-rw----
├─sdf1 vfat B687-437E /boot/efi
512M root disk brw-rw----
├─sdf2 ext4 56aaa632-d318-4ca9-8094-f803b2237e44 /media/sdf2
1,7T root disk brw-rw----
└─sdf3 vfat 30A8-C177
21,5G root disk brw-rw----
/dev/sdf2 1822227568 817873716 911719948 48% /
/dev/sdf1 523244 5360 517884 2% /boot/efi
答案1
“驱动程序”不起作用。这些是内核模块,需要加载。如果不备份整个内核(这意味着整个系统),您就无法复制它们
我建议将其限制在您的个人文件中,并创建一个用于安装后更新的脚本,并将恢复视为安装 -new- 安装(即,您随后执行大量“sudo apt install/purge”和“gsettings”或“sed”命令以恢复您的首选项)而不是修复旧系统。这意味着如果您想安装新版本的 Ubuntu,这也有效。
我可以添加一种不同的方法吗......
如果我是你,我不会使用tar
,但是rsync
。你可以在正在运行的系统上使用 rsync,还可以使用外部目标。像这样:
sudo rsync -ahPHAXx --delete --exclude={/dev/*,/proc/*,/sys/*,/tmp/*,/run/*,/mnt/*,/media/*,/lost+found} / {user}@{host}:/backup/{date}/
(如果您进行增量备份(见下文),则可以从此列表中删除 mnt 和 media;所有其他文件都是 tmpfs,因此不适合备份)还有一个好处,即恢复会一个接一个地进行,因此无需担心磁盘空间问题。此外,如果需要,您还可以恢复单个文件。
如果您想要完整备份并且有空间,您可以通过向目标添加 {date} 来获得多个备份。在目标上,您可以使用某种逻辑删除较旧的备份(保留 7、14、30 天并删除较旧的备份)
rsync
还可以进行增量备份(因此仅复制自上次备份以来的差异),这样可以大大降低带宽使用率。它的工作原理是:所有备份都有时间戳,您的第一次备份是完整备份,所有其他备份将最新时间戳与您当前的系统进行比较,然后创建差异备份。好处:您可以告诉 rsync 恢复特定时间戳(即“使系统像 2 天前的 13:00 一样)。
答案2
在 Ubuntu 服务器 20.04 上测试...以下步骤将使您能够从 RAM 运行系统并分离所有磁盘/磁盘分区后克隆远程计算机的整个磁盘...当然有风险(但尽可能包含)。
参考:
进入 RAM
通过 SSH 连接到您的服务器(始终保持此 SSH 连接,直到最后才关闭它)。
然后,变成
root
:sudo -i
然后,保存已挂载文件系统的列表(参考) 到文件
mounted_fs
:df -TH > mounted_fs
然后,尝试停止可停止的正在运行的服务(不包括
SSH
):systemctl list-units --type=service --state=running --no-pager --no-legend | awk '!/ssh/ {print $1}' | xargs systemctl stop
然后,卸载所有未使用的部分:
umount -a
然后,在 RAM 中准备系统环境(大约需要 2.2G)通过运行以下命令六按相同顺序依次执行命令:
mkdir /tmp/tmproot mount none /tmp/tmproot -t tmpfs mkdir /tmp/tmproot/{proc,sys,usr,var,run,dev,tmp,oldroot} cp -ax /{bin,etc,mnt,sbin,lib,lib64} /tmp/tmproot/ cp -ax /usr/{bin,sbin,lib,lib64} /tmp/tmproot/usr/ cp -ax /var/{lib,local,lock,opt,run,spool,tmp} /tmp/tmproot/var/
然后运行:
mount --make-rprivate /
然后,将系统根目录更改为该环境:
pivot_root /tmp/tmproot /tmp/tmproot/oldroot
然后,安装一些所需的系统部件:
for i in dev proc sys run; do mount --move /oldroot/$i /$i; done
然后,重新启动 SSH:
systemctl restart sshd
然后运行:
systemctl list-units --type=service --state=running --no-pager --no-legend | awk '!/ssh/ {print $1}' | xargs systemctl restart
然后运行:
systemctl daemon-reexec
然后卸载原有的系统根目录(在磁盘上):
umount -l /oldroot/
然后,运行
df -h
并卸载任何已安装的剩余磁盘/磁盘分区,如/boot
。
现在服务器上的系统完全从 RAM 运行,磁盘/磁盘分区完全分离,并且您通过 SSH 连接...这或多或少就像您从实时 USB 启动一样。
影像
您现在可以使用dd
(小心翼翼地)克隆整个磁盘,并将克隆的映像保存在同一台服务器上的备份驱动器上(首先安装备份驱动器) 或同一网络中的另一台服务器/NAS。
您也可以将图像直接保存在您的机器上(需要直接且快速的互联网链接)像这样:
使用
dd
(小心翼翼地)对整个磁盘进行映像处理,并准备使用侦听器将映像从服务器发送到您的计算机nc
(更改/dev/sda
为您想要在服务器上映像的磁盘):dd if=/dev/sda | nc -l 4444
然后,打开一个新终端在您的机器上接收图像并保存(更改
10.0.0.100
你的服务器的 IP):nc 10.0.0.100 4444 > disk.img
等待此过程完成...您将看到来自
dd
服务器端的如下消息:10737418240 bytes (11 GB, 10 GiB) copied, 500.935 s, 21.4 MB/s
然后,关闭新航站楼(或输入CTRL+ C)
现在,您已成功克隆服务器的磁盘。
从 RAM 中回归
使服务器恢复正常状态的最简单方法(磁盘上的系统根目录)就是简单地重新启动(我强烈建议重启,因为这样更安全)...因此,清理一下:
rm mounted_fs
然后,重新启动(没有安装永久文件系统,因此仅发送b
应该/proc/sysrq-trigger
是相当安全的):
echo "b" > /proc/sysrq-trigger
另一方面,如果您不想重新启动服务器,那么:
将原始根分区(磁盘上的分区)或 LV 挂载到
/oldroot
(device
使用根分区或逻辑卷进行更改并引用先前保存的mounted_fs
文件):mount device /oldroot
然后运行:
mount --make-rprivate /
然后,将系统根目录改回磁盘上的根目录:
pivot_root /oldroot /oldroot/tmp/tmproot
然后,通过运行以下命令准备一些重要的系统部件三按相同顺序依次执行命令:
for i in dev proc sys run; do mount --move /tmp/tmproot/$i /$i; done
然后,卸载
/tmp/tmproot
:umount -l /tmp/tmproot
然后运行:
rmdir /tmp/tmproot
然后,挂载原始文件系统:
mount -a
然后,重新启动 SSH:
systemctl restart ssh
然后,启动失败的服务:
systemctl list-units --type=service --state=failed --no-pager --no-legend | awk '!/ssh/ {print $2}' | xargs systemctl restart
然后,重新启动正在运行的服务:
systemctl list-units --type=service --state=running --no-pager --no-legend | awk '!/ssh/ {print $1}' | xargs systemctl restart
然后运行:
mount --make-rshared /
然后运行:
systemctl isolate default.target
然后,打开一个新终端并通过 SSH 连接到您的服务器...如果新 SSH 连接一切如预期工作,那么您就完成了。
清理:
rm mounted_fs