AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 596813
Accepted
kasperd
kasperd
Asked: 2015-03-15 09:59:31 +0800 CST2015-03-15 09:59:31 +0800 CST 2015-03-15 09:59:31 +0800 CST

Ubuntu 14.04 可以在不诉诸非官方黑客的情况下使用加密交换吗?

  • 772

在全新安装的 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都会影响两个脚本的操作如何交错,有时,它最终会起作用。

很明显,两者不应该并行处理同一设备。我怎样才能序列化这两个脚本,这样交换在每次启动时都有效?

14.04
  • 1 1 个回答
  • 1143 Views

1 个回答

  • Voted
  1. Best Answer
    kasperd
    2015-03-16T09:10:57+08:002015-03-16T09:10:57+08:00

    cryptswap1为了在 Ubuntu 14.04 中正常工作,必须解决两个不同的问题。

    问题 1:覆盖交换标头

    该分区最初使用未加密的交换标头进行格式化,用于在引导期间找到要使用的正确分区。因为加密密钥在每次启动时都会发生变化,所以加密的交换标头将在每次启动时被重写。由于生成的错误/etc/crypttab,加密的交换标头会覆盖未加密的交换标头。这将防止在以后的所有引导中找到交换分区。

    问题 2:引导期间的竞争条件

    /etc/init.d/cryptdisks-early和之间在引导期间存在竞争条件/etc/init/cryptdisks.conf。两者都会同时尝试激活 中列出的所有设备crypttab。在加密交换的情况下,大多数情况下竞争条件的结果是,它根本不起作用。某些健全性检查失败会导致跳过加密交换标头的写入,以防止潜在的数据丢失。

    修复并解决问题

    第一个问题很容易解决。第二个可以解决。在/etc/crypttab识别交换线。它应该看起来像这样(除了 UUID 会有所不同):

    cryptswap1 UUID=f9a0f20c-fac4-408c-a8b9-47300216f727 /dev/urandom swap,cipher=aes-cbc-essiv:sha256
    

    在我的例子中,这是/etc/crypttab. 要修复交换标头的覆盖,必须添加一个偏移量。消息来源对使用的正确值究竟是多少存在分歧,但使用太大的值并没有什么坏处。我使用16.

    此外,我添加noearly了导致/etc/init.d/cryptdisks-early忽略此行的原因,并且这种方式可以解决竞争条件。

    结果行如下所示:

    cryptswap1 UUID=f9a0f20c-fac4-408c-a8b9-47300216f727 /dev/urandom swap,cipher=aes-cbc-essiv:sha256,offset=16,noearly
    

    这将防止未加密的交换标头再次被覆盖,但我们仍然需要在分区上重新创建它。在此步骤中,使用正确的分区至关重要,因为使用错误的分区会导致数据丢失。我曾经fdisk -l找到正确的分区,在我的例子中是/dev/sda6.

    现在用于mkswap重写未加密的交换标头。

    mkswap /dev/sda6 -U f9a0f20c-fac4-408c-a8b9-47300216f727
    

    UUID 是交换分区在被覆盖之前的那个(您仍然可以在 中看到/etc/crypttab)。完成后需要重新启动,它应该一切正常。

    验证正确操作

    我建议重新启动三次以验证它是否继续工作。

    错误消息the disk drive for /dev/mapper/cryptswap1 is not ready yet or not present在引导过程中会短暂显示。但这似乎不是问题,因为它在引导过程完成之前就已准备就绪。

    登录并键入cat /proc/swaps以查看交换是否处于活动状态。您应该会看到一个名称为/dev/dm-0where的交换分区,这dm表明它确实在使用提供加密的设备映射器层。

    • 4

相关问题

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve