一开始我以为这是个很快的事,做系统盘、分区、安装,然后等大功告成。直到我折腾了几天依旧卡在分区这一步且仍然没有发现问题的所在后,我觉得事情并不如最初想的那么简单。

简单说一下问题所在:我的电脑装了两块固态硬盘,型号都是 Intel 720p,第一块 256G 装的 Win10,第二块 512G,我想把 Ubuntu 装在第二块上。前面制作系统盘的过程就省略了(这里可以介绍一下 YUMI 这个工具,支持制作多重引导启动盘。注意 UEFI 启动的一定要选择 UEFI 版本的,不要选择 MBR 版本的)。问题来了,当我进入手动分区这一步时,无论试多少次,总是只能看到其中一块硬盘,大概率是第一块,即 /dev/nvme0n1p*,而第二块硬盘无法显示。这样的话,系统就装不了了!

原因排查

网上搜了半天依旧无果,后来冷静了下,打算看看系统日志会不会有什么发现。通过dmesg命令果然发现了猫腻所在:第二块硬盘因为某种原因被安装自检程序自动忽略移除了!

ignoring ctrl due to duplicate subnqn

顺着这条线索,我查到了这篇帖子 X1 Extreme: only one of the two SSDs is loaded,简单来说,这是由于两块 NVMe SSD 先后提交了相同的 NQN,导致系统默认舍弃掉后提交 NQN 的硬盘,故而给人一种无法识别第二块硬盘的假象

那么其中的 NQN 是什么呢?

NVMe Qualified Names (NQNs) are used to uniquely describe a host or NVM subsystem for the purposes of identification and authentication. The NVMe Qualified Name for the NVM subsystem is specified in the Identify Controller data structure. An NQN is permanent for the lifetime of the host or NVM subsystem.

There are two supported NQN formats. The first format may be used by any organization that owns a domain name. This naming format may be used to create a human readable string to describe the host or NVM subsystem. This format consists of:

  • The string “nqn.”
  • A date code, in “yyyy-mm.” format. This date shall be during a time when the naming authority owned the domain name used in this format. The date code uses the Gregorian calendar. All digits and the dash shall be included.
  • The reverse domain name of the naming authority that is creating the NQN.
  • A colon (:) prefixed string that the owner of the domain name assigns that does not exceed the maximum length. The naming authority is responsible to ensure that the NQN is worldwide unique

The second format may be used to create a unique identifier when there is not a naming authority or there is not a desire for a human readable string. This format consists of:

  • The string “nqn.”
  • The string “2014-08.org.nvmexpress:uuid:”.
  • A 128-bit UUID based on the definition in RFC 4122 represented as a string formatted as “11111111-2222-3333-4444-555555555555”.

洋洋洒洒一大篇,概括来说,NQN 就是用来唯一标识 NVMe 设备的一种数据结构。NQN 有两种格式,一种形如:nqn.2014-08.com.example:nvme:nvm-subsystem-sn-d78432nqn.2014-08.com.example:nvme.host.sys.xyz;另一种形如:nqn.2014-08.org.nvmexpress:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6。上图系统使用的就是第二种形式,但无论使用哪一种,最重要的一点就是 NQN 必须要保持唯一性。遗憾的是,对于 Intel 760p/Pro 7600p 这几款 NVMe SSD,它们并没有保证这一点

所以,这既是内核的 bug,同时也是 Intel NVMe 驱动的锅。

解决方案

目前这一 bug 已经在 linux 更新版本的内核中被修复了。建议内核版本要大于4.18,因为我一开始装的 Ubuntu 18.04 默认内核是 4.18,依然会出现这个问题。后来我直接装的 Ubuntu19.04,内核版本 5.0,已经不存在这个问题了。如果想要继续使用 Ubuntu18.4 的朋友,安装前先 "try ubuntu",然后手动更新内核版本,毕竟 Ubuntu19.04 不是 LTS,到明年上半年就停止更新了。更新内核的方法网上也很容易搜到,不再赘述。

后续安装遇到的问题

添加 EFI 分区

我给 Ubuntu 分配了100G,共三个分区。除了 swap 和 ext4 挂载到根目录外,还需要添加 EFI 分区。这里 Ubuntu 的启动引导器直接选择挂载根目录的分区,我的是 /dev/nvme1n1p5。这样两块硬盘各有一个系统的引导。

分区

安装完成后,grub 的启动优先级会大于 Windows Boot Manager(也可以进入 BIOS 手动设置),同时也会自动检测到另一块硬盘上的 windows 引导。安装完成后开机就是熟悉的 Ubuntu 紫色界面,可以看到 Windows 选项也在里面。

Grub 安装失败

解决这个问题的办法就是联网安装(猜测是联网后下载补丁),否则会出现下面的问题:

grub安装失败

当时没有拍下来,图片是后来网上找的。

参考