Welcome! Wikis are websites that everyone can build together. It's easy!

Scripting on the MD3000/3000i


The Modular Disk Storage Manager (MDSM) software that is used to manage the Dell PowerVault MD3000 and MD3000i storage arrays is a powerful GUI for creating disk groups, configuring hosts, and setting up iSCSI parameters. It has a scripting component, the storage management command line interface (SMCLI) that enables the user to script actions that become tedious and error prone with the GUI, such as disk group/virtual disk creation, and to set parameters (such as disk group element size) that are not exposed through the GUI.

This note will show how to use the SMCLI to script disk group/virtual disk creation.

Get the full MD3000/3000i scripting document from support.dell.com for details (drill down to the MD3000i on support.dell.com and look for user guides).

The smcli program is installed along with the MD3000/3000i Modular Disk Storage Manager controller software
(C:\Program Files (x86)\Dell\MD Storage Manager\client/smcli.exe on our systems)

To automate disk group creation, use the MDSM GUI to create the first disk group on the MD3000i

Then, use SMCLI to store the MD3000i configuration (r3md3000i resolves to the IP address of the management port on the first MD3000i controller):

C:\>smcli r3md3000i -c "save storagearray configuration file=\"c:\\md3000i_config_base.scr\";"
Performing syntax check...
Syntax check complete.
Executing script...
Script execution complete.
SMcli completed successfully

This is what md3000i_config_base.scr looks like:
---------------------------------------------------------------------------------------------------
// Logical configuration information from Storage Array r3md3000i.
// Saved on November 2, 2007
// Firmware package version for Storage Array r3md3000i = 06.50.32.60
// NVSRAM package version for Storage Array r3md3000i = N133X-617890-015
//on error stop;
// Uncomment the two lines below to delete the existing configuration.
//show "Deleting the existing configuration.";
//clear storageArray configuration;

// Storage Array global logical configuration script commands
show "Setting the Storage Array user label to r3md3000i.";
set storageArray userLabel="r3md3000i";
show "Setting the Storage Array media scan rate to 15.";
set storageArray mediaScanRate=15;
// Uncomment the three lines below to remove default virtual disk, if exists, script command. NOTE: Default virtual disk name is always = "" (blank).
//on error continue;
//show "Deleting the default virtual disk created during the removal of the existing configuration.";
//delete virtualDisk[""];
//on error stop;
// Copies the hot spare settings
// NOTE: These statements are wrapped in on-error continue and on-error stop statements to
// account for minor differences in capacity from the physical disk of the Storage Array on which the
// configuration was saved to that of the physical disks on which the configuration will be copied.
//on error continue;
show "Creating hot spare at Enclosure 2 Slot 14.";
set physicalDisk[2,14] hotSpare=true;
//on error stop;
show "Setting the Storage Array cache block size to 4.";
set storageArray cacheBlockSize=4;
show "Setting the Storage Array to begin cache flush at 80% full.";
set storageArray cacheFlushStart=80;
show "Setting the Storage Array to end cache flush at 80% full.";
set storageArray cacheFlushStop=80;

show "Creating RAID 1 Virtual Disk SQLData1 on new Disk Group 1.";
// This command creates the Disk Group and the initial Virtual Disk on that group.
// NOTE: For Disk Groups that use all available capacity, the last Virtual Disk on this group is
// created using all remaining capacity by omitting the capacity= virtual disk creation parameter.
create virtualDisk physicalDisks=(0,0 0,1 0,2 0,3 0,4 1,0 1,1 1,2 1,3 1,4) raidLevel=1 userLabel="SQLData1" owner=0 segmentSize=128 capacity=730251814400 Bytes;
show "Setting additional attributes for Virtual Disk SQLData1.";
// Configuration settings that can not be set during Virtual Disk creation.
set virtualDisk["SQLData1"] cacheFlushModifier=10;
set virtualDisk["SQLData1"] cacheWithoutBatteryEnabled=false;
set virtualDisk["SQLData1"] mirrorEnabled=true;
set virtualDisk["SQLData1"] readCacheEnabled=true;
set virtualDisk["SQLData1"] writeCacheEnabled=true;
set virtualDisk["SQLData1"] mediaScanEnabled=true;
set virtualDisk["SQLData1"] consistencyCheckEnabled=true;
set virtualDisk["SQLData1"] readAheadMultiplier=1;
set virtualDisk["SQLData1"] modificationPriority=high;
---------------------------------------------------------------------------------------------------

Next, modify the script, remove other statements, and add additional create virtualDisk commands for additional disk groups:

The result, md3000i_create_LUNs.scr, looks like this:
---------------------------------------------------------------------------------------------------
show "Creating RAID 1 Virtual Disk SQLData1 on new Disk Group 1.";
create virtualDisk physicalDisks=(0,0 0,1 0,2 0,3 0,4 1,0 1,1 1,2 1,3 1,4) raidLevel=1 userLabel="SQLData1" owner=0 segmentSize=128 capacity=680.1GB;
set virtualDisk["SQLData1"] cacheFlushModifier=10;
set virtualDisk["SQLData1"] cacheWithoutBatteryEnabled=false;
set virtualDisk["SQLData1"] mirrorEnabled=true;
set virtualDisk["SQLData1"] readCacheEnabled=true;
set virtualDisk["SQLData1"] writeCacheEnabled=true;
set virtualDisk["SQLData1"] mediaScanEnabled=true;
set virtualDisk["SQLData1"] consistencyCheckEnabled=true;
set virtualDisk["SQLData1"] readAheadMultiplier=1;
set virtualDisk["SQLData1"] modificationPriority=high;
show "Creating RAID 1 Virtual Disk SQLData2 on new Disk Group 2.";
create virtualDisk physicalDisks=(0,5 0,6 0,7 0,8 0,9 1,5 1,6 1,7 1,8 1,9) raidLevel=1 userLabel="SQLData2" owner=1 segmentSize=128 capacity=680.2GB;
set virtualDisk["SQLData2"] cacheFlushModifier=10;
set virtualDisk["SQLData2"] cacheWithoutBatteryEnabled=false;
set virtualDisk["SQLData2"] mirrorEnabled=true;
set virtualDisk["SQLData2"] readCacheEnabled=true;
set virtualDisk["SQLData2"] writeCacheEnabled=true;
set virtualDisk["SQLData2"] mediaScanEnabled=true;
set virtualDisk["SQLData2"] consistencyCheckEnabled=true;
set virtualDisk["SQLData2"] readAheadMultiplier=1;
set virtualDisk["SQLData2"] modificationPriority=high;
show "Creating RAID 1 Virtual Disk SQLData3 on new Disk Group 3.";
create virtualDisk physicalDisks=(0,10 0,11 0,12 0,13 0,14 1,10 1,11 1,12 1,13 1,14) raidLevel=1 userLabel="SQLData3" owner=0 segmentSize=128 capacity=680.3GB;
set virtualDisk["SQLData3"] cacheFlushModifier=10;
set virtualDisk["SQLData3"] cacheWithoutBatteryEnabled=false;
set virtualDisk["SQLData3"] mirrorEnabled=true;
set virtualDisk["SQLData3"] readCacheEnabled=true;
set virtualDisk["SQLData3"] writeCacheEnabled=true;
set virtualDisk["SQLData3"] mediaScanEnabled=true;
set virtualDisk["SQLData3"] consistencyCheckEnabled=true;
set virtualDisk["SQLData3"] readAheadMultiplier=1;
set virtualDisk["SQLData3"] modificationPriority=high;
show "Creating RAID 1 Virtual Disk SQLData4 on new Disk Group 4.";
create virtualDisk physicalDisks=(2,0 2,1 2,2 2,3 2,4 2,5 2,6 2,7 2,8 2,9) raidLevel=1 userLabel="SQLData4" owner=1 segmentSize=128 capacity=680.4GB;
set virtualDisk["SQLData4"] cacheFlushModifier=10;
set virtualDisk["SQLData4"] cacheWithoutBatteryEnabled=false;
set virtualDisk["SQLData4"] mirrorEnabled=true;
set virtualDisk["SQLData4"] readCacheEnabled=true;
set virtualDisk["SQLData4"] writeCacheEnabled=true;
set virtualDisk["SQLData4"] mediaScanEnabled=true;
set virtualDisk["SQLData4"] consistencyCheckEnabled=true;
set virtualDisk["SQLData4"] readAheadMultiplier=1;
set virtualDisk["SQLData4"] modificationPriority=high;
show "Creating RAID 1 Virtual Disk SQLLogs on new Disk Group 5.";
create virtualDisk physicalDisks=(2,10 2,11 2,12 2,13) raidLevel=1 userLabel="SQLLogs" owner=0 segmentSize=128;
set virtualDisk["SQLLogs"] cacheFlushModifier=10;
set virtualDisk["SQLLogs"] cacheWithoutBatteryEnabled=false;
set virtualDisk["SQLLogs"] mirrorEnabled=true;
set virtualDisk["SQLLogs"] readCacheEnabled=true;
set virtualDisk["SQLLogs"] writeCacheEnabled=true;
set virtualDisk["SQLLogs"] mediaScanEnabled=true;
set virtualDisk["SQLLogs"] consistencyCheckEnabled=true;
set virtualDisk["SQLLogs"] readAheadMultiplier=1;
set virtualDisk["SQLLogs"] modificationPriority=high;
--------------------------------------------------------------------------------------------------------

Finally, run the script and watch the disk groups and virtual disks being created:

C:\>smcli r3md3000i -f md3000i_create_LUNs.scr
Performing syntax check...
Syntax check complete.
Executing script...
Creating RAID 1 Virtual Disk SQLData1 on new Disk Group 1.
Creating RAID 1 Virtual Disk SQLData2 on new Disk Group 2.
Creating RAID 1 Virtual Disk SQLData3 on new Disk Group 3.
Creating RAID 1 Virtual Disk SQLData4 on new Disk Group 4.
Creating RAID 1 Virtual Disk SQLLogs on new Disk Group 5.
Script execution complete.
SMcli completed successfully.






Latest page update: made by todd_muirhead , Jul 15 2008, 12:17 PM EDT (about this update About This Update todd_muirhead Moved from: Storage - todd_muirhead

No content added or deleted.

- complete history)
Keyword tags: None
More Info: links to this page

Anonymous  (Get credit for your thread)



By saving these changes, I acceptthis site's content policies and agree to comply with applicable copyright laws.

Started By Thread Subject Replies Last Post
brian_summers MPIO on MD3000i 0 Jan 31 2008, 11:39 AM EST by brian_summers
brian_summers
Thread started: Jan 31 2008, 11:39 AM EST  Watch
Is the following statement about the MD3000i true for both physical and virtual solutions?

“each port has a unique IP address and MPIO manages port failover via MPIO”
1  out of 2 found this valuable. Do you?    
Keyword tags: md md3000 md3000i mpio