共计 4971 个字符,预计需要花费 13 分钟才能阅读完成。
本文详细介绍了在 CentOS 系统中进行内核替换和制作自定义 ISO 镜像的步骤和注意事项。
首先,介绍了在替换内核过程中可能遇到的各种错误,并提供了解决方法,如处理 vmlinuz 权限问题、initrd.img 加载失败、内核模块体积过大等。接着,给出了制作 ISO 镜像的步骤,包括将原生 ISO 内容复制到磁盘、制作 initrd.gz(或 initrd.img)和 kernel-xxx.rpm 等操作。同时,提供了 Anaconda 安装日志及相关信息的查看方法。本文适用于需要定制 CentOS 系统安装过程或进行内核升级的用户,提供了一份详细的操作指南。
各临时路径说明
将内核解包在 /root/kernel/linux-4.14.141
原生 ISO 文件内容复制到 /ISO/
将 initrd 解包在 /root/initrd/
将内核模块安装在 /root/modinstall
将 squashfs 解包在 /root/,rootfs.img 会在 /root/squash-root/LiveOS/rootfs.img
过程中遇到的错误与解决方法
-
vmlinuz 没有增加执行权限。
-
initrd.img 无法被加载,改用 gzip 进行压缩,修改 isolinux/isolinux.cfg 中的 initrd.img 为 initrd.gz。
-
initrd.img 体积庞大,有两种解决办法,一是在编译内核时用 make modules_install INSTALL_MOD_STRIP=1 INSTALL_MOD_PATH=/root/modinstall,build ko 的时候会加上–strip-debug,这样会让 build 出的 ko 大小大幅缩小;二是编译完成后,在 lib/modules/ 中执行 find . -name *.ko -exec eu-strip –remove-comment {} ;
-
在 VMware 测试并不需要修改 grub.conf 或 grub.cfg,因为 VMware 用的是 ISOLINUX 引导方式,只需要修改 isolinux/isolinux.cfg 文件。
-
制作 kernel 的 rpm 有两种办法,一种是使用 rpmrebuild 修改旧版 rpm,替换里面的 vmlinuz、initrd.img,修改 SPEC 文件,但这种方式需要修改的内容较多,容易找不到文件,故采取另一种方式;另一种方法是直接使用 make rpm-pkg -j64。
-
genisoimage 命令的选项 - b 使用错误(- b 后面应该跟引导镜像 isolinux.bin)导致 isolinux.cfg 变成了二进制文件,所以无法引导系统。
-
squashfs.img 和 initrd.gz 中的 lib/modules/4.14.141 必须一致,否则进入 anaconda 安装界面会报错。
-
如果修改了 Packages 里的包,一定要执行 createrepo 命令,根据 comps.xml 重新生成 repodata,否则最终安装 kernel 的 rpm 时会报错 error populating transaction。
-
系统安装进入 dracut 的可能原因是没有找到光盘介质,在 grub.cfg 中的 inst.stage2=hd:LABEL= 后面的名称一定要和 genisoimage 的 - V 参数后面的名称相同。
其他可能失败的解决方法
-
可以通过修改.vmx 配置文件或启动虚拟机时选择打开电源时进入固件来进入 BIOS 设置,选择光盘为第一启动项,不过一般不会是这个原因。
-
如果内核 rpm 缺少依赖抛出 kernel panic,rpm -qpR kernel-xxx.rpm 查看依赖,修改 /root/kernel/linux-4.14.141/scripts/package 下的 mkspec 脚本,make rpm-pkg 时,会调用到该脚本来生成内核 RPM 的 SPEC 文件,PreReq 表示依赖类型为 install 前,这样就能先于内核 rpm 安装依赖。
替换内核全过程
编译内核
$ cd /root/kernel/
$ tar -xvJf linux-4.14.141.tar.xz # 或分两步,xz -d linux-4.14.141.tar.xz,tar -xvf linux-4.14.141.tar
$ cd linux-4.14.141
$ make mrproper
$ cp /boot/config-xxx ./.config # 使用系统中的 config 文件
$ yum install -y ncurses-devel bc flex ...
$ make menuconfig # 要选择 XFS 相关功能
$ make bzImage -j8 && make modules -j8 && make modules_install INSTALL_MOD_PATH=/root/modinstall/ INSTALL_MOD_STRIP=1 -j8
挂载系统 ISO 并复制 ISO 内容到磁盘
$ mkdir /mnt/cdrom /ISO
$ mount -o loop /root/CentOS-xxx.iso /mnt/cdrom
$ rsync -a /mnt/cdrom/ /ISO/ --exclude=repodata/ # 后续通过 createrepo 命令生成 repodata
$ find /ISO/ -name TRANS.TBL -exec rm -f {} ; -print # 或者在上一步加上 --exclude=TRANS.TBL 参数
制作 initrd.gz(或 xz 压缩方式的 initrd.img)
$ cp /ISO/isolinux/initrd.img /root/
$ xz -d /root/initrd.img
$ mkdir /root/initrd
$ cd /root/initrd
$ cpio -ivmd ../initrd.gz # 如果使用 xz - z 打包,文件名就为 initrd.img,系统安装时会自动判断为 xz 打包方式
制作 kernel-xxx.rpm 并替换
$ make rpm-pkg -j8 # 或者按下面的操作使用 rpmrebuild 修改旧版 rpm
$ cp /root/rpmbuild/RPSS/x86/kernel-4.14.141.rpm /ISO/Packages
还有两个方法:
通过源码包和 spec 文件构建 rpm:
rpmbuild kernel.spec
通过源码包重修改:
参考我的 SRPM 重修改方法。
复制 bzImage 和 initrd.gz 到 isolinux/
$ cp /root/kernel/linux-4.14.141/arch/x86/boot/bzImage /ISO/isolinux/vmlinuz
$ chmod +x /ISO/isolinux/vmlinuz # 内核文件的权限必须至少是 755
$ cp /root/initrd.gz /ISO/isolinux/initrd.gz
修改 isolinux.cfg
$ vi isolinux.cfg
label linux
menu label ^Install CentOS 7
menu default
kernel vmlinuz
append initrd=initrd.gz inst.stage2=hd:LABEL=CentOS7
menu default 表示默认指向 Install CentOS 7
然后定义内核文件、initrd 的名字以及 ISO 的 label,该 label 和后面 genisoimage 命令的 - V 选项保持一致。
修改并替换 squashfs.img
$ cp squashfs.img /root
$ cd /root
$ unsquashfs squashfs.img
$ mkdir /rootfs
$ mount squashfs-root/LiveOS/rootfs.img /rootfs
$ cp -r /root/modinstall/lib/modules/4.14.141/ /rootfs/modules/
$ rm -rf /rootfs/modules/3.10.x
$ umount /rootfs
$ unsquashfs -stat squashfs.img # 查看压缩方式和 block 大小
$ mksquashfs squashfs-root/ newsquashfs.img -comp xz -b 131072 -Xbcj x86 -Xdict-size 131072 # 根据原来的 squashfs.img 设置参数
$ cp newsquashfs.img /ISO/LiveOS/squashfs.img
制作 comps.xml,生成 repodata
$ cp /mnt/cdrom/repodata -comps.xml /ISO/comps.xml # 如果新增了包,要修改该文件,替换内核 rpm 包不需要修改该文件
$ cd /ISO
$ createrepo -g comps.xml . # 否则 Packages 会校验失败,报 error populating transaction 错误
制作 ISO 镜像
$ genisoimage -joliet-long -V CentOS7 -o centos7.iso -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -R -J -v -cache-inodes -T -eltorito-alt-boot -b images/efiboot.img -no-emul-boot /ISO # -eltorito-alt-boot -e images/efiboot.img -no-emul-boot 用于 EFI 引导模式
如果没有 ISOLINUX 引导,只使用 EFI 引导:
$ genisoimage -joliet-long -V CentOS7 -o centos7.iso -b EFI/BOOT/grubaa64.efi -c boot.catalog -no-emul-boot -boot-load-size 4 -boot-info-table -R -J -v -cache-inodes -T -eltorito-alt-boot -e images/efiboot.img -no-emul-boot /ISO
执行该命令使 ISO 能写入 U 盘被 BIOS 引导,否则只能通过 DVD 等引导:
$ isohybrid centos7.iso
安装系统
anaconda 安装日志
可以参考:
2、Anaconda 安装与配置(Python 环境及库依赖)
3、【Anaconda 安装与环境配置教程】 文章来源:https://www.toymoban.com/diary/share/750.html
一般性的 anaconda 消息 anaconda.log,由 anaconda 运行的所有外部程序信息 anaconda.program.log,可扩展的存储模块信息 anaconda.storage.log,网络接口配置相关信息 anaconda.ifcfg.log,yum 安装软件包的信息 anaconda.yum.log,硬件相关的系统信息 anaconda.syslog。注意如果系统安装失败,则这些文件的信息会一起放在一个 anaconda-tb-identifier 文件中,这里 identifier 是一个随机字符串。 文章来源地址 https://www.toymoban.com/diary/share/750.html
到此这篇关于 Linux Centos 内核替换与 ISO 制作详细指南的文章就介绍到这了, 更多相关内容可以在右上角搜索或继续浏览下面的相关文章,希望大家以后多多支持 TOY 模板网!
原文地址:https://www.toymoban.com/diary/share/750.html
如若转载,请注明出处:如若内容造成侵权 / 违法违规 / 事实不符,请联系站长进行投诉反馈,一经查实,立即删除!