由于 lvmetad,Ubuntu 无法启动

Mac*_*Dre 31 encryption boot grub2 dual-boot lvm

我已按照本教程安装 Ubuntu 15.10:

https://web.archive.org/web/20180530122126/http://thesimplecomputer.info/full-disk-encryption-with-ubuntu

重新启动计算机后,我进入了 grub 菜单并选择了 Ubuntu。不久之后,我收到了这个错误:

/run/lvm/lvmetad.socket: connect failed: No such file or directory
WARNING: Failed to connect to lvmetad. Falling back to internal scanning.
Run Code Online (Sandbox Code Playgroud)

这些消息每秒都会在黑屏上不断增加。过了一会儿,我可以访问initramfsash 控制台。

我究竟做错了什么?

小智 12

我今天在运行 Ubuntu 15.10 的笔记本电脑上看到了同样的错误,我一直保持最新状态,但在我想测试当前内核之前一个月没有重新启动(即,最近可能有更改)。

无论如何,我发现在我的情况下,根本原因实际上是由于遵循上述教程时的设置故障导致的“丢失”交换分区。如果是这种情况和/或您实际上正在使用lvm,则可以跳过下面的第 2 步。当然,如果您的系统(或辅助数据)分区已损坏或无法找到(请参阅步骤 3),您也可能会看到上述错误消息。

步骤 1:按照上述教程挂载系统,引导分区

假设您的(ext2)引导分区是 /dev/sdX1,您的(加密的)交换分区是 /dev/sdX2,您的(加密的)数据分区是 /dev/sdX3 并且您已经成功地使用 解密了后者cryptsetup luksOpen /dev/sdX3 data,然后安装它:mkdir /tmp/data; mount /dev/mapper/data /tmp/data

注意教程中的绑定挂载并确保挂载 /dev/sdX1 以便您可以从系统分区的 /boot 目录访问它(这很重要,因为我们必须执行update-initramfs)。

在下文中,我们假设您已成功执行chroot /tmp/data/@ubuntu1510(或您挂载的系统分区的任何名称)

第 2 步:去掉上面的错误信息

我正在使用 btrfs(您可能已经从提到的子卷名称中猜到了),因此可以轻松禁用 lvmetad,如下所示而不会丢失功能:

  • 编辑 /etc/lvm/lvm.conf 并更改use_lvmetad=1use_lvmetad=0
  • 执行 update-initramfs -k $(uname -r) -u ; sync

现在,您可以重新启动,错误消息应该消失了。但是,就我而言,下一条错误消息 [1] 向我指出了上面提到的潜在问题,因此,当我们解决这个问题时,...

步骤 3:确保 /etc/crypttab 指向正确的、未损坏的分区

首先,运行sfdisk --list /dev/sdX并检查您的加密交换分区(在我的情况下为 /dev/sdX2)实际上没有显示为(正常)交换分区。如果确实如此(如我的情况),这意味着启动(例如,使用救援磁盘)可能会使用该可用交换分区,从而覆盖与 cryptsetup 相关的元数据(关键短语和 UUID)。

接下来,查看 /dev/disk/by-uuid 并将加密分区的各自 UUID 与 /etc/crypttab 中包含的 UUID 进行比较。我在这一点上的猜测:在你的情况下,有一个不匹配。

如果在 /dev/disk/by-uuid 下找不到专用的加密交换分区,那是因为您的救援系统当前正在使用它。在这种情况下,请执行以下操作:

  • 确保停止使用分区: swapoff -a
  • 重新格式化它:(mkfs.ext2 /dev/sdX2这很重要,尤其是在使用 GPT 分区 [2] 时,因为它消除了我之前提到的故障。分区在 sfdisk 列表中显示为“swap”类型的可能原因是您/我错误地使用了mkswap /dev/sdX2在开始设置分区时。)
  • 按照教程加密分区并设置密码;之后,使用 cryptsetup 打开它并正确重新格式化现在解密的分区(使用类似的东西mkswap /dev/mapper/swap
  • 确保sfdisk --list /dev/sdX不会像这样识别交换分区(在这种情况下,重复最后的步骤)

现在,重新检查 /etc/crypttab 中列出的 UUID 是否与您在下面看到的 /dev/disk/by-uuid 对应的加密分区一致。

同样,要使更改永久化,您必须update-initramfs按上图所示执行。

如果您满意,请确保所有内容都写入磁盘并重新启动系统(无需手动卸载所有内容)。之后,您的问题应该消失了。

[1] 可能是我第一次没注意或者第一条错误信息“掩盖”了第二条;即,仅在重新启动(使用use_lvmetad=0)后,我才看到“正在读取所有物理卷。这可能需要一段时间...... ”(重复多次),然后是“警报!/dev/disk/by-uuid/.. . 不存在。 ”。(应该注意的是,update-initramfs还抱怨缺少分区。)

[2] 因为它们的类型是从分析它们的内容中推导出来的,而不是最终由标志/字节指定(这就是为什么没有简单的方法,例如,使用[g]parted.更改 GPT 文件系统类型)


bit*_*ant 5

Failed to connect to lvmetad错误可能发生,因为硬盘是100%满。要解决此问题,请从 USB 拇指驱动器启动,安装完整磁盘,删除一些不需要的文件,然后重新启动。我还重新安装了引导系统 - 我不知道是否有必要。

这些是为我解决问题的命令,从 USB 驱动器启动后从终端运行。我有完整驱动器加密的 Ubuntu 18.04。天啊。

  1. 挂载驱动:

    sudo cryptsetup luksOpen /dev/sda5 sda5_crypt
    sudo vgscan --mknodes
    sudo vgchange -ay
    sudo mount /dev/mapper/ubuntu--vg-root /mnt
    
    Run Code Online (Sandbox Code Playgroud)
  2. 删除不需要的文件 ( cd /mnt/home/your_username... rm ...)

  3. (可能没有必要)重新安装引导系统:

    cd /mnt/
    sudo mount /dev/sda1 boot
    for d in dev sys proc run; do sudo mount --bind /$d $d; done
    sudo vi etc/crypttab # make sure first line uses "sda5_crypt"
    sudo chroot .
    update-grub
    grub-install /dev/sda
    update-initramfs -u -k all
    exit
    sudo umount dev sys proc run boot
    
    Run Code Online (Sandbox Code Playgroud)
  4. 卸载:

    cd /
    sudo umount /mnt
    sudo vgchange -an
    sudo cryptsetup close sda5_crypt
    
    Run Code Online (Sandbox Code Playgroud)
  5. 重启:

    sudo reboot
    
    Run Code Online (Sandbox Code Playgroud)