summaryrefslogtreecommitdiffstats
path: root/scripts/lib/mic
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/lib/mic')
-rw-r--r--scripts/lib/mic/imager/baseimager.py47
-rw-r--r--scripts/lib/mic/imager/direct.py42
-rw-r--r--scripts/lib/mic/plugins/imager/direct_plugin.py2
-rw-r--r--scripts/lib/mic/utils/partitionedfs.py37
4 files changed, 22 insertions, 106 deletions
diff --git a/scripts/lib/mic/imager/baseimager.py b/scripts/lib/mic/imager/baseimager.py
index 0d591eaf43..7f32dd559e 100644
--- a/scripts/lib/mic/imager/baseimager.py
+++ b/scripts/lib/mic/imager/baseimager.py
@@ -97,41 +97,15 @@ class BaseImageCreator(object):
97 97
98 98
99 # 99 #
100 # Properties
101 #
102 def __get_instroot(self):
103 if self.__builddir is None:
104 raise CreatorError("_instroot is not valid before calling mount()")
105 return self.__builddir + "/install_root"
106 _instroot = property(__get_instroot)
107 """The location of the install root directory.
108
109 This is the directory into which the system is installed. Subclasses may
110 mount a filesystem image here or copy files to/from here.
111
112 Note, this directory does not exist before ImageCreator.mount() is called.
113
114 Note also, this is a read-only attribute.
115
116 """
117
118
119 #
120 # Hooks for subclasses 100 # Hooks for subclasses
121 # 101 #
122 def _mount_instroot(self, base_on = None): 102 def _create(self):
123 """Mount or prepare the install root directory. 103 """Create partitions for the disk image(s)
124 104
125 This is the hook where subclasses may prepare the install root by e.g. 105 This is the hook where subclasses may create the partitions
126 mounting creating and loopback mounting a filesystem image to 106 that will be assembled into disk image(s).
127 _instroot.
128 107
129 There is no default implementation. 108 There is no default implementation.
130
131 base_on -- this is the value passed to mount() and can be interpreted
132 as the subclass wishes; it might e.g. be the location of
133 a previously created ISO containing a system image.
134
135 """ 109 """
136 pass 110 pass
137 111
@@ -176,19 +150,16 @@ class BaseImageCreator(object):
176 150
177 runner.show('umount -l %s' % self.workdir) 151 runner.show('umount -l %s' % self.workdir)
178 152
179 def mount(self): 153 def create(self):
180 """Setup the target filesystem in preparation for an install. 154 """Create partitions for the disk image(s)
181 155
182 This function sets up the filesystem which the ImageCreator will 156 Create the partitions that will be assembled into disk
183 install into and configure. The ImageCreator class merely creates an 157 image(s).
184 install root directory, bind mounts some system directories (e.g. /dev)
185 and writes out /etc/fstab. Other subclasses may also e.g. create a
186 sparse file, format it and loopback mount it to the install root.
187 """ 158 """
188 self.__setup_tmpdir() 159 self.__setup_tmpdir()
189 self.__ensure_builddir() 160 self.__ensure_builddir()
190 161
191 self._mount_instroot() 162 self._create()
192 163
193 def unmount(self): 164 def unmount(self):
194 """Unmounts the target filesystem. 165 """Unmounts the target filesystem.
diff --git a/scripts/lib/mic/imager/direct.py b/scripts/lib/mic/imager/direct.py
index 2e6914b86d..b96740d0f4 100644
--- a/scripts/lib/mic/imager/direct.py
+++ b/scripts/lib/mic/imager/direct.py
@@ -79,9 +79,10 @@ class DirectImageCreator(BaseImageCreator):
79 self.staging_data_dir = staging_data_dir 79 self.staging_data_dir = staging_data_dir
80 80
81 def __write_fstab(self, image_rootfs): 81 def __write_fstab(self, image_rootfs):
82 """overriden to generate fstab (temporarily) in rootfs. This 82 """overriden to generate fstab (temporarily) in rootfs. This is called
83 is called from mount_instroot, make sure it doesn't get called 83 from _create, make sure it doesn't get called from
84 from BaseImage.mount()""" 84 BaseImage.create()
85 """
85 if image_rootfs is None: 86 if image_rootfs is None:
86 return None 87 return None
87 88
@@ -217,29 +218,15 @@ class DirectImageCreator(BaseImageCreator):
217 # 218 #
218 # Actual implemention 219 # Actual implemention
219 # 220 #
220 def _mount_instroot(self): 221 def _create(self):
221 """ 222 """
222 For 'wic', we already have our build artifacts and don't want 223 For 'wic', we already have our build artifacts - we just create
223 to loop mount anything to install into, we just create
224 filesystems from the artifacts directly and combine them into 224 filesystems from the artifacts directly and combine them into
225 a partitioned image. 225 a partitioned image.
226
227 We still want to reuse as much of the basic mic machinery
228 though; despite the fact that we don't actually do loop or any
229 other kind of mounting we still want to do many of the same
230 things to prepare images, so we basically just adapt to the
231 basic framework and reinterpret what 'mounting' means in our
232 context.
233
234 _instroot would normally be something like
235 /var/tmp/wic/build/imgcreate-s_9AKQ/install_root, for
236 installing packages, etc. We don't currently need to do that,
237 so we simplify life by just using /var/tmp/wic/build as our
238 workdir.
239 """ 226 """
240 parts = self._get_parts() 227 parts = self._get_parts()
241 228
242 self.__instimage = PartitionedMount(self._instroot) 229 self.__instimage = PartitionedMount()
243 230
244 for p in parts: 231 for p in parts:
245 # as a convenience, set source to the boot partition source 232 # as a convenience, set source to the boot partition source
@@ -250,20 +237,11 @@ class DirectImageCreator(BaseImageCreator):
250 for p in parts: 237 for p in parts:
251 # need to create the filesystems in order to get their 238 # need to create the filesystems in order to get their
252 # sizes before we can add them and do the layout. 239 # sizes before we can add them and do the layout.
253 # PartitionedMount.mount() actually calls __format_disks() 240 # PartitionedMount.create() actually calls __format_disks()
254 # to create the disk images and carve out the partitions, 241 # to create the disk images and carve out the partitions,
255 # then self.install() calls PartitionedMount.install() 242 # then self.install() calls PartitionedMount.install()
256 # which calls __install_partitition() for each partition 243 # which calls __install_partitition() for each partition
257 # to dd the fs into the partitions. It would be nice to 244 # to dd the fs into the partitions.
258 # be able to use e.g. ExtDiskMount etc to create the
259 # filesystems, since that's where existing e.g. mkfs code
260 # is, but those are only created after __format_disks()
261 # which needs the partition sizes so needs them created
262 # before its called. Well, the existing setup is geared
263 # to installing packages into mounted filesystems - maybe
264 # when/if we need to actually do package selection we
265 # should modify things to use those objects, but for now
266 # we can avoid that.
267 245
268 fstab = self.__write_fstab(self.rootfs_dir.get("ROOTFS_DIR")) 246 fstab = self.__write_fstab(self.rootfs_dir.get("ROOTFS_DIR"))
269 247
@@ -294,7 +272,7 @@ class DirectImageCreator(BaseImageCreator):
294 self.__disks[disk_name] = disk_obj 272 self.__disks[disk_name] = disk_obj
295 self.__instimage.add_disk(disk_name, disk_obj) 273 self.__instimage.add_disk(disk_name, disk_obj)
296 274
297 self.__instimage.mount() 275 self.__instimage.create()
298 276
299 def install(self): 277 def install(self):
300 """ 278 """
diff --git a/scripts/lib/mic/plugins/imager/direct_plugin.py b/scripts/lib/mic/plugins/imager/direct_plugin.py
index 793a736e95..da18b65f54 100644
--- a/scripts/lib/mic/plugins/imager/direct_plugin.py
+++ b/scripts/lib/mic/plugins/imager/direct_plugin.py
@@ -91,7 +91,7 @@ class DirectPlugin(ImagerPlugin):
91 creatoropts) 91 creatoropts)
92 92
93 try: 93 try:
94 creator.mount() 94 creator.create()
95 creator.install() 95 creator.install()
96 creator.configure() 96 creator.configure()
97 creator.print_outimage_info() 97 creator.print_outimage_info()
diff --git a/scripts/lib/mic/utils/partitionedfs.py b/scripts/lib/mic/utils/partitionedfs.py
index 50536b4fce..43a38a9b14 100644
--- a/scripts/lib/mic/utils/partitionedfs.py
+++ b/scripts/lib/mic/utils/partitionedfs.py
@@ -33,11 +33,9 @@ MBR_OVERHEAD = 1
33SECTOR_SIZE = 512 33SECTOR_SIZE = 512
34 34
35class PartitionedMount: 35class PartitionedMount:
36 def __init__(self, mountdir): 36 def __init__(self):
37 self.disks = {} 37 self.disks = {}
38 self.partitions = [] 38 self.partitions = []
39 self.mountOrder = []
40 self.unmountOrder = []
41 self.parted = find_binary_path("parted") 39 self.parted = find_binary_path("parted")
42 # Size of a sector used in calculations 40 # Size of a sector used in calculations
43 self.sector_size = SECTOR_SIZE 41 self.sector_size = SECTOR_SIZE
@@ -102,7 +100,6 @@ class PartitionedMount:
102 'label': label, # Partition label 100 'label': label, # Partition label
103 'disk_name': disk_name, # physical disk name holding partition 101 'disk_name': disk_name, # physical disk name holding partition
104 'device': None, # kpartx device node for partition 102 'device': None, # kpartx device node for partition
105 'mount': None, # Mount object
106 'num': None, # Partition number 103 'num': None, # Partition number
107 'boot': boot, # Bootable flag 104 'boot': boot, # Bootable flag
108 'align': align, # Partition alignment 105 'align': align, # Partition alignment
@@ -303,17 +300,6 @@ class PartitionedMount:
303 self.__run_parted(["-s", d['disk'].device, "set", 300 self.__run_parted(["-s", d['disk'].device, "set",
304 "%d" % p['num'], "lba", "off"]) 301 "%d" % p['num'], "lba", "off"])
305 302
306 def __calculate_mountorder(self):
307 msger.debug("Calculating mount order")
308 for p in self.partitions:
309 if p['mountpoint']:
310 self.mountOrder.append(p['mountpoint'])
311 self.unmountOrder.append(p['mountpoint'])
312
313 self.mountOrder.sort()
314 self.unmountOrder.sort()
315 self.unmountOrder.reverse()
316
317 def cleanup(self): 303 def cleanup(self):
318 if self.disks: 304 if self.disks:
319 for dev in self.disks.keys(): 305 for dev in self.disks.keys():
@@ -323,23 +309,6 @@ class PartitionedMount:
323 except: 309 except:
324 pass 310 pass
325 311
326 def unmount(self):
327 for mp in self.unmountOrder:
328 if mp == 'swap':
329 continue
330 p = None
331 for p1 in self.partitions:
332 if p1['mountpoint'] == mp:
333 p = p1
334 break
335
336 if p['mount'] != None:
337 try:
338 p['mount'].cleanup()
339 except:
340 pass
341 p['mount'] = None
342
343 def __install_partition(self, num, source_file, start, size): 312 def __install_partition(self, num, source_file, start, size):
344 """ 313 """
345 Install source_file contents into a partition. 314 Install source_file contents into a partition.
@@ -375,13 +344,11 @@ class PartitionedMount:
375 self.__install_partition(p['num'], p['source_file'], 344 self.__install_partition(p['num'], p['source_file'],
376 p['start'], p['size']) 345 p['start'], p['size'])
377 346
378 def mount(self): 347 def create(self):
379 for dev in self.disks.keys(): 348 for dev in self.disks.keys():
380 d = self.disks[dev] 349 d = self.disks[dev]
381 d['disk'].create() 350 d['disk'].create()
382 351
383 self.__format_disks() 352 self.__format_disks()
384 353
385 self.__calculate_mountorder()
386
387 return 354 return