Linux 使用 dd 命令备份和还原
共计 1753 个字符,预计需要花费 5 分钟才能阅读完成。
linux 系统环境很容易搞乱,由于不想每次手动重装系统,并且重写设置很多东西,所以之前一直想物理机 dd 系统来着。但是尝试了几次,不清楚是机器原因还是其他原因没有 dd 成功。
然后想着能不能用 dd 命令将当前系统备份,等需要的时候再恢复。经过多次请教大佬,发现目前这套方案是可行的,就是花费的时间比较久,内容越多和硬盘越大都会让备份和恢复的时间增加。
dd 命令可以通过 bs 参数设置缓存大小,可以一定程度上提高效率,测试命令如下:
dd if=/dev/zero bs=512 count=2000000 of=1Gb.file
dd if=/dev/zero bs=1K count=1000000 of=1Gb.file
dd if=/dev/zero bs=2K count=500000 of=1Gb.file
dd if=/dev/zero bs=4K count=250000 of=1Gb.file
dd if=/dev/zero bs=8K count=125000 of=1Gb.file
dd if=/dev/zero bs=16K count=62500 of=1Gb.file
dd if=/dev/zero bs=32K count=31250 of=1Gb.file
1. 备份
重新挂载所有文件系统为只读,目的是防止备份的时候还有东西继续写入。
echo u >/proc/sysrq-trigger
挂载另一个硬盘,这里根据自己实际情况进行挂载。(如果使用 ssh 拷贝到其他机器无需进行此操作)
mount /dev/sdb1 /mnt
备份系统盘,设备一般为 /dev/sda
,当然这个也是看自己的实际情况。
# 1. 备份到硬盘
dd if=/dev/sda bs=4K status=progress | gzip > /mnt/os-backup.gz
# 2. 备份到其他机器
# 备份并压缩,并且备份到其他机器上
# dd if=/dev/sda bs=4K status=progress | gzip -c | ssh root@172.20.3.3 'dd of=/home/docker/nginx/html/file/os-backup.gz'
然后只需要静静地等待备份完即可。
/>
这里备份的大小,取决于当前系统里面的东西有多少。当然,经过压缩也会小很多。
为什么要进行压缩,因为 dd 命令默认就是全部拷贝,如果不使用压缩,那么必须准备一块比当前系统盘容量还要大的硬盘。
重启系统,因为文件系统都变为了只读,所以需要重启下。
echo b >/proc/sysrq-trigger
2. 还原
重新挂载所有文件系统为只读。
echo u >/proc/sysrq-trigger
挂载带有备份的硬盘。
mount /dev/sdb1 /mnt
使用 dd
命令还原,推荐安装 tmux
后运行,否则 ssh 窗口异常关闭可能导致系统出现问题。
# 安装
sudo apt update && sudo apt install -y tmux
# 创建一个新的会话
tmux
# 1. 从本地硬盘还原
gzip -dc /mnt/os-backup.gz | dd of=/dev/sda bs=4K status=progress
# 2. 网络还原
# 对应上面的备份命令,请确保该文件能够网络访问到。如果运行出现 gzip: stdin: unexpected end of file,可以试试挂载一块硬盘并在其目录下执行该命令
# curl https://172.20.3.3/file/os-backup.gz | gzip -dc | dd of=/dev/sda bs=4K status=progress
最好不要退出,否则执行 tmux a
会提示 Segmentation fault
错误,这样就不能看见什么时候结束。虽然如此,等待上面的命令执行完毕,还是能够还原成功的,只不过要等一个足够久的时间再重启就是了,否则命令还在执行系统就会崩掉。
这里是将之前的 dd
拷贝的内容还原到系统盘 /dev/sda
,所以系统就相当于是复原了。还原真的很慢,如果可以的话,还是选择半夜还原好了。
/>
请确定还原时一定挂载所有文件为只读,否则可能导致还原失败!!!
执行重启操作,重启后才能看见还原后的文件。
echo b >/proc/sysrq-trigger
目前这套方案最大的问题就是还原慢,但是睡觉之前执行一下,好像也不影响。主要是不需要像手动安装系统,需要显示器还有 U 盘才能进行。
Tips:清朝云网络工作室