一次性付费进群,长期免费索取教程,没有付费教程。
进微信群回复公众号:微信群;QQ群:460500587
微信公众号:计算机与网络安全
ID:Computer-network
有时我们会输入错误命令并且永久地销毁文档,或者将经历某些重要硬件或软件失效带来的挫败感。进行适当的备份意味着可以远离不能正常运作的操作系统(OS)或计算机,并且可以在其他地方重建所有的备份内容。但是这永远是B计划。A计划是恢复数据。
本文将介绍Linux恢复套件中的关键工具。介绍如何使用原生系统引导设备加载最新的Linux副本,挂载带来麻烦的驱动,与此同时,或者升级受损的配置文件从而可以重新正常启动,或者在重新利用或销毁受损驱动前救回可以被修复的数据。无法运行的系统中的文件可以“起死回生”并在它们自己的虚拟环境中运行,可以进行例如重置用户忘记的密码等操作。
当试图将硬件和软件放在一起并期待它们良好协同运行时,总会遇到很多错误。主要关注如下的灾难性事件:
● 计算机启动了,但是不确定硬盘驱动器是否完全良好运转。
● 所有的部件都正常工作,但是因为软件问题或忘记密码无法登录Linux系统。
面临的具体问题将决定回到正常工作状态的操作。图1展示了一些诊断及修复选项。
图1 常见的系统问题以及我们将在本章中探讨的诊断和解决方案
1、在恢复/救援模式下工作
Linux不能正常登录,也许启动过程在显示登录界面之前毫无预兆地停止了。我们将需要一些基本的系统管理工具。
如果Linux不能加载,将如何运行那些工具?即使Linux不能正常加载至命令提示页,它通常会加载至GRUB菜单。在这一页(如图2所示),可以通过上下箭头键及回车键选择恢复模式(recovery mode)下运行的Linux内核。
图2 Ubuntu下安装GRUB Advanced Options菜单显示最新的和旧的内核版本链接,以及在恢复模式下的启动选项
在充分利用这些工具之前,首先需要理解什么是GRUB以及它的运行方式。
(1)GRUB引导加载程序
什么是GRUB?它的全称是GUN GRand Unified Bootloader。那什么是bootloader?它是接通电源时,操作系统用来启动自己的代码。图3描述了这个过程。
图3 Linux计算机引导过程关键步骤
当计算机启动时,嵌入在基本系统硬件中的固件版本使用说明识别可用的网络、存储及内存资源。这些在较老版本的计算机上,是通过BIOS系统来实现的,当前使用的是UEFI。
一旦系统找到包含Master Boot Record(MBR)的硬盘驱动器分区,它就会把内容加载到活动内存。在Linux系统中,MBR分区包含一系列文件,当文件运行时,显示一个或多个可加载的内核映像引导配置。可以选择加载任何来自GRUB启动菜单中的配置。
通常,除非之前的进程加载失败,GRUB会自动加载它的默认映像而不会询问。如果想显示GRUB菜单,可在计算机启动时按下右Shift键。
(2)在Ubuntu环境下使用恢复模式
从图4中可以看出,当Ubuntu在恢复模式下被加载时,会看到包含一系列用于解决引导问题工具的菜单。把每一项都试一试是很值得的,因为其中一项有可能会用于解决在启动中遇到的问题。例如clean选项,如果怀疑问题在于硬盘已满,它会移除无用的文件。dpkg选项试图修复任何基于APT的损坏软件包,这些损坏的软件包可能会把事情搞砸(dpkg工具也许会需要首先启用网络连接)。
图4 Ubuntu Recovery菜单及带有基本诊断和修复工具的链接,以及打开shell会话作为root的选项
root选项打开一个root命令行shell会话,在那里可以随意地使用Bash。总的来说,使用简单的shell会话而非完备的GUI桌面进行系统修复会更合理。因为运行的复杂服务程序越少,使系统运行起来的可能性越大。
一旦成功得到一个运行的命令提示,就可以去尝试识别并解决问题。
(3)在CentOS下使用救援模式
CentOS的GRUB菜单在启动时提供了rescue kernel而非恢复模式。这个核(kernel)不像Ubuntu那样包含一个工具菜单,但是类似的,它会提供一个单一的作为root用户的shell会话。图5显示了CentOS GRUB下的救援引导选项。
图5 CentOS Linux提供救援内核,用于直接引导到单一用户shell会话,以对损坏的系统进行故障排除
下面展示如何使用Bash和脚本技巧来解决一些问题。
(4)找到命令行救援工具
有Ubuntu机器在运行吗(该工具在Debian上不起作用)?如果有运行菜单的代码,那么它一定已经存在于Ubuntu文件系统的某处。请自行寻找。使用locate命令来找到它:
如果在/lib/recovery-mode/目录下寻找,将看到recovery-menu文件是显示如图3所示的菜单界面的脚本。option/目录包含执行每个菜单项的文件。例如,如果可能的话,fsck将会检查并修复任何损坏的系统文件。
从下面fsck脚本的内容开始着手,脚本已经被很好地编写(使用#字符)以帮助理解正在发生的事情:
在Ubuntu机器上手动运行clean脚本。看看发生了什么?然后尝试仔细编写/lib/recovery-mode/recovery-menu脚本(首先进行备份)。修改一些简单的东西,例如菜单名称或一条脚本描述。然后重启机器,从GRUB菜单进入Recovery Mode查看恢复环境。除了一些变化和例外,在其他地方应该可以很好地使用那些脚本,包括在CentOS上。
2、创建一个原生系统引导恢复设备
VirtualBox VM使用的.ISO操作系统映像可以被写入CD或USB驱动,用来启动操作系统的原生系统会话。这样的原生系统引导设备可以加载功能完备的Linux会话而无须安装任何内容到硬件驱动上。许多用户在安装特殊的Linux版本之前会使用这类驱动器验证该版本可以在他们的硬件上良好运行。另一些用户将原生系统会话作为一种安全方式,在进行例如网上银行等敏感行为时保护他们的隐私。
事实证明,那些原生系统引导设备同样是用于系统救援和恢复的一种神奇的工具。
将一个原生系统引导设备插入一台有问题的计算机中,并且运行Linux及所有管理工具,可以帮助您了解到底发生了什么,并提供修复它的工具。下面将展示如何创建一个原生系统引导的USB驱动器,以及如何使用它。
(1)系统救援映像
如果碰巧已经有了一个带有完整Linux系统(如Ubuntu)的DVD或USB驱动器,那么这将是最简单的解决方案,因为需要的大多数软件都已经预先安装。假设已经有网络连接,始终可以在原生系统会话期间安装其他包。下面讲述一些特殊的映像。
Boot-Repair
如果要尝试救援一个Ubuntu系统,那么会想尝试Boot-Repair。这个小而快速的Boot-Repair原生系统引导会检查GRUB设置,在必要的情况下,会重新构建它们。如图6所示,它还可以执行其他有用的管理任务。
图6 Boot-Repair桌面以及可见的System Tools菜单
Boot-Repair也可以在已启动的原生系统会话上安装。
GParted Live
如果问题与损坏的数据或阻止成功启动的损坏分区有关,GParted Live映像将带给原生系统的CD或USB功能齐全且强大的GParted分区编辑器。与Boot-Repair一样,GParted也可以在任何正常的Linux会话中安装和使用。如果问题与分区有关,那么,完备的原生系统引导版本是解决这一问题的最快捷、最直接的方式。不同于Boot-Repair,GParted是为在几乎所有Linux发行版上使用而构建的,而不仅仅是Ubuntu。
SystemRescueCd
另一种选择是SystemRescueCd,它是一种构建在Gentoo Linux发行版本上的轻量级映像。由于它有大量有用的系统恢复工具,SystemRescueCd能制作非常棒的随身携带的USB驱动盘(CD也很棒,但是它不容易装进口袋)。
(2)将原生系统引导映像写入USB驱动
在可以写任何.ISO映像之前,需要下载它。这里假设能找到正确的发行版网站上的网页并下载它。但下载大型文件有时会在网络传输时被破坏。更糟的是,它们可以通过入侵或者中间攻击者被替换成恶意软件。有些人下载MINT Linux一段时间后就发生了这样的事情。
除了检查以确保所在的网站被正确加密之外(浏览器应该在URL栏中显示某种锁图标),最好的防御措施是在下载的文件上生成一个哈希值,并将其与网站提供的哈希值进行比较。
图7显示了Ubuntu 17.04的哈希值的样子。
图7 用于Ubuntu17.04的各种映像的SHA256哈希值,目前可供下载
一旦找到映像已发布的哈希值,将计算下载的文件的哈希值并比较这两个值。该示例生成在同一个目录中下载的SystemRescueCd映像的SHA256哈希值:
随着一种或另一种可靠的映像安全下载,是时候创建恢复工具原生系统引导设备了。如果当前计算机和正在创建的原生系统引导USB都将运行Debian、Ubuntu或派生程序,最简单的方法是使用Ubuntu Startup Disk Creator。
Creator工具可以从通用的GUI菜单中选取,如图8所示,简单明了。从硬盘的某个地方选择一个映像文件,然后选择一个想写入映像的目标USB(或CD)。Creator将完成后续工作。
图8 具有Ubuntu Server 16.04映像的Ubuntu Startup Disk Creator以及被选定的目标USB驱动
另一方面,如果需要在不同发行版本下构建的原生系统引导设备(试图挽救CentOS机器并希望使用CentOS工具来完成),那么将需要重新使用dd了。如果想让一个基于CD或DVD的原生系统可启动,运行在任何Linux主机上的dd都能胜任这个工作。但如果映像被写入一个USB驱动器,而碰巧在Ubuntu主机上工作,首先需要添加一个MBR到.ISO文档以修改映像,BIOS和UEFI固件将知道如何运行。图9展示了该过程。
图9 编写可运行的实时启动USB映像所需的步骤
在Ubuntu主机上,使用isohybrid进行映像修改。包含isohybrid的apt包被称为syslinux-utils。当它被安装后,移动到包含下载映像的目录,并将映像文件名作为唯一参数运行isohybrid:
无论使用什么版本,接下来的步骤应该都是可行的。仔细识别目标设备的系统名称。df列出了当前所有可识别的文件系统及其名称:
在这个例子中,在Kingston USB设备上安装了一个名为/dev/sdb1的文件系统。设备本身被称为/dev/sdb。
如果打算将映像写入光驱,比如CD或DVD,那么可以通过lsblk获得它的名称,lsblk表示list block devices。驱动器本身必须是可写的。这里DVD驱动器叫作sr0:
现在可以在系统上使用dd,并把映像写入USB。
首先卸载驱动器,使dd可以完全访问。然后编写归档文件。在这个例子中,使用了systemrescuecd-x86-5.0.2.iso映像,并将其写入位于/dev/sdb的驱动器。
输入sda而非sdb(在这种特殊情况下)将无可挽回地覆盖主机文件系统并毁掉一天的时间。也应该确保USB驱动器上没有什么重要的东西,因为它们肯定会消失:
dd可能需要一些时间来将映像写到USB设备上,但是,当它完成后,应该将驱动器插入计算机,启动它,并进入一个原生系统会话。这里假设计算机被配置为从USB驱动器启动。如果不是,可以通过在引导过程中进入Boot菜单来强制它从一个选定的设备启动。
还可以进入安装实用程序(BIOS或UEFI)来永久设置引导设备的顺序。访问安装实用程序也可能通过一些键来实现:比如 F2、F10、DEL和Enter。
3、让原生系统引导设备运行
可以用创建的Linux-in-a-pocket驱动做很多事情。下面描述一些常见的场景以及解决问题的方法。
(1)检测系统存储区
如果经历过突然和意外的系统崩溃,罪魁祸首很可能是物理内存(RAM)。与所有硬件一样,RAM最终会失效。问题是,当操作系统正在运行时,不能正确地测试RAM是否有错误。相反,需要在操作系统加载之前找到它。幸运的是,作为Linux原生系统引导设备的骄傲拥有者,已经拥有了这个任务所需要的一切。如图10所示,Test Memory是启动Ubuntu驱动器后将显示的菜单选项之一。
图10 表示Test Memory的Ubuntu安装进程主菜单
选择Test Memony(使用上下箭头键并按Enter)将进入Memtest86+程序(图11)。该程序对RAM进行多次扫描,显示扫描过程中发现的任何错误。如果全程至少运行几次后没有返回错误,那么内存可能不是引发问题的罪魁祸首。这可能是好消息,也可能是坏消息,毕竟,仍然不知道是什么导致了系统崩溃。
图11 Memtest86+工具显示你的RAM内存中任何错误的位置和种类。该系统是完好的(迄今)
除了Test Memory,Ubuntu安装过程的主菜单中的Rescue a Broken System选项将提供一个运行的Bash shell。
在Troubleshooting菜单下CentOS安装盘包含它们自己的Memtest86+链接(图12)。
图12 从CentOS安装光盘主菜单链接到Troubleshooting菜单
(2)受损的分区
分区(Partition)实际上是指向文件系统占用的物理磁盘上的位置的元数据。分区是脆弱的东西,破坏它们好像不用费太多心思。如果磁盘数据以某种方式损坏,分区的起点和终点的确切地址也被更改或丢失,那么分区上的文件系统将变得不可被访问。如果文件系统是不可被访问的,那么文件系统上的数据就和丢失没有什么差别了。
无法访问分区?现在是时候启动新的SystemRescue驱动了。SystemRescue是一个轻量级的软件包,所以不要期望一个功能齐全的拥有完美GUI界面的版本。例如笔记本触摸板和自动WiFi连接之类的功能可能不像期望的那样工作。但这是一种让一些强有力的救援工具发挥作用的快速方法。如图13所示,默认启动选项将打开一个特殊命令行shell。
图13 SystemRescue启动时显示的Boot Options菜单。注意页面底部每个选项的详细解释
当准备修复受损分区(或其数据)时,SystemRescue提供了一些有用的指导信息及命令行,包括网络和文本编辑基础(图14)。不要担心:Vim和Nano在命令行中都可用。键入startx将加载一个快速且简洁的GUI桌面。
图14 SystemRescue shell。注意默认情况下可用文本编辑器(包括Nano)或键入startx启动图形桌面
如果需要访问网络来下载或安装更多的工具,或者传输数据,可以在命令提示符处键入net-setup,选择正确的接口,并表明网络是有线的还是无线的。如果是无线网络,需要输入WiFi路由器的SSID和加密密钥(它可能使用ASCII而不是十六进制字符)。在大多数情况下,希望DHCP能自动检测网络。
面对受损的分区,首先应该考虑的是如何恢复。如果物理磁盘本身可能有故障,那么第一项任务必须是保护它的数据。为此,将在SystemRescue命令提示符下使用dd命令创建当前状态的分区的完美副本,并将其保存到具有相同或更大容量的健康磁盘。在运行lsblk确认两个指定的分区后,复制操作可能类似于这样,其中故障磁盘是/dev/sda,目标驱动器上的空分区是/dev/sdc1:
完成后,就可以自由地查看是否可以保存原始副本。输入test-disk。将被询问希望如何记录会话事件,希望恢复哪个磁盘以及希望找到哪个分区类型。通常情况下,TestDisk将猜测正确的一个,并将其作为默认值突出显示。
然后会发现自己面对一个如图15中显示的屏幕,可以要求TestDisk分析磁盘,寻找现有的分区。当发现并适当地标记了损坏的分区时,可以将更改写入磁盘,并且应该能够再次成功启动。
图15 TestDisk Partition Repair页面,通过Analyze发现的分区可被编辑并使用其他工具修复
发现并适当地标记损坏的分区是一种有用的表达方式且涵盖了整个复杂过程。
(3)从损坏的文件系统中恢复文件
如果结果表明无法完全修复磁盘,那么设法恢复分区的操作可能足以允许访问文件,但却不足以从磁盘可靠地启动。那么首选是尽可能多地挽救重要文件。
最简单的方法是使用任意形式的原生系统引导会话中的常规Linux文件系统管理工具。如果不确定分区的名称,运行lsblk将一如既往地告诉您这些信息。
分区可能无法作为文件系统被访问,因为它还没有被挂载。事实上,如果df命令的结果中没有显示它,那么必须挂载它,这意味着将其分配到文件系统中一个可被访问的位置。可以创建一个挂载分区的新目录,然后使用mount命令快速解决这个问题。选择在/run/目录中创建临时挂载点,碰巧找到的任何未使用的位置(如/media/或/mnt/)也可以。我们假定分区名称为/dev/sdcl:
从这里开始,来自受损文件系统的任何健康文件都可以从临时目录中复制或编辑。它们也可能会自动出现在任意一个想使用的GUI桌面文件管理工具中。
使用ddrescue恢复
不起作用?是时候拿出秘密武器了。数据恢复工具,即ddrescue,在文件系统之间复制文件。它分析文件,并试图修复任何损坏的文件。没有任何工具能保证修复所有变坏的东西。
如果它还没有安装正在使用的原生系统中,那么ddrescue将成为SystemRescue默认的一部分。从存储库中调用它。然后识别出有问题的分区(该例中是/dev/sdc1),希望保存映像的分区,以及可以写入操作事件记录的日志文件的名称和位置。拥有日志文件允许ddrescue继续已停止的操作,而不是从头开始。本例使用了一个挂载在/run/usb-mount目录下的外部驱动器(比源驱动器的容量更大):
为了测试修复,可以使用dd命令将备份映像写到一个新的、空的驱动器(例子中称为/dev/sdd/),然后启动系统到新的驱动器:
即使发现仍然无法启动分区,现在也许有可能使用它可靠地访问重要的单个文件。
使用PhotoRec进行文件恢复
另一个可以帮助您从损坏的驱动器中获取文件的工具是PhotoRec。它与TestDisk来自同一个地方。事实上,两者都是由CGSecurity的Christophe Grenier创建和维护的。要加载程序,请输入:
关于PhotoRec,需要记住的是,这些文件都被赋予了新的被编号的文件名,同时保留了它们的原始文件扩展名。这有时会使找到单个文件很难,但肯定比完全丢失它们要好。
4、密码恢复:使用chroot安装文件系统
通过使用诸如KeePass2或LastPass这样的好的密码库,可以在很大程度上解决保持足够复杂密码的问题。通过使用诸如Kerberos之类的单点登录解决方案,至少可以使过度使用同一密码的问题得到缓解。但是尽管如此,意外总是会发生。
如果有一两个用户足够小心谨慎,为他们访问的每台服务器设计良好的、强大的密码,那么会发生什么呢?他们时常忘记密码。如果有另一个具有sudo功能的管理员可以登录到服务器并运行passwd来为用户创建新密码,那么这不会是个问题:
但是,如果不幸且健忘的用户是唯一拥有该设备账户的管理员,那么就有麻烦了。
使用原生系统引导设备来启动被锁定的服务器,运行lsblk来确定服务器硬盘上root分区的名称,并将root分区挂载到临时目录:
然后会得到:
这就是全部。此时,可以自由地运行命令,就像在正在运行的物理硬盘版本上工作一样。使用passwd给管理员一个新的密码以替换丢失的密码。并且,在输入exit关闭chroot会话后,重新启动机器(不需原生系统引导USB)。现在一切都会好起来。
加密还是不加密?
使用诸如ecryptfs或dm-crypt之类的工具对存储驱动器上的数据进行加密,使数据不太可能受到损害。另一方面,这里讨论的许多救援和恢复操作在加密卷上是行不通的。
在安全性和访问性之间取得平衡不是一门精确的科学。许多管理员没有对本地服务器和桌面工作站进行加密,因为这些服务器和桌面工作站至少被锁在办公室里保护了起来,但他们坚持要加密移动设备。
微信公众号:计算机与网络安全
ID:Computer-network
【推荐书籍】