在使用加密的个人目录进行干净的14.04安装时,交换空间无法正常工作。

更新3:

我决定从头开始重新安装系统,以清除升级后出现的其他问题。然而,这个问题仍然存在。

在干净的安装中,选择使用“加密主目录”会导致加密交换配置出现问题。

更新2:

我修复了cfdisk报告的分区顺序问题,但问题仍然存在。交换分区现在位于/dev/sda6上,并且可以按照以下步骤启动和运行:

~$ sudo mkswap /dev/sda6
Setting up swapspace version 1, size = 7998460 KiB
no label, UUID=18881d0f-d9ec-43be-a23f-0cbd78ea6d22

$sudo nano /etc/crypttab # Update crypttad with new UUID

$ sudo /etc/init.d/cryptdisks reload
 * Stopping remaining crypto disks...
 * cryptswap1 (stopped)...                                               [ OK ] 
 * Starting remaining crypto disks...                                        
 * cryptswap1 (starting)..
 * cryptswap1 (started)...                                               [ OK ] 
$ sudo swapon -a

$ls -l /dev/disk/by-uuid/
total 0
lrwxrwxrwx 1 root root 10 May 11 09:04 08b07f88-6da5-4b40-b062-42b3bb1c5f00 -> ../../sda3
lrwxrwxrwx 1 root root 10 May 11 09:08 18881d0f-d9ec-43be-a23f-0cbd78ea6d22 -> ../../sda6
lrwxrwxrwx 1 root root 10 May 11 09:04 19aa372c-05c8-4226-8f09-c54e5566e816 -> ../../sda5
lrwxrwxrwx 1 root root 10 May 11 09:04 A800B16E00B143DA -> ../../sda1
lrwxrwxrwx 1 root root 10 May 11 09:04 D28230E68230D129 -> ../../sda2
lrwxrwxrwx 1 root root 10 May 11 09:08 fcc8c419-8fec-4d4d-b55e-9e4c3b04d21d -> ../../dm-0

但是在重新启动后,交换失败激活,并且它再次变成了这个样子:
$ ls -l /dev/disk/by-uuid/
total 0
lrwxrwxrwx 1 root root 10 May 11 09:12 08b07f88-6da5-4b40-b062-42b3bb1c5f00 -> ../../sda3
lrwxrwxrwx 1 root root 10 May 11 09:12 19aa372c-05c8-4226-8f09-c54e5566e816 -> ../../sda5
lrwxrwxrwx 1 root root 10 May 11 09:12 A800B16E00B143DA -> ../../sda1
lrwxrwxrwx 1 root root 10 May 11 09:12 D28230E68230D129 -> ../../sda2

我的猜测是,当将磁盘设置为加密Linux时,系统不再识别分区类型,因此无法正确加载它,导致UUID无法注册,进而导致cryptswap无法找到它,从而引发故障。但我不知道如何修复它...
更新的问题是:
进一步测试发现,通过运行以下命令可以启动并运行交换空间: $ mkswap /dev/sda5
然后,在/etc/crypttab中更新正确的UUID,并按照这里列出的步骤进行操作: 如何设置加密交换文件? 然而,问题仍然存在,当我重新启动计算机时,/dev/sda5在运行时没有出现。
$ ls -l /dev/disk/by-uuid/

如果我这样做:
$ cfdisk /dev/sda 

我遇到了以下错误:
FATAL ERROR: Bad logical partition 6: enlarged logical partitions overlap
                      Press any key to exit cfdisk

图形化的“磁盘”工具在使用时没有报告任何错误。
$ sudo fdisk -l

Disk /dev/sda: 256.1 GB, 256060514304 bytes
255 heads, 63 sectors/track, 31130 cylinders, total 500118192 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x619aebf1

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048      206847      102400    7  HPFS/NTFS/exFAT
/dev/sda2          206848   100870143    50331648    7  HPFS/NTFS/exFAT
/dev/sda3       191397888   192397311      499712   83  Linux
/dev/sda4       192399358   500117503   153859073    5  Extended
/dev/sda5       484118528   500117503     7999488   82  Linux swap / Solaris
/dev/sda6       192399360   484118527   145859584   83  Linux

Partition table entries are not in disk order

升级到14.04版(从13.04版)后,我的电脑出现了严重的减速问题。在运行top命令时,我注意到kswap0占用了大量的CPU时间。我还注意到我没有任何交换空间!
$ sudo swapon -a
swapon: /dev/mapper/cryptswap1: stat failed: No such file or directory

我的加密交换设置似乎出了一些问题(我甚至不知道我有这个设置)
$ cat /etc/crypttab 
cryptswap1 UUID=abe3c568-c8fd-4dfb-b8e9-0520d442dd61 /dev/urandom swap,cipher=aes-cbc-essiv:sha256

$ ls -l /dev/disk/by-uuid/
total 0
lrwxrwxrwx 1 root root 10 May  6 11:00 08b07f88-6da5-4b40-b062-42b3bb1c5f00 -> ../../sda3
lrwxrwxrwx 1 root root 10 May  6 11:00 19aa372c-05c8-4226-8f09-c54e5566e816 -> ../../sda6
lrwxrwxrwx 1 root root 10 May  6 11:00 A800B16E00B143DA -> ../../sda1
lrwxrwxrwx 1 root root 10 May  6 11:00 D28230E68230D129 -> ../../sda2

查看我的fstab

$ cat /etc/fstab
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
# / was on /dev/sda6 during installation
UUID=19aa372c-05c8-4226-8f09-c54e5566e816 /               ext4    errors=remount-ro 0       1
# /boot was on /dev/sda3 during installation
UUID=08b07f88-6da5-4b40-b062-42b3bb1c5f00 /boot           ext2    defaults        0       2
# swap was on /dev/sda5 during installation
#UUID=abe3c568-c8fd-4dfb-b8e9-0520d442dd61 none            swap    sw              0       0
/dev/mapper/cryptswap1 none swap sw 0 0

我的猜测是sda5的设置出了问题,但由于它被加密了,我不知道该如何修复。希望能得到一些帮助,指导下一步该怎么做。

我对加密分区一无所知,但第一个错误表明交换分区尚未挂载。此外,在/etc/fstab中用于挂载的行被注释掉了。我建议尝试取消注释该行并重新启动,看看是否能解决问题。 - Anake
我非常确定它应该被注释掉,而cryptswap1行负责间接地使用/etc/crypttab中的信息进行挂载。你的建议肯定会以未加密的方式挂载它? - ajn
1这个能用吗?https://ubuntuforums.org/showthread.php?t=2224129 我对一些命令不确定,我不想搞砸Ubuntu。 - user282110
看起来和我尝试的很相似,我预计它会在重新启动一次后停止工作,一旦你第一次激活了加密交换。 - ajn
目前我只是回到使用常规的交换空间。我使用加密的主要场景是,如果有人偷走了我的笔记本电脑,并且有一些具有适度Linux技能的人决定探索一下,看看他们是否能找到一些有趣的东西,比如尝试使用USB启动并挂载我的主分区。我没有任何我认为别人会觉得有价值到足以尝试从交换空间中恢复其片段的东西。实际上,应该有一个安装选项来同时使用加密的个人文件夹和常规的交换空间。 - ajn
我按照@Simon提供的链接中描述的解决方案进行了操作,对我来说确实有效。 - adosaiguas
请看我这个回答。希望能对你有所帮助。 - αғsнιη
5个回答

已知问题

存在一个错误(见下文),一旦数据被写入,就会覆盖分区的UUID。因此,您不能使用UUID来引用用于加密交换的分区。

现在,很少使用交换空间。在我的机器上,只有当我打开第40个标签时才会使用交换空间。当我没有交换空间时,突然间我的电脑开始卡顿,浏览器自动关闭。或者在Chromium浏览器中,许多标签会突然“死掉”。
因此,在/etc/crypttab中引用/dev/disk/by-uuid/可能会在一段时间内“看起来”有效,但一旦实际使用交换空间,它将覆盖UUID,因为整个分区都用于加密数据存储。

简单解决方法

简单的解决方法是在/etc/crypttab中通过设备引用交换分区,例如:

cryptswap1 /dev/sda5 /dev/urandom swap,cipher=aes-cbc-essiv:sha256

警告:这在笔记本电脑上(我就是这样使用的)可能是安全的,但如果您使用可更换驱动器的台式机或有其他原因需要更改驱动器/分区布局,则不建议这样做,因为正常的存储分区可能会突然被用作交换分区。
注意:您需要重新启动以使此更改生效,因为只有在引导时才会创建/dev/mapper/cryptswap1。
正确的修复方法是确保存储UUID的原始分区部分不会被加密的交换数据覆盖,这样它将在重新启动时仍然存在。然而,我不确定UUID写在哪里以及占用多少字节。您可以自行承担风险进行如下测试:
cryptswap1 UUID=abe3c568-c8fd-4dfb-b8e9-0520d442dd61 /dev/urandom swap,offset=36,cipher=aes-cbc-essiv:sha256

请注意 offset=36

如果您有Ubuntu One账户,请登录并转到在Launchpad上的Bug #1310058,然后选择(或点击此处):"我也受到此错误的影响",以便该错误得到更多的“关注”,从而更有可能被修复。


更新 2014-10-27

我也偶然发现了这个。没有经过我的验证。它看起来像是使用更多冗长的代码和关于重建损坏交换空间的注释的offset技巧。

https://bugs.launchpad.net/ubuntu/+source/ecryptfs-utils/+bug/1310058/comments/22


5我只想指出,这个错误已经在https://bugs.launchpad.net/ubuntu/+source/ecryptfs-utils/+bug/953875上进行跟踪,截至几天前(2015年3月中旬),状态为“已修复发布”,尽管该修复仅明确适用于15.04版本。我想知道是否将其回溯到14.04 LTS,并且官方的更新程序是什么。 - Tommy Trussell
1@TommyTrussell: 不对LTS进行回溯将是疯狂的。像这样关键问题的漏洞在发布近一年后仍然存在,这就是为什么即使是最大的Linux发行版也永远无法与OSX和Windows相媲美的原因。可惜啊。 - Redsandro
我对OSX和Windows中的错误修复没有公开讨论的情况不太了解,所以它们怎么能够"相当呢?根据我的经验,OSX中的错误要么被修复,要么没有;没有公开讨论,所以它们是"不透明的"。我只是提到了新的错误编号(因为你提供的那个已经被标记为重复),这样你就可以更新你的参考资料。从Bug 953875中提到的论坛帖子的讨论可以看出,在15.04版本中正在更改的初始化系统可能会导致最稳定的修复方法有所不同。因此,14.04版本的修复可能在向前兼容性方面存在技术挑战。 - Tommy Trussell
我只是说你在Windows或OSX这样的系统上永远不会看到类似“哦,顺便说一下,SWAP坏了”的情况。这是一种核心功能,在测试和修复之前绝对不会发布。就这样。至于安全性,没有公开讨论,但仍然有统计数据 - Redsandro
@Redsandro 嗯,这是一个免费的操作系统,如果人们在测试发布版本时发现了错误,只有在发布之前才会修复这些问题。发布后,修复错误可能会对某人的配置造成其他问题,所以这样做风险太大。然而,在更新版本中可能会修复此问题 - 所以可能值得使用最新版本 - 但临时版本通常比长期支持版本更不稳定,因为重点更多放在一般更新上。但你确实指出了为什么进行错误测试/修复/质量保证(QA)如此重要,Ubuntu 在这方面越来越好。 - Ads20000

我在Ubuntu 14.04遇到了完全相同的问题,并找到了这个帖子;mutant提供的this link对我很有帮助。我使用了/dev/disk/by-id的引用,而不是/dev/sdXY,因为该引用并不总是指向同一个物理分区。我的/etc/crypttab最终变成了:
cryptswap1 /dev/disk/by-id/wwn-0x500...-part6 /dev/urandom swap, cipher=aes-cbc-essiv:sha256

3这是一个正确简单的解决方案! - Serge Stroobandt

只需使用未加密的交换分区
...并保持/home加密
我尝试了这里提出的几种其他解决方案。 尽管它们在热重启后继续工作,但在关机和冷启动后最终都失败了。
这告诉我们实际上我们正在处理一个双重错误:
1. 交换驱动器的UUID被加密系统覆盖了,以及 2. 启动过程中存在超时问题。
这些想法也反映在与相关的在Launchpad上提交的错误的评论中。 然而,随着从Upstart到systemd的即将移动,对当前LTS系统上的错误进行解决的工作很少。
此时,我脑海中浮现出以下想法:
1. 在系统安装期间,我要求仅加密我的\home分区,没有其他内容。 2. 不具备加密交换分区的风险相当有限。 3. 这是Canonical的责任来解决这个问题。我不会再浪费时间在这上面了。
所以,这是我解决的方法,可以将交换分区恢复为正常的、未加密的交换分区,而无需重新安装整个操作系统。
如果您还没有这样做,请安装blkid$ sudo apt-get install blkid 编辑/etc/crypttab并删除整个cryptswap1行:$ sudo nano /etc/crypttab 从系统设置菜单启动GParted。 您将看到一个带有感叹号的分区。这应该是有问题的交换分区。 仔细选择它并将其重新格式化为linux-swap分区。 执行此操作后,您将收到有关恢复正常交换分区的新UUID的通知。您可以选择保存此信息。如果不保存,您始终可以使用blkid命令从命令行检索新的UUID:$ sudo blkid 现在,是时候将/etc/fstab恢复到其旧的状态了:$ sudo nano /etc/fstab 删除包含对/dev/mapper/cryptswap1的引用的整行。 通过删除UUID=...前面的井号#取消注释旧的swap行。 现在,用之前获得的新UUID替换旧的UUID。 按下Ctrl+O将文件写出,并使用Ctrl+X退出nano。 完成所有操作后,您可以立即开始使用新的未加密交换:$ sudo swapon -a 此解决方案适用于热重启和冷启动时的关机。

1这是唯一对我有效的答案,尽管我尝试了其他所有方法。 - fifaltra
在gparted中,我的交换分区有引导标志。这样还能正常工作吗,还是会导致无法启动? - Christian Skjødt
@ChristianSkjødt 你的交换分区不应该设置启动标志。无论如何,上述步骤都不会影响任何这些内容。 - Serge Stroobandt

看一下this。我通过在/etc/crypttab中简单地将UUID=...替换为/dev/sda3来解决了这个问题。

1首先运行“sudo fdisk -l”命令来查看你的交换分区叫什么,它可能是“/etc/sda5”或其他名称,然后按照mutant的描述编辑cryptab文件。这对我起作用,并且在重启后依然有效。这明显是一个bug,因为我在新的SSD上进行了全新安装时遇到了这个问题。我在安装时选择了“加密家目录”的选项,但最好是在安装后加密/home目录,特别是如果你要从以前的安装中复制文件到旧的/home目录中。 - Paul Williams
sudo fdisk -l 这个命令是没有人告诉我的。谢谢你!:) - Aman Alam
你至少应该警告人们,/dev/sd* 路径可能会随意更改,并导致错误的分区被交换数据破坏。/dev/disk/by-id 是更好的选择。 - underscore_d

我有这个问题,和question 332625中的人一样。 暂停和重新启动的某些组合会丢失交换分区的UUID(正如您的/etc/fstab中的注释所说,请使用sudo blkd确认),因此在您的/etc/crypttab中使用该UUID作为加密交换的行失败。
我尝试将/etc/crypttab切换到使用分区的/dev名称(在您的情况下为/dev/sda6)或dev/disk/by-id/名称而不是消失的UUID,但没有成功。
放弃加密交换是最简单,迄今为止最好的解决方案,可悲的是。

这个问题很久了,我不知道为什么他们还没有修复它。现在我遇到了同样的问题,我的台式机无法正常运行。过去我曾经在笔记本电脑上解决过这个问题,但是现在我忘记了具体方法。 - tomasb