self.guestfs_device = None
self.size = 0
self.mounted = False
+ self.mounted_ro = False
self.g = guestfs.GuestFS()
self.g.add_drive_opts(self.device, readonly=0, format="raw")
self.ostype = self.g.inspect_get_type(self.root)
self.distro = self.g.inspect_get_distro(self.root)
- self.out.success('found a(n) %s system' % self.distro)
+ self.out.success(
+ 'found a(n) %s system' %
+ self.ostype if self.distro == "unknown" else self.distro)
def _get_os(self):
"""Return an OS class instance for this image"""
def mount(self, readonly=False):
"""Mount all disk partitions in a correct order."""
- mount = self.g.mount_ro if readonly else self.g.mount
- msg = " read-only" if readonly else ""
- self.out.output("Mounting the media%s ..." % msg, False)
- mps = self.g.inspect_get_mountpoints(self.root)
+ msg = "Mounting the media%s ..." % (" read-only" if readonly else "")
+ self.out.output(msg, False)
+
+ #If something goes wrong when mounting rw, remount the filesystem ro
+ remount_ro = False
+ rw_mpoints = ('/', '/etc', '/root', '/home', '/var')
# Sort the keys to mount the fs in a correct order.
# / should be mounted befor /boot, etc
return 0
else:
return -1
+ mps = self.g.inspect_get_mountpoints(self.root)
mps.sort(compare)
+
+ mopts = 'ro' if readonly else 'rw'
for mp, dev in mps:
+ if self.ostype == 'freebsd':
+ # libguestfs can't handle correct freebsd partitions on GUID
+ # Partition Table. We have to do the translation to linux
+ # device names ourselves
+ m = re.match('^/dev/((?:ada)|(?:vtbd))(\d+)p(\d+)$', dev)
+ if m:
+ m2 = int(m.group(2))
+ m3 = int(m.group(3))
+ dev = '/dev/sd%c%d' % (chr(ord('a') + m2), m3)
try:
- mount(dev, mp)
+ self.g.mount_options(mopts, dev, mp)
except RuntimeError as msg:
- self.out.warn("%s (ignored)" % msg)
-
- self.mounted = True
- self.out.success("done")
+ if self.ostype == 'freebsd':
+ freebsd_mopts = "ufstype=ufs2,%s" % mopts
+ try:
+ self.g.mount_vfs(freebsd_mopts, 'ufs', dev, mp)
+ except RuntimeError as msg:
+ if readonly is False and mp in rw_mpoints:
+ remount_ro = True
+ break
+ elif readonly is False and mp in rw_mpoints:
+ remount_ro = True
+ break
+ else:
+ self.out.warn("%s (ignored)" % msg)
+ if remount_ro:
+ self.out.warn("Unable to mount %s read-write. "
+ "Remounting everything read-only..." % mp)
+ self.umount()
+ self.mount(True)
+ else:
+ self.mounted = True
+ self.mounted_ro = readonly
+ self.out.success("done")
def umount(self):
"""Umount all mounted filesystems."""
break
if not re.match("ext[234]", fstype):
- self.out.warn("Don't know how to resize %s partitions." % fstype)
+ self.out.warn("Don't know how to shrink %s partitions." % fstype)
return self.size
part_dev = "%s%d" % (self.guestfs_device, last_part['part_num'])