在我的情况下grub的(/boot/grub/grub.cfg)第一个menuentry(3.19.0-51-generic)缺少一个initrd条目而无法启动。
在进一步调查之后,查看特定内核的dpkg,将其标记为失败和未配置
dpkg -l | grep 3.19.0-51-generic iF linux-image-3.19.0-51-generic 3.19.0-51.58~14.04.1 iU linux-image-extra-3.19.0-51-generic 3.19.0-51.58~14.04.1
这一切都源于Google提供的Ubuntu映像,启用了无人值守升级。出于某种原因,initrd在构建时被杀死,而其他东西出现并运行update-grub2。
unattended-upgrades-dpkg_2016-03-10_06:49:42.550403.log:update-initramfs: Generating /boot/initrd.img-3.19.0-51-generic Killed E: mkinitramfs failure cpio 141 xz -8 --check=crc32 137 unattended-upgrades-dpkg_2016-03-10_06:49:42.550403.log:update-initramfs: failed for /boot/initrd.img-3.19.0-51-generic with 1.
解决眼前的问题。
dpkg --force-confold --configure -a
虽然理论上的无人值守升级是一个好主意,但默认情况下启用它可能会产生无人值守的后果。
那是百万美元的问题。在检查了我的GCE VM之后,我发现安装了14个不同的内核占用了几百MB的空间。大多数内核都没有相应的内容 的 的initrd.img 强> 文件,因此不可启动(包括3.19.0-39-generic)。
我当然没有试图安装随机内核,一旦删除,它们就不再出现可用的升级,所以我不确定发生了什么。说真的,发生了什么?
的 修改:Google云支持的新响应。 强> 我收到了另一个令人不安的回应。这可以解释其他错误的内核。 “在极少数情况下,需要将VM从一个物理主机迁移到另一个物理主机。在这种情况下,Google可能会应用内核升级和安全补丁。”
的 修改:Google云支持的新响应。 强>
我收到了另一个令人不安的回应。这可以解释其他错误的内核。
“在极少数情况下,需要将VM从一个物理主机迁移到另一个物理主机。在这种情况下,Google可能会应用内核升级和安全补丁。”
我的第一直觉是建议使用AWS而不是GCE。但是,GCE 是 更便宜。在做之前 的 任何 强> 升级,确保拍摄快照,然后尝试重新启动服务器以查看升级是否破坏了任何内容。
在几封来回的电子邮件之后,我终于得到了支持的回复,这让我可以解决这个问题。请注意,您必须更改内容以匹配您的唯一VM。
首先拍摄磁盘快照,以防我们需要回滚下面的任何更改。
编辑损坏实例的属性以禁用此选项: 的 “删除实例时删除启动盘” 强>
删除损坏的实例。
启动一个新的临时实例。
附上损坏的磁盘(这将显示为 /dev/sdb1 )到临时实例
/dev/sdb1
启动临时实例时,请执行以下操作:
在临时实例中:
# Run fsck to fix any disk corruption issues $ sudo fsck.ext4 -a /dev/sdb1 # Mount the disk from the broken vm $ sudo mkdir /mnt/sdb $ sudo mount /dev/sdb1 /mnt/sdb/ -t ext4 # Find out the UUID of the broken disk. In this case, the uuid of sdb1 is d9cae47b-328f-482a-a202-d0ba41926661 $ ls -alt /dev/disk/by-uuid/ lrwxrwxrwx. 1 root root 10 Jan 6 07:43 d9cae47b-328f-482a-a202-d0ba41926661 -> ../../sdb1 lrwxrwxrwx. 1 root root 10 Jan 6 05:39 a8cf6ab7-92fb-42c6-b95f-d437f94aaf98 -> ../../sda1 # Update the UUID in grub.cfg (if necessary) $ sudo vim /mnt/sdb/boot/grub/grub.cfg
注意:这^^^是我偏离支持指令的地方。
而不是修改所有引导条目来设置 root=UUID=[uuid character string] ,我查找了所有设置的条目 root=/dev/sda1 并删除它们。我还删除了没有设置的每个条目 initrd.img 文件。在我的情况下,具有正确参数的顶部引导条目最终成为 的 3.19.0-31泛型 强> 。但你的可能会有所不同。
root=UUID=[uuid character string]
root=/dev/sda1
initrd.img
# Flush all changes to disk $ sudo sync # Shut down the temporary instance $ sudo shutdown -h now
最后,将HDD从临时实例中分离出来,并根据该实例创建一个新实例 固定 磁盘。它有希望启动。
假设它启动了,你还有很多工作要做。如果您的未使用内核数量是我的一半,那么您可能希望清除未使用的内核(特别是因为某些内核可能缺少相应的initrd.img文件)。
我用了 的 第二 强> 回答(基于终端的) 这个askubuntu问题 清除其他内核。
注意:确保不要清除启动的内核!
当我托管一些网站时如何处理这些问题? 醇>
我不确定你是如何陷入这种情况的,但是如果有其他信息(请参阅上面的评论)以便能够理解触发此问题的原因,那将会很高兴。
如何从旧磁盘恢复我的数据? 醇>
假设您在删除实例时没有删除原始磁盘,只需从另一个VM安装此磁盘即可从中读取数据。去做这个:
将磁盘附加到另一个VM实例 ,例如,
gcloud compute instances attach-disk $INSTANCE --disk $DISK
挂载磁盘:
sudo mkdir -p /mnt/disks/[MNT_DIR]
sudo mount [OPTIONS] /dev/disk/by-id/google-[DISK_NAME] /mnt/disks/[MNT_DIR]
注意:您需要替换适当的值:
MNT_DIR
OPTIONS
DISK_NAME
使用完磁盘后,请执行以下步骤:
的 注意:在分离非根磁盘之前,请先卸载磁盘。拆卸已安装的磁盘可能会导致I / O操作不完整和数据损坏。 强>
卸载磁盘
sudo umount /dev/disk/by-id/google-[DISK_NAME]
从VM分离磁盘 :
gcloud compute instances detach-disk $INSTANCE --device-name my-new-device