赞
踩
环境 | 配置 |
---|---|
物理环境 | 系统:macOS12.2.1 架构:M1 |
虚拟机环境 | UTM虚拟机工具 系统:ubuntu20.04.3 Focal Fossa桌面 架构:aarch64 |
cubic安装参考链接:https://launchpad.net/cubic
https://www.jianshu.com/p/1f10e9a9e3a3
sudo apt-add-repository universe
sudo apt-add-repository ppa:cubic-wizard/release
sudo apt update
sudo apt install --no-install-recommends cubic
2.1 左下角菜单打开cubic,然后设置构建目录。如下图
2.2 点击下图1处,选择基础镜像,其他必要的内容会自动生成并填充,然后点击下图2处进入虚拟环境终端开始定制。如下图
官网下载太慢?选择华为镜像源https://repo.huaweicloud.com/ubuntu-cdimage/releases/22.10/release/ubuntu-22.10-live-server-arm64.iso
2.3 定制内核vmlinuz和临时根文件系统initrd,将/boot目录下的vmlinuz-5.10.0(自己编译的)和initrd.img-5.10.0复制进虚拟环境终端。如下图。其他应用可以通过apt-get 安装来定制。
2.4 选择vmlinuz-5.10.0和initrd.img-5.10.0。如下图
2.5 选择压缩方式,然后生成,然后等待生成完毕。如下图
2.6 生成在之前定义的构建路径(我的在/home/yison/CUBIC),如下图
问题1:内核恐慌并打印信息RAMDISK: Couldn’t find valid RAM disk image starting at 0
原因1:内核无法识别initrd
分析1:内核选项没有开启ext2文件系统支持
参考链接:https://news.68idc.cn/mobilesys/other/20160929631837.html
解决办法1:重新make编译内核,勾选ext2文件系统支持,然后make install安装。如下图
***************************************************************************************************
问题2:内核恐慌并打印信息Begin: Mounting root file system … /init: .: line 287: can’t open ‘/scripts/casper’: No such file or directory。如下图
原因2:initrd中执行init程序时报的错,似乎是找不到initrd中的/scripts/casper
分析2:
(1)尝试什么都不加,不定制内核和initrd,测试是可以引导启动的!也就是说在initrd加载到内存后,执行init程序时找不到scripts/casper。解开原镜像和定制镜像的initrd对比一下scripts目录的内容。
(2).1 挂载原镜像
mount ubuntu-22.10-live-server-arm64.iso /cdrom/
(2).2 解开原镜像的initrd到目录initrd_ori,压缩格式:Zstandard compressed data (v0.8+)
cp /cdrom/casper/initrd /home/yison/initrd.zst
zstdcat -d initrd.zst|cpio -ivd -D initrd_ori
(2).3 解开本机/boot目录的initrd.img-5.10.0,压缩格式:LZ4 compressed data (v0.1-v0.9)
lz4cat -d /boot/initrd.img-5.10.0|cpio -ivd -D initrd_5.10
发现定制initrd没有casper相关目录和文件。
(2).4 复制capser相关目录和文件,然后重新生成initrd
cp -r initrd_ori/scripts/casper* initrd_5.10/scripts/
find initrd_5.10/.|cpio -c -o > initrd.img
lz4 --best initrd.img initrd.img-5.10.0
(2).5 然后再次使用CUBIC定制镜像,然后通过UTM安装失败!似乎修改initrd就会报错Couldn’t find valid RAM disk image starting at 0
(3).6 接着尝试不修改initrd,在grub引导选项按"e"编辑boot参数:删除boot=casper。进入initramfs shell,提示No root device specified. Boot arguments must include a root= parameter。如下图
(3).7 尝试增加grub参数 “loglevel=7 debug"然后启动进入initramfs shell,发现根目录下多了casper.vars、casper.log文件和cow目录,查看casper.log文件,发现panic '/cow format specified as '”‘“‘overlay’”’"’ and no support found。如下图
但查看内核发现overlay模块是M;而且查看initrd内容也发现存在overlay.ko;并且在initramfs shell 执行modprobe overlay也没报错,因此不应该触发后面的panic呀!!。
解决办法2:
修改复制到/etc/initramfs-tools/scripts/的casper脚本,注释panic,如下图
重新生成initrd并重新定制iso,成功引导安装。如下2图
***************************************************************************************************
问题3: 安装过程出错An error occurred during installation。如下图
原因3:切到"View full report"查看,发现报错less: /lib/aarch64-linux-gnu/libc.so.6: version `GLIBC_2.33’ not found (required by less)
分析3:我是在ubuntu20.04.3下制作的initrd(用的是20.04的lib目录的库),而该系统libc版本是2.31;定制的ubuntu20.10.0;可能是这个问题。
解决3:将定制的ISO改为20.04.3;复制20.04.3的capser相关目录和文件;修改/etc/initramfs-tools/scripts/的casper脚本,注释panic,没这个报错了!
***************************************************************************************************
问题4:安装过程又出错An error occurred during installation。
原因4:但这次我点击"Close report",接着点击"View full log"发现信息DM multipath kernel driver not loaded。如下图
分析4:看样子是关于设备多路径映射的驱动木有,沃日!我查看5.10.0的modules目录发现有dm-multipath.ko,那就只是initrd里没有啰。
解决4:修改/etc/initramfs-tools/modules,增加dm-multipath,重新生成initrd,重新生成iso。引导安装成功!!!如下图
***************************************************************************************************
问题5:引导安装完定制ISO后,重新启动系统进入initramfs shell报错Volume group “ubuntu-vg” not found。如下图
原因5:看报错就是没有识别到逻辑卷ubuntu-vg。
分析5:在grub2传递参数"loglevel=7 debug"。发现debug信息在/run/initramfs/initramfs.debug。如下图
通过debug信息发现了几个亮点rootdelay、modules。如下图
解决5
在内核源码先执行make modules_install安装版本内核模块,再执行make install安装内核并生成inirtd。
问题6
内核源码执行make install,update-initramfs时报错:Error 24 : Write error : cannot write compressed block
分析6
/boot分区不够
原因6
源码安装内核模块,默认未去掉调试符号,导致生成的initrd体积1.4G,超出boot容量。
解决6
安装执行如下
sudo make INSTALL_MOD_STRIP=1 modules_install
4.1 复制基础镜像中的所有文件到指定目录
mount ubuntu-20.04.3-live-server-arm64.iso /mnt
mkdir isoubuntu
cp -r /mnt/. isoubuntu
4.2 替换内核和对应版本的initrd(initrd制作见https://blog.csdn.net/weixin_44417500/article/details/128687462,在构建主机中的/etc/initramfs-tools/scripts目录复制iso中initrd的casper目录等文件)
cp vmlinuz-5.10.0 isoubuntu/casper/vmlinuz
cp initrd-5.10.0 isoubuntu/casper/initrd
4.3 进入isoubuntu目录,执行如下命令,在上一级目录生成iso。如下图
cd isoubuntu
taskset -c 1 genisoimage -R -J -T -no-emul-boot -e boot/grub/efi.img -V "Ubuntu 20.04" -o ../ubuntu.iso .
注意:使用taskset -c 1是为了只用1个CPU执行这个程序。否则可能导致生成的iso引导时无法被识别而进入UEFI shell。
问题1:安装成功后,重新启动内核没变
分析1:改的是iso安装时内核,安装后系统使用的内核需要替换ISO的pool/main/l目录中,内核的deb文件
解决1: 内核源码编译使用make deb-pkg命令,生成内核deb文件。替换ISO中pool/main/l文件。重新生成iso。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。