ISO loopback升级安装ubuntu24.04,避免制作启动U盘

举报
黄生 发表于 2026/02/25 18:41:26 2026/02/25
【摘要】 我现在安装有ubuntu20.04和win10双系统,使用ubuntu的grub启动的。现在我需要将ubuntu20.04更新到ubuntu24.04,但不希望制作和使用启动U盘,如何做?一种ds给出的办法是用 sudo do-release-upgrade 升级2次,从 20.04 -> 22.04 -> 24.04。因为不能直接从 20.04 跳到 24.04,需要分两步走。但这个办法有...

我现在安装有ubuntu20.04和win10双系统,使用ubuntu的grub启动的。现在我需要将ubuntu20.04更新到ubuntu24.04,但不希望制作和使用启动U盘,如何做?一种ds给出的办法是用 sudo do-release-upgrade 升级2次,从 20.04 -> 22.04 -> 24.04。因为不能直接从 20.04 跳到 24.04,需要分两步走。

但这个办法有些繁琐。我有一个想法,就是下载ubuntu24.04的ISO文件,然后使用当前已有的grub来启动这个iso进行安装,并且在安装时,保留我的/home分区不格式化(因为我所有的个人数据都在/home下),然后使用一个不同的用户名安装,这样原数据存在备份可以查看。特别需要注意的是:iso文件如果存放在/根分区,那么在安装的过程中这个/根分区会被格式化,导致iso文件访问不了,导致过程异常,因此iso要放到/home分区。

整体思路

  1. 下载Ubuntu 24.04 ISO文件(6个G,最好检查校验和保证文件一致性)
  2. 配置GRUB添加ISO启动项
  3. 从ISO启动安装程序
  4. 手动分区,保留原/home分区不格式化
  5. 使用新用户名安装,原数据作为备份

完整步骤如下(部分步骤略过):

第二步:配置GRUB添加ISO启动项

  1. 编辑GRUB自定义配置 /etc/grub.d/40_custom

  2. 在文件末尾添加以下内容

menuentry "Ubuntu 24.04 ISO" {
    insmod part_gpt
    insmod ext2
    insmod loopback
    insmod iso9660
    set isofile="/iso/ubuntu-24.04.4-desktop-amd64.iso"
    loopback loop (hd0,5)$isofile
    linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$isofile quiet splash
    initrd (loop)/casper/initrd
}

⚠️ 重要:需要修改硬盘分区号

  • (hd0,5)中的数字需要根据你的实际情况修改
  • 查看存放ISO的/home分区。例如:如果显示/dev/sda6,则写(hd0,6);如果显示/dev/nvme0n1p5,则写(hd0,gpt5)
  1. 更新GRUB配置
sudo update-grub

第三步:重启并进入ISO启动。

如果ISO启动失败

  • 检查分区号是否正确
  • 尝试在GRUB菜单中按e编辑启动项,按tab可以提示分区里的文件名称

第四步:安装Ubuntu 24.04。重点是分区时,原/home分区不要格式化!其他Linux分区大小和挂载点等都保持原样,进行格式化即可。

第五步:安装后的数据访问

重启后,你将进入全新的Ubuntu 24.04系统,使用新用户名登录。

附录一:

Ubuntu Live Server (约3GB) - "极简主义"为什么小很多?

  1. 无图形界面:只有命令行
  2. 最小化软件包:只包含服务器运行必需的核心组件
  3. 无预装应用:需要什么自己装
  4. 无多媒体支持:不包含音视频解码器
  5. 最小化驱动:只保留服务器必需的驱动

附录二:
GRUB配置的含义:

整体结构

menuentry "Ubuntu 24.04 ISO" {
    # 这里面的内容是启动项的具体配置
}
  • menuentry:定义一个GRUB启动菜单项
  • "Ubuntu 24.04 ISO":显示在GRUB菜单中的名称

模块加载部分

  • insmod part_gpt:加载GPT分区表支持模块(识别GPT分区格式的硬盘)
  • insmod ext2:加载ext2/3/4文件系统模块(读取Linux分区)
  • insmod loopback:加载回环设备模块(这是关键!允许把ISO文件虚拟成一个光驱)
  • insmod iso9660:加载ISO9660文件系统模块(读取光盘/ISO文件格式)

为什么要加载这些模块?
因为GRUB启动时还没有加载Linux内核,它需要自己具备识别硬盘、分区、文件系统的能力。

ISO文件定位

set isofile="/iso/ubuntu-24.04.4-desktop-amd64.iso"
  • set isofile=:定义一个变量,存储ISO文件的路径

回环设备创建(核心部分)

loopback loop (hd0,5)$isofile
  • loopback:创建回环设备的命令
  • loop:给这个回环设备命名为"loop"
  • (hd0,5):指定硬盘和分区
    • hd0:第一块硬盘
    • 5:第五个分区
    • 意思是:从第一块硬盘的第五个分区读取文件
  • $isofile:上面定义的ISO文件路径

完整意思是:把iso文件虚拟成一个光驱设备,命名为"loop"

Linux内核加载

linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$isofile quiet splash
  • linux:指定要加载的Linux内核文件
  • (loop)/casper/vmlinuz
    • (loop):上面创建的回环设备(虚拟光驱)
    • /casper/vmlinuz:ISO文件里面的内核文件路径
  • boot=casper:告诉内核以"casper"模式启动(Ubuntu Live环境的启动模式)
  • iso-scan/filename=$isofile:告诉Live系统ISO文件的位置,方便后续访问
  • quiet splash:启动参数
    • quiet:减少启动时的文字输出
    • splash:显示开机动画

初始化内存盘加载

initrd (loop)/casper/initrd
  • initrd:指定初始化内存盘文件(Initial RAM Disk)
  • (loop)/casper/initrd:从虚拟光驱中加载initrd文件
  • initrd包含了启动初期需要的驱动和工具

整个流程

  1. GRUB启动 → 加载必要的模块
  2. 找到ISO文件 → 根据指定的分区和路径
  3. 虚拟光驱 → 把ISO文件当作一个光盘设备
  4. 加载内核 → 从虚拟光驱中读取Linux内核
  5. 加载initrd → 从虚拟光驱中读取初始化内存盘
  6. 启动Live系统 → 进入Ubuntu Live环境

附录三:
40_custom的内容如下

#!/bin/sh
exec tail -n +3 $0
#This file provides an easy way to add custom menu entries.  Simply type the
#menu entries you want to add after this comment.  Be careful not to change
#the 'exec tail' line above.

第一部分:Shebang和exec技巧

#!/bin/sh
exec tail -n +3 $0
  • #!/bin/sh:声明这个文件要用shell解释器执行
  • exec tail -n +3 $0:用tail命令重新执行这个文件本身
    • tail -n +3:从第3行开始输出文件内容(跳过前两行)
    • $0:代表这个文件自身
    • exec:用tail命令替换当前进程

实际效果:当这个文件被执行时,它会输出从第3行开始的内容,而不是执行其中的命令。

第二部分:注释说明

# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.

这是给用户的说明文字,告诉你:

  1. 这个文件是用来添加自定义启动项的
  2. 把自定义菜单项写在注释后面
  3. 不要修改上面的exec tail

当运行update-grub命令时,系统会:

  1. 执行/etc/grub.d/目录下的所有可执行脚本
  2. 这些脚本会输出GRUB配置内容
  3. 所有输出被合并成最终的/boot/grub/grub.cfg

关键点

  • /etc/grub.d/40_custom是一个可执行脚本
  • 它通过exec tail -n +3 $0把自己变成一个"输出文件内容"的工具
  • 你写的menuentry实际上是数据,不是要执行的命令

这种grub扩展机制的设计有几个优点:

  1. 安全性:即使脚本被意外执行,也不会破坏系统
  2. 简单性:用户只需要添加文本,不需要懂shell编程
  3. 一致性:与其他GRUB脚本的输出格式保持一致

看看其他GRUB脚本是如何工作的:

  • /etc/grub.d/10_linux:复杂的shell脚本,自动检测内核并生成启动项
  • /etc/grub.d/30_os-prober:检测其他操作系统(如Windows)
  • /etc/grub.d/40_custom:简单的文本输出,供用户自定义

附录四:
如果显示/dev/sda6,则写(hd0,6);如果显示/dev/nvme0n1p5,则写(hd0,gpt5)
这是两种不同的命名系统

  1. Linux设备命名
# 传统SATA/IDE硬盘
/dev/sda    # 第一块硬盘
/dev/sda1   # 第一块硬盘的第一个分区
/dev/sda6   # 第一块硬盘的第六个分区

# NVMe固态硬盘
/dev/nvme0n1    # 第一块NVMe硬盘
/dev/nvme0n1p1  # 第一块NVMe硬盘的第一个分区
/dev/nvme0n1p5  # 第一块NVMe硬盘的第五个分区
  1. GRUB设备命名(需要转换的)
# 传统SATA硬盘 (可以是mbr,也可以是gpt分区)
(hd0)      # 第一块硬盘
(hd0,1)    # 第一块硬盘的第一个分区
(hd0,6)    # 第一块硬盘的第六个分区

# NVMe硬盘 (注意 NVMe硬盘总是gpt分区)
(hd0,gpt1)     # 第一块硬盘的GPT分区表的第一个分区
(hd0,gpt5)     # 第一块硬盘的GPT分区表的第五个分区

为什么有这种区别?历史原因:MBR vs GPT分区表

1. MBR分区表(传统)

# MBR分区规则:
- 主分区:1-4
- 逻辑分区:5+
- GRUB用数字直接表示:(hd0,1)(hd0,4)是主分区,(hd0,5)以上是逻辑分区

2. GPT分区表(现代)

# GPT分区规则:
- 没有主分区和逻辑分区的区别
- 所有分区统一编号:1,2,3,4,5...
- GRUB需要明确指定使用GPT: (hd0,gpt1)(hd0,gpt128)

如何确定应该用哪种格式?一个简单方法是检查分区表类型

# 查看硬盘分区表类型
sudo fdisk -l /dev/sda

# 输出中会显示:
# Disk label type: dos    → MBR分区表(用数字)
# Disk label type: gpt    → GPT分区表(用gpt前缀)
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。