开机慢、内核加载时间长,是因为错误的恢复设备。

有段时间了,我的启动过程太长了(几乎1分钟)。
systemd-analyze time 

显示内核花费了35.765秒。
查看dmesg,似乎问题出在挂载文件系统上。
...
[    2.186084]  sdb: sdb1 sdb9
[    2.186919] sd 2:0:0:0: [sdb] supports TCG Opal
[    2.186922] sd 2:0:0:0: [sdb] Attached SCSI disk
[    2.499795] ata5: SATA link down (SStatus 0 SControl 300)
[    2.844320] clocksource: Switched to clocksource tsc
[   35.670493] EXT4-fs (dm-0): mounted filesystem with ordered data mode. Opts: (null)
[   35.782128] ip_tables: (C) 2000-2006 Netfilter Core Team
[   35.803610] systemd[1]: systemd 237 running in system mode. (+PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD -IDN2 +IDN -PCRE2 default-hierarchy=hybrid)
...

我的 /etc/fstab 文件看起来是这样的:
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
/dev/mapper/ubuntu--vg-root /               ext4    errors=remount-ro 0       1
# /boot/efi was on /dev/sda1 during installation
UUID=3996-2381  /boot/efi       vfat    umask=0077      0       1
#/dev/mapper/ubuntu--vg-swap_1 none            swap    sw              0       0
/dev/mapper/cryptswap1 none swap sw 0 0

怎么解决这个问题呢?
编辑:仔细查看启动消息(在grub中去掉quiet选项后),我发现了这一可疑的行。
gave up waiting for suspend/resume device

我觉得我的交换分区是加密的,而且我也觉得/etc/initramfs/conf.d/resume中的UUID与任何设备都不对应。
我应该禁用恢复/挂起吗?如何操作?

7问题实际上出现在 开始:运行 /scripts/local-premount这是在启动过程中显示的(如果你禁用了安静模式)。由于某种原因,这个预挂载脚本需要大约30秒钟。 - Sudhanshu
2这个问题/答案很有价值,因为它帮助解决了 Lubuntu Bionic 中的一个错误,请帮忙重新打开它 :-) - sudodus
5个回答

好的,我找到了解决办法,多亏了Sudhanshu的评论。
问题是由于我的交换分区被加密所致。因此,initramfs中的local-premount脚本在等待一个不可用的交换设备,直到超时。相关的消息是"gave up waiting for suspend/resume device"。
为了禁用这个功能(因为无法从加密的交换分区恢复,并且我也不使用休眠),我修改了这个文件:/etc/initramfs-tools/conf.d/resume。
在这个文件中,有一行内容:
RESUME=none

(原来的UUID已被删除)将禁用等待恢复设备功能。
运行
sudo update-initramfs -u

应用更改。
系统现在正常启动。

2我觉得你受到了Bug #1763611, Lubuntu bionic启动速度比其他Ubuntu版本慢一些,特别是在某些SSD上的影响。而且你已经展示了如何解决这个问题 :-) - sudodus
5太棒了!感谢你的修复。这问题让我抓狂了! - user636763
1长期以来一直存在的问题是由于zram(没有交换分区)引起的。我刚刚解决了它,谢谢! - Pierre-Damien
1谢谢,它起作用了! - Malakai
奇怪的是,注释掉那一行并没有解决问题。我想知道你是如何找出需要放置什么的。谢谢,这个问题真的让我烦恼 :-D - DimiDak
@DimiDak 我在禁用grub中的安静模式后查看了dmesg中的启动消息... 这有点猜测的工作... - alci

我在Linux Mint(基于Ubuntu)中也看到了这个问题,并花了一些时间弄清楚出了什么问题。

如果您的系统安装在LVM上并且正在使用LVM卷作为交换磁盘,就会出现这个问题。

存在一个长期存在且反复发生的错误,恢复文件错误地具有UUID(对于LVM而言是无效的),而不是应该有的设备路径。 请参阅https://bugs.launchpad.net/ubuntu/+source/initramfs-tools/+bug/1768230

您可以通过编辑/etc/initramfs-tools/conf.d/resume文件并将UUID替换为交换驱动器的设备路径来修复此问题。 以下命令片段将为您执行此操作,使用blkid找到并报告的第一个交换驱动器:

sudo bash -c 'mv /etc/initramfs-tools/conf.d/resume /tmp/resume.bak; echo RESUME=$(blkid | \grep -i swap | head -n 1 | cut -d : -f 1) > /etc/initramfs-tools/conf.d/resume'

固定的简历文件应该是这个样子: ``` RESUME=/dev/mapper/mint--vg-swap_1 ```

1这个脚本并不适用于每个人(比如我)。请在之后包括实际的简历文件内容是什么样的。 - aggregate1166877
2简历文件应该看起来像这样:RESUME=/dev/mapper/mint--vg-swap_1 - Nameless Voice
谢谢,+1 - aggregate1166877
我认为有一个拼写错误:grep -i应该是grep -I正确的行可能是:sudo bash -c 'mv /etc/initramfs-tools/conf.d/resume /tmp/resume.bak; echo RESUME=$(blkid | \grep -I swap | head -n 1 | cut -d : -f 1) > /etc/initramfs-tools/conf.d/resume' - kFly

以上或其他地方的解决方案都对我没有用,但我找到了一个解决办法,将我的启动时间从2分钟10秒缩短到40秒。

我曾经创建和删除交换分区,但这些日志在/etc/fstab文件中保留下来。所以我的系统一直在尝试挂载那些之前创建的但已经不存在的交换分区。请允许我逐步解释我做了什么。

  1. 我运行了这个命令sudo blkid | grep swap来查找我的交换分区。有两个,但其中一个实际上不存在(它不指向任何我的分区)。

  2. 所以我去编辑/etc/fstab文件,输入sudo gedit /etc/fstab

  3. 然后我意识到在这个文件中有很多我已经删除但仍然存在的交换文件。所以我参考第一步,删除不再存在的分区

请看两个/etc/fstab文件的截图,一个是修改前,一个是修改后。清理完毕后,一切都正常工作。

这是未编辑的/etc/fstab文件 未编辑的/etc/fstab

在清除不存在的交换分区之后,这里需要执行clean /etc/fstab操作。

这对我很有效。谢谢。 - Abanoub Hanna
这对我有用,我只需要打开fstab文件,看看哪一行引用了一个已被删除的分区上的交换文件,并且我在grub中也删除了该引用。我建议首先这样做-检查fstab并查找你知道不存在的交换文件的引用。 - VanAlbert

我在安装两个不同的Linux发行版后遇到了这个问题。 不知何故,在一个发行版上,交换分区被分配了另一个UUID。 我的解决方案是: 首先,运行sudo blkid以获取交换分区的正确UUID。 复制交换分区的UUID。 将其粘贴到/etc/initramfs-tools/conf.d/resume中,使其变为RESUME=_正确的UUID_。 现在运行sudo update-initramfs -u以应用此更改。
接下来,检查/etc/fstab,并在必要时更改交换分区的UUID。(我不得不这样做)

这个对我有帮助。谢谢。 - Abanoub Hanna

在我的情况下,根据其他回答所说,在/etc/initramfs-tools/conf.d/中添加配置文件(例如RESUME=none等)对我无效。Ubuntu在启动时仍然报告如下错误:

放弃等待挂起/恢复设备

对我有效的解决方法是修改grub配置文件/etc/default/grub中的一行,将其改为类似以下内容:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash resume=UUID=7f6bbc71-07d2-46db-946c-03e47368706c"

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash noresume"

然后运行:
sudo update-grub