错误未知命令 hwmatch

错误未知命令 hwmatch

按照以下步骤安装 Ubuntu 16.04 后,每次启动时都会收到“未知命令 hwmatch”消息:https://gist.github.com/umpirsky/6ee1f870e759815333c8以便设置 RAID0。

特别关注apt-get install -y grub-efi-amd64部分https://gist.github.com/umpirsky/6ee1f870e759815333c8#file-ubuntu-raid-sh-L40

由于某种原因,我无法使用 apt-get,因此我手动下载 deb 并使用 dpkg -i 进行安装。

有一个与此错误相关的错误报告https://bugs.launchpad.net/ubuntu/+source/grub2/+bug/733836

系统正常启动,但我想修复此错误。有没有办法更新配置并修复它?

更新:使用该系统一个月后,有一天它无法启动并出现此错误,最后出现 initramfs 提示,我从 clonezilla 备份中恢复了它,但我担心这种情况会再次发生。最糟糕的是,我不知道为什么会发生这种情况。

更新:

这种情况一再发生,通常是在强制关机或电池耗尽后。我启动了 live USB 并运行了 fsck:

sudo fsck /dev/sda1
fsck from util-linux 2.20.1
fsck.fat 3.0.26 (2014-03-07)
0x41: Dirty bit is set. Fs was not properly unmounted and some data may be corrupt.
1) Remove dirty bit
2) No action
? 2
There are differences between boot sector and its backup.
This is mostly harmless. Differences: (offset:original/backup)
  65:01/00
1) Copy original to backup
2) Copy backup to original
3) No action

当笔记本电脑电池耗尽或强制关机时,某些数据似乎不一致。

还:

sudo fsck /dev/md0
fsck from util-linux 2.20.1
e2fsck 1.42.9 (4-Feb-2014)
ext2fs_open2: Bad magic number in super-block
fsck.ext2: Superblock invalid, trying backup blocks...
fsck.ext2: Bad magic number in super-block while trying to open /dev/md0

The superblock could not be read or does not describe a valid ext2/ext3/ext4
filesystem.  If the device is valid and it really contains an ext2/ext3/ext4
filesystem (and not swap or ufs or something else), then the superblock
is corrupt, and you might try running e2fsck with an alternate superblock:
    e2fsck -b 8193 <device>
 or
    e2fsck -b 32768 <device>

但 e2fsck 并没有修复它:

sudo e2fsck -b 8193 /dev/md0
e2fsck 1.42.9 (4-Feb-2014)
e2fsck: Bad magic number in super-block while trying to open /dev/md0

The superblock could not be read or does not describe a valid ext2/ext3/ext4
filesystem.  If the device is valid and it really contains an ext2/ext3/ext4
filesystem (and not swap or ufs or something else), then the superblock
is corrupt, and you might try running e2fsck with an alternate superblock:
    e2fsck -b 8193 <device>
 or
    e2fsck -b 32768 <device>

谢谢。

评论说明:自从从 Clonezilla 备份恢复后,我无法重现此问题。

答案1

严格处理hwmatch问题,仔细查看/etc/grub.d/10_linux,你会发现它在底部附近列出了类似这样的内容(此显示屏上第 9 行):

# Use ELILO's generic "efifb" when it's known to be available.
# FIXME: We need an interface to select vesafb in case efifb can't be used.
if [ "x$GRUB_GFXPAYLOAD_LINUX" != x ] || [ "$gfxpayload_dynamic" = 0 ]; then
  echo "set linux_gfx_mode=$GRUB_GFXPAYLOAD_LINUX"
else
  cat << EOF
if [ "\${recordfail}" != 1 ]; then
  if [ -e \${prefix}/gfxblacklist.txt ]; then
    if hwmatch \${prefix}/gfxblacklist.txt 3; then
      if [ \${match} = 0 ]; then
        set linux_gfx_mode=keep
      else
        set linux_gfx_mode=text
      fi
    else
      set linux_gfx_mode=text
    fi
  else
    set linux_gfx_mode=keep
  fi
else
  set linux_gfx_mode=text
fi
EOF
fi

无论出于什么原因,你的 grub 安装不完整并且缺少hwmatch模块。当你使用以下命令时,你应该会在许多其他文件中看到它ll /boot/grub/i386-pc

-rw-r--r-- 1 root root  47292 Dec  5 07:13 hwmatch.mod
-rw-r--r-- 1 root root   2928 Dec  5 07:13 iorw.mod
-rw-r--r-- 1 root root   8656 Dec  5 07:13 iso9660.mod
-rw-r--r-- 1 root root   6168 Dec  5 07:13 jfs.mod
-rw-r--r-- 1 root root   6280 Dec  5 07:13 jpeg.mod
-rw-r--r-- 1 root root   5112 Dec  5 07:13 keylayouts.mod
-rw-r--r-- 1 root root   2044 Dec  5 07:13 keystatus.mod
-rw-r--r-- 1 root root   6608 Dec  5 07:13 ldm.mod
-rw-r--r-- 1 root root  29816 Dec  5 07:13 legacycfg.mod
-rw-r--r-- 1 root root  14536 Dec  5 07:13 legacy_password_test.mod
-rw-r--r-- 1 root root   8048 Dec  5 07:13 linux16.mod
-rw-r--r-- 1 root root  13184 Dec  5 07:13 linux.mod
-rw-r--r-- 1 root root    100 Dec  5 07:13 load.cfg
-rw-r--r-- 1 root root   5924 Dec  5 07:13 loadenv.mod
-rw-r--r-- 1 root root   3056 Dec  5 07:13 loopback.mod
-rw-r--r-- 1 root root   4872 Dec  5 07:13 lsacpi.mod
-rw-r--r-- 1 root root   2352 Dec  5 07:13 lsapm.mod
-rw-r--r-- 1 root root   1884 Dec  5 07:13 lsmmap.mod
-rw-r--r-- 1 root root   4136 Dec  5 07:13 ls.mod
-rw-r--r-- 1 root root   4928 Dec  5 07:13 lspci.mod
-rw-r--r-- 1 root root   6724 Dec  5 07:13 luks.mod
-rw-r--r-- 1 root root   6776 Dec  5 07:13 lvm.mod

根据此错误报告(bugs.launchpad.net - Ubuntu 从 Lucid 升级到 Precise 导致 grub 配置损坏)获取所有 grub 模块的最简单方法是重新安装它。

您应该运行sudo dpkg-reconfigure grub-pc并指示它在某处安装引导加载程序,可能是 /dev/vda。

以上是错误报告中的直接引用。正如这里的评论所指出的,并且查看您的链接,应该使用以下代码:

sudo dpkg-reconfigure grub-efi-amd64

然而看看这篇文章(superuser.com - 如何重新安装 grub2 efi)您必须首先使用实时 USB/DVD 启动并使用:

sudo mount /dev/sda2 /mnt #sda2 is the root partition
sudo mount /dev/sda1 /mnt/boot/efi #sda1 is the efi partition
for i in /dev /dev/pts /proc /sys; do sudo mount -B $i /mnt$i; done
sudo cp /etc/resolv.conf /mnt/etc/ #makes the network available after chrooting
modprobe efivars # make sure this is loaded
sudo chroot /mnt

第一步是确认文件hwmatch确实丢失。如果是这样,最简单的方法是从以下位置复制它:

/usr/lib/grub/i386-pc/hwmatch.mod

进入目录:

/boot/efi/efi/grub

此目录名称来自(https://help.ubuntu.com/community/UEFIBooting) 他们说这“主要是”目录名称。请确认您的安装。

更复杂的方法dpkg-reconfigure应该采用极其谨慎并且只有在经过适当的备份之后才可以。

答案2

您是否尝试过使用超级块的不同副本(我认为 8193 和 32768 就是示例):

mke2fs -n /dev/XYZ 
...
Superblock-Sicherungskopien gespeichert in den Blöcken:
          32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, ...

选择超级块的一个副本,例如第三个:在这种情况下163840执行以下操作:

e2fsck -p -b 163840 /dev/XYZ

答案3

对于 Legacy 靴子,没有理由不能简单地将备用文件复制到适当的位置,如下所示sudo cp /usr/lib/grub/i386-pc/hwmatch.mod /boot/grub/i386-pc/hwmatch.mod

我的测试表明它们是相同的:

$ diff -s /usr/lib/grub/i386-pc/hwmatch.mod /boot/grub/i386-pc/hwmatch.mod 
Files /usr/lib/grub/i386-pc/hwmatch.mod and /boot/grub/i386-pc/hwmatch.mod are identical

对于 EFI 模式:

我检查了 EFI 模式下全新安装的 16.04,hwmatch.mod 不存在,因此我认为可以安全地忽略它。如果它让您烦恼,我建议您备份当前的 grub.cfg,在 grub.cfg 中搜索导致insmod hwmatch问题的行并将其注释掉,看看是否能缓解问题。

相关内容