自定义含工具包`Ubuntu22.04.5.iso`镜像
我有一个梦想,有一个自己改版ISO
镜像,可以用来作为离线挂载的离线镜像源,安装make
、gcc
、git
等开发者工具,而不需要去一个一个依赖进行安装,还不一定能安装上,就用对应版本的操作系统作为私有镜像源。本着不浪费原则,将这个打包过程分享出来。
下载基底 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
至此,本地封装自己的操作系统镜像与软件源本地挂载介绍完成。