今天给 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.
问题1:找不到系统
在将全部的磁盘插入到新板子上,插好内存/CPU/电源后,开机。
然而理想中的 引导菜单 没有出来,直接报错
在磁盘迁移好,接入电源等,开机!好家伙,第一步就报错了,Boot Device Not Find
。
这个报错前面之前遇到过,如果系统盘没啥问题,应该是启动顺序问题,没有从系统盘启动。
于是,进 BIOS 看了一下,果然没有从系统盘启动,调了一下启动顺序,再次重启。
问题2:找不到分区
再次重启,终于进入了引导菜单,选择第一个进入。
不出意外,再次出意外了。 出现了下面的错误:
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” 错误信息通常与系统启动过程中的某些问题有关。这个错误可能是由于多种原因引起的,包括但不限于硬件问题、驱动程序问题、文件系统错误或配置错误。以下是一些可能的原因和解决方法:
- 文件系统错误:如果文件系统存在错误,Linux系统可能会进入紧急模式以允许系统管理员进行修复。你可以使用
fsck
命令来检查和修复文件系统错误 。/etc/fstab
文件配置错误:如果/etc/fstab
文件中的配置不正确,比如挂载点不存在或UUID不匹配,可能会导致系统无法正常挂载文件系统,从而进入紧急模式 。- 硬件或驱动问题:如果系统在启动过程中遇到硬件错误或驱动问题,比如不支持的
ioctl
命令或错误的ioctl
使用,也可能导致系统进入紧急模式 。- 系统更新或配置脚本错误:系统更新后,如果更新过程中出现问题或配置脚本存在错误,也可能导致系统启动失败 。
解决这类问题通常需要以下步骤:
- 进入紧急模式后,首先使用
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 的考虑:
- 使用 UUID 的好处:
- 当系统启动时,UUID 允许系统准确地挂载正确的分区,即使磁盘的分区表发生变化。
- 在多磁盘或动态磁盘环境中,使用 UUID 可以避免因分区顺序变化而导致的挂载错误。
- 不使用 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系统中用于存储文件系统信息及其挂载点的配置文件。其格式通常包括六个字段,每个字段由空格分隔。下面是每个字段的详细说明:
设备名或UUID: 指定要挂载的设备。这可以是设备文件的路径(如
/dev/sda1
),也可以是设备的UUID。挂载点: 设备挂载到的目录。这通常是绝对路径,如
/
、/home
、/var
等。文件系统类型: 指定设备的文件系统类型,如
ext4
、xfs
、vfat
等。挂载选项: 指定挂载选项,如
defaults
、ro
(只读)、rw
(读写)、noatime
(不更新访问时间戳)等。这些选项可以组合使用。Dump: 这个字段用于
dump
程序,通常设置为0
或1
。0
表示不备份该分区,1
表示需要备份。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。以下是步骤:
找到分区的 UUID: 使用
blkid
命令来列出所有分区及其对应的 UUID:blkid
编辑
/etc/fstab
文件: 使用文本编辑器以 root 权限编辑/etc/fstab
文件。你可以使用nano
或vi
,例如:nano /etc/fstab
或者
vi /etc/fstab
添加或更新 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
确保 UUID的正确性:
- 确保你复制和粘贴的 UUID 是准确的,没有多余的空格或拼写错误。
保存并关闭编辑器:
- 在
nano
中,你可以按Ctrl+O
保存更改,然后按Ctrl+X
退出。- 在
vi
中,你可以按:wq
保存并退出,或按:q!
放弃更改并退出。测试
/etc/fstab
的更改:
- 在应用更改之前,你可以使用以下命令来测试
fstab
文件的语法是否正确:mount -a
- 如果这个命令没有报错,那么你可以重启系统来测试更改是否有效。
重启系统:
- 如果你确定更改是正确的,并且
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的时代。