Files
documents/4.2-700-efi.md
zhang 0a40174e94 [Bug #4900] 更新4.2 700版支持efi说明文档
修改:     4.2-700-efi.md
Signed-off-by: zhang <dpzhang@linx-info.com>
2020-11-19 09:43:31 +08:00

24 KiB
Raw Permalink Blame History

4.2 700版uefi支持

700版镜像下载

rocky6.0.42.41-x86_64-security-20181101-700.iso


一、重新制作initrd.img

1.光盘initrd.img

目前光盘引导中的initrd.img为正常安装的700版本系统中的/boot/initrd.img-2.6.32.700-Rocky4.2-x86_64文件重命名

md5=3596a5ee6924547e4c19487039939693

2.initrd解压

gunzip -S .img initrd.img
cpio -vimd <initrd

3.initrd修改

1 解压后目录结构
root@Linx:/tmp/c# ls -l
总用量 31732
drwxr-xr-x 2 root root     4096  5月 23 08:08 bin
drwxr-xr-x 3 root root     4096  5月 23 08:08 conf
drwxr-xr-x 6 root root     4096  5月 23 08:08 etc
-rwxr-xr-x 1 root root     6008  9月 12 2018 init
-rw-r--r-- 1 root root 32417792  5月 23 08:04 initrd
drwxr-xr-x 5 root root     4096  5月 23 08:08 lib
drwxr-xr-x 2 root root     4096  5月 23 08:08 lib64
drwxr-xr-x 2 root root     4096  5月 23 08:08 sbin
drwxr-xr-x 6 root root     4096  5月 23 08:08 scripts
2 在bin目录添加list-devices脚本(该脚本来自于4.2 initrd)
#! /bin/sh -e
# get from debian-installer-utils list-devices-linux

TYPE="$1"

case $TYPE in
    maybe-floppy)
	#logger -t list-devices "deprecated parameter maybe-floppy"
	TYPE=floppy
	;;
    cd|disk|partition|floppy|maybe-usb-floppy|usb-partition) ;;
    *)
	echo "Usage: $0 cd|disk|partition|floppy|maybe-usb-floppy|usb-partition" >&2
	exit 2
	;;
esac

if [ ! -d /sys/block ]; then
	exit 0
fi
if type udevadm >/dev/null 2>&1; then
	device_info () {
		udevadm info -q "$1" -p "$2" 2>/dev/null
	}
elif type udevinfo >/dev/null 2>&1; then
	device_info () {
		udevinfo -q "$1" -p "$2" 2>/dev/null
	}
else
	exit 0
fi

device_name () {
	local name
	if ! name="$(device_info name "$1")"; then
		name="$(printf %s "${1##*/}" | \
			sed 's,!,/,g')"
	fi
	echo "/dev/$name"
}

is_sataraid () {
	grep -qs ^DMRAID- "$1/dm/uuid"
}

is_sataraid_partition () {
	# dmraid partitions are always slaved to another dm device
	for slave in "$1"/slaves/dm-*; do
		if [ -e "$slave" ]; then
			return 0
		fi
	done
	return 1
}

if type dmraid >/dev/null 2>&1; then
	raiddevs="$(dmraid -r -c || true)"
else
	raiddevs=
fi

# cloned-and-hacked from partman-base/init.d/parted
part_of_sataraid () {
	local raiddev
	for raiddev in $raiddevs; do
		if [ "$(readlink -f "$raiddev")" = "$1" ]; then
			return 0
		fi
	done
	return 1
}

syspaths=
scan_partition=false
case $TYPE in
    partition)
	for x in /sys/block/*/*[0-9]; do
		[ -d "$x" ] || continue
		syspaths="${syspaths:+$syspaths }$x"
	done
	for x in /sys/block/dm-*; do
		[ -d "$x" ] || continue
		(is_sataraid "$x" && is_sataraid_partition "$x") || continue
		syspaths="${syspaths:+$syspaths }$x"
	done
	TYPE=disk
	# Also allow misdetected USB devices
	scan_partition=:
	;;
    usb-partition)
	for x in /sys/block/*/*; do
		[ -d "$x" ] || continue
		syspaths="${syspaths:+$syspaths }$x"
	done
	;;
    *)
	for x in /sys/block/*; do
		[ -d "$x" ] || continue
		case $x in
		    /sys/block/dm-*)
			if is_sataraid "$x" && is_sataraid_partition "$x"; then
				continue
			fi
			;;
		    *)
			name="$(device_name "$x")"
			if part_of_sataraid "$name"; then
				continue
			fi
			;;
		esac
		syspaths="${syspaths:+$syspaths }$x"
	done
	;;
esac
for x in $syspaths; do
	devpath="${x#/sys}"
	match=false
	case $TYPE in
	    floppy)
		# TODO ugly special case for non-IDE floppies
		case $devpath in
		    /block/fd[0-9]*)
			match=:
			;;
		esac
		;;
	esac
	if ! $match && [ "$TYPE" = cd ]; then
		if device_info env "$devpath" | grep -q '^ID_CDROM='; then
			match=:
		fi
	fi
	if ! $match; then
		if device_info env "$devpath" | grep -q "^ID_TYPE=$TYPE"; then
			match=:
		fi
	fi
	if ! $match && [ "$TYPE" = disk ]; then
		case $devpath in
		    /block/cciss\!*|/block/ida\!*|/block/rd\!*|/block/mmcblk*|/block/vd[a-z]*|/block/xvd[a-z]*)
			match=:
			;;
		    /block/dm-*)
			# for now, we only understand dmraid
			if is_sataraid "/sys$devpath"; then
				match=:
			fi
			;;
		esac
	fi
	# Some USB sticks and CD drives are misdetected as floppy
	# This allows to scan for those
	if ! $match && ( $scan_partition || [ "$TYPE" = maybe-usb-floppy ] ); then
		if device_info env "$devpath" | grep -q '^ID_BUS=usb' && \
		   device_info env "$devpath" | grep -q '^ID_TYPE=floppy'; then
			match=:
		fi
	fi
	# Disk partitions, but only on USB drives
	if ! $match && [ "$TYPE" = usb-partition ]; then
		if device_info env "$devpath" | grep -q '^ID_BUS=usb' && \
		   device_info env "$devpath" | grep -q '^ID_TYPE=disk'; then
			match=:
		fi
	fi
	if $match; then
		device_name "/sys$devpath"
	fi
done

(3)修改scripts下的local文件
root@Linx:/tmp# diff -uparN b/scripts/local a/scripts/local
--- b/scripts/local 2018-09-12 01:50:47.000000000 +0000
    +++ a/scripts/local 2019-05-22 06:05:29.000000000 +0000
@@ -50,6 +50,66 @@ 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 /
    +                            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

4.initrd压缩

find . | cpio -o -H newc | gzip -9 > ../initrd.img

二、制作镜像

1.解压镜像

mount rocky6.0.42.41-x86_64-security-20181101-700.iso /mnt -o loop
mkdir cd2
cp -Ra /mnt/. ./cd2

2.替换initrd

cp initrd.img ~/cd2/boot/

3.添加分区对vfat的支持

1修改cd2/usr/lib/new_install/new_partition/interface_partition.py文件
--- /root/cd2/usr/lib/new_install/new_partition/interface_partition.py	2018-10-30 05:30:13.000000000 +0000
+++ new_partition/interface_partition.py	2019-05-07 07:48:57.000000000 +0000
@@ -326,7 +326,7 @@ def add_partition(ptype='', extended='',
    sg21 = Grid(2,1)
    typeLbl = Label("File System type:   ")
    lb_fstype = Listbox(height=3, scroll=1)
-   list_fs = ['ext2', 'ext3', 'ext4', 'linux-swap', 'raid', 'reiserfs', 'xfs', 'jfs']
+   list_fs = ['ext2', 'ext3', 'ext4', 'vfat', 'linux-swap', 'raid', 'reiserfs', 'xfs', 'jfs']
    for fs in list_fs:
    lb_fstype.append(fs, fs)
    lb_fstype.setCurrent('ext3')
2修改/root/cd2/usr/lib/new_install/text/ri_newt.py
root@Linx:~/cd/usr/lib/new_install# diff -uparN /root/cd2/usr/lib/new_install/text/ri_newt.py text/ri_newt.py
--- /root/cd2/usr/lib/new_install/text/ri_newt.py	2018-10-30 05:30:13.000000000 +0000
+++ text/ri_newt.py	2019-05-07 07:48:57.000000000 +0000
@@ -524,7 +524,7 @@ class MountPoint(Screen):
    Screen.label_mp = Label('mountpoint : ')
    Screen.label_fs = Label('File System Type : ')
    Screen.widget_label('')
-   fs_list = ['ext2','ext3', 'ext4', 'linux-swap', 'reiserfs', 'xfs', 'jfs']
+   fs_list = ['ext2','ext3', 'ext4', 'vfat', 'linux-swap', 'reiserfs', 'xfs', 'jfs']
    Screen.widget_listbox(3, *fs_list)
    Screen.widget_checkbox('Format the partition')
    Screen.listbox.setCurrent('ext3')

三、制作efi 启动文件

1.制作用于光盘启动bootx64.efi

1 在4.2系统中grub-2.02-beta2/grub-core目录下制作用于光盘启动bootx64.efi

编写grub.cfg文件用于初始化efi中的环境变量和找到根引导/boot/grub/x86_64-efi/grub.cfg文件

早期引导的grub.cfg文件如下(为解决某些机器,如c30不能自动加载grub.cfg问题)

search --file /tag --set=root
set prefix=($root)/boot/grub/x86_64-efi/
configfile $prefix/grub.cfg

制作bootx64.efi文件

../grub-mkimage  --config=grub.cfg -O x86_64-efi -d . -o bootx64.efi -p /boot/grub/x86_64-efi part_gpt part_msdos disk fat exfat ext2 ntfs xfs appleldr hfs iso9660 normal search_fs_file configfile linux linux16 chain loopback echo efi_gop efi_uga video_bochs video_cirrus file gfxmenu gfxterm gfxterm_background gfxterm_menu halt reboot help jpeg ls png true
2 拷贝efi所依赖的模块到x86_64-efi目录
mkdir x86_64-efi
cp *.mod *.lst x86_64-efi/
3在x86_64-efi目录下编写镜像启动的grub.cfg文件
set default="0"

insmod efi_gop
insmod efi_uga
insmod part_gpt
insmod ext2
insmod gettext
set root=(hd0)
search --file /tag --set=root
set timeout=5
### END /etc/grub.d/00_header ###

menuentry 'Manu Install Rocky OS 4.2' --class rocky --class gnu-linux --class gnu --class os {
            insmod part_gpt
            insmod fat
            linux /boot/isolinux/vmlinuzI instmode=Text efimode=y root=/dev/cdrom vga=791 ro
            initrd /boot/isolinux/initrd.img

}

menuentry 'Auto Install Rocky OS 4.2' --class rocky --class gnu-linux --class gnu --class os {
            insmod part_gpt
            insmod fat
            linux /boot/isolinux/vmlinuzI instmode=Auto efimode=y root=/dev/cdrom vga=791 ro
            initrd /boot/isolinux/initrd.img

}

menuentry 'StateGrid AutoInstall Rocky OS 4.2' --class rocky --class gnu-linux --class gnu --class os {
            insmod part_gpt
            insmod fat
            linux /boot/isolinux/vmlinuzI instmode=StateGrid efimode=y root=/dev/cdrom vga=791 ro
            initrd /boot/isolinux/initrd.img

}

menuentry 'Dmraid Install Rocky OS 4.2' --class rocky --class gnu-linux --class gnu --class os {
            insmod part_gpt
            insmod fat
            linux /boot/isolinux/vmlinuzI instmode=Dmraid efimode=y dmraid=true root=/dev/cdrom vga=791 ro
            initrd /boot/isolinux/initrd.img
}

4 在8.0系统下制作efi.img
dd if=/dev/zero of=bootx64.img bs=1M count=20
mkfs.vfat  efi.img
mount efi.img /mnt -o loop
mkdir -p  /mnt/efi/boot/
cp bootx64.efi /mnt/efi/boot/
umount /mnt
cp efi.img cd2/boot/grub/
cp -r x86_64-efi cd2/boot/grub/

2.制作用于系统启动的bootx64.efi

1 在4.2系统中grub-2.02-beta2/grub-core目录下制作用于系统启动的bootx64.efi

制作bootx64.efi文件

../grub-mkimage -O x86_64-efi -d . -o bootx64.efi -p /efi/boot/x86_64-efi search_fs_file search_fs_uuid search_label search part_gpt part_msdos disk fat exfat ext2 ntfs xfs appleldr hfs iso9660 normal search_fs_file configfile linux linux16 chain loopback echo efi_gop efi_uga video_bochs video_cirrus file gfxmenu gfxterm gfxterm_background gfxterm_menu halt reboot help jpeg ls png true

2将bootx64.efi添加到光盘环境
mkdir cd2/opt/efi/boot -p
cp bootx64.efi x86_64-efi/ -r cd2/opt/efi/boot/

三、添加efi自动安装脚本

1.编写efi安装脚本

创建cd2/usr/lib/new_install/operation/finish_install/99exec_install_efi.sh

#!/bin/bash

efimode=`cat /proc/cmdline | sed 's/.*efimode=\([^ ]*\).*/\1/'`
upgrubcmd="/usr/sbin/update-grub"

if [ $efimode == "y" ];then

        source ./functions

        efi_dir="/Rocky/boot-efi"

        mkdir -p $TARGET/boot/efi/efi/boot

        cp ${efi_dir}/bootx64.efi $TARGET/boot/efi/efi/boot

        cp -r ${efi_dir}/x86_64-efi $TARGET/boot/efi/efi/boot

        cp $TARGET/boot/grub/grub.cfg $TARGET/boot/efi/efi/boot/x86_64-efi    

        #echo 'exec grub-mkconfig -o /boot/efi/efi/boot/x86_64-efi/grub.cfg $@ ' >> $TARGET/$upgrubcmd

        sed -i 's/\/boot\/grub\/grub.cfg/\/boot\/efi\/efi\/boot\/x86_64-efi\/grub.cfg/' $TARGET/$upgrubcmd

        ln -snf /boot/efi/efi/boot/x86_64-efi/grub.cfg $TARGET/boot/grub/grub.cfg

        echo -e "Install efi successfully !"
else
        echo -e "not efi mode !"
fi

2.增加对efi分区情况的限制

更改/cd2/usr/lib/new_install/text/ri_newt.py

zhang@linx:~/software/rocky/diff$ diff -uparN a/ri_newt.py b/ri_newt.py
--- a/ri_newt.py	2020-01-13 10:13:08.673809083 +0800
+++ b/ri_newt.py	2020-01-13 10:14:12.713809392 +0800
@@ -2,6 +2,7 @@
 from snack import *
 import sys
 import re
+import logging
 sys.path.append('../interface/')
 sys.path.append('../new_partition/')

@@ -9,6 +10,14 @@ import ri_data
 import partition_data as p_d
 import interface_partition

+import os
+
+logger=logging.getLogger('debuglog')
+logger.setLevel(logging.DEBUG)
+fh=logging.FileHandler('/tmp/test.log')
+fh.setLevel(logging.DEBUG)
+logger.addHandler(fh)
+
 config_xml = "../xml/install_cfg.xml"

 class Screen:
@@ -478,6 +487,7 @@ class MountPoint(Screen):
 		self.mds.sort()

 	def check_mountpoint(self,flag='one'):
+		eficheck=0
 		nonmount_dir = ['/dev','/etc','/lib64','/lib','/bin','/sbin','/proc','/sys']
 		if flag == 'one':
 			mountpoint = Screen.entry.value()
@@ -497,6 +507,21 @@ class MountPoint(Screen):
 						return False
 				return True
 		elif flag == 'all':
+			if os.path.exists("/sys/firmware/efi"):
+				for ddisk in self.disks:
+					efidict={}
+					efidevs=p_d.Partition.dict[ddisk]['partition'].keys()
+					for ddev in efidevs:
+						if ddev.startswith(ddisk) and ddev.endswith('1'):
+							logger.info('efi maybe ' + ddev)
+							logger.info('mountpoint is' +str(p_d.Partition.dict[ddisk]['partition'][ddev]['mount_point']))
+							logger.info('filesystem is' +str(p_d.Partition.dict[ddisk]['partition'][ddev]['filesystem']))
+							efidict['dev']=ddev
+							efidict['mountpoint']=str(p_d.Partition.dict[ddisk]['partition'][ddev]['mount_point'])
+							efidict['filesystem']=str(p_d.Partition.dict[ddisk]['partition'][ddev]['filesystem'])
+							if (efidict['mountpoint']=='/boot/efi' or efidict['mountpoint']=='/boot/efi/') and (efidict['filesystem'] == 'vfat'):
+								eficheck=1
+								break
 			list_mountpoint = []
 			for m in ri_data.Raid.dict.keys():
 			    R = ri_data.Raid.dict[m]
@@ -513,7 +538,6 @@ class MountPoint(Screen):
 				return False
+			elif os.path.exists("/sys/firmware/efi") and eficheck != 1:
+				return False
 			else:
 				return True
-
 	def set_mountpoint(self, device):
 		disk = device.split(':')[0]
 		dev = device.split(':')[1]
@@ -524,7 +548,7 @@ class MountPoint(Screen):
 		Screen.label_mp = Label('mountpoint : ')
 		Screen.label_fs = Label('File System Type : ')
 		Screen.widget_label('')
-		fs_list = ['ext2','ext3', 'ext4', 'linux-swap', 'reiserfs', 'xfs', 'jfs']
+		fs_list = ['ext2','ext3', 'ext4', 'linux-swap', 'reiserfs', 'xfs', 'jfs','vfat']
 		Screen.widget_listbox(3, *fs_list)
 		Screen.widget_checkbox('Format the partition')
 		Screen.listbox.setCurrent('ext3')
@@ -551,8 +575,12 @@ class MountPoint(Screen):
 			s =  Screen.yesno(self.title, 1, 8, 'TextboxReflowed', 'eLabel', 'Grid_Complex', 'eLabel', 'Checkbox','eLabel','ButtonBar')
 			if s == 0:
 				if not self.check_mountpoint(flag='one'):
-					Screen.pop_window('Invalid mount point','The mount point you entered is invalid.\nMount point must start with "/".They cannot contain spaces.\nMount point cannot be "/dev","/etc","/lib","lib64","/bin","/sbin","/proc","/sys".\nAnd when formatted linux-swap filesystem, the partition can not be mounted.', 50)
-					continue
+					if os.path.exists("/sys/firmware/efi"):
+						Screen.pop_window('Invalid mount point','The mount point you entered is invalid.\nMount point must start with "/boot/efi".They cannot contain spaces.\nMount point cannot be "/dev","/etc","/lib","lib64","/bin","/sbin","/proc","/sys".\nAnd when formatted linux-swap filesystem, the partition can not be mounted.', 50)
+						continue
+					else:
+						Screen.pop_window('Invalid mount point','The mount point you entered is invalid.\nMount point must start with "/".They cannot contain spaces.\nMount point cannot be "/dev","/etc","/lib","lib64","/bin","/sbin","/proc","/sys".\nAnd when formatted linux-swap filesystem, the partition can not be mounted.', 50)
+						continue
 				if MD:
 				    if Screen.entry.value() != '' or Screen.checkbox.value() == 1:
 					ri_data.Raid.dict[disk].fmt = 'yes'
@@ -561,7 +589,6 @@ class MountPoint(Screen):
 				    ri_data.Raid.dict[disk].filesystem = Screen.listbox.current()
 				    ri_data.Raid.dict[disk].mp = Screen.entry.value()
 				    break
-				    #p_d.Partition.dict[disk]['partition'][dev]['format'] = 'yes'
 				else:
 				    if Screen.entry.value() != '' or Screen.checkbox.value() == 1:
 					p_d.Partition.dict[disk]['partition'][dev]['format'] = 'yes'
@@ -629,8 +656,12 @@ class MountPoint(Screen):
 				break
 			else:
 				if not self.check_mountpoint(flag='all'):
-					Screen.pop_window('Invalid mount point','Two file systems must not be assigned the same mount point.\nA root file system is needed.\nPlease correct this by changing mount points.', 50)
-					continue
+					if os.path.exists("/sys/firmware/efi"):
+						Screen.pop_window('Invalid mount point','Two file systems must not be assigned the same mount point.\nA root file system is needed.\nIn efi install mod the first partition mountpoint must be /boot/efi/ and filesystem must be vfat.\nPlease correct this by changing mount points.', 50)
+						continue
+					else:
+						Screen.pop_window('Invalid mount point','Two file systems must not be assigned the same mount point.\nA root file system is needed.\nPlease correct this by changing mount points.', 50)
+						continue
 				break
 		return (s == 'help' and '0' or s)


四、制作镜像

1.安装isolinux

apt-get install isolinux

2.mk_iso_4.2.sh脚本

#!/bin/bash
# shiftwidth=4 tabstop=4

isopath="$1"
output="$2"

xorriso -as mkisofs -r -checksum_algorithm_iso md5,sha1 -V `cat ${isopath}/tag| cut -b1-32` -o ${output}  -J -isohybrid-mbr /usr/lib/ISOLINUX/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 -eltorito-alt-boot -e boot/grub/efi.img -no-emul-boot -isohybrid-gpt-basdat  -isohybrid-apm-hfsplus $isopath

3.执行脚本制作镜像

./mk_iso_4.2.sh cd2 linx4.2-700-uefi.iso


五、集成到自动编译工具

1. 需要修改的库和文件

修改new_install(根据上方叙述进行修改)

修改new_install/new_partition/interface_partition.py文件

修改new_install/text/ri_newt.py文件

添加new_install/operation/finish_install/99exec_install_efi.sh文件

修改autobuild-tools

1.添加autobuild-tools/integration-tool/cfg/iso_env/x86_64/cfg/boot/grub/grub.cfg

2.添加autobuild-tools/integration-tool/cfg/iso_env/x86_64/cfg/boot/grub/x86_64-efi

3.添加autobuild-tools/integration-tool/cfg/iso_env/x86_64/cfg/boot/grub/efi.img

4.添加autobuild-tools/integration-tool/cfg/iso_env/x86_64/cfg/boot/grub/bootx64.efi

5.修改autobuild-tools/integration-tool/mk_iso

438         echo "info: 安装uefi引导文件"
439         mkdir -pv ${ISO_DIR}/opt/efi
440         mv ${ISO_DIR}/boot/grub/bootx64.efi ${ISO_DIR}/opt/efi/
441         cp -r ${ISO_DIR}/boot/grub/x86_64-efi ${ISO_DIR}/opt/efi/
442         mv ${ISO_DIR}/boot/grub/grub.cfg ${ISO_DIR}/x86_64-efi/      
………………
551         xorriso -as genisoimage -r -checksum_algorithm_iso md5,sha1 -V `cat ${ISO_DIR}/tag| cut -b1-32` -o ${DAILY_BUILDS_DIR}/rocky$os_version-$ARCH-$B_S-`date "+%Y%m%d"`.iso  -J -isohybrid-mbr /usr/share/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 -eltorito-alt-boot -e boot/grub/efi.img -no-emul-boot -isohybrid-gpt-basdat  -isohybrid-apm-hfsplus  $ISO_DIR

上述xorriso命令会出现报错

libisofs: NOTE : Automatically adjusted MBR geometry to 1021/245/32
libisofs: NOTE : Aligned image size to cylinder size by 635 blocks
libisofs: FAILURE : MBR template file seems not prepared for Apple Partition Map.
libisofs: FAILURE : Image write error
libisofs: MISHAP :  > Caused by: Cannot patch isolinux boot image
libburn : FAILURE : Premature end of input encountered. Missing: 4098375680 bytes
xorriso : FAILURE : libburn indicates failure with writing.
xorriso : NOTE : -return_with SORRY 32 triggered by problem severity FAILURE

更更改为如下命令,可以编过。

xorriso -as genisoimage -r -checksum_algorithm_iso md5,sha1 -V `cat ${isopath}/tag| cut -b1-32` -o ${output}  -J -isohybrid-mbr /usr/share/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 -eltorito-alt-boot -b boot/grub/efi.img -no-emul-boot $isopath

修改x11-driver

xf86-video-fbdev-0.4.2.tar.bz2 将编译的fbdev_drv.so放到usr/lib64/xorg/modules/drivers/下 并修改/etc/X11/xorg.config /将vesa改为fbdev

为保证图形界面正常在重新编译x11-driver使其支持fbdev 更改x11-driver编译文件Pkgfile

在drivermoduledir参数里添加xf86-video-fbdev-0.4.2

尝试编译时出现报错,部分/usr/lib/下的库不对,将不对的库删除可以编过,或更改符号链接,链接到/usr/lib64下的相应库也可编过。

尝试使用同一个grub.config

在grub-2.02-beta2/grub-core目录下 修改bootx64.efi文件

search --file /tag --set=root
set prefix=($root)/boot/grub/x86_64-efi
configfile $prefix/grub.cfg

修改grub.cfg

../grub-mkimage  --config=grub.cfg -O x86_64-efi -d . -o bootx64.efi -p /boot/grub/x86_64-efi part_gpt part_msdos disk fat exfat ext2 ntfs xfs appleldr hfs iso9660 normal search_fs_file configfile linux linux16 chain loopback echo efi_gop efi_uga video_bochs video_cirrus file gfxmenu gfxterm gfxterm_background gfxterm_menu halt reboot help jpeg ls png true

修改new_install/operation/finish_install/99exec_install_efi.sh文件

上述尝试失败重做bootx64.efi后依然无法找到/boot/grub/grub.cfg文件调查可能是由于efi启动文件有格式要求现在的方式是在99exec_install_efi.sh文件中插入一条,建立软链接/boot/grub/grub.cfg链接到启动文件。

ln -snf /boot/efi/efi/boot/x86_64-efi/grub.cfg $TARGET/boot/grub/grub.cfg
去除/ope文件夹

在Rocky目录下创建boot-efi文件,将bootx64.efi和x86_64-efi文件放到/Rocky/boot-efi目录下。 修改99exec_install_efi.sh文件使其从/Rocky/boot-efi安装文件。

更改安装目录efi_dir="/Rocky/boot-efi"