当前位置: 首页 > news >正文

自定义含工具包`Ubuntu22.04.5.iso`镜像

image.png
我有一个梦想,有一个自己改版ISO镜像,可以用来作为离线挂载的离线镜像源,安装makegccgit等开发者工具,而不需要去一个一个依赖进行安装,还不一定能安装上,就用对应版本的操作系统作为私有镜像源。本着不浪费原则,将这个打包过程分享出来。

下载基底 ISO 镜像

下载官方桌面端系统操作系统镜像文件。

https://releases.ubuntu.com/jammy/ubuntu-22.04.5-desktop-amd64.iso

用户目录创建ubuntu-dev-iso-work

mkdir ubuntu-dev-iso-work

移动镜像到ubuntu-dev-iso-work下。

mv ubuntu-22.04.5-desktop-amd64.iso ./ubuntu-dev-iso-work/ubuntu-22.04.5-desktop-amd64.iso

安装依赖

安装xorriso

sudo apt install -y xorriso

查看版本。

xorriso -version
xorriso 1.5.4 : RockRidge filesystem manipulator, libburnia project.

创建脚本

平级目录下创建构建脚本dev-iso-build.sh

touch dev-iso-build.sh

目录如下:

./
../
dev-iso-build.sh
ubuntu-dev-iso-work/ubuntu-22.04.5-desktop-amd64.iso

编辑脚本。

vi dev-iso-build.sh

进入编辑模式,添加内容如下,保存并退出(脚本内容主要为AI生成,笔者进行了改造和问题修复)。

#!/bin/bash
set -e# ================== 配置 ==================
ORIG_ISO_URL="https://releases.ubuntu.com/22.04.5/ubuntu-22.04.5-desktop-amd64.iso"  # ← 修复1: 删除URL末尾空格
ORIG_ISO_NAME="ubuntu-22.04.5-desktop-amd64.iso"
CUSTOM_ISO_NAME="ubuntu-22.04-dev-nogui.iso"
WORK_DIR="$HOME/ubuntu-dev-iso-work"  # ← 修复2: 不要直接用 $HOME(避免污染主目录)
OUTPUT_DIR="$PWD/output"
OUTPUT_ISO="$OUTPUT_DIR/$CUSTOM_ISO_NAME"
# 创建目录
mkdir -p "$WORK_DIR" "$OUTPUT_DIR"
# ================== 1. 下载原始 ISO(如果不存在) ==================
if [ ! -f "$WORK_DIR/$ORIG_ISO_NAME" ]; thenecho "📥 下载 Ubuntu 22.04.5 Desktop ISO..."wget -O "$WORK_DIR/$ORIG_ISO_NAME" "$ORIG_ISO_URL"
elseecho "✅ 原始 ISO 已存在,跳过下载。"
fi
# ================== 2. 提取 ISO ==================
echo "📦 提取 ISO 内容..."
rm -rf "$WORK_DIR/extracted"
xorriso -osirrox on \-indev "$WORK_DIR/$ORIG_ISO_NAME" \-extract / "$WORK_DIR/extracted"
# 验证 squashfs 存在
if [ ! -f "$WORK_DIR/extracted/casper/filesystem.squashfs" ]; thenecho "❌ 错误:filesystem.squashfs 未找到!"ls -l "$WORK_DIR/extracted/casper/" 2>/dev/null || echo "casper/ 目录不存在"exit 1
fi
# ================== 3. 修复提取目录权限(关键!) ==================
echo "🔧 修复提取目录权限(避免后续所有权限问题)..."
chmod -R u+w "$WORK_DIR/extracted"
chattr -R -i "$WORK_DIR/extracted" 2>/dev/null || true
# ================== 4. 解压文件系统 ==================
echo "📦 解压 filesystem.squashfs..."
sudo unsquashfs -f -d "$WORK_DIR/extracted/casper/filesystem" \"$WORK_DIR/extracted/casper/filesystem.squashfs"
# ================== 5. 准备 chroot 环境 ==================
ROOTFS="$WORK_DIR/extracted/casper/filesystem"
# 挂载虚拟文件系统
sudo mount --bind /dev "$ROOTFS/dev"
sudo mount --bind /proc "$ROOTFS/proc"
sudo mount --bind /sys "$ROOTFS/sys"
sudo mount --bind /run "$ROOTFS/run"
# ================== 6. 在 chroot 中定制系统 ==================
echo "⚙️ 定制 Live 系统:移除 GUI,安装开发工具..."
sudo chroot "$ROOTFS" sh -c "set -e# 更新并安装开发工具apt updateapt install -y build-essential git vim curl wget htop# 移除桌面环境(保留基础终端)apt remove -y --purge ubuntu-desktop gnome-shell gdm3 xserver-xorg* \libreoffice* thunderbird firefox snapd# 清理无用依赖apt autoremove -y# 清理缓存(减小体积)apt cleanrm -rf /var/lib/apt/lists/*rm -rf /tmp/*
"
# ================== 7. 卸载虚拟文件系统 ==================
sudo umount "$ROOTFS/dev" "$ROOTFS/proc" "$ROOTFS/sys" "$ROOTFS/run"
# ================== 8. 重建 squashfs 并清理 ==================
echo "🔄 重建 filesystem.squashfs..."
# 删除旧 squashfs(现在已有写权限)
rm -f "$WORK_DIR/extracted/casper/filesystem.squashfs"
sudo mksquashfs "$WORK_DIR/extracted/casper/filesystem" \"$WORK_DIR/extracted/casper/filesystem.squashfs" \-comp xz -e boot -processors $(nproc)
# ⚠️ 关键:删除解压目录,防止 ISO 膨胀!
echo "🧹 清理解压的 filesystem 目录..."
sudo rm -rf "$WORK_DIR/extracted/casper/filesystem"
# 验证清理成功
if [ -d "$WORK_DIR/extracted/casper/filesystem" ]; thenecho "❌ 错误:filesystem 目录未删除!"exit 1
fi
# ================== 9. 更新 md5sum ==================
cd "$WORK_DIR/extracted"
rm -f md5sum.txt
find . -type f -print0 | xargs -0 md5sum | grep -v "md5sum.txt" > md5sum.txt
# ================== 10. 重建 ISO(Ubuntu 22.04+ Desktop 正确参数) ==================
echo "💿 生成自定义 ISO..."
# 验证引导文件存在
if [ ! -f boot/grub/i386-pc/eltorito.img ] || [ ! -f EFI/boot/bootx64.efi ]; thenecho "❌ 引导文件缺失!"ls -l boot/grub/i386-pc/ 2>/dev/null || echo "boot/grub/i386-pc/ 不存在"ls -l EFI/boot/ 2>/dev/null || echo "EFI/boot/ 不存在"exit 1
fi
xorriso -as mkisofs \-r -V "Ubuntu-22.04-Dev-NoGUI" \-J -joliet-long \-l \-b boot/grub/i386-pc/eltorito.img \-no-emul-boot \-boot-load-size 4 \-boot-info-table \-eltorito-alt-boot \-e EFI/boot/bootx64.efi \-no-emul-boot \-isohybrid-gpt-basdat \-o "$OUTPUT_ISO" \.echo "✅ 自定义 ISO 已生成: $OUTPUT_ISO"
ls -lh "$OUTPUT_ISO"

执行脚本构建

添加执行权限。

chmod +x dev-iso-build.sh

执行脚本进行构建,若构建成功,输出如下:

xorriso : UPDATE :  3.01% done
xorriso : UPDATE :  59.48% done
ISO image produced: 1603677 sectors
Written to medium : 1603677 sectors at LBA 0
Writing to 'stdio:/home/<username>/output/ubuntu-22.04-dev-nogui.iso' completed successfully.

本地挂载镜像

在一个内网镜像Ubuntu 22.04.5 操作系统中,查看make命令,make: 表示对应环境变量检索目录中不存在make 命令。

whereis make
make:

本地上传构建的镜像ubuntu-22.04-dev-nogui.iso,笔者上传目录为/home/ggcy/ubuntu-22.04-dev-nogui.iso

ll /home/ggcy/ubuntu-22.04-dev-nogui.iso
-rw-r--r-- 1 ggcy ggcy 3284330496 Sep 29 03:44 /home/ggcy/ubuntu-22.04-dev-nogui.iso

本地创建挂载点。

sudo mkdir /media/cdrom

挂载镜像。

 sudo mount /home/ggcy/ubuntu-22.04-dev-nogui.iso /media/cdrom
mount: /media/cdrom: WARNING: source write-protected, mounted read-only.

查看挂载路径内容。

ll /media/cdrom/
total 100
dr-xr-xr-x 1 root root  2048 Sep 29 03:44 ./
drwxr-xr-x 3 root root  4096 Sep 30 22:35 ../
dr-xr-xr-x 1 root root  2048 Sep 11  2024 .disk/
dr-xr-xr-x 1 root root  2048 Aug 14  2024 EFI/
dr-xr-xr-x 1 root root  2048 Aug 14  2024 boot/
-r--r--r-- 1 root root  2048 Sep 29 03:44 boot.catalog
dr-xr-xr-x 1 root root  2048 Sep 29 03:44 casper/
dr-xr-xr-x 1 root root  2048 Sep 11  2024 dists/
dr-xr-xr-x 1 root root  2048 Sep 11  2024 install/
-r--r--r-- 1 root root 77007 Sep 29 03:44 md5sum.txt
dr-xr-xr-x 1 root root  2048 Sep 11  2024 pool/
dr-xr-xr-x 1 root root  2048 Sep 11  2024 preseed/
lr-xr-xr-x 1 root root     1 Sep 29 03:39 ubuntu -> ./

备份本地原有软件源配置,对于ubuntu来说,软件源配置在/etc/apt/sources.list 中。

sudo mv /etc/apt/sources.list /etc/apt/sources.list.bak

创建新的软件源配置。

sudo vi /etc/apt/sources.list

配置内容如下,插入模式添加后退出编辑并保存。

deb file:///media/cdrom jammy main restricted

更新软件源:

$ sudo apt update
Get:1 file:/media/cdrom jammy InRelease
Ign:1 file:/media/cdrom jammy InRelease
Get:2 file:/media/cdrom jammy Release [1072 B]
Get:2 file:/media/cdrom jammy Release [1072 B]
Get:3 file:/media/cdrom jammy Release.gpg [833 B]
Get:3 file:/media/cdrom jammy Release.gpg [833 B]
Get:4 file:/media/cdrom jammy/main amd64 Packages [38.5 kB]
Ign:4 file:/media/cdrom jammy/main amd64 Packages
Get:5 file:/media/cdrom jammy/restricted amd64 Packages [640 B]
Ign:5 file:/media/cdrom jammy/restricted amd64 Packages
Get:4 file:/media/cdrom jammy/main amd64 Packages [38.5 kB]
Get:5 file:/media/cdrom jammy/restricted amd64 Packages [640 B]
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
All packages are up to date.

安装make

sudo apt install make
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Suggested packages:make-doc
The following NEW packages will be installed:make
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 0 B/180 kB of archives.
After this operation, 426 kB of additional disk space will be used.
Get:1 file:/media/cdrom jammy/main amd64 make amd64 4.3-4.1build1 [180 kB]
Selecting previously unselected package make.
(Reading database ... 42578 files and directories currently installed.)
Preparing to unpack .../make_4.3-4.1build1_amd64.deb ...
Unpacking make (4.3-4.1build1) ...
Setting up make (4.3-4.1build1) ...
Processing triggers for man-db (2.10.2-1) ...

查看位置和版本。

whereis make
make: /usr/bin/make /usr/share/man/man1/make.1.gz

查看版本。

make --version
GNU Make 4.3
Built for x86_64-pc-linux-gnu
Copyright (C) 1988-2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

如果需要去除挂载,可以直接使用umount 进行卸载,并需要恢复之前的sources.list配置。

sudo umount /media/cdrom

至此,本地封装自己的操作系统镜像与软件源本地挂载介绍完成。

http://www.dtcms.com/a/427341.html

相关文章:

  • Day 29 - 密码管理器开发 - Python学习笔记
  • Docker镜像结构全解析
  • ubuntu 22.04安装CUDA 13.0
  • 鸿蒙NEXT Wi-Fi扫描开发指南:从基础到实战
  • wordpress做的学校网站北京网页设计公司
  • 精读 C++20 设计模式:行为型设计模式——观察者模式
  • 广州营销型网站建设旅游网站内容规划特点
  • 【mdBook】6 在持续集成中运行 mdbook
  • Jenkins安装并与GitLab集成,实现dev、qa、uat、prod多分支持续集成的详细步骤
  • k8s部署前后分离架构微服务——跨域和缓存问题
  • 临沂网站建设推荐wordpress 评论倒序
  • MyBatis Plus注解 @TableField
  • 石家庄建设工程招标办网站成都网站推广公司
  • 【C#避坑实战系列文章16】性能优化(CPU / 内存占用过高问题解决)
  • JavaScript性能优化实战:从指标到落地的全链路方案
  • 上海网站优化加盟网站建设的公司开发
  • 网站怎么发布到服务器青岛不错的网站公司
  • linux0.11学习之启动主线要点(一)
  • Invoke-customs are only supported starting with Android O (--min-api 26)
  • 安卓基础组件014--button圆角 背景色 边框
  • 【Android】浅谈kotlin协程应用
  • 比价网站源码整站程序梦幻西游网页版app
  • dz做网站虚拟主机可以干什么
  • Windows10,11自带的Hyper-V虚拟机开启及使用方法
  • QCustomPlot 系列总结:从入门到精通的完整指南与资源整理
  • RK3566鸿蒙开发板规格书Purple Pi OH
  • 大模型落地深水区:企业 AI 转型的实践路径与价值突破
  • 金顺广州外贸网站建设图片模板网站
  • LinuxC++——etcd-cpp-api精简源代码函数参数查询参考
  • [特殊字符]️ Spring Cloud Eureka 三步通:搭建注册中心 + 服务注册 + 服务发现,通俗易懂!