Configuring 
              SAN Storage in Solaris
             Brad Bascom and Jason McCullough
              Storage area networks have moved from the cutting edge to almost 
              commonplace. But, if this is your first time connecting remote storage 
              to Solaris, there are a number of configuration tasks that will 
              be new to you if you have only worked with directly attached SCSI 
              arrays or Sun's legacy Fibre Channel arrays such as the A5200 
              series. In this article, we will outline steps to configure Solaris 
              to attach to remote disk storage from HP, IBM, and Network Appliance 
              SANs. The platform configurations have much in common, but there 
              are some differences in the patch sets and software libraries required. 
              In our environment, we have used a few different SAN host bus adapter 
              cards from Emulex and JNI, and we installed Veritas Volume Manager 
              on the systems after the SAN devices were attached.
              A SAN is a network that provides access to remote devices through 
              a serial SCSI protocol such as Fibre Channel or iSCSI. This differs 
              from NAS (network attached storage), which uses SMB/CIFS and NFS 
              protocols. A SAN is much more than just a Fibre loop to remote disk 
              drives -- tape robots and other hosts can transfer data directly 
              between nodes and thereby decrease the load on the production Ethernet 
              interfaces, where most of the user application traffic is directed. 
              Using a SAN fabric of Fibre Channel switches, dozens of servers 
              from multiple platforms can be interconnected to share the same 
              cabinet of disks for data and share the same tape devices for enterprise 
              backups.
              Cost justification for investing in a SAN might be found by comparing 
              the cost of directly attached storage to that of a centralized pool 
              of storage. In our environment, many of our legacy directly attached 
              storage arrays were underutilized. Although most of our old disk 
              arrays still had room for growth, this storage space could not be 
              effectively shared among servers. Pooling all disk storage into 
              one large SAN array allowed for less waste and more efficient storage 
              expansion as needed. Another advantage of migrating our storage 
              to SANs has been increased I/O speed. Many of our older servers 
              use 80 MB/s SCSI or 100 MB/s Fibre Channel for local disk storage.
              Migrating storage to the SAN using dual 2-Gb Fibre Channel connections 
              on each server has brought new life to some of our older, slower 
              machines. Our older disk arrays had little or no cache to speed 
              I/O transactions unlike our SAN storage cabinets, which have several 
              gigabytes of I/O cache. In practice, we found some of our heavily 
              I/O-bound applications, such as database loads, to run in half their 
              previous time after migrating to the SAN. There have been numerous 
              other advantages to our SAN, such as new tools for monitoring space, 
              tools for trend analysis, and a significant consolidation of rack 
              space in our data center.
              Preparing Solaris for SAN Connectivity
              Regardless of the brand of SAN equipment used, the place to start 
              is with Solaris patches. We can't stress enough the importance 
              of applying Sun's recommended patch clusters immediately after 
              installing Solaris. We found that some features didn't work 
              as expected until the recommended patch set and additional patches 
              below were applied. We started with Sun's Recommended and Security 
              patch cluster, which can be downloaded from the Web or via ftp from:
              
             
http://sunsolve.sun.com
 
            For Solaris 8, we downloaded the 8_Recommended.zip file and unzipped 
            this file on our boot disk where we had plenty of free space. We shut 
            down to single user mode with init s before running the install_cluster 
            script. We issued the uname -a command before and after the 
            patches to ensure the kernel version had been upgraded. The kernel 
            version is the number after the dash in the output, for example, 108528-20 
            is Solaris 8 at kernel version 20. Sun's best practice is to 
            keep up to date with the latest kernel release by installing the full 
            Recommended and Security patch cluster. The patch cluster includes 
            the basic patches that are recommended for all systems, although additional 
            patches may be required for specific applications.
             We then downloaded the Sun StorEdge SAN 4.2 software. This can 
              be found at www.sun.com/storage/san, and will require a sunsolve 
              account login. The file to download is Solaris_8_SFK_packages.tar.Z. 
              We uncompressed and tar extracted this file and noted that it contained 
              three small Solaris packages: SUNWsan, SUNWcfpl, and SUNWcfplx. 
              We used the pkgadd utility to install all three of these with pkgadd 
              -d . Solaris_8_SFK_packages.
              The next step was to review individual patch versions on our box 
              and determine whether additional patches were required. We used 
              the showrev command to list installed patches and install 
              higher versions as needed. For example, showrev -p | grep 109524 
              will search for the ssd driver patch at any version. We wanted to 
              see version two, 109524-02, or higher. The best practice is to make 
              a list of the versions you have and compare them to the latest available 
              versions on sunsolve.sun.com. Below are the specific patches we 
              applied for Fibre channel and general SAN readiness on our servers. 
              These patches are all installed separately with the patchadd 
              command; refer to the readme files that come with these patches 
              for specific installation instructions. After all the patches were 
              installed, we rebooted and checked /var/adm/messages for any errors 
              before continuing:
              
             
109524-15 /kernel/drv/ssd patch
109657-09 isp driver patch
108974-27 dada, uata, dad, sd and scsi drivers patch
109529-06 luxadm, liba5k and libg_fc patch #1
111413-08 luxadm, liba5k and libg_fc patch #2 (requires 109529-06)
110380-04 ufssnapshots support, libadm patch
110934-13 pkgtrans, pkgadd, pkgchk
 
            Installing Host Bus Adapters
             We used dual JNI (http://www.jni.com) host bus adapters 
              to connect to our HP and IBM SANs, and we used Emulex (http://www.emulex.com) 
              adapters to connect to our Network Appliance SAN. Thus, we can provide 
              an example for both of these common cards. The choice of interface 
              card will depend on vendor support and certification of card models 
              and specific levels of firmware. Be sure to check the vendor Web 
              sites for latest firmware releases. Power off your server and install 
              the interface cards in appropriate slots. Our test servers were 
              a Sun 220R system (with PCI slots) and a Sun Ultra-2 server (with 
              SBUS slots). We installed two adapters for each of the installations 
              below so we would have some hardware redundancy and be able to take 
              advantage of multipathing software. Some of Sun's Enterprise 
              servers can accept either SBUS or PCI cards by making use of Sun's 
              I/O boards with the appropriate SBUS or PCI slots.
              Network Appliance SAN Configuration
              In the first installation, we connected a Sun 220R server to our 
              Network Appliance SAN filer model F940. We installed two PCI-based 
              Emulex LP9002L host bus adapters in our Sun server and studied /var/adm/messages 
              to be sure we had no boot errors. The software driver for the Emulex 
              cards was provided to us by Network Appliance on CD, although updates 
              can be downloaded from their Web site (http://www.netapp.com). 
              Network Appliance has repackaged the Emulex drivers to include additional 
              tools beyond the generic drivers obtainable at http://www.emulex.com. 
              We installed the drivers by uncompressing and tar extracting the 
              file "ntap_solaris_fcp_1_0.tar.Z" and then running the 
              install script in the resulting directory. The script installed 
              the Emulex lpfc drivers and utilities, Network Appliance sanlun 
              utility, and updated parameters in /etc/system. There was only one 
              question to answer regarding the use of Veritas with multipathing, 
              which we will discuss later. We rebooted after running the script.
              The Network Appliance SAN filer has a worldwide node name (WWNN), 
              which should be bound to your Sun server. Using persistent bindings 
              between the filer (known as the target) and the Sun server's 
              Fibre Channel cards (the initiators) means you will always get the 
              same SCSI target IDs for your SAN disks after every reboot. Without 
              persistent bindings, the SCSI ID could change. To set up these bindings 
              we telneted into the SAN filer and issued the command fcp nodename. 
              This provided us the Fibre Channel node name in two formats, with 
              and without colons, similar to the following example:
              
             
filer> fcp nodename
Fibre Channel nodename: 50:a9:80:00:55:CC:66:CD  (50a9800055CC66CD)
 
            Once we installed the two Emulex host bus adapter cards in the Sun 
            server, they were named by Solaris to be lpfc0 and lpfc1. We ran the 
            newly installed lputil command (installed under the /usr/sbin/lpfc 
            directory) to create persistent bindings. The utility is a text-based 
            menu, so we selected the "Persistent Bindings" and "Bind 
            Target Manually" options. We were shown a list of HBA cards in 
            our server (lpfc0, lpfc1), entered 0 to select the first card, and 
            selected "Node Name". We pasted in our Network Appliance 
            Fibre Channel nodename discovered above as a block of 16 characters 
            with no colons or dashes. We entered 1 for the target number. The 
            target number could be set to any number from 0 to 511 and uniquely 
            identifies the filer in the event you want to attach more than one 
            SAN filer to the Sun server. We repeated these steps for the second 
            HBA card lpfc1, entering the same Fibre Channel nodename and filer 
            target 1. We performed a reconfiguration reboot at this point with 
            reboot -- -r. We think it's a good idea to go back into 
            the lpfc menu after the system reboots to verify that the persistent 
            bindings were preserved and that everything looks correct.
             LUN Configuration
              The next step is to create LUNs on the SAN filer and make them 
              available to the Sun server, or more specifically, make them available 
              to the HBA cards in our Sun server. The term LUN is derived from 
              SCSI unit number and, in this context, we are referring to SCSI 
              disk devices, although they are virtual disks and not physical SCSI 
              disk drives. A virtual disk is created by combining slices of physical 
              disks into one logical volume. The physical disk structure may use 
              mirroring or RAID5, but the resulting LUN can be treated as one 
              unit of disk in Solaris. In our environment, the SAN provides storage 
              for several operating systems and is not managed by the Unix administrators. 
              How to configure and make available sets of disks or LUNs on the 
              SAN arrays is beyond the scope of this article, but we can summarize 
              the steps. We created an initiator group on the filer, which is 
              a list of worldwide port names (WWPNs). Network Appliance provides 
              a tool to make this step easier. We ran the following sanlun command 
              on our Sun server and provided the output to our SAN systems administrator:
              
             
# /usr/sbin/sanlun fcp show adapter -c
 
            Enter this filer command to create an initiator group for this system:
             
             
igroup create -f -t solaris "sunhost1" 10000000c9307031  10000000c930694c
 
            The second line of output provided us with the Network Appliance igroup 
            command to be used on the filer to create the initiator group. The 
            name of the group is the same as the Sun host name, in this example 
            sunhost1. The following numbers are the WWPNs of the two HBA cards 
            in this Sun server, and the igroup command is used to add these cards 
            into the sunhost1 igroup on the filer. We provided this information 
            to our SAN administrator along with our request for LUNs. He created 
            three LUNs for us and mapped them to this initiator group for our 
            use.
             On the Solaris side, we needed to configure the /kernel/drv/sd.conf 
              file, which is used to define and configure SCSI disk storage. Each 
              Sun server already has a generic version of this file, however, 
              we need to expand upon it to tell Solaris to probe for new LUNs 
              at boot time. We added the following lines to the bottom of our 
              sd.conf file to configure three additional LUNs. Note that target 
              1 matches the target we mapped to our filer when configuring the 
              HBA cards with the lputil menu:
              
             
name="sd" parent="lpfc" target=1 lun=0;
name="sd" parent="lpfc" target=1 lun=1;
name="sd" parent="lpfc" target=1 lun=2;
 
            If you anticipate needing to add storage space to this system in the 
            future, add plenty of extra entries to the sd.conf file. The sd.conf 
            is only read by Solaris during a reboot, so to avoid reboots, you 
            must define several more LUNs than you currently need by incrementing 
            the lun number. As long as these definitions were read during the 
            last reboot, you will be able to add LUNs on the fly with the devfsadm 
            command.
             After our sd.conf was configured and the server was rebooted, 
              we saw the new devices listed in the Solaris format utility. We 
              noticed warnings regarding the new LUNs indicating they had corrupt 
              labels. When we selected a disk (LUN) by number, we received the 
              message that it was formatted but not labeled and were asked, "Label 
              it now?" Responding with a "y", we labeled the LUN 
              and repeated the process for all the new LUNs. Along with the format 
              command, we found Network Applicance's sanlun utility useful 
              for displaying the status of our LUNs. For example, "sanlun 
              lun show filer1" lists all the LUNs on SAN filer1, showing 
              the Solaris device filename, LUN size, and state.
              We installed two HBAs in our server so we had two paths to each 
              LUN; for example, we had one set of disks on controller 2 and another 
              set on controller 3. Our first disk, c2t0d0, is the same physical 
              LUN as c3t0d0 and only the first instance needs to be labeled. Veritas 
              will take advantage of the second path to the LUN if you install 
              Veritas Volume Manager with Dynamic Multipathing. At this point, 
              the LUNs looked like standard Solaris disks, and we were ready to 
              create new file systems on them or initialize them with Veritas 
              Volume Manager.
              HP SAN Configuration
              Our second installation was performed connecting an HP SAN model 
              XP1024 to the Sun 220R server. Starting from a clean installation 
              of Solaris on the server, we applied the Sun patches as indicated 
              above and then installed two PCI-based JNI host bus adapters. We 
              performed a reconfiguration reboot and again examined the /var/adm/messages 
              to ensure we had no boot errors. Even before any software drivers 
              for the cards were installed, we could verify that Solaris was aware 
              of the JNI hardware by issuing the command prtconf | grep JNI. 
              The output showed one line per card and indicated that a JNI device 
              was installed but no driver was attached. We downloaded the drivers 
              for the JNI cards directly from their Web site (http://www.jni.com). 
              Our cards were model FCX-6562, and the files to download for Solaris 
              were the driver package "JNIC146x.pkg" and the EZ Fibre 
              GUI configuration software "EZF_22j.tar". You need to 
              be root to perform these installs, although you do not need to be 
              in single user mode. We installed the drivers with pkgadd -d 
              jnic146x.pkg. In the pkgadd menu, we selected "all" 
              to install both the JNI HBA driver and the associated libraries 
              for Solaris. At this point, the command prtconf | grep JNI 
              showed one line for each card indicating instance 0 and instance 
              1, an indication the device drivers were attached.
              One difference between the Emulex and JNI products is the addition 
              of a configuration GUI provided by JNI. We configured the sd.conf 
              with LUN definitions and relied on the EZ Fibre GUI to perform these 
              edits. The GUI also made tuning parameter changes for the JNI drivers, 
              which are stored in the /kernel/drv/jnic146x.conf file. To install 
              the EZ Fibre software, we tar extracted the ezf_22j.tar file, changed 
              into the resulting EZF_22 directory, and ran the install.sh script. 
              This is an X Window application, and it popped up a series of windows 
              leading us through the installation. We accepted the license agreement 
              and the default install directory /opt/jni/ezfibre/standalone. After 
              installation, we started the EZ Fibre GUI by changing to the ezfibre/standalone 
              directory and executing the ezf script. The GUI provided a view 
              of our system, listing each JNI card and providing the card status 
              and WWPN information.
              We used the EZ Fibre configuration GUI to look up the worldwide 
              port names for each JNI HBA card and provided these WWPNs to our 
              SAN administrator. The card parameter changes are stored in the 
              jnic146x.conf file. The defaults may be correct for most installs, 
              but we hard-coded the link speed to 2 GB, disabled IP protocol, 
              and set the topology to use a fabric instead of a private Fibre 
              loop. Changes here were made to both HBA cards separately before 
              rebooting.
              Our HP SAN administrator uses a Web-based tool from HP called 
              the StorageWorks command view. Using this tool, he created LUNs 
              within the HP SAN array and assigned them to our HBA WWPNs. This 
              created a soft zone to map the LUNs to our HBAs and is analogous 
              to using the igroup command in the Network Appliance installation 
              above. After the LUNs were assigned to the cards in our Sun server, 
              we could see the LUNs as available to us in the "LUN-Level 
              Zoning" tab in the EZ Fibre GUI. Checking them off and accepting 
              them in the GUI made the proper edits to our sd.conf file. We repeated 
              the process of attaching LUNs to both HBA cards. We committed changes 
              for each card separately in the GUI and then rebooted the server. 
              Note that persistent bindings are in effect since Dynamic Binding 
              in the GUI is disabled by default. After exiting the EZ Fibre GUI, 
              we examined the sd.conf file and saw the LUNs added at the bottom 
              in the following format:
              
             
name="sd" class="scsi" target=0 lun=1;
name="sd" class="scsi" target=0 lun=2;
name="sd" class="scsi" target=0 lun=3;
 
            Although using the GUI to add LUNs to sd.conf was convenient, it did 
            not provide a way to add extra LUN definitions for future disk expansion. 
            Thus, we used a text editor to edit the sd.conf file and add several 
            more lines, incrementing the LUN number. The sd.conf file is only 
            read at boot time, and we wanted to be able to add more disk space 
            on the fly without having to reboot in the future. We can have up 
            to 256 LUNs per target number. If our SAN manager provides another 
            LUN on the fly, we can run the devfsadm command to create the 
            Solaris device for the predefined LUN without rebooting.
             IBM Shark SAN Configuration
              We connected an older Sun Ultra-2 server to our Shark SAN ESS 
              2105-F20 using a pair of SBUS-based JNI cards (model FCE1473). Again, 
              we downloaded the card drivers from the JNI Web site, along with 
              the JNI EZ Fibre utility, and there were no significant differences 
              from our previous JNI installations. This Ultra-2 was installed 
              with Solaris 9 and, unlike with Solaris 8, we could achieve connectivity 
              to the Shark SAN without additional patches after the base Solaris 
              install. However, the best practice is to always install the cluster 
              of patches 9_Recommended.zip.
              We downloaded the Sun StorEdge SAN 4.2 software, Solaris_9_SFK_packages.tar.Z, 
              from http://www.sun.com/storage/san. This is essentially 
              the same as for Solaris 8 and contains the Solaris packages SUNWsan, 
              SUNWcfpl, and SUNWcfplx for Solaris 9. We confirmed through the 
              /var/adm/messages file that our hardware was running cleanly before 
              setting up LUNs with the EZ Fibre GUI. After rebooting, we saw the 
              familiar message about corrupt labels on our LUNs and used the Solaris 
              format utility to label each LUN with a default Solaris label. Although 
              not required for our installation, enhanced functionality is available 
              through IBM's Subsystem Device Drivers (SDD) for Solaris. These 
              drivers support the multipath configuration within the Shark and 
              allow for load balancing multiple paths.
              Veritas Volume Manager and DMP
              In each of our SAN installations, every LUN that was provided 
              to our Sun server became a Solaris disk device in the familiar Sun 
              convention of c#t#d#, where c = controller, t = target, d = disk. 
              The LUNS as defined in sd.conf as 0, 1, 2 became Solaris disk devices 
              c2t0d0, c2t0d1, c2t0d2. We saw them again as controller 3 (c3t0d0, 
              c3t0d1, c3t0d2) since we have two HBA paths to the same devices. 
              We worked with our SAN administrator to create LUNs that were roughly 
              7 Gb in size. Although we could create LUNs many times this size, 
              we thought it would be less wasteful to add disks in increments 
              of 7 Gb, one or two LUNs at a time, as our applications required 
              more space.
              We needed a utility that allowed us to grow and expand file systems 
              on the fly without reboots. With this setup, we could add LUNs on 
              the fly if they were already reserved in the sd.conf file, however, 
              we could not resize an existing LUN. Although our SAN administrator 
              could resize a LUN on the backend, it would require us to create 
              a new file system on the Solaris device. We could back up, resize, 
              and rebuild the LUN and Solaris disk device, and then restore our 
              data. But we could not keep our file system online during that process.
              Veritas Volume Manager allows us to create Unix file systems that 
              span multiple LUNs and also provides tools to resize Unix file systems 
              without taking them offline. If one of our mounted file systems 
              is running out of space, we can import another LUN, initialize it 
              as a Veritas disk, and extend the file system onto this disk. It 
              is not necessary to unmount the file system during the process.
              In our three SAN environments, we installed Veritas Volume Manager 
              version 3.5. Veritas recommends also installing their maintenance 
              pack update MP1 for 3.5. (At the time of writing, MP1 consisted 
              of Sun patches 113210-02 for Solaris 8, 112392-04 for vxvm, and 
              three for vea, 113203-02, 113595-02, and 13596-02. On our older 
              Veritas 3.2 installations, we downloaded 113201-02 for vxvm, 111904-06 
              for vmsa, and 110435-08 for vxfs.) There was nothing unusual about 
              the installation in a SAN environment compared to legacy disk arrays. 
              Once the LUNs are visible as Solaris devices under the format utility 
              and have been labeled, they can be brought under Veritas control. 
              Veritas should see the disks after a reconfiguration reboot or, 
              if you have added LUNs on the fly, you can run the Veritas vxdctl 
              enable command to make them visible to Veritas. The vxdisk 
              list command is convenient for checking whether all your disk 
              devices are known to Veritas. We use the vxdiskadm menu to initialize 
              all our LUN disks and then the Veritas vea (previously vmsa) GUI 
              to create volumes and file systems.
              As mentioned previously, we have dual HBAs in each server so there 
              is one instance of each disk under each controller c2 and c3. Veritas 
              is installed with Dynamic Multipathing by default and will configure 
              itself to show only one instance of each disk as seen in the vxdisk 
              list output. We verified that Veritas is aware of the second 
              path to each of these disks by listing the detailed information 
              on each disk. For example, vxdisk list c2t0d0s2 will show 
              a page of detail about the disk, including multipath information 
              near the bottom:
              
              Multipathing information: 
              numpaths:    2 
              c2t0d0s2     state=enabled 
              c3t0d0s2     state=enabled 
              
              An enabled state means that DMP has been enabled in Veritas, but 
              it is not an immediate indicator of the physical connection status. 
              To certify our servers during the installation process, we watched 
              a tail -f /var/adm/messages on our system and unplugged one 
              Fibre HBA connection at a time to observe the failure and reconnection 
              of each path to the LUN devices.
              In our HP SAN environment, we downloaded an additional software 
              package, the Veritas Array Support Library. Starting with Volume 
              Manager version 3.2, Veritas introduced the Device Discovery Layer 
              (DDL), which enhances the Veritas configuration daemon to discover 
              multipathing attributes of disks. Support for some disk arrays is 
              built in before adding these libraries and vxddladm listsupport 
              will identify them. However, check the Veritas Web site at support.veritas.com 
              to see whether a library is available for your specific array. In 
              the case of our HP SAN, the array support library enabled Veritas 
              to correctly identify the array and provide additional advanced 
              functionality relative to command devices, which are reserved devices 
              for each host server to communicate with the array. We did not install 
              Veritas support libraries for our Shark and Network Appliance SANs; 
              however, we issued the command vxddladm addjbod vid=NETAPP 
              for the Network Appliance SAN to identify NETAPP to the Veritas 
              DDL.
              Summary
              We have shown examples of configuring Solaris to connect to three 
              different vendors' SANs. Although there are differences in 
              how to configure the HBA software drivers for various types of cards, 
              the steps to achieve connectivity are similar. Before beginning 
              an installation, we ensure that our system has been upgraded to 
              the latest patch sets available. Patch releases are frequently released, 
              and time spent researching the latest versions on sunsolve before 
              installing is time well spent. Once the system is running with the 
              latest patches, SAN software, and HBA drivers, we provide the WWPN 
              numbers of our HBA cards to our SAN administrator. He creates virtual 
              disks and puts them into a group or soft zone, which restricts their 
              use only to our HBAs.
              We then edit our Solaris sd.conf file to add these new LUNs and 
              instruct Solaris to define them as disk devices during the next 
              reconfiguration reboot. We configure the HBA driver software to 
              persistently bind the SCSI targets for the new LUNs so they will 
              be consistent across reboots. The new disk devices are labeled with 
              the Solaris format utility and initialized with Veritas Volume Manager. 
              We install enhanced libraries for Veritas DDL if they exist for 
              our vendor's SAN and, finally, test the functionality of dynamic 
              multipathing. Our first attempt to connect Solaris to a SAN was 
              challenging because we needed to learn several new concepts, such 
              as configuring the sd.conf file and how to bind WWPN numbers in 
              our environment. We hope we have provided enough of an overview 
              of these concepts here to make this process easier for others.
              Brad Bascom has worked for the past 16 years in the fields 
              of Unix administration and TCP/IP networking for academic, municipal 
              government, and financial corporations. Brad holds a computer science 
              degree from Houghton College (1987) and is currently working as 
              a senior Unix administrator at a large financial firm in downtown 
              Boston. He can be emailed at: [email protected].
              Jason McCullough, a former U.S. Marine, started his career 
              in systems administration in the Marine Corps. Jason has worked 
              for the past 4 years as a senior Unix systems administrator for 
              a financial company in Boston. His technical expertise includes 
              Solaris, AIX, and Veritas NetBackup and HA products. He can be emailed 
              at: [email protected]. 
            |