Files
documents/record-update-to-700.md
2018-04-19 09:38:38 +08:00

10 KiB
Raw Blame History

制作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 制作所需的包及基础盘

  1. 最新的42发布版镜像。在60系统上制作镜像

  2. 修改过的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
  1. 最新编译的700版内核包

编译内核会生成6个包3个系统环境的内核包、3个光盘环境的内核包。kernel-image/kernel-header/kernel-source 其中内核制作及修改后续会有记录)

此六个内核包光盘环境和系统环境区别只有序列号的添加与否。系统环境需要全装光盘环境建议只安装kernel-image即可。

  1. 内核对应的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 更换光盘环境和系统环境包

  1. 替换系统环境内核、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'/>
  1. 替换光盘环境包

换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及安装程序

  1. 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下

  1. 修改安装程序中的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