本文詳細介紹了在CentOS系統(tǒng)中進行內(nèi)核替換和制作自定義ISO鏡像的步驟和注意事項。
首先,介紹了在替換內(nèi)核過程中可能遇到的各種錯誤,并提供了解決方法,如處理vmlinuz權限問題、initrd.img加載失敗、內(nèi)核模塊體積過大等。接著,給出了制作ISO鏡像的步驟,包括將原生ISO內(nèi)容復制到磁盤、制作initrd.gz(或initrd.img)和kernel-xxx.rpm等操作。同時,提供了Anaconda安裝日志及相關信息的查看方法。本文適用于需要定制CentOS系統(tǒng)安裝過程或進行內(nèi)核升級的用戶,提供了一份詳細的操作指南。
各臨時路徑說明
將內(nèi)核解包在/root/kernel/linux-4.14.141
原生ISO文件內(nèi)容復制到/ISO/
將initrd解包在/root/initrd/
將內(nèi)核模塊安裝在/root/modinstall
將squashfs解包在/root/,rootfs.img會在/root/squash-root/LiveOS/rootfs.img
過程中遇到的錯誤與解決方法
vmlinuz沒有增加執(zhí)行權限。
initrd.img無法被加載,改用gzip進行壓縮,修改isolinux/isolinux.cfg中的initrd.img為initrd.gz。
initrd.img體積龐大,有兩種解決辦法,一是在編譯內(nèi)核時用make modules_install INSTALL_MOD_STRIP=1 INSTALL_MOD_PATH=/root/modinstall,build ko的時候會加上–strip-debug,這樣會讓build出的ko大小大幅縮小;二是編譯完成后,在lib/modules/中執(zhí)行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文件,但這種方式需要修改的內(nèi)容較多,容易找不到文件,故采取另一種方式;另一種方法是直接使用make rpm-pkg -j64。
genisoimage命令的選項-b使用錯誤(-b后面應該跟引導鏡像isolinux.bin)導致isolinux.cfg變成了二進制文件,所以無法引導系統(tǒng)。
squashfs.img和initrd.gz中的lib/modules/4.14.141必須一致,否則進入anaconda安裝界面會報錯。
如果修改了Packages里的包,一定要執(zhí)行createrepo命令,根據(jù)comps.xml重新生成repodata,否則最終安裝kernel的rpm時會報錯error populating transaction。
系統(tǒng)安裝進入dracut的可能原因是沒有找到光盤介質(zhì),在grub.cfg中的inst.stage2=hd:LABEL=后面的名稱一定要和genisoimage的-V參數(shù)后面的名稱相同。
其他可能失敗的解決方法
可以通過修改.vmx配置文件或啟動虛擬機時選擇打開電源時進入固件來進入BIOS設置,選擇光盤為第一啟動項,不過一般不會是這個原因。
如果內(nèi)核rpm缺少依賴拋出kernel panic,rpm -qpR kernel-xxx.rpm查看依賴,修改/root/kernel/linux-4.14.141/scripts/package下的mkspec腳本,make rpm-pkg時,會調(diào)用到該腳本來生成內(nèi)核RPM的SPEC文件,PreReq表示依賴類型為install前,這樣就能先于內(nèi)核rpm安裝依賴。
替換內(nèi)核全過程
編譯內(nèi)核
$ 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 # 使用系統(tǒng)中的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
掛載系統(tǒng)ISO并復制ISO內(nèi)容到磁盤
$ mkdir /mnt/cdrom /ISO $ mount -o loop /root/CentOS-xxx.iso /mnt/cdrom $ rsync -a /mnt/cdrom/ /ISO/ --exclude=repodata/ # 后續(xù)通過createrepo命令生成repodata $ find /ISO/ -name TRANS.TBL -exec rm -f {} \; -print # 或者在上一步加上--exclude=TRANS.TBL參數(shù)
制作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.img $ cp -r /root/modinstall/lib/modules/4.14.141/ /root/initrd/lib/modules/ $ rm -rf /root/initrd/lib/modules/3.10.x # 刪除ISO中原來版本的內(nèi)核模塊目錄 $ find ./ | cpio --quiet -H newc -o | gzip -9 -c >../initrd.gz # 如果使用xz -z打包,文件名就為initrd.img,系統(tǒng)安裝時會自動判斷為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 # 內(nèi)核文件的權限必須至少是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
然后定義內(nèi)核文件、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 # 根據(jù)原來的squashfs.img設置參數(shù) $ cp newsquashfs.img /ISO/LiveOS/squashfs.img
制作comps.xml,生成repodata
$ cp /mnt/cdrom/repodata <隨機值>-comps.xml /ISO/comps.xml # 如果新增了包,要修改該文件,替換內(nèi)核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
執(zhí)行該命令使ISO能寫入U盤被BIOS引導,否則只能通過DVD等引導:
$ isohybrid centos7.iso
安裝系統(tǒng)
anaconda安裝日志
可以參考:
2、Anaconda安裝與配置(Python環(huán)境及庫依賴)
3、【Anaconda安裝與環(huán)境配置教程】文章來源:http://www.zghlxwxcb.cn/article/750.html
一般性的anaconda消息anaconda.log,由anaconda運行的所有外部程序信息anaconda.program.log,可擴展的存儲模塊信息anaconda.storage.log,網(wǎng)絡接口配置相關信息anaconda.ifcfg.log,yum安裝軟件包的信息anaconda.yum.log,硬件相關的系統(tǒng)信息anaconda.syslog。注意如果系統(tǒng)安裝失敗,則這些文件的信息會一起放在一個anaconda-tb-identifier文件中,這里identifier是一個隨機字符串。文章來源地址http://www.zghlxwxcb.cn/article/750.html
到此這篇關于Linux Centos 內(nèi)核替換與ISO制作詳細指南的文章就介紹到這了,更多相關內(nèi)容可以在右上角搜索或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!