在全新安装的 Ubuntu 14.04 上,我在引导期间收到此错误消息
/dev/mapper/cryptswap1 的磁盘驱动器尚未准备好或不存在
并且交换分区永远不会被激活。到目前为止,从我的搜索中我发现:
- 这是一个普遍存在的问题,可能会影响激活加密交换的每个 Ubuntu 14.04 安装。
- 部分问题是一个易于修复的错误,该错误导致加密的交换标头(在启动期间生成)覆盖未加密的交换标头,这使得在下次启动时无法再次找到正确的分区。
- 所有建议的让它工作的解决方案似乎都是简单的变通方法: 1. 通过在 fstab 中将它设置为 noauto 来禁用交换。2. 创建一个 /etc/rc.local 文件(或者定义你自己的服务在启动时被激活),它激活交换分区。
是否可以在不使用这种 hack 的情况下在 Ubuntu 14.04 上使用加密交换?我非常乐意更新所有已安装的软件包并修复那些配置文件,这些配置文件由于错误的安装脚本而使用不正确的内容进行了初始化。我宁愿避免必须使用我自己的脚本来激活交换,因为这种方法在更新包时往往会中断。
这就是我的/etc/crypttab
样子:
cryptswap1 /dev/sda6 /dev/urandom swap,cipher=aes-cbc-essiv:sha256,offset=16
我的相关行/etc/fstab
是:
/dev/mapper/cryptswap1 none swap sw 0 0
到目前为止我尝试了什么:
我发现/dev/mapper/cryptswap1 的消息磁盘驱动器尚未准备好或不存在,即使在尝试了各种选项询问可能是相同的情况后也是如此。
但唯一的答案是建议使用未加密的交换。
我发现http://ubuntuforums.org/showthread.php?t=2200995声称有解决方案,但该解决方案对我来说毫无意义。
建议解决方案的第一部分是使用 mkswap 重写加密的交换标头。但是,由于此标头是使用密钥加密的,因此在重新启动后不会持久存在,因此此步骤无助于在下次重新启动后让交换正常工作。
它还建议更新 /etc/fstab,但看起来我的 fstab 看起来已经正确了。
该帖子采用 LVM,我不使用它。我不知道有什么办法,那会有所作为。
我找到了https://bugs.launchpad.net/ubuntu/+source/ecryptfs-utils/+bug/1310058这帮助我理解了交换标头被覆盖的问题以及添加和offset
重新crypttab
生成未加密的交换标头,可以解决这个问题。
然而,被覆盖的标头并不是唯一的问题,还有另一个问题,我还没有完全理解。
我发现的关于这个问题的其他事情:
从阅读/lib/cryptsetup/cryptdisks.functions
中我了解到,在启动期间,应该使用名称创建设备,cryptswap1_unformatted
然后写入加密的交换标头,并将设备重命名为cryptswap1
. 在内核日志中,我发现此错误消息:
[ 39.419429] device-mapper: ioctl: Unable to change name on mapped device cryptswap1_unformatted to one that already exists: cryptswap1
令人困惑的是,结果是该设备确实最终具有名称cryptswap1
,但swap
标头从未被写入。
交换在执行文件系统检查的那些引导期间工作。只有在不执行文件系统检查时,我才会收到可怕的cryptswap1 is not ready yet
错误。
在/var/log/upstart/cryptdisks.log
我找到错误消息
Device cryptswap1_unformatted already exists.
但是,通过向 中添加一些额外的日志记录/lib/cryptsetup/cryptdisks.functions
,我了解到/etc/init.d/cryptdisks-early
和之间存在竞争/etc/init/cryptdisks.conf
。我添加的任何日志记录cryptdisks.functions
都会影响两个脚本的操作如何交错,有时,它最终会起作用。
很明显,两者不应该并行处理同一设备。我怎样才能序列化这两个脚本,这样交换在每次启动时都有效?
cryptswap1
为了在 Ubuntu 14.04 中正常工作,必须解决两个不同的问题。问题 1:覆盖交换标头
该分区最初使用未加密的交换标头进行格式化,用于在引导期间找到要使用的正确分区。因为加密密钥在每次启动时都会发生变化,所以加密的交换标头将在每次启动时被重写。由于生成的错误
/etc/crypttab
,加密的交换标头会覆盖未加密的交换标头。这将防止在以后的所有引导中找到交换分区。问题 2:引导期间的竞争条件
/etc/init.d/cryptdisks-early
和之间在引导期间存在竞争条件/etc/init/cryptdisks.conf
。两者都会同时尝试激活 中列出的所有设备crypttab
。在加密交换的情况下,大多数情况下竞争条件的结果是,它根本不起作用。某些健全性检查失败会导致跳过加密交换标头的写入,以防止潜在的数据丢失。修复并解决问题
第一个问题很容易解决。第二个可以解决。在
/etc/crypttab
识别交换线。它应该看起来像这样(除了 UUID 会有所不同):在我的例子中,这是
/etc/crypttab
. 要修复交换标头的覆盖,必须添加一个偏移量。消息来源对使用的正确值究竟是多少存在分歧,但使用太大的值并没有什么坏处。我使用16
.此外,我添加
noearly
了导致/etc/init.d/cryptdisks-early
忽略此行的原因,并且这种方式可以解决竞争条件。结果行如下所示:
这将防止未加密的交换标头再次被覆盖,但我们仍然需要在分区上重新创建它。在此步骤中,使用正确的分区至关重要,因为使用错误的分区会导致数据丢失。我曾经
fdisk -l
找到正确的分区,在我的例子中是/dev/sda6
.现在用于
mkswap
重写未加密的交换标头。UUID 是交换分区在被覆盖之前的那个(您仍然可以在 中看到
/etc/crypttab
)。完成后需要重新启动,它应该一切正常。验证正确操作
我建议重新启动三次以验证它是否继续工作。
错误消息
the disk drive for /dev/mapper/cryptswap1 is not ready yet or not present
在引导过程中会短暂显示。但这似乎不是问题,因为它在引导过程完成之前就已准备就绪。登录并键入
cat /proc/swaps
以查看交换是否处于活动状态。您应该会看到一个名称为/dev/dm-0
where的交换分区,这dm
表明它确实在使用提供加密的设备映射器层。