今天给 Homelab 的主机换了个主板。为了省去重装系统与数据迁移,我直接将原来的磁盘拔下来全插到新板子上。之前操作过一次很顺利,这次却无法进入系统了。好在在 AI 的帮助下,很快折腾好了。在这过程中用 AI 来解决问题的体验很赞,不仅能够快速的定位问题、解决问题,同时也很快的学到了一些关于 Linux 分区与挂载的知识,这里记录一下。

背景

  • 原板子型号:畅网 J6413 NAS 主板 (M.2 NVME * 2 + SATA 3.0 * 6 + 2.5G * 3)
  • 换后的板子:纳斯 B365 NAS 主板 + i3-8100T (M.2 NVME *2 + SATA 3.0 * 6 + 2.5G * 2)
  • 磁盘: NVME * 2 + HDD (系统装在其中一块 NVME 上)

两块板子其实差异不是很大,只是 B365 这块支持 PCIE X16 ,扩展性好点,可以上个万兆网卡,而且可以换 CPU.

image-20240819230259420

问题1:找不到系统

在将全部的磁盘插入到新板子上,插好内存/CPU/电源后,开机。

然而理想中的 引导菜单 没有出来,直接报错

在磁盘迁移好,接入电源等,开机!好家伙,第一步就报错了,Boot Device Not Find

image-20240904062427067

这个报错前面之前遇到过,如果系统盘没啥问题,应该是启动顺序问题,没有从系统盘启动。

于是,进 BIOS 看了一下,果然没有从系统盘启动,调了一下启动顺序,再次重启。

问题2:找不到分区

再次重启,终于进入了引导菜单,选择第一个进入。

image-20240820222452234

不出意外,再次出意外了。 出现了下面的错误:

grub loading 
synoswa(5439): error during setup ioctl handler: -2 

You are in rescue mode. After logging in, type "journalctl -xb" to view system logs, "systemctl reboot" to reboot, "systemctl default" or "exit" to boot into default mode.
Press Enter for maintenance
(or press Contol-D to continue):
root@homelab:~#

这次的错误synoswa(5439): error during setup ioctl handler: -2 就超出我的知识范围了,于是AI登场了。

synoswa(5439): error during setup ioctl handler: -2 linux 启动进入紧急模式,报错这个是怎么回事

出现 “synoswa(5439): error during setup ioctl handler: -2” 错误信息通常与系统启动过程中的某些问题有关。这个错误可能是由于多种原因引起的,包括但不限于硬件问题、驱动程序问题、文件系统错误或配置错误。以下是一些可能的原因和解决方法:

  1. 文件系统错误:如果文件系统存在错误,Linux系统可能会进入紧急模式以允许系统管理员进行修复。你可以使用 fsck 命令来检查和修复文件系统错误 。
  2. /etc/fstab 文件配置错误:如果 /etc/fstab 文件中的配置不正确,比如挂载点不存在或UUID不匹配,可能会导致系统无法正常挂载文件系统,从而进入紧急模式 。
  3. 硬件或驱动问题:如果系统在启动过程中遇到硬件错误或驱动问题,比如不支持的 ioctl 命令或错误的 ioctl 使用,也可能导致系统进入紧急模式 。
  4. 系统更新或配置脚本错误:系统更新后,如果更新过程中出现问题或配置脚本存在错误,也可能导致系统启动失败 。

解决这类问题通常需要以下步骤:

  • 进入紧急模式后,首先使用 journalctl -xb 来查看系统日志,这有助于诊断问题的原因 。
  • 检查 /etc/fstab 文件,确保所有的挂载点和UUID都是正确的 。
  • 如果怀疑是文件系统错误,可以使用 fsck 命令来手动检查和修复文件系统 。
  • 如果问题与硬件或驱动有关,可能需要检查或更新相关的驱动程序,或者在BIOS/UEFI中禁用有问题的硬件选项。

如果你不熟悉这些步骤或不确定如何操作,建议在进行任何更改之前咨询专业人士或系统管理员。

从GPT的回答中,结合换磁盘这个动作,大概率定位应该是和文件系统有关。GPT最后也提供了排查步骤,那先按照操作步骤来试试。

于是在当前的恢复模式下输入密码,使用 journalctl -xb 查看启动日志,其中出现了这样的错误:

error disk '/lvmpid/xxx/xxx' not found  

再查看了一下 /etc/fstab 文件:

/dev/mapper/almaLinux-root  / xfs defaults 0 0 
UUID=113413-dadasd-asdadasd-dadasd /boot xfs defaults 0 0 
UUID=0088-A3B2 /boot/efi vfat umask=0077.shortname=wommt 0 2
/dev/mapper/almaLinux-home  /home xfs defaults 0 0 
/dev/mapper/almaLinux-swap  none swap defaults 0 0 
/dev/nvme1n1p1 /mnt/nvme2 ext4  defaults 0 0 
/dev/sda1 /mnt/sda ext4  defaults 0 0 

发现我这里的文件中,部分使用了 UUID, 部分直接指定的卷组名称,好奇这种写法也可可以么? 于是我继续追问了一下 GPT。

我的 /etc/fstab内容如下 … 其中部分没有UUID, UUID是否可以不写?

/etc/fstab 文件中,使用 UUID 是一种最佳实践,因为它提供了一种更稳定和可靠的方法来识别分区,特别是在分区顺序可能变化或磁盘被替换的情况下。然而,技术上你确实可以不使用 UUID 而使用设备文件(如 /dev/sda1)来指定分区。

以下是一些关于使用和不使用 UUID 的考虑:

  1. 使用 UUID 的好处
  • 当系统启动时,UUID 允许系统准确地挂载正确的分区,即使磁盘的分区表发生变化。
  • 在多磁盘或动态磁盘环境中,使用 UUID 可以避免因分区顺序变化而导致的挂载错误。
  1. 不使用 UUID
  • 如果你确定你的系统环境是静态的,即磁盘和分区不会变化,你可以使用设备文件(如 /dev/sda1)。
  • 但是,如果你添加或移除磁盘,或者重新分区,不使用 UUID 可能会导致系统无法正确识别和挂载分区。

在你提供的 /etc/fstab 示例中,大部分条目已经使用了 UUID,这已经是一个比较安全和可靠的配置。但是,/dev/mapper/almaLinux-root/dev/nvme1n1p1/dev/sda1 这些条目没有使用 UUID,而是使用了设备文件或卷组名称。

如果你决定不使用 UUID,你需要确保:

  • 你的系统环境不会发生变化,分区顺序和磁盘设备文件(如 /dev/sda1)保持一致。
  • 你了解不使用 UUID 可能带来的风险,并准备好在系统环境变化时手动更新 /etc/fstab

建议

  • 对于 /dev/mapper/almaLinux-root 这样的 LVM 卷,通常不需要 UUID,因为 LVM 卷名是唯一的。
  • 对于物理分区(如 /dev/nvme1n1p1/dev/sda1),如果确定不会变化,可以继续使用设备文件。但最好是使用 blkid 命令来获取它们的 UUID,并在 /etc/fstab 中使用这些 UUID。

最后,如果你对 /etc/fstab 进行更改,无论是添加、删除还是修改条目,都应该在更改后进行测试,以确保系统可以正常启动和挂载所有必要的分区。

总的来说,也就是UUID是最佳实践,但如果你的系统是静态的,不对分区修改或增换磁盘的情况下,不使用UUID也是可以的。但如果你对分区顺序,磁盘设备做了变动,分区顺序没有和设备文件保持一致,那会出现问题。

这基本上就帮我定位到问题了,那么现在要做的就是补全这个UUID了。通过blkid查看一下UUID.

[root@homelab ~]# blkid
/dev/mapper/almalinux-root: UUID="5b2a641d-5c35-4c78-a9a4-7798a7f7f039" BLOCK_SIZE="512" TYPE="xfs"
/dev/nvme1n1: PTUUID="9dcdf924-16dd-4428-b4c3-f4233c37a7f1" PTTYPE="gpt"
/dev/nvme1n1p1: UUID="8A88-A3B2" BLOCK_SIZE="512" TYPE="vfat" PARTLABEL="EFI System Partition" PARTUUID="036be490-1633-4f20-8dc6-ab75978b31e3"
/dev/nvme1n1p2: UUID="1afc7fbc-eaab-4d0a-966b-b3920c3198a5" BLOCK_SIZE="512" TYPE="xfs" PARTUUID="5dfef291-170d-4ebf-894a-94f31ff7ff05"
/dev/nvme1n1p3: UUID="jW3pfe-lYkL-nGUw-G3rz-80Xf-YCNx-VP1Zy0" TYPE="LVM2_member" PARTUUID="38630270-afd0-4bba-8f46-519bb94e8214"
/dev/nvme0n1: PTUUID="a645f66c-ff6c-4716-b996-7f6fcae62097" PTTYPE="gpt"
/dev/nvme0n1p1: UUID="09492435-1637-466a-938b-63291449ff01" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="d6b4a8b4-29af-b14a-a831-c8c430551622"
/dev/sda1: UUID="5913181b-e903-4067-8394-4ae5ffb832e0" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="b4bf7d38-7c77-2d4b-9145-a367f9b37c82"
/dev/mapper/almalinux-swap: UUID="33043fe7-c007-4263-b917-00c76e3a7767" TYPE="swap"
/dev/mapper/almalinux-home: UUID="3f6e6f82-9c18-4fba-a8cf-e22d17074e71" BLOCK_SIZE="512" TYPE="xfs"

现在UUID也有了,/etc/fstab文件格式是什么规范,怎么修改呢?继续追问。

/etc/fstab 文件的格式

/etc/fstab 文件是Linux系统中用于存储文件系统信息及其挂载点的配置文件。其格式通常包括六个字段,每个字段由空格分隔。下面是每个字段的详细说明:

  1. 设备名或UUID: 指定要挂载的设备。这可以是设备文件的路径(如 /dev/sda1),也可以是设备的UUID。

  2. 挂载点: 设备挂载到的目录。这通常是绝对路径,如 //home/var 等。

  3. 文件系统类型: 指定设备的文件系统类型,如 ext4xfsvfat 等。

  4. 挂载选项: 指定挂载选项,如 defaultsro(只读)、rw(读写)、noatime(不更新访问时间戳)等。这些选项可以组合使用。

  5. Dump: 这个字段用于 dump 程序,通常设置为 010 表示不备份该分区,1 表示需要备份。

  6. Pass: 这个字段用于 fsck 程序,指定 fsck 在启动时检查文件系统的顺序。根文件系统通常设置为 1,其他分区设置为 2,不需要检查的分区设置为 0

一个典型的 /etc/fstab 文件条目可能如下所示:

UUID=1234-ABCD    /               ext4    defaults        0 1
/dev/sdb1         /home           ext4    defaults        0 2
UUID=5678-EFGH    /var            xfs     defaults,noatime  0 2
/dev/sdc1         swap            swap    defaults        0 0
/dev/sdd1         /boot           vfat    defaults        0 2
  • 第一行:根文件系统使用 UUID 挂载,文件系统类型为 ext4,具有默认挂载选项,并在启动时首先检查。
  • 第二行:/home 目录挂载自 /dev/sdb1,文件系统类型为 ext4
  • 第三行:/var 目录使用 UUID 挂载,文件系统类型为 xfs,具有默认挂载选项加上 noatime,并在启动时第二个检查。
  • 第四行:/dev/sdc1 被用作交换空间。
  • 第五行:/boot 目录挂载自 /dev/sdd1,文件系统类型为 vfat

编辑 /etc/fstab 文件时需要格外小心,因为错误的配置可能导致系统无法启动。在进行任何更改之前,建议备份原始文件。

这样下来就很清晰了,我只要将 /etc/fstab中的 /dev/mapper/almaLinux-root /dev/nvme1n1p1 等替换成对应的UUID就好了。

如何为我的这个配置文件加上UUID?

要为你的 /etc/fstab 配置文件中的条目添加 UUID,你需要首先确定每个分区的 UUID。以下是步骤:

  1. 找到分区的 UUID: 使用 blkid 命令来列出所有分区及其对应的 UUID:

    blkid
    
  2. 编辑 /etc/fstab 文件: 使用文本编辑器以 root 权限编辑 /etc/fstab 文件。你可以使用 nanovi,例如:

    nano /etc/fstab
    

    或者

    vi /etc/fstab
    
  3. 添加或更新 UUID:

    • 对于每个使用设备文件名(如 /dev/sda1/dev/mapper/almaLinux-home 等)的条目,用 blkid 命令找到相应的 UUID。
    • 将 UUID 替换到 /etc/fstab 文件中的相应行。例如,如果你发现 /dev/mapper/almaLinux-root 的 UUID 是 1234-ABCD,那么你应该将对应的行改为:
      UUID=1234-ABCD / xfs defaults 0 0
      
  4. 确保 UUID的正确性:

    • 确保你复制和粘贴的 UUID 是准确的,没有多余的空格或拼写错误。
  5. 保存并关闭编辑器:

    • nano 中,你可以按 Ctrl+O 保存更改,然后按 Ctrl+X 退出。
    • vi 中,你可以按 :wq 保存并退出,或按 :q! 放弃更改并退出。
  6. 测试 /etc/fstab 的更改:

    • 在应用更改之前,你可以使用以下命令来测试 fstab 文件的语法是否正确:
      mount -a
      
    • 如果这个命令没有报错,那么你可以重启系统来测试更改是否有效。
  7. 重启系统:

    • 如果你确定更改是正确的,并且 mount -a 命令没有报错,你可以重启系统:
      reboot
      

请注意,编辑 /etc/fstab 时要非常小心,因为错误的配置可能会导致系统无法启动。在进行更改之前,确保备份原始的 /etc/fstab 文件。如果你不确定如何操作,或者在解决问题时遇到困难,可能需要寻求专业帮助。

接着就可以修改了,这里我们有个小技巧。恢复模式下复制这种UUID不好操作,一个个字母输入太低效了。这种情况下,可以将/etc/fstab文件复制一个tmp, 将 blkid命令的结果追加到临时文件中,然后在临时文件中操作就好了。

# 复制一个临时文件
cp /etc/fstab /etc/fstab.tmp
# 将UUID等内容追加到临时文件后面,方便vi下复制
blkid >> /etc/fstab.tmp
# 编辑临时文件
vi /etc/fstab.tmp

文件编辑完,内容如下,全部将设备文件换成了UUID:

UUID=5b2a641d-5c35-4c78-a9a4-7798a7f7f039 /                       xfs     defaults        0 0
UUID=1afc7fbc-eaab-4d0a-966b-b3920c3198a5 /boot                   xfs     defaults        0 0
UUID=8A88-A3B2                            /boot/efi               vfat    umask=0077,shortname=winnt 0 2
UUID=3f6e6f82-9c18-4fba-a8cf-e22d17074e71 /home                   xfs     defaults        0 0
UUID=33043fe7-c007-4263-b917-00c76e3a7767 none                    swap    defaults        0 0
UUID=09492435-1637-466a-938b-63291449ff01 /mnt/nvme2              ext4    defaults        0  0
UUID=5913181b-e903-4067-8394-4ae5ffb832e0 /mnt/sda                ext4    defaults        0  0

然后保存,再替换文件。

# 再备份一个原文件
cp /etc/fstab /etc/fstab.bak
# 覆盖
mv /etc/fstab.tmp /etc/fstab
# 测试一下, 没报错就OK
mount -a
# 重启
reboot

之后就顺利的进入了系统,完成了本次的迁移。

总结

虽然以前遇到这种问题也能解决,但当时各种 关键词 Google, 然后打开一堆 tab, 一个个问题答案翻找,效率着实不高。当下,借助 AI,实时追问,秒出答案,快速解决问题,很高效。而且这类基础问题准确率也很高,很快能学习到相关的知识点。总之,AI得用起来,未来必定是AI的时代。