- 我认为我有一个加密的交换分区,因为我在安装过程中选择加密我的主目录。我相信这就是
/dev/mapper/cryptswap1 ...
我行中的/etc/fstab
内容。 我做了一些事情来破坏我的交换,因为在下次启动时,我收到一条消息(解释):
/dev/mapper/cryptswap1 的磁盘驱动器尚未准备好或不存在。请等待以继续。按 S 跳过或按 M 手动恢复。
(顺便说一句,按下S或M似乎与等待没有什么不同。)
这是我尝试过的:
- 本教程关于如何修复交换分区未安装的问题。但是,在上述情况下,
mkswap
由于设备繁忙,命令失败。 - 因此,我从实时 USB 启动,运行 GParted 重新格式化交换分区(显示为未知的 fs 类型),然后 chroot 到损坏的系统以再次尝试该教程。我还调整了
/etc/initramfs-tools/conf.d/resume
并/etc/fstab
反映了将分区格式化为交换分区生成的新 UUID。这仍然不起作用;不是/dev/mapper/cryptswap1
不存在,而是“UUID 为=[交换分区的 UUID]尚未准备好或不存在...” - 所以我决定重新开始,就好像我从来没有创建过交换分区一样。从 Live USB 中,我完全删除了交换分区(它再次在 GParted 中显示为未知的 fs 类型),删除了 swap 和 cryptswap 条目以及删除
/etc/fstab
了/etc/initramfs-tools/conf.d/resume
和/etc/crypttab
。此时,主系统不应被视为已损坏,因为没有交换分区,也没有安装交换分区的说明,对吗?我在启动过程中没有收到任何错误。我按照相同的说明创建和加密交换分区,从创建交换分区开始,但我认为fdisk
需要重新启动才能看到更改。
- 本教程关于如何修复交换分区未安装的问题。但是,在上述情况下,
我确信上述第三个过程会起作用,但问题仍然存在。
一些相关信息(
/dev/sda8
是交换分区):/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> proc /proc proc nodev,noexec,nosuid 0 0 # / was on /dev/sda6 during installation UUID=4c11e82c-5fe9-49d5-92d9-cdaa6865c991 / ext4 errors=remount-ro 0 1 # /boot was on /dev/sda5 during installation UUID=4031413e-e89f-49a9-b54c-e887286bb15e /boot ext4 defaults 0 2 # /home was on /dev/sda7 during installation UUID=d5bbfc6f-482a-464e-9f26-fd213230ae84 /home ext4 defaults 0 2 # swap was on /dev/sda8 during installation UUID=5da2c720-8787-4332-9317-7d96cf1e9b80 none swap sw 0 0 /dev/mapper/cryptswap1 none swap sw 0 0
输出
sudo mount
:/dev/sda6 on / type ext4 (rw,errors=remount-ro) proc on /proc type proc (rw,noexec,nosuid,nodev) sysfs on /sys type sysfs (rw,noexec,nosuid,nodev) none on /sys/fs/fuse/connections type fusectl (rw) none on /sys/kernel/debug type debugfs (rw) none on /sys/kernel/security type securityfs (rw) udev on /dev type devtmpfs (rw,mode=0755) devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=0620) tmpfs on /run type tmpfs (rw,noexec,nosuid,size=10%,mode=0755) none on /run/lock type tmpfs (rw,noexec,nosuid,nodev,size=5242880) none on /run/shm type tmpfs (rw,nosuid,nodev) /dev/sda5 on /boot type ext4 (rw) /dev/sda7 on /home type ext4 (rw) /home/undisclosed/.Private on /home/undisclosed type ecryptfs (ecryptfs_check_dev_ruid,ecryptfs_cipher=aes,ecryptfs_key_bytes=16,ecryptfs_unlink_sigs,ecryptfs_sig=cbae1771abd34009,ecryptfs_fnek_sig=7cefe2f59aab8e58) gvfs-fuse-daemon on /home/undisclosed/.gvfs type fuse.gvfs-fuse-daemon (rw,nosuid,nodev,user=undisclosed)
输出
sudo blkid
(请注意/dev/sda8
缺失):/dev/sda1: LABEL="SYSTEM" UUID="960490E80490CC9D" TYPE="ntfs" /dev/sda2: UUID="D4043140043126C0" TYPE="ntfs" /dev/sda3: LABEL="Shared" UUID="80F613E1F613D5EE" TYPE="ntfs" /dev/sda5: UUID="4031413e-e89f-49a9-b54c-e887286bb15e" TYPE="ext4" /dev/sda6: UUID="4c11e82c-5fe9-49d5-92d9-cdaa6865c991" TYPE="ext4" /dev/sda7: UUID="d5bbfc6f-482a-464e-9f26-fd213230ae84" TYPE="ext4" /dev/mapper/cryptswap1: UUID="41fa147a-3e2c-4e61-b29b-3f240fffbba0" TYPE="swap"
输出
sudo fdisk -l
:Disk /dev/mapper/cryptswap1 doesn't contain a valid partition table Disk /dev/sda: 320.1 GB, 320072933376 bytes 255 heads, 63 sectors/track, 38913 cylinders, total 625142448 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: 0xdec3fed2 Device Boot Start End Blocks Id System /dev/sda1 * 2048 409599 203776 7 HPFS/NTFS/exFAT /dev/sda2 409600 210135039 104862720 7 HPFS/NTFS/exFAT /dev/sda3 210135040 415422463 102643712 7 HPFS/NTFS/exFAT /dev/sda4 415424510 625141759 104858625 5 Extended /dev/sda5 415424512 415922175 248832 83 Linux /dev/sda6 415924224 515921919 49998848 83 Linux /dev/sda7 515923968 621389823 52732928 83 Linux /dev/sda8 621391872 625141759 1874944 82 Linux swap / Solaris Disk /dev/mapper/cryptswap1: 1919 MB, 1919942656 bytes 255 heads, 63 sectors/track, 233 cylinders, total 3749888 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: 0xaf5321b5
/etc/initramfs-tools/conf.d/resume
文件:RESUME=UUID=5da2c720-8787-4332-9317-7d96cf1e9b80
/etc/crypttab
文件:cryptswap1 /dev/sda8 /dev/urandom swap,cipher=aes-cbc-essiv:sha256
输出
sudo swapon -as
:Filename Type Size Used Priority /dev/mapper/cryptswap1 partition 1874940 0 -1
输出
sudo free -m
:total used free shared buffers cached Mem: 1476 1296 179 0 35 671 -/+ buffers/cache: 590 886 Swap: 1830 0 1830
那么,如何解决这个问题呢?
答案1
使用加密交换分区时,我遇到了同样的问题。一般掉期常见问题解答,Puny Geek 对“cryptswap1 尚未准备好或不存在”消息的解决方案也不Braiam 的回答到这个问题为我解决了这个问题 - 有时交换可用,有时不可用。经过多次重启和一番探索,我想我已经找到了根本原因:
交换分区的路径/dev/sda3
有时会有所不同,例如/dev/sdb3
。由于文件/etc/crypttab
默认似乎通过此路径识别交换分区,因此有时它会找到它(如果该分区在启动时恰好获得相同的路径)或找不到它(如果该分区在启动时分配了不同的路径)。
看来我不是唯一一个有这个问题的人因为正如这里所述,更好的解决方案是通过其驱动器 ID 而不是其/dev/sd*
路径来绑定交换分区。可以通过运行
ls -l /dev/disk/by-id/
其中列出了所有分区(包括交换分区)的磁盘 ID,在我的例子中是
ata-TOSHIBA_MQ01UBD100_73JATD5GT-part3 -> ../../sdb3
在“磁盘实用程序”等程序中仔细检查-> ../../sdb*
此行的部分确实是您要用于交换的分区,因为(如我之前所说)这个分区有时会更改名称。一如既往,请记住这一点:
注意:乱动 cryptsetup 和磁盘设备对数据和操作系统来说都是危险的。我亲自在单独的磁盘上做了完整备份,然后拔掉了它,以确保它不会发生任何意外。
/etc/crypttab
然后使用 ID 链接而不是“原始”路径来编辑文件,在我的情况下,此行是
cryptswap1 /dev/disk/by-id/ata-TOSHIBA_MQ01UBD100_73JATD5GT-part3 /dev/urandom swap,cipher=aes-cbc-essiv:sha256
我认为这种方法应该是新安装的默认方法,因为显然永远无法确定路径/dev/sd*
......我发现这有点令人担忧,因为我觉得有更多的脚本和软件仍然依赖这些路径(而不是ID,标签或UUID)在重启后保持不变。
去做:
我还没有检查通过这种设置是否仍然可以从休眠状态恢复,因为这似乎依赖于 UUID(我的交换分区没有),如下页所述:https://altinukshini.wordpress.com/2012/10/15/devmappercryptswap1-is-not-ready-yet-or-not-present/
更新:
到目前为止,休眠似乎运行良好。希望这也能为其他人解决这些问题!
答案2
简短回答:
UUID 问题:
你应该有这个/etc/crypttab
:
cryptswap1 /dev/sda4 /dev/urandom swap,cipher=aes-cbc-essiv:sha256
末尾还有这一行/etc/fstab
/dev/mapper/cryptswap1 none swap sw 0 0
确保您没有在 crypttab 文件中使用 uuid。
暂停问题:
现在让我们使用一个技巧来在重启或关机之前规范交换的行为:
创建一个/etc/init.d/cryptswap.sh
包含以下内容的脚本:
#!/bin/bash
/etc/init.d/cryptdisks-early restart
使用以下命令使其可执行:
sudo chmod +x /etc/init.d/cryptswap.sh
为了正确地执行操作,让我们使用链接和数字使其在重启或关闭时在正确的时刻执行:
cd /etc/rc6.d
sudo ln -s ../init.d/cryptswap.sh S10cryptswap.sh
cd /etc/rc0.d
sudo ln -s ../init.d/cryptswap.sh S10cryptswap.sh
这里重要的是名称中的数字 10,因为该脚本应该在开始关闭交换的 S40 之前运行;甚至更晚,另一个脚本也会关闭加密设备。关键是原始序列失败了,我们需要重新启动才能让它顺利完成。
就是这样!
注意:这是一个肮脏的黑客行为,有时重启可能无法修复正在发生的问题。负责 swap 和/或 cryptsetup 的开发人员中应该深入研究一下,看看为什么在暂停后,交换会处于导致swapoff /dev/mapper/cryptswap1
失败的状态/etc/init.d/cryptdisks-early stop
。如果您运行这些命令,您会看到 swapoff 抱怨交换文件的标题。此外,您会看到cryptdisks-early
在尝试停止时发送“失败” /dev/mapper/cryptswap1
。
冗余/历史:
起初我以为他的问题与 libblk 的内核行为有关,可能是 bug(不是故意的)。问题似乎是分区表被不同的“文件系统”编辑了。内核拒绝填充,/dev/disk/by-uuid/
因为它检测到多个文件系统的签名正在编辑分区表。这似乎很重要,因为脚本/usr/bin/ecryptfs-setup-swap
使用 UUID 来引用它为 创建的条目/etc/crypttab
。
修复方法是通过启动某些实时媒体从同一文件系统重新创建所有分区。请参阅:http://forums.fedoraforum.org/showthread.php?t=288890
但是,这不起作用,因为 ecryptfs/crypttab 每次启动时都会“重新格式化”交换分区;运行 ecryptfs-setup-swap 并重新启动后,您无法看到交换分区的 uuid,因为您不应该看到它。这意味着在启动时,如果通过 uuid 引用该分区,则 crypttab 将找不到该分区,如另一个答案所述。
接下来,一个可能的解决方法是放弃使用 uuid,而是在 /etc/crypttab 中用不同的符号替换它们:只有 /dev/sdXX 有效,因为在 crypttab 脚本中运行 mkswap 时其他符号会丢失。这是论坛建议的解决问题的方法。必须这样做。
但那并没有完全起作用。我猜测 crypttab 中存在一些错误(/etc/rcS.d/S26cryptdisks-early
-> /etc/init.d/cryptdisks-early
-> /lib/cryptsetup/cryptdisks.functions
)。所以我去那里挖掘了一下,但什么也没发现。实际上,/etc/init.d/cryptdisks-early restart
一旦启动,运行就正常了,/dev/mapper/cryptswap1
链接就生成了。
当时我看到的一个可能的修复方法是将交换移动到一个占用交换分区所有空间的“文件”。这很脏,需要一个挂载点等。这个想法是,您将创建一个整个分区大小的文件,该文件将作为常规 ext4 挂载在 /swap 上,并使用加密文件作为交换。类似这样:
在 GParted 中格式化为 ext4;注意这将格式化分区并生成新的 UUID;请勿使用,
sudo mkswap /dev/sdXX
因为如果标记为交换,分区将自动挂载sudo mkdir /swap
ls -l /dev/disk/by-uuid/
sudo gedit /etc/fstab
# 添加UUID=XXXXXXXXXXXXXXXXXXXXXXXXX /swap ext4 defaults 0 2
sudo mount /dev/sdXX /swap
sudo dd if=/dev/zero of=/swap/swapfile bs=1024 count=800000
sudo mkswap /swap/swapfile
sudo swapon /swap/swapfile
sudo ecryptfs-setup-swap
但我不喜欢它,所以我没有尝试。
我看到的另一种可能的解决方法是手动设置放弃自动随机密钥生成,如下所示:http://wiki.drewess.com/wiki/Creating_an_encrypted_filesystem_on_a_partition#External_links
在手动探索了一番之后,我以某种方式修复了问题,方法是/usr/bin/ecryptfs-setup-swap
先执行操作(查看它以了解其工作原理,它只是编辑/etc/crypttab
和/etc/fstab
),然后手动运行在启动时运行的脚本:/etc/init.d/cryptdisks-early restart
;但它又坏了。重新考虑恢复问题,我发现了模式。它在暂停后重新启动时中断,并且一直处于中断状态。要重新修复它,必须执行以下操作:
sudo /etc/init.d/cryptdisks-early restart
此后,只要您不暂停,交换就会成功安装,并且不会出现磨损。这就是简短答案中提出的脚本的来源。
答案3
我遇到了同样的问题,我找到了一个适合我的解决方案这个帖子。
基本上:
打开 fstab:
sudo gedit /etc/fstab
更改此行:
/dev/mapper/cryptswap1 none swap sw 0 0
更改为:
/dev/mapper/cryptswap1 none swap sw,noauto 0 0
然后转到
sudo gedit /etc/rc.local
以及紧接之前
exit 0
添加以下两行:
sleep 5 swapon /dev/mapper/cryptswap1
如果你想检查你的 SWAP 是否真的安装并且正常工作,请打开大量消耗 RAM 的应用程序并通过终端输入进行检查:
free -m
答案4
只需使用未加密的交换
...并保持 /home 加密
我尝试了这里建议的其他几种解决方案。尽管它们在热重启后仍然有效,但最终它们在关机和冷重启后都失败了。
这告诉我们我们实际上正在处理一个双重错误:
- 交换驱动器的 UUID 被加密系统覆盖,并且
- 启动过程中存在超时问题。
这些想法也反映在对相关在 Launchpad 上提交的错误。然而,随着从 Upstart 到 systemd 的迁移即将完成,目前 LTS 系统上的错误几乎没有得到解决。
此时,我的脑海里闪过以下想法:
- 在系统安装期间,我只要求加密我的
\home
分区,没有其他内容。 - 未加密交换分区所涉及的风险相当有限。
- Canonical 必须改过自新。我不会再浪费时间了。
因此,这是我的解决方案将交换恢复为正常的、未加密的交换,而无需重新安装整个操作系统。
- 如果您还没有安装,请安装
blkid
:$ sudo apt-get install blkid
- 编辑
/etc/crypttab
并删除整cryptswap1
行:$ sudo nano /etc/crypttab
- 从系统设置菜单启动 GParted。
- 您将看到一个带有感叹号的分区。这应该是有故障的交换分区。仔细选择它并将其重新格式化为分区
linux-swap
。应用此操作后,您将收到有关恢复的正常交换分区的新 UUID 的通知。您将有机会保存此信息。如果您不这样做,请记住,您始终可以使用以下命令从命令行检索新的 UUIDblkid
:$ sudo blkid
现在,是时候恢复
/etc/fstab
其昔日的辉煌了:$ sudo nano /etc/fstab
- 删除包含对 的引用的整行
/dev/mapper/cryptswap1
。 - 通过删除前面的
swap
井号来取消注释旧行。#
UUID=...
- 现在,用之前获得的新 UUID 替换旧的 UUID。
- Ctrl按+写出文件,然后按+O 退出。
nano
CtrlX
- 删除包含对 的引用的整行
- 完成所有这些后,您就可以开始使用新的未加密交换了:
$ sudo swapon -a
- 该解决方案既能实现热重启,也能实现冷重启关机。