10 KiB
制作700版升级内核的4.2系统镜像
在最新42发布版的基础上,更换系统环境和光盘环境的内核为2.6.32.700
出一版单独的700版内核安装盘。
1 准备工作
1.1 环境及制作工具准备
60操作系统。(在60系统上制作镜像)
创建workdir工作目录。创建镜像内容目录cd。
mkdir workdir
cd workdir
mkdir cd
制作镜像的工具:mk_iso_4.2.sh (注意:脚本中的所涉及的文件及命令,自行安装。)
cat workdir/mk_iso_4.2.sh
#!/bin/bash
# shiftwidth=4 tabstop=4
isopath="$1"
output="$2"
/opt/xorriso -as genisoimage -r -checksum_algorithm_iso md5,sha1 -V `cat ${isopath}/tag| cut -b1-32` -o ${output} -J -isohybrid-mbr /usr/lib/syslinux/isohdpfx.bin -partition_offset 16 -J -cache-inodes -b boot/isolinux/isolinux.bin -c boot/isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table $isopath
1.2 制作所需的包及基础盘
-
最新的42发布版镜像。(在60系统上制作镜像)
-
修改过的udev164安装包。(修改包中的启动脚本,在start末尾添加创建/dev/shm)
if [ ! -d /dev/shm ];then
mkdir --mode=755 /dev/shm
fi
;;
*)
修改sbin/start_udev脚本(修改脚本最后两行,164中没有udevtrigger和udevsettle)
/sbin/udevadm trigger
/sbin/udevadm settle
- 最新编译的700版内核包:
编译内核会生成6个包,3个系统环境的内核包、3个光盘环境的内核包。(kernel-image/kernel-header/kernel-source 其中内核制作及修改后续会有记录)
此六个内核包,光盘环境和系统环境区别只有序列号的添加与否。系统环境需要全装,光盘环境建议只安装kernel-image即可。
- 内核对应的linux-firmware
此包为linx6.0.76上的kernel-firmware-2.6.32-696.el6.noarch.rpm,解压后重新打包为linux-firmware#20180326-x86_64-linx-Rocky4.2.pkg.tar.gz
2 镜像修改制作
为便于查看修改及便于理解,建议只在workdir目录下进行工作。
准备好的workdir下的目录及文件:
cd
mnt
mk_iso_4.2.sh
rocky6.0.42.41-x86_64-security-20171028.iso
./base/kernel-image#2.6.32.700-x86_64-linx-Rocky4.2.pkg.tar.gz
./base/kernel-source#2.6.32.700-x86_64-linx-Rocky4.2.pkg.tar.gz
./base/kernel-header#2.6.32.700-x86_64-linx-Rocky4.2.pkg.tar.gz
./security/linux-firmware#20180326-x86_64-linx-Rocky4.2.pkg.tar.gz
./security/kernel-image#2.6.32.700-x86_64-linx-Rocky4.2.pkg.tar.gz
./security/kernel-source#2.6.32.700-x86_64-linx-Rocky4.2.pkg.tar.gz
./security/kernel-header#2.6.32.700-x86_64-linx-Rocky4.2.pkg.tar.gz
udev#164-x86_64-linx2-Rocky4.2.pkg.tar.gz
2.1 光盘环境修改
2.1.1 准备光盘环境
mount rocky6.0.42.41-x86_64-security-20171028.iso ./mnt -oloop
cp ./mnt/. ./cd -R
2.1.2 更换光盘环境和系统环境包
- 替换系统环境内核、udev164、linux-firmware及删掉update-drivers包(此包对应原内核,与此内核不匹配)。
rm cd/Rocky/packages/kernel-*
rm cd/Rocky/packages/udev#*
rm cd/Rocky/packages/linux-firmware#*
rm cd/Rocky/packages/update-drivers#*
cp security/kernel-* cd/Rocky/packages/
cp security/linux-firmware#* cd/Rocky/packages/
cp udev#164* cd/Rocky/packages/
删除update-drivers包需要同时修改安装程序中的安装此包的列表。
需要修改的位置如下,修改时注意格式(可能要调下空行)。
usr/lib/new_install/xml$ grep update-drivers *
dependency.xml: <package group="base" install="mandatory" iso_env="install" layer="above_floor" name="update-drivers" sys_env="install" version="20140806">
install_cfg.xml:<package name='update-drivers'/>
install_cfg.xml: <including install='mandatory' package='update-drivers'/>
install-d5000.xml: <package name='update-drivers'/>
install.xml: <package name='update-drivers'/>
- 替换光盘环境包
换udev
chroot到光盘环境下、pkgrm掉要替换的包
pkgrm udev
pkgadd Rocky/packages/udev#164...
换内核
退出chroot,删除光盘环境下的内核安装目录及文件,然后需要解压base/kernel-image#...拷贝需要的内核文件及目录到到光盘环境下。
rm /boot/config-* kernel_src_info isolinux/initrd.img isolinux/vmlinuz isolinux/System.map
rm /lib/modules/2.6.32.41-Rocky4.2-x86_64 -rf
rm /usr/src/linux-2.6.32.41
tar -xf base/kernel-image#... -C base/ki
cp base/ki/boot/config* cd/boot
cp base/ki/boot/kernel_src_info cd/boot
cp base/ki/boot/System.map-2.6.32.700... cd/boot/isolinux/System.map
cp base/ki/boot/initrd-2.6.32.700... cd/boot/isolinux/initrd.img
cp base/ki/boot/vmlinuz-2.6.32.700... cd/boot/isolinux/vmlinuz
cp base/ki/lib/modules/2.6.32.700... cd/lib/modules/ -ra
换linux-firmware
直接将linux-firmware包解压,然后拷贝解压的目录lib/firmware覆盖到cd/lib/firmware
2.1.3 修改initrd及安装程序
- initrd的修改内容
添加usb驱动,(发现usb口无法使用,键盘无反应u盘没认到)
将光盘环境的usb驱动添加到initrd中。
cd cd/boot/isolinux/
mkdir work
cd work
gunzip -cd ../initrd.img | cpio -iumd
cp ../../../lib/modules/2.6.32.700-Rocky4.2-x86_64/kernel/drivers/usb/* ./lib/modules/2.6.32.700-Rocky4.2-x86_64/kernel/drivers/usb/ -ra
depmod -a -b ./ 2.6.32.700-Rocky4.2-x86_64
修改udev规则及拷贝udev164的cdrom_id到lib/udev下(此项待确定)。新加的init脚本中调用local时,里面有创建cdrom软链接,此处创建规则暂不添加,待测。(已测,可不添加)
local中添加扫描确认镜像文件的脚本内容,此块内容为在41系统的initrd中找到并修改后添加的。local中的修改diff:
diff -Nurp /0327/b/ki/boot/work/scripts/functions ./scripts/functions
--- /0327/b/ki/boot/work/scripts/functions 2018-03-26 10:32:28.000000000 +0800
+++ ./scripts/functions 2018-04-11 16:45:10.000000000 +0800
@@ -6,6 +6,11 @@ _log_msg()
printf "$@"
}
+log_info_msg()
+{
+ _log_msg "Infomation: $@\n"
+}
+
log_success_msg()
{
_log_msg "Success: $@\n"
diff -Nurp /0327/b/ki/boot/work/scripts/local ./scripts/local
--- /0327/b/ki/boot/work/scripts/local 2018-03-26 10:32:28.000000000 +0800
+++ ./scripts/local 2018-04-13 16:14:37.000000000 +0800
@@ -50,6 +50,67 @@ pre_mountroot()
/sbin/usplash_write "TIMEOUT 15" || true
fi
fi
+
+ local check_flag="false"
+ mkdir -p /.tmpfs/.cdrom
+ if [ "${ROOT}" == "/dev/cdrom" ]; then
+ #echo "**********************************"
+ #echo "Locating cdrom for installing"
+ #echo "**********************************"
+ CDROM_DEVICES="`grep 'drive name:' /proc/sys/dev/cdrom/info | cut -d: -f2`"
+ for DEV in $CDROM_DEVICES
+ do
+ DEV="/dev/$DEV"
+ mount -r -t iso9660 $DEV /.tmpfs/.cdrom 2>&1 > /dev/null
+ if [ $? -eq 0 ]
+ then
+ if [ -e /.tmpfs/.cdrom/tag ]
+ then
+ ln -sf $DEV /dev/cdrom
+# REAL_ROOT="${ROOT}"
+ check_flag="true"
+ umount /.tmpfs/.cdrom
+ rm /.tmpfs -rf
+ break
+ fi
+ else
+ check_flag="false"
+ log_warning_msg "try to mount cdrom: /dev/$DEV failed."
+ fi
+ done
+ fi
+ # check usb disk
+ if [ "${check_flag}" == "false" ];then
+
+ cat /proc/modules | grep usb_storage
+ if [ 0 != $? ];then
+ modprobe usb-storage 2>&1 > /dev/null
+ fi
+
+ USB_DEVICES=$(list-devices usb-partition)
+ for DEV in $USB_DEVICES;do
+ if mount -r -t iso9660 $DEV /.tmpfs/.cdrom;then
+ if [ -e /.tmpfs/.cdrom/tag ]; then
+# REAL_ROOT="${DEV}"
+ ROOT="${DEV}"
+ check_flag="true"
+ umount /.tmpfs/.cdrom
+ rm /.tmpfs -rf
+ break
+ else
+ check_flag="false"
+ fi
+ log_warning_msg "$DEV on usb disk is not rocky 4.2 iso."
+ else
+ check_flag="false"
+ log_warning_msg "try to mount cdrom on usb disk: $DEV failed."
+ fi
+ done
+ fi
+ # Get the root filesystem type
+ if [ "${check_flag}" == "false" ]; then
+ panic "ALERT! root device: ${REAL_ROOT} does not exist. Dropping to a shell!"
+ fi
# We've given up, but we'll let the user fix matters if they can
while [ ! -e "${ROOT}" ]; do
@@ -113,6 +174,10 @@ mountroot()
mount ${roflag} ${ROOTFLAGS} ${ROOT} ${rootmnt}
fi
+# if ! mount ${roflag} ${REAL_ROOT} ${rootmnt};then
+# panic "MOUNT ERROR! mount ${roflag} ${REAL_ROOT} ${rootmnt}. Dropping to a shell."
+# fi
+
[ "$quiet" != "y" ] && log_begin_msg "Running /scripts/local-bottom"
run_scripts /scripts/local-bottom
[ "$quiet" != "y" ] && log_end_msg
local中添加的内容,调用list-devices脚本,从41原镜像中拷贝到bin下
- 修改安装程序中的udev命令
udev164中没有udevinfo的命令,修改udevinfo为 udevadm info cd/usr/lib/new_install/operation/functions
关于内核过大需要stripped
initrd stripped
cd/boot/isolinux/work/lib/modules/2.6.32.700-Rocky4.2-x86_64/kernel# find -name *.ko | while read f;do strip --strip-debug $f;done
cd/boot/isolinux/work# depmod -a -b ./ 2.6.32.700-Rocky4.2-x86_64
光盘环境stripped
root@linx:/0327/cd/lib/modules/2.6.32.700-Rocky4.2-x86_64/kernel# find -name *.ko | while read f;do strip --strip-debug $f;done
root@linx:/0327/cd/lib/modules/2.6.32.700-Rocky4.2-x86_64/kernel# cd ../..
root@linx:/0327/cd/lib/modules# ls
2.6.32.700-Rocky4.2-x86_64
root@linx:/0327/cd/lib/modules# cd ../..
root@linx:/0327/cd# depmod -a -b ./ 2.6.32.700-Rocky4.2-x86_64