打造自定义的Ubuntu Live CD ISO
前言
最近为了儿子们上网课流畅把家里的iPad Mini 2
降级了,但是降级的条件相当苛刻,对软硬件都有要求
考虑到不是人人都有MacBook
或者黑苹果
可以用,于是有了寻找Linux
上替代方案的想法
虽然如愿找到了https://github.com/LukeZGD/iOS-OTA-Downgrader,但对普通人还是显得无从下手
最终想将远程协助软件
和降级工具
集成在一个镜像中,无论是刻盘还是做出Live USB
都相对简单很多
另外,可视化工具CUBIC
虽更简单,但在替换像initrd
这样的文件时不够灵活,所以便有了本流程介绍
需求
对新生成的ISO
有如下几点需求
- 安装
vim
,git
和Teamviewer
- 安装
bcmwl-kernel-source
以更新无线网卡驱动 - 安装
LukeZGD/iOS-OTA-Downgrader
降级工具,可选
操作
# 0. 安装工具
sudo apt install squashfs-tools genisoimage syslinux-utils -y
# 1. 复制原ISO 镜像内容
## 1.1 创建工作目录并加载ISO 镜像
cd && mkdir -p work/{orgiso,extract-cd} # 注意逗号后面不能有空格
cd ~/work && sudo mount -o loop ~/ubuntu-18.04.5-desktop-amd64.iso orgiso
## 1.2 除了filesystem.squashfs,其他文件都拷贝到extract-cd 目录,注意源目录正斜杠/ 不能少
cd ~/work && sudo rsync --exclude=/casper/filesystem.squashfs -a orgiso/ extract-cd
## 1.3 将文件系统压缩镜像filesystem.squashfs 解压到fsroot 目录下
cd ~/work && sudo unsquashfs -d fsroot orgiso/casper/filesystem.squashfs
## 1.4 卸载原ISO 镜像
sudo umount -l ~/work/orgiso # -l = lazy 设备空闲时卸载
# 2. chroot 环境准备
## 2.1 将本机的DNS 信息复制一份给chroot
sudo cp /etc/resolv.conf ~/work/fsroot/etc/
## 2.2 chroot 中绑定以下运行时目录
### 进入chroot 前
#sudo mount --bind /dev/ ~/work/fsroot/dev # 非必须
sudo chroot fsroot
### 进入chroot 后
mount -t proc none /proc # 必须
#mount -t sysfs none /sys # 非必须
#mount -t devpts none /dev/pts # 非必须
## 2.3 chroot 中设置环境变量
export HOME=/root # 必须
export LC_ALL=C # 必须
# 3. chroot 内定制化
## 3.0 更新apt 源列表
cd /etc/apt && [ -f sources.list.bak ] || cp sources.list sources.list.bak
cat > sources.list << 'EOF'
deb http://us.archive.ubuntu.com/ubuntu/ bionic main restricted
deb http://us.archive.ubuntu.com/ubuntu/ bionic-updates main restricted
deb http://us.archive.ubuntu.com/ubuntu/ bionic universe
deb http://us.archive.ubuntu.com/ubuntu/ bionic-updates universe
deb http://us.archive.ubuntu.com/ubuntu/ bionic multiverse
deb http://us.archive.ubuntu.com/ubuntu/ bionic-updates multiverse
deb http://us.archive.ubuntu.com/ubuntu/ bionic-backports main restricted universe multiverse
deb http://security.ubuntu.com/ubuntu bionic-security main restricted
deb http://security.ubuntu.com/ubuntu bionic-security universe
deb http://security.ubuntu.com/ubuntu bionic-security multiverse
EOF
apt update
## 3.1 删除不常用的软件(可选)
apt purge --autoremove libreoffice-common -y
apt purge --autoremove unity-webapps-common deja-dup -y
apt purge --autoremove thunderbird totem rhythmbox empathy brasero \
simple-scan gnome-mahjongg aisleriot gnome-mines cheese gnome-sudoku \
transmission-common gnome-orca webbrowser-app landscape-client-ui-install -y
## 3.2 安装vim、git
apt install vim git -y
## 3.3 安装Teamviewer
cd && wget https://download.teamviewer.com/download/linux/teamviewer_amd64.deb
dpkg -i teamviewer_amd64.deb ; apt install -f -y # -f = fix broken dependences
rm -rf teamviewer_amd64.deb # 删除安装包
cat > /etc/profile.d/teamviewer.sh << 'EOF'
#!/bin/bash
cp /usr/share/applications/teamviewerapi.desktop $HOME/Desktop/
chmod +x $HOME/Desktop/teamviewerapi.desktop
EOF
### 该脚本可在Live Session User (默认用户ubuntu)的桌面上创建Teamviewer 的快捷方式
## 3.4 安装LukeZGD/iOS-OTA-Downgrader
cd && git clone https://github.com/LukeZGD/iOS-OTA-Downgrader.git
cd iOS-OTA-Downgrader && sudo bash restore.sh # 主要是安装依赖和编译工具
## 3.5 安装bcmwl 驱动
apt install bcmwl-kernel-source -y
### 后面还需要拷贝initrd.img 文件配合,驱动在其里面
## 3.6 chroot 清理工作
umount -l /proc # -l = lazy,等设备不忙时立即卸载
umount -l /sys
umount -l /dev/pts
exit # 退出chroot,确保以上3 条umount 都执行过才可以退出
sudo umount -l ~/work/fsroot/dev
## 3.7 拷贝bcmwl 驱动
cd ~/work && sudo cp fsroot/boot/initrd.img*generic extract-cd/casper/initrd
### 实际上就是用包含bcmwl 驱动的initrd.img 替换原来的
# 4. 创建文件系统压缩镜像
cd ~/work && sudo mksquashfs fsroot extract-cd/casper/filesystem.squashfs
## 如果出现读取错误也是正常的,可能是chroot 下有些目录不完整,压缩程序还在运行即可
# 5. 省略掉的步骤,因为此ISO 不以安装为目的
#printf $(du -sx --block-size=1 edit | cut -f1) > extract-cd/casper/filesystem.size
#find -type f -print0 | sudo xargs -0 md5sum | grep -v isolinux/boot.cat | sudo tee md5sum.txt
# 6. 生成新ISO 镜像
cd ~/work/extract-cd &&\
sudo mkisofs -D -r -J -l \
-c isolinux/boot.cat -b isolinux/isolinux.bin \
-no-emul-boot -boot-load-size 4 -boot-info-table \
-eltorito-alt-boot -e boot/grub/efi.img -no-emul-boot \
-V "u1804m" -o ~/u1804m.iso . # 注意最后的点. 代表当前目录
## -b 指BIOS 启动,-e 指UEFI 启动,这两个参数后面都有-no-emul-boot 即非软盘引导的启动方式
## -eltorito-alt-boot 指定另一个启动文件,-V 卷标,-o 生成文件名,最后文件夹作为ISO 根目录
# 7. 转换成isohybrid 格式的可启动ISO
## 优先BIOS 启动(Macbook 启动菜单出现windows)
isohybrid ~/u1804m.iso
## 或优先UEFI 启动,推荐,(MacBook 启动菜单出现EFI Boot)
isohybrid --uefi ~/u1804m.iso
# 8. 清理工作目录
cd && sudo rm -rf work
# 8. 测试新ISO 镜像
## 使用qemu 的方式会非常慢,不推荐!!!
sudo apt install qemu-kvm libvirt-binvirtinst bridge-utils -y
qemu-system-x86_64 -cdrom ~/u1804m.iso -boot d -m 2048
## 推荐部署到U 盘上测试,参考https://blog.csdn.net/yoshubom/article/details/112554770
## 也可用dd 将iso 写到U 盘里,参考https://blog.csdn.net/db_guy/article/details/79831873
sudo fdisk -l # 查看U 盘的设备号,注意不是某个分区/dev/sdc1,而是整个设备/dev/sdc
sudo dd if=~/u1804m.iso of=/dev/sdc bs=4M # 假设U 盘是/dev/sdc
# dd --version 大于8.24 的可以使用status=progress 显示执行进度
sudo dd if=~/u1804m.iso of=/dev/sdc bs=4096 status=progress
## 之后还原U 盘还得用dd 去清除分区表信息,有时否则仅格式化U 盘是没用的
sudo dd if=/dev/zero of=/dev/sdc bs=512 count=1
## 极力推荐使用https://rufus.ie/ 的“iso 模式”写入U 盘(期间会提示下载syslinux-6.03)
## 即使用如下命令创建不指定启动文件的ISO,只要文件结构正确可以用rufus 让U 盘支持启动
sudo mkisofs -r -V 'u1804mt' -o ~/u1804mt.iso ~/work/extract-cd
## 生成的ISO 只设置了卷标,拷贝到Windows 下并打开rufus
### 设备:要写入的U 盘
### 引导类型选择,点“选择”找到u1804mt.iso
### 分区类型:MBR 目标系统类型:BIOS或UEFI
### ------ 以下全部保持默认即可 ------
### 卷标:u1804mt
### 文件系统:Fat32
### 簇大小:8192
### 点击“开始”,提示数据会丢失,“确认”即可
## 写入完毕后该U 盘即可同时支持BIOS 和UEFI 启动了
## 插入Macbook 按住Option 键开机会看到多出windows 和EFI Boot 两个启动盘
## 其中windows 是MBR 引导扇区的程序,EFI Boot 则是U 盘FAT 分区上EFI/BOOT/ 里的efi 文件
## EFI 启动盘的名称是可以改的,具体可使用bless 命令给efi 文件所在目录添加label 来实现
## sudo bless --folder "/Volumes/ESP/EFI/BOOT" --label "Windows 8.1"
参考
Live CD Customization
Ubuntu 16.04 LTS 删除不常用的软件
使用Cubic 备份或制作自定义通用型Ubuntu Live ISO 镜像
mkisofs 参数及用法详解
Linux 系统下使用dd 命令备份还原MBR 主引导记录
dd 命令显示执行进度
mkisofs 命令制作光盘ISO
Isohybrid
如何制作可启动光盘