Miscellaneous Solaris notes

netstat -k

Determine total amount of bytes (not just packets) sent and received over a network interface:

netstat -k | less
/hme0 (or your network interface)

hme0:
ipackets 1450233797 ierrors 5183 opackets 1312917784 oerrors 0 collisions 122831
24
defer 58 framing 0 crc 0 sqe 0 code_violations 0 len_errors 0
ifspeed 100 buff 5063 oflo 0 uflo 0 missed 107 tx_late_collisions 0
retry_error 0 first_collisions 55296 nocarrier 0 inits 246 nocanput 917395
allocbfail 0 runt 13 jabber 0 babble 0 tmd_error 0 tx_late_error 0
rx_late_error 0 slv_parity_error 0 tx_parity_error 0 rx_parity_error 0
slv_error_ack 0 tx_error_ack 0 rx_error_ack 0 tx_tag_error 0
rx_tag_error 0 eop_error 0 no_tmds 0 no_tbufs 0 no_rbufs 0
rx_late_collisions 0 rbytes 1773527647 obytes 3313629004 multircv 321597 multixm
t 0
brdcstrcv 328712706 brdcstxmt 162426 norcvbuf 726653 noxmtbuf 0

netstat -k provides a method to display kernel statistics recorded by the kstat facility.


prtconf usage

Display device aliases (along with other information) without being at the Open Boot Prompt ("ok" prompt):

prtconf -pv

Determine current boot-device (i.e. it is possible that the first entry in the EEPROM boot-device order is not necessarily the current boot-device):

prtconf -pv | grep bootpath

Here is a script I wrote to convert the "bootpath" into cxtxdx (logical) format. This procedure should work with Solaris 2.6 and later. If it does not work on your system, please send me the prtconf output above along with the full device path to your boot disk.

#!/bin/sh

# Determine the Solaris boot disk in cxtxdx format.

BOOTPATH=`prtconf -pv | grep bootpath | tr -d "'" | awk '{print $2}'`

if [ -n "`echo $BOOTPATH | grep "/disk"`" ] ; then
   # The bootpath contains "disk," but the /devices block device contains
   # either "sd" or "ssd"
   BOOTPATH=`echo $BOOTPATH | sed 's/disk@//'`
   BOOT_DISK=`ls -l /dev/dsk | sed -e 's/ssd@//' -e 's/sd@//' \
   | grep "$BOOTPATH" 2>/dev/null | awk '{print $9}' | sed 's/s[0-7]//'`
else
   BOOT_DISK=`ls -l /dev/dsk | grep "$BOOTPATH" 2>/dev/null | \
   awk '{print $9}' | sed 's/s[0-7]//'`
fi

if [ -n "$BOOT_DISK" ] ; then
   echo "Your boot disk is ${BOOT_DISK}."
else
   echo "Unable to determine logical boot disk."
fi

More information at sun-managers mailing list.


Determine minfree

minfree is the percentage of a file system reserved for the superuser or privileged processes. The value is 10% by default on UFS file systems.

/usr/sbin/fstyp -v raw_device | grep minfree

ex.
# /usr/sbin/fstyp -v /dev/rdsk/c0t0d0s0 | grep minfree
minfree 10%     maxbpg  2048    optim   time


"Blackhole"/null routing a destination IP address:

route add destination_IP 127.0.0.1 -blackhole

Note that this seems to work without the -blackhole flag, and can be used on most Unices.

All network traffic destined to destination_IP will not leave the network interface, as it is given a "next hop" of 127.0.0.1 (localhost). Note that  destination_IP can still reach the host, although response traffic will not reach destination_IP, making it appear that communication is broken.


Multiple devalias entries with eeprom

ex.
# eeprom "nvramrc=devalias c0t0d0 /sbus@2,0/SUNW,socal@d,10000/sf@0,0/ssd@w220000203714f2ee,0:a devalias c3t6d0 /sbus@6,0/SUNW,socal@d,10000/sf@1,0/ssd@w2200002037093df0,0:a"

Make sure to also set use-nvramrc? to true. These device aliases will be stored after a system reset.

# eeprom "use-nvramrc?=true"


SENA disk serial numbers

Script to display disk serial numbers for fibre channel devices and devices in a Sun Enterprise Network Array (SENA):

#!/bin/sh

for disk in `format < /dev/null | egrep "[0-9]+\." | awk '{print $2}'`
do
   serial=`luxadm display /dev/rdsk/${disk}s2 2>/dev/null | grep Serial | awk '{print $3}'`
   echo "$disk\t$serial"
done

Example output:
c0t0d0  LAV27428
c0t2d0  LAY18677
c1t0d0  LAV00875
c1t1d0  LAY19210
c1t2d0  LAY18927
c1t3d0  LAY17116
c1t4d0  LAY19231
c1t6d0  LAY18239
c1t16d0 LAY19212
c1t17d0 LAY18981
c1t18d0 LAY19339
c1t19d0 LAY16957
c1t20d0 LAY17615
c1t22d0 LAY15851


"configuring IPv4 interfaces:ifconfig: setifflags: SIOCSLIFFLAGS: interface: Cannot assign requested address interface"

An /etc/hostname.interface file exists, but the value in /etc/hostname.interface file is not in /etc/hosts. Add the IP address and hostname listed in /etc/hostname.interface to /etc/hosts.


Determining RPM of a Sun disk

Run mkfs -m /dev/rdsk/cxtxdxs2 and multiply the rps= value (revolutions per second) by 60 to determine the RPM.

ex. # mkfs -m /dev/rdsk/c0t0d0s2
mkfs -F ufs -o nsect=133,ntrack=27,bsize=8192,fragsize=1024,cgsize=16,free=10,rps=90,nbpi=2049,opt=t,apc=0,gap=0,nrpos=8,maxcontig=16 /dev/rdsk/c0t0d0s2 412964

90 (rps) * 60 (seconds) = 5400 RPM.


"UX: groupadd: ERROR: group is already in use.  Choose another."

If you attempt to add a group with a name longer than 8 characters, you may see this error message with Solaris even if group is not in /etc/group or the NIS group map. You may manually add groups longer than 8 characters to /etc/group to overcome this limitation, although grpck will complain about these entries.


Solaris routing with multiple interfaces

In this example, we have an hme2 network interface with an IP address of 65.201.213.117, a  network address of 65.201.213.112, and a subnet mask of 255.255.255.240. The interface was initially enabled using the default subnet mask and broadcast address.

ifconfig hme2
hme2: flags=1000843<UP,BROADCAST,RUNNING,MULTICAST,IPv4> mtu 1500 index 3
        inet 65.201.213.117 netmask ff000000 broadcast 65.255.255.255

Routing Table: IPv4
  Destination           Gateway           Flags  Ref   Use   Interface
-------------------- -------------------- ----- ----- ------ ---------
65.0.0.0             65.201.213.117        U        1      8  hme2

To correct the routing table:

1. Specify the correct subnet mask and broadcast address with ifconfig.
ifconfig 65.201.213.117 netmask 255.255.255.240 broadcast 65.201.213.127

2. Add an /etc/netmasks entry for the correct netmask to be used after system reboot.
65.201.213.112    255.255.255.240

Corrected routing table:

Routing Table: IPv4
  Destination           Gateway           Flags  Ref   Use   Interface
-------------------- -------------------- ----- ----- ------ ---------
65.201.213.112       65.201.213.117        U        1      1  hme2


"/usr/share/man/windex: No such file or directory"

Run catman -w as root to rebuild the "windex" database that is used by the whatis and man -f and -k options.


List installed packages by size

The following script will list all installed Solaris packages with an estimate of their size using the ouput of pkginfo. A better implementation would be a Perl script that would look at the /var/sadm/install/contents file.

#!/bin/sh

printf "%-10s %-10s %-s\n" "Name" "Size (k)" "Description"
printf "%-10s %-10s %-s\n" "----" "--------" "-----------"

pkginfo | while read line
do
   set $line
   category=$1
   name=$2
   description=`pkginfo -l $name | grep DESC: | awk -F: '{print $2}'`
   size=`pkginfo -l $name | grep "blocks used" | awk '{print $1}'`
   [ -n "$size" ] && size_in_kbytes=`echo "$size * 512 / 1024" | bc`
   printf "%-10s %-8d %-s\n" "$name" "${size_in_kbytes}" "$description" 2>/dev/null
done


A "block" (disk block) referred to in pkginfo -l output or df output is 512 bytes. By default, Solaris UFS file systems are created using 8K blocks (filesystem blocks).


"Clock board TOD does not match TOD on any IO board."

Run the command copy-clock-tod-to-io-boards from the Open Boot Prompt ("ok" prompt).


patchadd return codes

The "Return codes" listed when installing the Sun Recommended Patch Clusters are listed toward the top of the patchadd script. Here are some common return codes:

#               2       Attempt to apply a patch that's already been applied
#               8       Attempting to patch a package that is not installed
#               25      A required patch is not applied


Mounting an ISO image

The following instructions are for Solaris 8 and later. You must be root to mount the ISO image.

lofiadm -a absolute_path_to_ISO
mount -F hsfs -r /dev/lofi/1 mount_point

ex. mounting /home/hutch/cdrom.iso to /tmp/mnt
lofiadm -a /home/hutch/cdrom.iso
/dev/lofi/1

mount -F hsfs -r /dev/lofi/1 /tmp/mnt


"WARNING: Timed out waiting for NIS to come up"

If a Solaris system is configured as a NIS client and there is a problem reaching a NIS server, the system will hang indefinitely when booting. To fix,

1. Perform a send brk to get to the Open Boot Prompt ("ok" prompt).
2. Boot to single-user mode with boot -s
3. Temporarily disable RPC services  or remove /etc/defaultdomain to prevent NIS from starting at system boot.
mv /etc/rc2.d/S71rpc /etc/rc2.d/NOS71rpc
-- or --
rm /etc/defaultdomain
4. Type exit to continue booting your system to your default runlevel.

The system will now boot. Begin troubleshooting problems reaching the NIS server with /etc/init.d/rpc start (if you disabled RPC) or domainname your_NIS_domainname;/usr/lib/netsvc/yp/ypstart (if you removed /etc/defaultdomain).

Once you determine the problem, re-enable RPC services with mv /etc/rc2.d/NOS71rpc /etc/rc2.d/S71rpc or re-create /etc/defaultdomain, depending on which method of disabling NIS you chose.


"Blackhole"/null routing a destination IP address

route add destination_IP 127.0.0.1 -blackhole

Note that this seems to work without the -blackhole flag, and can be used on most Unices.

All network traffic destined to destination_IP will not leave the network interface, as it is given a "next hop" of 127.0.0.1 (localhost). Note that destination_IP can still reach the host performing the null routing, although response traffic will not reach destination_IP, making it appear that communication is broken.


"umount: I/O error"
umount: cannot unmount /mount_point

I received this error on a Solaris 8 system when the disk containing a Veritas volume failed. After killing all the processed identified with fuser -c /mount_point and confirming no other processes were in use in the file system with lsof +D /mount_point, I had to issue the umount -f /mount_point command to forcibly unmount the file system:

# umount /file_system
umount: I/O error
umount: cannot unmount /file_system
# fuser -c /file_system
/file_system:
# lsof +D /file_system
# umount -f /file_system
# mount | grep /file_system
#

For Solaris users, only Solaris 8 and later provide the umount -f ("force") flag. Other Unices may have the "force" flag for umount.

Volume Management (vold) problems

Starting vold via /etc/init.d/volmgt start or /usr/sbin/vold will occasionally fail.

# /usr/sbin/vold
Mon Dec 22 14:49:07 2003 fatal: mounting of "/vol" failed

# cd /vol
NFS server for volume management (/vol) not responding still trying
NFS getattr failed for server for volume management (/vol): error 23 (RPC: Unitdata error)
/vol: bad directory

To fix the problem, unmount the /vol directory (you may have to use the -f  "force" flag in umount for Solaris 8 and later) and restart volume management.


"No directory! Logging in with home=/"

This error message may occur on Solaris systems when the automount daemon (automountd) is already running when NIS is started (/usr/lib/netsvc/yp/ypstart). To fix this, restart the automount daemon via /etc/init.d/autofs stop;/etc/init.d/autofs start and re-login.


Sun Explorer

The Sun Explorer Data Collector is a tool that gathers extensive system information primarly for the use of Sun engineers. The latest version of the tool may be downloaded at http://sunsolve.sun.com/diag/explorer/SUNWexplo.tar.Z


Problems starting vold

If the volume management service will not start via /etc/init.d/volmgt start or /usr/sbin/vold, and the following errors are listed in /var/adm/messages and /var/adm/vold.log, you may need to unmount /vol. Run fuser -c /vol to see which process ID(s) are using /vol. Kill these process(es), and restart volume management.

/var/adm/messages errors:
/usr/sbin/vold[9808]: svc_tli_create: could not bind to requested address: No Error
/usr/sbin/vold[9808]: svc_tli_create: Cannot create server handle

/var/adm/vold.log errors:
fatal: svc_tli_create: Cannot create server handle


Booting off an external CD-ROM

To boot off an external CD-ROM, determine the device path with probe-scsi-all from the Open Boot PROM (OBP or "ok" prompt). Note: you may want to temporarily perform a setenv auto-boot? false and reset-all if OBP warns you that executing probe-scsi-all could hang your system.

Relevant probe-scsi-all output:

/sbus@b,0/SUNW,fas@3,8800000
Target 3
  Unit 0   Removable Read Only device     PLEXTOR CD-R   PX-R820T 1.0811/21/00
                                           16:00

In this example, the SCSI target ID ("Target") is 3, and the physical path to the external CD-ROM is /sbus@b,0/SUNW,fas@3,8800000. To boot a Solaris Operating Environment CD using this external CD-ROM, you would issue the command:

{e} ok boot /sbus@b,0/SUNW,fas@3,8800000/sd@3,0:f

In the command above, sd@3,0 refers to the SCSI target (3) and LUN/Unit (0).

Note: when connecting an external CD-ROM device, make sure that the CD-ROM drive and system are both powered off. Connect the CD-ROM, and power on the CD-ROM and then the system. Failure to follow this procedure may result in the following errors:

{e} ok boot /sbus@b,0/SUNW,fas@3,8800000/sd@3,0:f
Boot device: /sbus@b,0/SUNW,fas@3,8800000/sd@3,0:f  File and args:
Bad magic number in disk label
Can't open disk label package

Can't open boot device

Repairing a hard disk with bad sectors

The format command may be used to repair a hard disk that is experiencing read/write errors.

Example error:

WARNING: /sbus@3,0/SUNW,fas@3,8800000/sd@0,0 (sd120):
        Error for Command: read                    Error Level: Retryable
        Requested Block: 577712                    Error Block: 577796
        Vendor: SEAGATE                            Serial Number: 9737K75183
        Sense Key: Media Error
        ASC: 0x16 (data sync mark error), ASCQ: 0x0, FRU: 0xd2

While the format command allows you to repair an individual block, it is probably best to run analyze and perform at least a read test, as there may be more than one bad block on the disk.

The analyze command will automatically repair errors it finds when scanning the hard disk for bad blocks.

analyze> read
Ready to analyze (won't harm SunOS). This takes a long time,
but is interruptable with CTRL-C. Continue? y

        pass 0
WARNING: /sbus@3,0/SUNW,fas@3,8800000/sd@0,0 (sd120):
        Error for Command: read                    Error Level: Retryable
        Requested Block: 577800                    Error Block: 577800
        Vendor: SEAGATE                            Serial Number: 9737K75183
        Sense Key: Media Error
        ASC: 0x16 (data sync mark error), ASCQ: 0x0, FRU: 0xd2
Medium error during read: block 577800 (0x8d108) (267/8/0)
ASC: 0x16   ASCQ: 0x0
Repairing hard error on 577800 (267/8/0)...ok.

Back to brandonhutchinson.com.
Last modified: 08/24/2004