系统急救

Y 驿窗注: 常备Live启动U盘

在电脑边常备一个Debian Live启动U盘,可以在Linux系统出故障的时候,用U盘引导电脑,然后把重要数据拷贝出来备份,之后可以用U盘中的各种工具对系统进行修复,甚至可以通过网络安装其它系统救援工具。

Debian Live启动U盘不仅可以用来体验Debian,它作为应急启动工具也非常实用,请使用Linux系统的用户一定在电脑边常备,以应对突发状况。

这一章原本是放在附录中的,但因为大家的数据实在是过于重要,一旦丢失会导致无数的心血浪费,所以,把系统急救相关的内容提前到这个位置,让用户尽早了解系统急救相关的关键知识,尽量确保数据安全。

系统急救的主要目的是保护数据。在保护数据之余,如果能对系统进行修复就更好了。下面我们进行详细说明:

  1. 安全的两个大方向

  2. 平时工作时的备份策略

  3. 数据备份工具rsync及操作方法

  4. 系统故障导致无法正常启动

  5. 忘记密码导致无法登录

  6. 备份整个系统

1. 安全的两个大方向

我们讨论安全,无非就是保密和防止丢失两大类。

保密:

如果有些数据需要保密,在成果完成之前不想让任何人看到,那么应该重点考虑数据加密。如果能够做到加密后的数据只能自己才能解密,那么保密完全没有问题。

至于加密工具,推荐使用dm-crypt/cryptsetup。dm-crypt是集成在linux内核中的,而cryptseup是用来实现dm-crypt功能的一些命令。

另外,如果需要对一些文本信息进行加密,比如邮件内容。这种情况下,发出去的邮件是经过加密后再发送的,必须有密钥才能知道邮件真实内容是什么。这个功能推荐使用GPG(GnuPG),它的非对称加密功能非常适合用于邮件加密。

并且,除了加密外,GPG还可以用于数字签名;这种情况下,信息并未加密,但可以验证签名的文件是否是本人发出的。

丢失:

加密的数据也可能丢失,比如不小心误删除,硬盘损坏或者被盗等。应对丢失这种情况,应该重点考虑下面讨论的备份策略

2. 平时工作时的备份策略

第一,平时电脑数据备份,应该是从一块硬盘备份到另一块硬盘:两块硬盘同时损坏的机率远远小于一块硬盘损坏的机率。

第二,可以考虑建立本地私有云备份功能,比如用NAS+Nextcloud来创建私人云盘。如果不得不使用商用云存储,那么务必在上传数据前,对必要的数据进行加密处理。

所以,您的电脑应该配备双硬盘,这有点类似于不要把所有鸡蛋放在一个篮子里

另外,SSD固态硬盘有两个不太好的特点,一是SSD硬盘一旦损坏就彻底无法找回数据;二是SSD长期不通电会导致数据丢失,比如移动硬盘。这两个问题导致SSD在可靠性上出现争议,而机械硬盘在这两个方面的表现则要好很多。所以,您电脑上的两个硬盘,至少有一个应该是机械硬盘。如果实在没有,那么最好考虑USB移动机械硬盘或者NAS机械硬盘。固态硬盘提供读写速度优势,而机械硬盘则用来提供更可靠的安全保障。

第三,备份工作可以考虑自动备份+手动备份两种。

自动备份,就是让系统在设定的时间自己运行数据备份工作,无需人工干预,只要系统是开机状态且没有休眠,就会把指定的数据自动备份到指定的目录。Debian系统中有一个服务叫cron,专门用来执行自动运行任务,典型的内容就是自动备份数据。

手动备份,就是人工手动操作备份工具进行备份。

之所以需要自动+手动两种方式,与用户的需求有关。常规情况下,自动备份到指定的自动备份目录可以满足99%的备份需求,但为灵活起见,临时手动操作备份数据到另一个专门的手动备份目录,也能满足部分特殊需求。两种方式的脚本在命令上没有大的区别,主要区别是备份目录不同。

3. 数据备份工具rsync及操作方法

rsync是linux平台非常有名的备份工具,且经常被用于生产环境,这里我们仅介绍一下简单的手动备份方法:

3.1 安装rsync

先检查一下看系统中是否存在rsync命令:

rsync --version

如果输出类似下面的信息则表明系统中已经存在rsync,直接使用即可:

peter@Debian12:~ $ rsync --version
rsync  version 3.2.7  protocol version 31
Copyright (C) 1996-2022 by Andrew Tridgell, Wayne Davison, and others.
Web site: https://rsync.samba.org/
Capabilities:
    64-bit files, 64-bit inums, 64-bit timestamps, 64-bit long ints, socketpairs, symlinks, symtimes, hardlinks, hardlink-specials, hardlink-symlinks, IPv6, atimes, batchfiles, inplace, append, ACLs, xattrs, optional secluded-args, iconv, prealloc, stop-at, no crtimes
Optimizations:
    no SIMD-roll, no asm-roll, openssl-crypto, no asm-MD5
Checksum list:
    xxh128 xxh3 xxh64 (xxhash) md5 md4 sha1 none
Compress list:
    zstd lz4 zlibx zlib none
Daemon auth list:
    sha512 sha256 sha1 md5 md4

rsync comes with ABSOLUTELY NO WARRANTY.  This is free software, and you are welcome to redistribute it under certain conditions.  See the GNU General Public Licence for details.

否则,您需要使用下面的命令安装rsync:

sudo apt update
sudo apt install rsync

3.2 手动备份

假设重要数据在/home/peter/data/目录中,您希望对整个data目录进行备份,备份的位置是另一个硬盘/media/peter/backup/data/ :

手动备份,您需要使用下面的命令:

rsync -avcP --delete /home/peter/data/ /media/peter/rootfs/home/peter/data/

命令运行成功后,您可以在文件管理器中鼠标右键点击data文件夹>属性,检查一下两个目录大小,尤其是字节数,字节数应该完全一致。一致表示两个目录完全一样,备份成功;否则表示备份失败,需要检查原因。

3.3 自动备份

自动备份除了使用rsync,还会用到debian系统的cron服务,可以先检查一下cron服务是否存在:

crontab -l

如果提示类似下面的信息,就表示cron服务已经运行,可以直接使用:

peter@debian12:~/data $ crontab -l

no crontab for peter

否则,您需要按下面的命令安装cron:

sudo apt update
sudo apt install cron

确认系统已经运行cron服务后,先在/home/peter/目录创建一个文本文件,名称为backmydata,无后缀,文件内容为:

#!/usr/bin/bash

rsync -acP --delete /home/peter/data/ /media/peter/rootfs/home/peter/data/

上面这个文件其实是把手动备份命令放到backmydata这个脚本文件里,之后让系统定期执行这个脚本文件就可以了,等同于定期执行脚本文件中的备份命令。

接下来运行crontab命令,设置自动备份命令执行的时间:

peter@debian12:~/data $ crontab -e

首次运行crontab -e命令会提示下面的信息:

no crontab for peter - using an empty one

Select an editor.  To change later, run 'select-editor'.
  1. /bin/nano        <---- easiest
  2. /usr/bin/vim.tiny

Choose 1-2 [1]:

Y 驿窗注:nano编辑器的简单指南

nano编辑器默认系统自带不需要安装,简单操作方法如下:

  1. Ctrl+o:保存

  2. Ctrl+x:退出

  3. Ctrl+Esc:取消

  4. (其它快捷键请参考窗口下方的提示,^表示Ctrl+,字母不区分大小写)

  5. (用户可以用方向键和回车键在内容中移动光标到需要的位置,然后输入相关内容,输入完成后按Ctrl+o保存,再Ctrl+x退出)

这表示用户需要指定一个编辑器,用来编辑cron服务所执行的文件。这里我们选择nano,输入数字1然后回车,会提示下面的信息:

# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').
#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command

在上面文件的最末尾,添加下面两行:

SHELL=/usr/bin/bash
0 12 * * * $HOME/backmydata

保存并退出,再运行crontab -l命令,会输出类似下面的信息:

# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').
#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command
SHELL=/usr/bin/bash
0 12 * * * $HOME/backmydata

其中,SHELL=/usr/bin/bash表示执行终端命令, 0 12 * * * $HOME/backmydata表示每天的中午12点执行/home/peter/目录中的backmydata脚本。因为脚本中的命令就是备份,所以执行backmydata脚本等同于执行备份命令。

4. 系统故障导致无法正常启动

在拯救系统之前,我们先要确保数据安全。所以,这时最有效的方法是使用有数据拷贝功能的启动U盘启动电脑,先把数据拷贝到安全的地方,然后再考虑如何拯救系统。

启动U盘很简单,使用Debian-live的iso创建的U盘就可以,主要功能就是把电脑引导起来,然后进行进一步的操作,比如把重要的数据拷贝到移动硬盘、对系统进行修复等等。

这要求您在平时就创建好一个Live启动U盘放在电脑边备用。实际上,驿窗强烈您平时准备一个Debian Live启动U盘,这样系统无论何时出任何状况,只要硬件没坏,您就可以用这个U盘把电脑引导起来,然后拷贝您的重要数据并尝试修复系统。

5. 忘记密码导致无法登录

这个情况通常不需要重新安装系统,只需要重置密码就可以了,包括root密码也可以重置。

6. 备份整个系统

之所以把备份整个系统放在最后,是因为对于多数人,尤其是对于新手来说,备份系统不如只备份重要数据。当系统有问题时,重装系统更适合。

但当用户的Linux水平和经验以及应用有一定积累以后,备份整个系统的需求就显得更有意义一些。例如,当你的系统里有一些特殊设置,或者有一些复杂的设置,或者有比较多的应用。这种情况下,重装系统之后,需要花很多时间和精力来配置新装的系统,否则无法正常工作,这导致工作进度会被暂停,尤其对于需要快速进入工作状态的情况下,会显得很浪费时间。这个时候,整个系统的备份/还原功能就非常方便。

接下来,我们介绍两种备份/还原整个系统的方法:

  1. 使用clonezilla这个系统克隆工具,把整个系统备份到文件,或者直接克隆到新硬盘。

  2. 使用rsync命令,把整个系统备份成文件,或者直接迁移到新硬盘。

两种方法相比,clonezilla操作起来相对简单,rsync命令操作起来相对要复杂一些。

使用clonezilla工具时,各个方面都还不错,唯一的美中不足是,clonezilla要求目标硬盘的空间不能小于源硬盘空间。

举个例子,我当前的系统所在的硬盘,容量是512GB,那么,如果我想把这个系统克隆到一个新硬盘上,则要求新硬盘的容量不能小于512GB,更大当然没问题。

如果源硬盘是512GB,新硬盘是480GB,那么clonezilla工具失败的概率就非常大。这种情况下,就要考虑使用rsync命令,因为rsync命令不用考虑两个硬盘到底哪个大哪个小,只要空间容量足够存放数据即可。比如源硬盘,在系统中运行df -Th命令可以查看其大小和已用空间,所有已用空间的总和就是需要的新硬盘的容量。新硬盘容量只要大于这个已用空间数值就可以。

未完稿……

*最近一次更新:2024-01-20