交换分区无法识别(UUID=... 的磁盘驱动器尚未准备好或不存在)

交换分区无法识别(UUID=... 的磁盘驱动器尚未准备好或不存在)
  • 我认为我有一个加密的交换分区,因为我在安装过程中选择加密我的主目录。我相信这就是/dev/mapper/cryptswap1 ...我行中的/etc/fstab内容。
  • 我做了一些事情来破坏我的交换,因为在下次启动时,我收到一条消息(解释):

    /dev/mapper/cryptswap1 的磁盘驱动器尚未准备好或不存在。请等待以继续。按 S 跳过或按 M 手动恢复。

    (顺便说一句,按下SM似乎与等待没有什么不同。)

  • 这是我尝试过的:

    1. 本教程关于如何修复交换分区未安装的问题。但是,在上述情况下,mkswap由于设备繁忙,命令失败。
    2. 因此,我从实时 USB 启动,运行 GParted 重新格式化交换分区(显示为未知的 fs 类型),然后 chroot 到损坏的系统以再次尝试该教程。我还调整了/etc/initramfs-tools/conf.d/resume/etc/fstab反映了将分区格式化为交换分区生成的新 UUID。这仍然不起作用;不是/dev/mapper/cryptswap1不存在,而是“UUID 为=[交换分区的 UUID]尚未准备好或不存在...”
    3. 所以我决定重新开始,就好像我从来没有创建过交换分区一样。从 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 上,并使用加密文件作为交换。类似这样:

  1. 在 GParted 中格式化为 ext4;注意这将格式化分区并生成新的 UUID;请勿使用,sudo mkswap /dev/sdXX因为如果标记为交换,分区将自动挂载

  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.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

我遇到了同样的问题,我找到了一个适合我的解决方案这个帖子

基本上:

  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

答案4

只需使用未加密的交换

...并保持 /home 加密

我尝试了这里建议的其他几种解决方案。尽管它们在热重启后仍然有效,但最终它们在关机和冷重启后都失败了。

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

  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 的通知。您将有机会保存此信息。如果您不这样做,请记住,您始终可以使用以下命令从命令行检索新的 UUID blkid$ sudo blkid
  5. 现在,是时候恢复/etc/fstab其昔日的辉煌了:$ sudo nano /etc/fstab

    • 删除包含对 的引用的整行/dev/mapper/cryptswap1
    • 通过删除前面的swap井号来取消注释旧行。#UUID=...
    • 现在,用之前获得的新 UUID 替换旧的 UUID。
    • Ctrl按+写出文件,然后按+O 退出。nanoCtrlX
  6. 完成所有这些后,您就可以开始使用新的未加密交换了:$ sudo swapon -a
  7. 该解决方案既能实现热重启,也能实现冷重启关机。

相关内容