惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Cisco Talos Blog
Cisco Talos Blog
Cyberwarzone
Cyberwarzone
T
Tenable Blog
Security Latest
Security Latest
NISL@THU
NISL@THU
V
Vulnerabilities – Threatpost
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
W
WeLiveSecurity
罗磊的独立博客
Stack Overflow Blog
Stack Overflow Blog
云风的 BLOG
云风的 BLOG
Martin Fowler
Martin Fowler
Engineering at Meta
Engineering at Meta
T
Tor Project blog
H
Heimdal Security Blog
Microsoft Security Blog
Microsoft Security Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
雷峰网
雷峰网
L
LINUX DO - 热门话题
The GitHub Blog
The GitHub Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Recorded Future
Recorded Future
Hugging Face - Blog
Hugging Face - Blog
P
Privacy & Cybersecurity Law Blog
F
Full Disclosure
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
PCI Perspectives
PCI Perspectives
MyScale Blog
MyScale Blog
B
Blog RSS Feed
www.infosecurity-magazine.com
www.infosecurity-magazine.com
K
Kaspersky official blog
Attack and Defense Labs
Attack and Defense Labs
H
Hackread – Cybersecurity News, Data Breaches, AI and More
有赞技术团队
有赞技术团队
Know Your Adversary
Know Your Adversary
Hacker News - Newest:
Hacker News - Newest: "LLM"
Scott Helme
Scott Helme
The Last Watchdog
The Last Watchdog
博客园 - 【当耐特】
S
Security Affairs
The Cloudflare Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
人人都是产品经理
人人都是产品经理
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
N
News and Events Feed by Topic
AI
AI
H
Help Net Security
美团技术团队
T
Threatpost
Project Zero
Project Zero

Razeen`s Blog

Let's Encrypt 推出 Gen Y 根证书架构:揭示 Web PKI 的五大未来趋势 通过 Wi-Fi 自动备份你的 iPhone 到 Nas 管理培训感悟:从技术视角看管理之路 UPS 一拖多:保护你的 NAS 和 Linux 服务器 从影音中心到 AI 助手:我的50款 Homelab 服务清单 从SSL证书有效期将缩短到47天聊开去 部署一个自己的 Running Page 谈谈特斯拉 Model Y 用车一年的感受和费用分析 弃用 Disqus 评论,使用自建 Waline 使用 Prometheus 和 Grafana 搭建你的证书监控面板 改善信息来源, 利用 RSS 高效获取资讯 (RSShub + Reeder5 + WeWe RSS) 多种 Docker 镜像拉取解决方案与实践 App分享 | AppCleaner - Mac上的卸载神器 Azure OpenAI API 申请和使用 如何开通 OneKey 虚拟信用卡,并充值消费 如何拥有一个可长期在国内使用的国外手机号码 分享开通 ChatGPT Plus 过程 如何开通 Depay 虚拟信用卡,并充值消费 如何开通欧易Web3钱包, 交易入账 如何5分钟内1块钱注册 ChatGPT 如何注册美区的 Apple ID (2023年/无需科学上网) NAS折腾记(11): NASTool3.0体验和降级 NAS折腾记(10): Docker版本的NASTool配置 NAS折腾记(9): NASTool与微信交互,微信发送消息远程下载电影【多图】 NAS折腾记(8):群晖安装 NASTool 实现影音半自动化【多图】 内网穿透(2):Tailscale 组网实现内网穿透,操作简单,无成本 内网穿透(1):总结了11中内网穿透的方式,总有一种适合你 NAS折腾记(7):从零开始设置(黑)群晖系统 NAS折腾记(6):黑群晖系统安装好后怎么洗白? NAS折腾记(5):群晖硬盘休眠设置与分析 NAS折腾记(4): 20分钟手把手带你完美安装 DS918+ 黑群晖7.1.1 NAS折腾记(3):NAS 装机 NAS折腾记(2):B360-ITX 双M.2 双2.5G网口 6 SATA主版 开箱 NAS折腾记(1):328元的4盘位Nas机箱开箱 Openwrt + Clash 全局科学上网 Newifi3 刷入 OpenWrt 固件 v21.02 利用 Markdown 画一些流程图、时序图、甘特图等 Homelab(8): 搭建自用 Gitlab 与 Docker 仓库 Nginx Tcp 转发保留客户端真实 IP (PROXY Protocol) Homelab (7):IPSec VPN(基于证书认证)客户端设置 Homelab (6): 基于自签发证书的 IPSec VPN 搭建 Homelab (5): DDNS 动态域名解析 Homelab (4): Linux 服务器基础环境准备 Homelab (3): 整体网络与基础硬件介绍 Go学习笔记(十)老项目迁移 go module 大型灾难记录 Github Actions 初体验之自动化部署 Hexo 博客 记一次 Nginx DNS 缓存导致转发问题 Homelab (2): 电信悦me网关修改桥接模式,路由器拨号 Homelab (1):5分钟上手黑群晖 NAS 终极 Bash 脚本指南 Typora 自动上传图片到七牛云 Ubuntu 20.04 LTS 有线网卡驱动安装 折腾 Ubuntu 20.04 LTS 开发环境 Go学习笔记(九) 计时器的生命周期[译] 利用 git hook 规范你的代码与 commit message 规范 git commit message 与自动化版本控制 超详细 vim 配置 (with MacVim) Golang 中的 RESTful API 最佳实践 折腾服务器(开篇) 我的第一台个人服务器 Newifi3 实现低成本家庭级科学上网 Go学习笔记(八) | 使用 os/exec 执行命令 如何用 Go 调用 Windows API Mac OS 自动根据 WI-FI 名字改变网络位置 关于 Docker 清理 MIME Types 速查表 Go学习笔记(七) | 理解OAuth 2.0并实现一个客户端 我又又又把博客迁移了 Go学习笔记(六) | 使用swaggo自动生成Restful API文档 Go学习笔记(五) | 使用代码片段(snippets)提高编码效率 书单 - 2018 IPFS 初体验,利用 IPFS 托管你的静态网站 记一次 PostgreSQL LIKE 索引优化,联合字段 LIKE 查询优化。 Disqus 添加有趣的 Reactions 的功能 TLS 1.3 详解 (RFC 8446解读) gRPC在Go中的使用(三)gRPC实现TLS加密通信与流模式 gRPC在Go中的使用(二)gRPC实现简单通讯 gRPC在Go中的使用(一)Protocol Buffers语法与相关使用 CentOS 安装 tshark 抓包工具 Go学习笔记(四) | win上使用VSCode搭建Go开发环境 日常 Postgres 数据库点滴记录 简单了解 PKCS 规范 美食篇 | DIY戚风蛋糕(烤箱做蛋糕) Go学习笔记(三) | 怎么写Go基准测试(性能测试) TLS1.3正式更新,为Nginx添加TLS1.3的支持 一次诡异的数据库删除 GitHub Pages自定义域名开启HTTPS 证书透明度是什么?它是怎么工作的? Go学习笔记(二) | 我对 recover 的一点误解 搭建证书透明度(certificate-transparency)日志服务之从入门到放弃 修复远程登陆 Centos 时,出现 UTF-8 Warning HTTPS篇之SSL握手过程详解 Go学习笔记(一) | postgres与golang点点滴滴 AWS 命令行界面(aws-cli)从安装到快速上手 数字证书分类及怎么区分各类数字证书 常用 linux 命令小结(一)文件目录操作 云服务器搭建 hexo 博客,git hooks自动更新 SSH 免密登陆, SSH Config 配置 Golang CGO Mac 交叉编译 Windows 使用 goose 让数据库迁移更加轻松 开始使用Ghost
服务器迁移记:一次磁盘换板引发的Linux分区与挂载的学习
2024-08-19 · via Razeen`s Blog

今天给 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:

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

    或者

  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 文件的语法是否正确:
    • 如果这个命令没有报错,那么你可以重启系统来测试更改是否有效。
  7. 重启系统:

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

请注意,编辑 /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的时代。