ISO loopback升级安装ubuntu24.04,避免制作启动U盘
我现在安装有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分区。
整体思路
- 下载Ubuntu 24.04 ISO文件(6个G,最好检查校验和保证文件一致性)
- 配置GRUB添加ISO启动项
- 从ISO启动安装程序
- 手动分区,保留原/home分区不格式化
- 使用新用户名安装,原数据作为备份
完整步骤如下(部分步骤略过):
第二步:配置GRUB添加ISO启动项
-
编辑GRUB自定义配置 /etc/grub.d/40_custom
-
在文件末尾添加以下内容
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)
- 更新GRUB配置
sudo update-grub
第三步:重启并进入ISO启动。
如果ISO启动失败
- 检查分区号是否正确
- 尝试在GRUB菜单中按
e编辑启动项,按tab可以提示分区里的文件名称
第四步:安装Ubuntu 24.04。重点是分区时,原/home分区不要格式化!其他Linux分区大小和挂载点等都保持原样,进行格式化即可。
第五步:安装后的数据访问
重启后,你将进入全新的Ubuntu 24.04系统,使用新用户名登录。
附录一:
Ubuntu Live Server (约3GB) - "极简主义"为什么小很多?
- 无图形界面:只有命令行
- 最小化软件包:只包含服务器运行必需的核心组件
- 无预装应用:需要什么自己装
- 无多媒体支持:不包含音视频解码器
- 最小化驱动:只保留服务器必需的驱动
附录二:
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包含了启动初期需要的驱动和工具
整个流程
- GRUB启动 → 加载必要的模块
- 找到ISO文件 → 根据指定的分区和路径
- 虚拟光驱 → 把ISO文件当作一个光盘设备
- 加载内核 → 从虚拟光驱中读取Linux内核
- 加载initrd → 从虚拟光驱中读取初始化内存盘
- 启动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.
这是给用户的说明文字,告诉你:
- 这个文件是用来添加自定义启动项的
- 把自定义菜单项写在注释后面
- 不要修改上面的
exec tail行
当运行update-grub命令时,系统会:
- 执行
/etc/grub.d/目录下的所有可执行脚本 - 这些脚本会输出GRUB配置内容
- 所有输出被合并成最终的
/boot/grub/grub.cfg
关键点
/etc/grub.d/40_custom是一个可执行脚本- 它通过
exec tail -n +3 $0把自己变成一个"输出文件内容"的工具 - 你写的menuentry实际上是数据,不是要执行的命令
这种grub扩展机制的设计有几个优点:
- 安全性:即使脚本被意外执行,也不会破坏系统
- 简单性:用户只需要添加文本,不需要懂shell编程
- 一致性:与其他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)
这是两种不同的命名系统
- Linux设备命名
# 传统SATA/IDE硬盘
/dev/sda # 第一块硬盘
/dev/sda1 # 第一块硬盘的第一个分区
/dev/sda6 # 第一块硬盘的第六个分区
# NVMe固态硬盘
/dev/nvme0n1 # 第一块NVMe硬盘
/dev/nvme0n1p1 # 第一块NVMe硬盘的第一个分区
/dev/nvme0n1p5 # 第一块NVMe硬盘的第五个分区
- 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前缀)
- 点赞
- 收藏
- 关注作者
评论(0)