无法识别交换分区(UUID = …的磁盘驱动器尚未就绪或不存在)

  • 我想我有一个加密的交换分区,因为我在安装过程中选择加密我的主目录。 我相信这就是我/etc/fstab /dev/mapper/cryptswap1 ...所有内容。
  • 我做了一些事情来交换我的交换,因为在下次启动时,我收到了一条消息(转述):

    / dev / mapper / cryptswap1的磁盘驱动器尚未就绪或不存在。 等等继续 按S跳过或M按手动恢复。

    (作为旁注,按SM似乎没有什么不同于等待。)

  • 这是我尝试过的:

    1. 本教程介绍如何修复交换分区未安装。 但是,在上面, mkswap命令因设备繁忙而失败。
    2. 所以我从现场USB启动,运行GParted重新格式化交换分区(显示为未知的fs类型),然后chrooted到破碎的系统再次尝试该教程。 我还调整了/etc/initramfs-tools/conf.d/resume/etc/fstab以反映将分区格式化为交换时生成的新UUID。 那还是行不通; 而不是/dev/mapper/cryptswap1不存在,“具有UUID = [交换分区的UUID]的磁盘驱动器尚未就绪或不存在……”
    3. 所以我决定重新开始,好像我从来没有创建过交换分区。 从Live USB中,我完全删除了交换分区(在GParted中再次显示为未知的fs类型),删除了/etc/fstab的swap和cryptswap条目以及删除了/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). # #       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 

那么,如何解决这个问题呢?

使用加密交换分区时遇到了同样的问题。 一般的Swap FAQ , 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和磁盘设备对于数据和操作系统是危险的。 我亲自在一个单独的磁盘上进行了完整备份,然后将其推出以确保它不会涉及任何不幸事故。

然后使用ID链接而不是“原始”路径编辑/etc/crypttab文件,在我的情况下,这一行是

cryptswap1 /dev/disk/by-id/ata-TOSHIBA_MQ01UBD100_73JATD5GT-part3 /dev/urandom swap,cipher=aes-cbc-essiv:sha256

我认为这个方法应该是新安装的默认方法,因为显然无法确定/dev/sd*路径……我觉得有些担心,因为我觉得有更多的脚本和软件在那里仍然依赖这些路径(而不是ID,标签或UUID)在重新启动时保持不变。

去做:

我没有检查是否恢复hibernate仍然可以使用此设置,因为这似乎依赖于UUID(我的交换分区没有),如本页所述: https : //altinukshini.wordpress.com / 2012/10/15 / devmappercryptswap1此结果未就绪的尚未或不在场/

更新:

到目前为止,冬眠似乎工作得很好。 希望这也能为他人解决这些问题!

简答:

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之前运行; 甚至以后,另一个脚本将取消加密的设备。 关键是原始序列失败,我们需要重新启动才能顺利通过。

而已!

注意:这是一个肮脏的黑客,并且可能发生重启无法修复有时发生的任何事情。 负责交换和/或cryptsetup的开发人员中的某个人应该深入了解为什么在挂起之后,交换处于使swapoff /dev/mapper/cryptswap1/etc/init.d/cryptdisks-early stop失败。 如果你运行这些命令,你会看到swapoff抱怨交换文件的标题。 此外,您将看到cryptdisks-early在尝试停止/dev/mapper/cryptswap1cryptdisks-early发送“失败”。

冗余/历史:

起初我以为他的问题与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将找不到该分区,如另一个答案中所述。

接下来,一个可能的解决方法是放弃使用uuids并在/ 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挂载在say / swap,并使用加密文件作为交换。 像这样的东西:

  1. 以GParted格式为ext4; 注意这将格式化分区并生成新的UUID; 不要使用sudo mkswap /dev/sdXX因为如果标记为swap,分区将自动挂载

  2. sudo mkdir /swap

  3. ls -l /dev/disk/by-uuid/

  4. sudo gedit /etc/fstab UUID=XXXXXXXXXXXXXXXXXXXXXXXXX /swap ext4 defaults 0 2

  5. sudo mount /dev/sdXX /swap

  6. sudo dd if=/dev/zero of=/swap/swapfile bs=1024 count=800000

  7. sudo mkswap /swap/swapfile

  8. sudo swapon /swap/swapfile

  9. sudo ecryptfs-setup-swap

但我讨厌它,所以我没试过。

我看到的另一个可能的修复是设置手动放弃自动随机密钥生成,如下所示: http : //wiki.drewhess.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

之后,只要您不挂起,交换就会成功安装,无需担心。 这是简短答案中提出的脚本来自的地方。

我有同样的问题,我在这篇文章中找到了一个对我有用的解决方案。

基本上:

  1. 打开fstab:

     sudo gedit /etc/fstab 
  2. 改变这一行:

     /dev/mapper/cryptswap1 none swap sw 0 0 

    对此:

     /dev/mapper/cryptswap1 none swap sw,noauto 0 0 
  3. 然后去

     sudo gedit /etc/rc.local 

    并且在此之前

     exit 0 

    添加以下两行:

      sleep 5 swapon /dev/mapper/cryptswap1 

如果你想检查你的SWAP实际上已经挂载并且正在打开很多占用大量RAM的应用程序并通过终端输入检查它:

 free -m 

只需使用未加密的交换

…并保持/家庭加密

我在这里尝试了其他一些解决方案。 即使他们在热重启后继续工作,最终他们都会在关机和冷启动后失败。

这告诉我们实际上是在处理双重错误:

  1. 交换驱动器的UUID被加密系统覆盖,并且
  2. 引导期间存在超时问题。

这些想法也反映在对Launchpad提交的相关错误的评论中。 但是,随着从Upstart到systemd的未决移动,解决当前LTS系统上的错误的工作很少。

在这一点上,我想到了以下想法:

  1. 在系统安装期间,我要求只加密我的\home分区,没有别的。
  2. 未加密交换分区所涉及的风险相当有限。
  3. 由Canonical来清理他们的行为。 我将不再浪费时间。

所以,这是我的解决方案, 将交换恢复为正常的,未加密的交换,而无需重新安装整个操作系统。

  1. 如果你还没有这样做,请安装blkid$ sudo apt-get install blkid
  2. 编辑/etc/crypttab并删除整个cryptswap1行: $ sudo nano /etc/crypttab
  3. 从系统设置菜单启动GParted。
  4. 您将看到带有感叹号的分区。 这应该是错误的交换分区。 仔细选择它并将其重新格式化为linux-swap分区。 应用此操作后,将通知您已恢复的正常交换分区的新UUID。 您将有机会保存此信息。 如果不这样做,请知道您始终可以使用blkid从命令行检索新的UUID: $ sudo blkid
  5. 现在,是时候将/etc/fstab恢复到昔日的辉煌: $ sudo nano /etc/fstab

    • 删除包含对/dev/mapper/cryptswap1的引用的整行。
    • 通过删除UUID=...前面的哈希#来取消注释旧的swap行。
    • 现在,将旧的UUID替换为之前获得的新UUID。
    • 通过按Ctrl + O写出文件,然后使用Ctrl + X退出nano
  6. 完成所有这些后,您就可以开始使用新的未加密交换: $ sudo swapon -a
  7. 此解决方案在热重启和冷启动关闭后都能够存在。