Beispiel #1
0
    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
Beispiel #2
0
    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
Beispiel #3
0
    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
Beispiel #4
0
 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