使用NVMe PCIE的SSD安装UBuntu 16.04存在以下几个问题,导致无法进入桌面:
(1) Couldn't get size: 0x8000000000000000e
(2) radeon 0000:01:00.0: Invalid PCI ROM header signature: excepting 0xaa55, got 0xffff
(3) nvme nvme1: ignoring ctrl due to duplicate subnqn (nnqn.2017-12.org.nvmexpress:uuid:)
问题(1)之前还应该有一个提示,拍照时没有拍到。问题(1)不知道是什么问题,问题(2)查到说是AMD的显卡驱动的问题,也是和NVMe有关的问题,老外那个帖子抱怨了一下AMD的驱动,也没有人给出解决方案。问题(3)也是NVMe驱动问题,搜索了一下,也没找到相关的解决方案。
经过仔细排查, 再次总结一下,以免给人以误导. 问题(3)的确是由于安装了2块Intel的NVMe SSD导致(由于2块SSD同时提交NQN请求导致,详见后面的内容),还好手头有一块三星的NVMe SSD,换上之后不再有问题(3)。但是问题(1)、(2)和(4)在升级内核后问题依然存在,刚开始还以为是UBuntu对NVMe的支持不好,但是使用SATA固态硬盘克隆系统之后,问题依然存在,所以确定不是NVMe的问题。突然想起在升级新内核的过程中提示了较多的关于firmware的警告信息,当时没有留意,也没有将警告信息保存起来。由于原来还备份了一份系统,于是使用系统备份克隆,刚开始还没有问题,可使用过程中,提示关键更新,于是就单击更新开始更新,更新完后,也看到了少量的关于firmware的警告信息,并且提示将内核升级到了4.15.0-47,同时自动将原来的4.15.0-45内核删除。再次启动,问题又出现了,并且无法进入桌面。于是确定应该是内核版本太高和firmware不匹配,不想折腾firmware,于是在rescue模式下删除新内核4.15.0-47(在启动界面直接启动旧版本4.15.0-46,仍然无法进入桌面,但是正好可以删除新内核),reboot后,没有提示错误,顺利进入桌面。 关于firware: 我没有更新firmware,一是不想再折腾,怕遇到内核版本与固件版本不匹配的情形,另外,看了一下系统中固件(/lib/firmware)中文件的时间,基本上和最新固件发布的时间相同,于是就没有更新。 |
问题(3)在Ubuntu的BUG提交网查到:https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1811755,BUG提交人看似是通过更新Linux内核版本解决了该问题。
This commit can fix your issue:
commit 6299358d198a0635da2dd3c4b3ec37789e811e44
Author: James Dingwall
Date: Tue Jan 8 10:20:51 2019 -0700
nvme: introduce NVME_QUIRK_IGNORE_DEV_SUBNQN
If a device provides an NQN it is expected to be g
commit 6299358d198a0635da2dd3c4b3ec37789e811e44
Author: James Dingwall
Date: Tue Jan 8 10:20:51 2019 -0700
nvme: introduce NVME_QUIRK_IGNORE_DEV_SUBNQN
If a device provides an NQN it is expected to be globally unique.
Unfortunately some firmware revisions for Intel 760p/Pro 7600p devices did
not satisfy this requirement. In these circumstances if a system has >1
affected device then only one device is enabled. If this quirk is enabled
then the device supplied subnqn is ignored and we fallback to generating
one as if the field was empty. In this case we also suppress the version
check so we don't print a warning when the quirk is enabled.
问题(1)~(3)的解决方案:升级Linux内核
# 看一下当前Linux内核版本
uname -sr
# Linux 4.18以后的内核依赖于libssll(>=1.1.0),到https://packages.ubuntu.com/bionic/下载libssll 1.1.0版本
wget -c http://kr.archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.0g-2ubuntu4.3_amd64.deb
# 安装libsll
sudo dpkg -i libssl1.1_1.1.0g-2ubuntu4.3_amd64.deb
# 到https://kernel.ubuntu.com/~kernel-ppa/mainline/下载比较新的内核
wget -c https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.0/linux-headers-5.0.0-050000_5.0.0-050000.201903032031_all.deb https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.0/linux-headers-5.0.0-050000-generic_5.0.0-050000.201903032031_amd64.deb https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.0/linux-modules-5.0.0-050000-generic_5.0.0-050000.201903032031_amd64.deb https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.0/linux-image-unsigned-5.0.0-050000-generic_5.0.0-050000.201903032031_amd64.deb
# 安装新内核, 按照下载的顺序依次安装
sudo dpkg -i ***.deb
# 看一下已经安装的所有内核版本
dpkg --get-selections|grep linux
# 删除孤立无用的Linux内核
sudo apt-get autoremove
# 删除特定的Linux内核版本,大概有3至4项,按照如下格式删除
sudo apt-get remove --purge linux-modules-extra-4.15.0-45-generic
# 清理缓存
sudo apt-get autoclean
# 更新grub
sudo update-grub
(4) /dev/nvme0n1p2 has unsupported feature(s): metadata_csum
e2fsck: Get a newer version of e2fsck
问题(4)的解决方案:升级e2fsck,参考博文Centos7升级最新版e2fsck
# 看一下当前e2fsck的版本
e2fsck -V
# 到https://sourceforge.net/projects/e2fsprogs/下载e2fsprogs的新版本,我下载的是1.45
wget -c https://nchc.dl.sourceforge.net/project/e2fsprogs/e2fsprogs/v1.45.0/e2fsprogs-1.45.0.tar.gz
# 解压
tar xzf e2fsprogs-1.45.0.tar.gz
# 编译
./configure
make
# 查看编译结果
cd e2fsck
./e2fsck -V
# 替换掉原来的e2fsck
sudo mv /sbin/e2fsck /sbin/e2fsck.old
sudo cp e2fsck /sbin/
# 看一下新版本
cd /
e2fsck -V
于是就针对/dev/nvme0n1p2校验和问题来解决,使用Boot-repair启动盘启动,然后使用e2fsck /dev/nvme0n1p2检查,并未发现问题。于是就使用Boot-repair修复grub(Note: 修复时不要按照默认的设置修复,要先根据自己的需要修改一下高级选项),修复完成后,尽管校验和问题依然存在,但是UBuntu能够顺利进入桌面。可却带来了新的问题:
(5)无法上网,尽管网络连接显示正常。(当时是病急乱投医,其实无需修复Grub,这是后话)
简单搜索了一下说是修改DNS,网上也提供了几种方法,尽管这几种方法都说解决了上网问题,可是我没有这样做。看到一个帖子提到了要修改/etc/resolv.conf,于是查看该文件,首先发现该文件并不是/run/resolconf/resolv.conf文件的符号链接,打开该文件,其中的nameserver被修改为127.0.0.53,本来应该是127.0.0.1,而/run/resolconf/resolv.conf文件中的nameserver仍然是127.0.0.1。
于是重命名/etc/resolv.conf,然后创建/run/resolconf/resolv.conf的符号链接: ln -s /run/resolconf/resolv.conf /etc/resol.conf。重启网络服务,或者注销重新登录,不能上网问题得以解决。但是不知道/etc/resolv.conf是为何被修改。
后记:
grub修复后能够进入桌面实际上是一种假象,再次重启则会遭遇多次无法进入桌面的情形。查了一些资料,基本上了解到是因为安装了2块Intel的760P SSD,同时提交NQN请求,导致系统忽略其请求,因此无法识别到SSD(因为有时也会提示无法找到UUID=XXXX的硬盘),因此,还是通过升级Linux内核来解决这个问题。
(1)由于Linux 4.16.4后的的内核都依赖于较高版本的libssll(>=1.1.0),记得要下载1.1.0版本的libssll,不要下载1.1.1版本,因为1.1.1版本libssl依赖于高版本的libc(>=2.27),很显然,这个依赖如果解决不好将会带来更复杂的问题。
(2)因为主板有2个M.2 NVMe接口,因此就买了2块Intel的760P SSD,这个SSD虽然性能不出色(看openbenchmarking的测试),但是价格相对便宜,据说较为稳定,并且质保5年。一块装WIndows10,一块装Ubuntu。WIndows 10自然没有问题,但是Ubuntu 16.04(我没有重新安装,而是通过系统迁移的方法将原来的安装好的系统迁移到SSD)却问题多多,想享受NVMe带来的优势看来并不简单,这个问题困扰了我将近1个星期,还好查到资料,知道问题原因。现在基本解决,但是有老外反映说是可能并不能完全解决NQN的问题,只是减少了NQN警告的几率。