Intel 760P NVMe SSD安裝UBuntu 16.04 所遇到的問題

使用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後,沒有提示錯誤,順利進入桌面。
     在這過程中找到幾個有用的網站:
    https://pkgs.org/, you can search all packages of linux
    https://kernel.ubuntu.com/~kernel-ppa/, kernels of Ubuntu
    https://mirrors.kernel.org/, a mirror web for kernels of linux
    https://packages.ubuntu.com/, pakages of ubuntu
    https://launchpad.net/ubuntu/+source/linux-firmware, firmware for ubuntu
    http://ftp.sjtu.edu.cn/, mirror web for linux

關於firware:
    硬件越來越複雜,硬件的許多功能使用了程序實現,與直接硬件實現相比,固件擁有處理複雜事物的靈活性和便於升級、維護等優點。固件(firmware)就是這樣的一段在設備硬件自身中執行的程序,通過固件標準驅動程序才能實現特定機器的操作,如:光驅、刻錄機等都有內部的固件。來自於博文(Linux設備模型firmware(固件): https://blog.csdn.net/u014379540/article/details/52496647),也可以看看另外一篇博文(如何在 Linux 上安裝/更新 Intel 微碼固件 | Linux 中國:https://blog.csdn.net/F8qG7f9YD02Pe/article/details/79472688)
    如何更新firmware:
    sudo apt-get update
    sudo apt-get install linux-firmware

    我沒有更新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 <email address hidden>
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 <email address hidden>
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警告的機率。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章