From 0a40174e94baec6e9ee9e54d796af73429d895e2 Mon Sep 17 00:00:00 2001 From: zhang Date: Thu, 19 Nov 2020 09:43:31 +0800 Subject: [PATCH] =?UTF-8?q?[Bug=20#4900]=20=E6=9B=B4=E6=96=B04.2=20700?= =?UTF-8?q?=E7=89=88=E6=94=AF=E6=8C=81efi=E8=AF=B4=E6=98=8E=E6=96=87?= =?UTF-8?q?=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改: 4.2-700-efi.md Signed-off-by: zhang --- 4.2-700-efi.md | 553 +++++++++++++++++++++++++++++++++++++------------ 1 file changed, 420 insertions(+), 133 deletions(-) diff --git a/4.2-700-efi.md b/4.2-700-efi.md index e989483..256c2d1 100644 --- a/4.2-700-efi.md +++ b/4.2-700-efi.md @@ -4,25 +4,28 @@ [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 +### 一、重新制作initrd.img -#### 光盘initrd.img +#### 1.光盘initrd.img 目前光盘引导中的initrd.img为正常安装的700版本系统中的/boot/initrd.img-2.6.32.700-Rocky4.2-x86_64文件重命名 md5=3596a5ee6924547e4c19487039939693 -#### initrd解压 + + +#### 2.initrd解压 ``` gunzip -S .img initrd.img cpio -vimd &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 @@ -112,38 +288,38 @@ root@Linx:/tmp# diff -uparN b/scripts/local a/scripts/local # We've given up, but we'll let the user fix matters if they can while [ ! -e "${ROOT}" ]; do - ``` +``` -#### initrd压缩 +#### 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 ``` ------------------------------------------------------------------------------- -### 替换initrd + +#### 2.替换initrd ``` cp initrd.img ~/cd2/boot/ ``` ------------------------------------------------------------------------------- -### 添加分区对vfat的支持 -##### 1. 修改cd2/usr/lib/new_install/new_partition/interface_partition.py文件 +#### 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 @@ -159,7 +335,7 @@ cp initrd.img ~/cd2/boot/ lb_fstype.setCurrent('ext3') ``` -##### 2. 修改/root/cd2/usr/lib/new_install/text/ri_newt.py +##### (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 @@ -178,15 +354,15 @@ root@Linx:~/cd/usr/lib/new_install# diff -uparN /root/cd2/usr/lib/new_install/te ------------------------------------------------------------------------------ -### 制作efi 启动文件 +## 三、制作efi 启动文件 -#### 制作用于光盘启动bootx64.efi +#### 1.制作用于光盘启动bootx64.efi -##### 1. 在4.2系统中grub-2.02-beta2/grub-core目录下制作用于光盘启动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文件如下 +早期引导的grub.cfg文件如下(为解决某些机器,如c30,不能自动加载grub.cfg问题) ``` search --file /tag --set=root @@ -200,14 +376,14 @@ configfile $prefix/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 ``` -##### 2. 拷贝efi所依赖的模块到x86_64-efi目录 +##### (2) 拷贝efi所依赖的模块到x86_64-efi目录 ``` mkdir x86_64-efi cp *.mod *.lst x86_64-efi/ ``` -##### 3. 在x86_64-efi目录下编写镜像启动的grub.cfg文件 +##### (3)在x86_64-efi目录下编写镜像启动的grub.cfg文件 ``` set default="0" @@ -226,7 +402,7 @@ menuentry 'Manu Install Rocky OS 4.2' --class rocky --class gnu-linux --class gn insmod part_gpt insmod fat linux /boot/isolinux/vmlinuzI instmode=Text efimode=y root=/dev/cdrom vga=791 ro - initrd /boot/initrd.img + initrd /boot/isolinux/initrd.img } @@ -234,7 +410,7 @@ menuentry 'Auto Install Rocky OS 4.2' --class rocky --class gnu-linux --class gn insmod part_gpt insmod fat linux /boot/isolinux/vmlinuzI instmode=Auto efimode=y root=/dev/cdrom vga=791 ro - initrd /boot/initrd.img + initrd /boot/isolinux/initrd.img } @@ -242,7 +418,7 @@ menuentry 'StateGrid AutoInstall Rocky OS 4.2' --class rocky --class gnu-linux - insmod part_gpt insmod fat linux /boot/isolinux/vmlinuzI instmode=StateGrid efimode=y root=/dev/cdrom vga=791 ro - initrd /boot/initrd.img + initrd /boot/isolinux/initrd.img } @@ -250,28 +426,28 @@ menuentry 'Dmraid Install Rocky OS 4.2' --class rocky --class gnu-linux --class insmod part_gpt insmod fat linux /boot/isolinux/vmlinuzI instmode=Dmraid efimode=y dmraid=true root=/dev/cdrom vga=791 ro - initrd /boot/initrd.img + initrd /boot/isolinux/initrd.img } ``` -##### 4. 在8.0系统下制作bootx64.img +##### (4) 在8.0系统下制作efi.img ``` dd if=/dev/zero of=bootx64.img bs=1M count=20 -mkfs.vfat bootx64.img -mount bootx64.img /mnt -o loop +mkfs.vfat efi.img +mount efi.img /mnt -o loop mkdir -p /mnt/efi/boot/ cp bootx64.efi /mnt/efi/boot/ umount /mnt -cp bootx64.img cd2/boot/grub/ +cp efi.img cd2/boot/grub/ cp -r x86_64-efi cd2/boot/grub/ ``` -#### 制作用于系统启动的bootx64.efi +#### 2.制作用于系统启动的bootx64.efi -##### 1. 在4.2系统中grub-2.02-beta2/grub-core目录下制作用于系统启动的bootx64.efi +##### (1) 在4.2系统中grub-2.02-beta2/grub-core目录下制作用于系统启动的bootx64.efi 制作bootx64.efi文件 @@ -280,7 +456,7 @@ cp -r x86_64-efi cd2/boot/grub/ ``` -##### 2. 将bootx64.efi添加到光盘环境 +##### (2)将bootx64.efi添加到光盘环境 ``` mkdir cd2/opt/efi/boot -p @@ -288,7 +464,7 @@ cp bootx64.efi x86_64-efi/ -r cd2/opt/efi/boot/ ``` ------------------------------------------------------------------------------ -### 添加efi自动安装脚本 +## 三、添加efi自动安装脚本 #### 1.编写efi安装脚本 @@ -302,33 +478,38 @@ upgrubcmd="/usr/sbin/update-grub" if [ $efimode == "y" ];then -source ./functions + source ./functions -efi_dir="/opt/efi/boot" + efi_dir="/Rocky/boot-efi" -mkdir -p $TARGET/boot/efi/efi/boot + mkdir -p $TARGET/boot/efi/efi/boot -cp ${efi_dir}/bootx64.efi $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 -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/ + 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 + #echo 'exec grub-mkconfig -o /boot/efi/efi/boot/x86_64-efi/grub.cfg $@ ' >> $TARGET/$upgrubcmd -echo -e "Install efi successfully !" + 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 !" + echo -e "not efi mode !" fi ``` #### 2.增加对efi分区情况的限制 +更改/cd2/usr/lib/new_install/text/ri_newt.py ``` -root@Linx:~/cd2/usr/lib/new_install/text# diff -uparN /root/cd/usr/lib/new_install/text/ri_newt.py /root/cd2/usr/lib/new_install/text/ri_newt.py• ---- /root/cd/usr/lib/new_install/text/ri_newt.py 2019-05-07 07:48:57.000000000 +0000 -+++ /root/cd2/usr/lib/new_install/text/ri_newt.py 2019-06-05 06:51:50.000000000 +0000 +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 @@ -336,11 +517,13 @@ root@Linx:~/cd2/usr/lib/new_install/text# diff -uparN /root/cd/usr/lib/new_insta +import logging sys.path.append('../interface/') sys.path.append('../new_partition/') -• -@@ -9,6 +10,12 @@ import ri_data + +@@ -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') @@ -348,97 +531,108 @@ root@Linx:~/cd2/usr/lib/new_install/text# diff -uparN /root/cd/usr/lib/new_insta +logger.addHandler(fh) + config_xml = "../xml/install_cfg.xml" -• + class Screen: -@@ -478,6 +485,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 +505,20 @@ class MountPoint(Screen): - return False - return True - elif flag == 'all': -+ for f in self.disks: -+ efidict={} -+ efidevs=p_d.Partition.dict[f]['partition'].keys() -+ if (f+'1') in efidevs: -+ logger.info('efi maybe' + f +'1') -+ logger.info('mountpoint is' +str(p_d.Partition.dict[f]['partition'][f+'1']['mount_point'])) -+ logger.info('filesystem is' +str(p_d.Partition.dict[f]['partition'][f+'1']['filesystem'])) -+ efidict['dev']=f+'1' -+ efidict['mountpoint']=str(p_d.Partition.dict[f]['partition'][f+'1']['mount_point']) -+ efidict['filesystem']=str(p_d.Partition.dict[f]['partition'][f+'1']['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] -@@ -511,9 +533,10 @@ class MountPoint(Screen): - list_mountpoint.append(p_d.Partition.dict[d]['partition'][p]['mount_point']) - if len(list_mountpoint) != len(list(set(list_mountpoint))) or '/' not in list_mountpoint: - return False -+ elif eficheck != 1: -+ return False - else: - return True +@@ -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 +547,7 @@ class MountPoint(Screen): - Screen.label_mp = Label('mountpoint : ') - Screen.label_fs = Label('File System Type : ') - Screen.widget_label('') -- fs_list = ['ext2','ext3', 'ext4', 'vfat', '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,7 +574,7 @@ 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","lib# -+ 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","/l# - continue - if MD: - if Screen.entry.value() != '' or Screen.checkbox.value() == 1: -@@ -561,7 +584,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,7 +651,7 @@ 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) -+ 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# - continue - break - return (s == 'help' and '0' or s) + 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) + ``` ------------------------------------------------------------------------------ -### 制作镜像 +## 四、制作镜像 -#### 安装isolinux +#### 1.安装isolinux ``` apt-get install isolinux ``` -#### mk_iso_4.2.sh脚本 +#### 2.mk_iso_4.2.sh脚本 ``` #!/bin/bash @@ -447,13 +641,106 @@ apt-get install isolinux 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/bootx64.img -no-emul-boot -isohybrid-gpt-basdat -isohybrid-apm-hfsplus $isopath +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(根据上方叙述进行修改) + +1.修改new_install/new_partition/interface_partition.py文件 + +2.修改new_install/text/ri_newt.py文件 + +3.添加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" +```