1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
|
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#
# DESCRIPTION
# This implements the 'bootimg-biosxen' source plugin class for 'wic'
#
# Bootloader arguments: Xen args are separated from Linux ones at '---':
# eg.
# bootloader --append="console=com1,vga com1=115200,8n1 --- console=hvc0"
#
# Optional source param: initrd
# accepts multiple ramdisk files to be supplied to multiboot.
# eg.
# part /boot --source bootimg-biosxen --sourceparams="initrd=foo.initrd;bar.initrd"
#
# AUTHORS
# Christopher Clark <christopher.w.clark [at] gmail.com>
# Elements derived from bootimg-biosplusefi.py by:
# William Bourque <wbourque [at] gmail.com>
import logging
import os
import types
from wic import WicError
from wic.misc import (exec_cmd, get_bitbake_var)
from wic.plugins.source.bootimg_pcbios import BootimgPcbiosPlugin
logger = logging.getLogger('wic')
class BootimgBiosXenPlugin(BootimgPcbiosPlugin):
"""
Create MBR boot partition including files for Xen
"""
name = 'bootimg_biosxen'
@classmethod
def do_configure_partition(cls, part, source_params, creator, cr_workdir,
oe_builddir, bootimg_dir, kernel_dir,
native_sysroot):
"""
Called before do_prepare_partition(), creates syslinux config
"""
bootloader = creator.ks.bootloader
if not bootloader.configfile:
splash = os.path.join(cr_workdir, "/hdd/boot/splash.jpg")
if os.path.exists(splash):
splashline = "menu background splash.jpg"
else:
splashline = ""
syslinux_conf = ""
syslinux_conf += "PROMPT 0\n"
syslinux_conf += "TIMEOUT " + str(bootloader.timeout) + "\n"
syslinux_conf += "\n"
syslinux_conf += "ALLOWOPTIONS 1\n"
syslinux_conf += "\n"
if splashline:
syslinux_conf += "%s\n" % splashline
syslinux_conf += "DEFAULT boot\n"
syslinux_conf += "LABEL boot\n"
syslinux_conf += " KERNEL mboot.c32\n"
# Split the bootloader args at '---' to separate the Xen args
# from the Linux kernel args.
# The Xen args here are defaults; overridden by bootloader append.
xen_args = "console=com1,vga com1=115200,8n1"
kernel_append = ""
if bootloader.append:
separator_pos = bootloader.append.find('---')
if separator_pos != -1:
xen_args = bootloader.append[:separator_pos]
kernel_append = bootloader.append[separator_pos+3:]
else:
kernel_append = bootloader.append
kernel_args = "label=boot root=%s %s" % \
(creator.rootdev, kernel_append)
syslinux_conf += " APPEND /xen.gz %s --- /vmlinuz %s" % \
(xen_args, kernel_args)
initrd = source_params.get('initrd')
if initrd:
initrds = initrd.split(';')
for initrd_file in initrds:
syslinux_conf += " --- /%s" % os.path.basename(initrd_file)
syslinux_conf += "\n"
logger.debug("Writing syslinux config %s/hdd/boot/syslinux.cfg",
cr_workdir)
hdddir = "%s/hdd/boot" % cr_workdir
install_cmd = "install -d %s" % hdddir
exec_cmd(install_cmd)
cfg = open("%s/hdd/boot/syslinux.cfg" % cr_workdir, "w")
cfg.write(syslinux_conf)
cfg.close()
else:
super().do_configure_partition(part, source_params,
creator, cr_workdir,
oe_builddir, bootimg_dir,
kernel_dir, native_sysroot)
@classmethod
def do_prepare_partition(cls, part, source_params, creator, cr_workdir,
oe_builddir, bootimg_dir, kernel_dir,
rootfs_dir, native_sysroot):
"""
Called to do the actual content population for a partition i.e. it
'prepares' the partition to be incorporated into the image.
"""
bootimg_dir = super()._get_bootimg_dir(bootimg_dir, 'syslinux')
hdddir = "%s/hdd/boot" % cr_workdir
# machine-deduction logic originally from isoimage-isohybrid.py
initrd_dir = get_bitbake_var("DEPLOY_DIR_IMAGE")
if not initrd_dir:
raise WicError("Couldn't find DEPLOY_DIR_IMAGE, exiting.")
machine = os.path.basename(initrd_dir)
xen = "xen-" + machine + ".gz"
cmds = ["install -m 0644 %s/%s %s/xen.gz" %
(kernel_dir, xen, hdddir),
"install -m 0644 %s/syslinux/mboot.c32 %s/mboot.c32" %
(bootimg_dir, hdddir)]
initrd = source_params.get('initrd')
# Allow multiple 'initrds', as per the bootimg-efi class.
# This can be used to install additional binaries for multiboot.
# eg. TXT ACMs, XSM/Flask policy file, microcode binary
if initrd:
initrds = initrd.split(';')
for initrd_file in initrds:
cmds.append("install -m 0644 %s/%s %s/%s" %
(kernel_dir, initrd_file, hdddir,
os.path.basename(initrd_file)))
for install_cmd in cmds:
exec_cmd(install_cmd)
super().do_prepare_partition(part, source_params,
creator, cr_workdir,
oe_builddir, bootimg_dir,
kernel_dir, rootfs_dir,
native_sysroot)
|