utils: implement BIOS boot for windows

Create ogboot.me and ogboot.secondboot as empty files and
ogboot.firstboot with the value "iniciado" in the root of
the BIOS Windows system partition.
The files must contain data for GRUB to be able to write content,
therefore these are created containing 3072 null bytes.
The Windows boot process is handled by the "pxe" profile.
There the files ogboot.me, ogboot.firstboot and ogboot.secondboot
are used as a state machine to chose between booting Windows and
ogLive.
The first Windows boot happens if ogboot.me and ogboot.firstboot
are identical, then "iniciado" is written in ogboot.firstboot.
We skip this stage as we create ogboot.firstboot with 'iniciado'.
The second Windows boot occurs if ogboot.me and ogboot.secondboot
are boot identical, then "iniciado" is written in ogboot.secondboot.
After the Windows boot ogLive is booted.
master
Alejandro Sirgo Rica 2024-03-13 12:18:35 +01:00 committed by lupoDharkael
parent ddf08779ae
commit 8012562302
2 changed files with 10 additions and 30 deletions

View File

@ -36,8 +36,6 @@ from src.utils.boot import *
from src.utils.sw_inventory import get_package_set
from src.utils.hw_inventory import get_hardware_inventory, legacy_list_hardware_inventory
from src.ogClient import ogClient
from src.utils.probe import OSFamily, get_os_family
OG_SHELL = '/bin/bash'
OG_CACHE_PATH = '/opt/opengnsys/cache/opt/opengnsys/images'
@ -267,30 +265,6 @@ class OgLiveOperations:
disk = request.getDisk()
partition = request.getPartition()
device = get_partition_device(int(disk), int(partition))
mountpoint = device.replace('dev', 'mnt')
if not mount_mkdir(device, mountpoint):
raise RuntimeError(f'Cannot probe OS family. Unable to mount {device} at {esp_mountpoint}.')
is_legacy = not is_uefi_supported(disk) and get_os_family(mountpoint) == OSFamily.WINDOWS
umount(mountpoint)
if is_legacy:
cmd = f'{ogClient.OG_PATH}interfaceAdm/IniciarSesion {disk} {partition}'
try:
ogRest.proc = subprocess.Popen([cmd],
stdout=subprocess.PIPE,
shell=True,
executable=OG_SHELL)
(output, error) = ogRest.proc.communicate()
except:
logging.exception('Exception when running session subprocess')
raise ValueError('Error: Incorrect command value')
logging.info('Starting OS at disk %s partition %s', disk, partition)
return output.decode('utf-8')
boot_os_at(int(disk), int(partition))
self.reboot()

View File

@ -19,9 +19,6 @@ from src.utils.uefi import *
from src.utils.fs import *
def _boot_bios_legacy(disk, part, mountpoint):
raise NotImplementedError
def _boot_bios_linux(disk, part, mountpoint):
logging.info(f'Booting Linux system')
@ -47,7 +44,16 @@ def _boot_bios_linux(disk, part, mountpoint):
def _boot_bios_windows(disk, part, mountpoint):
logging.info(f'Booting Windows system')
_boot_bios_legacy(disk, part, mountpoint)
try:
with open(f'{mountpoint}/ogboot.me', 'w') as f:
f.write('\0' * (3072))
with open(f'{mountpoint}/ogboot.firstboot', 'w') as f:
f.write('iniciado')
f.write('\0' * (3072 - 8))
with open(f'{mountpoint}/ogboot.secondboot', 'w') as f:
f.write('\0' * (3072))
except OSError as e:
raise RuntimeError(f'Could not create ogboot files in Windows partition: {e}')
def _boot_uefi_windows(disk, part, mountpoint):
logging.info(f'Booting windows system')