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

747 lines
24 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 4.2 700版uefi支持
## 700版镜像下载
[rocky6.0.42.41-x86_64-security-20181101-700.iso](http://42.builder.rd.in.linx/stable-iso/4.2-x86_64-builds/20181101-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"
```