def create( self, disk_geo, rdb_cyls=1, hi_rdb_blk=0, disk_names=None, ctrl_names=None ): cyls = disk_geo.cyls heads = disk_geo.heads secs = disk_geo.secs cyl_blks = heads * secs rdb_blk_hi = cyl_blks * rdb_cyls - 1 if disk_names != None: disk_vendor = disk_names[0] disk_product = disk_names[1] disk_revision = disk_names[2] else: disk_vendor = "RDBTOOL" disk_product = "IMAGE" disk_revision = "2012" if ctrl_names != None: ctrl_vendor = ctrl_names[0] ctrl_product = ctrl_names[1] ctrl_revision = ctrl_names[2] else: ctrl_vendor = "" ctrl_product = "" ctrl_revision = "" flags = 0x7 if disk_names != None: flags |= 0x10 if ctrl_names != None: flags |= 0x20 # create RDB phy_drv = RDBPhysicalDrive(cyls, heads, secs) log_drv = RDBLogicalDrive( rdb_blk_hi=rdb_blk_hi, lo_cyl=rdb_cyls, hi_cyl=cyls - 1, cyl_blks=cyl_blks, high_rdsk_blk=hi_rdb_blk, ) drv_id = RDBDriveID( disk_vendor, disk_product, disk_revision, ctrl_vendor, ctrl_product, ctrl_revision, ) self.block_bytes = self.rawblk.block_bytes self.rdb = RDBlock(self.rawblk) self.rdb.create( phy_drv, log_drv, drv_id, block_size=self.block_bytes, flags=flags ) self.rdb.write() self.used_blks = [self.rdb.blk_num] self.max_blks = self.rdb.log_drv.rdb_blk_hi + 1 self.valid = True
def open(self): # read RDB if not self.rdb: self.rdb = RDBlock(self.rawblk) if not self.rdb.read(): self.valid = False return False # check block size of rdb vs. raw block device if self.rdb.block_size != self.rawblk.block_bytes: raise IOError( "block size mismatch: rdb=%d != device=%d" % (self.rdb.block_size, self.rawblk.block_bytes) ) self.block_bytes = self.rdb.block_size # create used block list self.used_blks = [self.rdb.blk_num] # read partitions part_blk = self.rdb.part_list self.parts = [] num = 0 while part_blk != Block.no_blk: p = Partition(self.rawblk, part_blk, num, self.rdb.log_drv.cyl_blks, self) num += 1 if not p.read(): self.valid = False return False self.parts.append(p) # store used block self.used_blks.append(p.get_blk_num()) # next partition part_blk = p.get_next_partition_blk() # read filesystems fs_blk = self.rdb.fs_list self.fs = [] num = 0 while fs_blk != PartitionBlock.no_blk: fs = FileSystem(self.rawblk, fs_blk, num) num += 1 if not fs.read(): self.valid = False return False self.fs.append(fs) # store used blocks self.used_blks += fs.get_blk_nums() # next partition fs_blk = fs.get_next_fs_blk() # TODO: add bad block blocks self.valid = True self.max_blks = self.rdb.log_drv.rdb_blk_hi + 1 return True
def open(self): # read RDB self.rdb = RDBlock(self.rawblk) if not self.rdb.read(): self.valid = False return False # create used block list self.used_blks = [self.rdb.blk_num] # read partitions part_blk = self.rdb.part_list self.parts = [] num = 0 while part_blk != Block.no_blk: p = Partition(self.rawblk, part_blk, num, self.rdb.log_drv.cyl_blks, self) num += 1 if not p.read(): self.valid = False return False self.parts.append(p) # store used block self.used_blks.append(p.get_blk_num()) # next partition part_blk = p.get_next_partition_blk() # read filesystems fs_blk = self.rdb.fs_list self.fs = [] num = 0 while fs_blk != PartitionBlock.no_blk: fs = FileSystem(self.rawblk, fs_blk, num) num += 1 if not fs.read(): self.valid = False return False self.fs.append(fs) # store used blocks self.used_blks += fs.get_blk_nums() # next partition fs_blk = fs.get_next_fs_blk() # TODO: add bad block blocks self.valid = True self.max_blks = self.rdb.log_drv.rdb_blk_hi + 1 return True
def peek_block_size(self): self.rdb = RDBlock(self.rawblk) if not self.rdb.read(): self.valid = False return None return self.rdb.block_size