VIOS⚓︎
Network⚓︎
Create Network Interface Backup (NIB) adapter⚓︎
Create Link Aggregated (802.3ad) adapter⚓︎
Create Shared Ethernet Adapter (SEA)⚓︎
mkvdev -sea entX -vadapter entX,entY -default entX -defaultid XXX -attr ha_mode=sharing
chdev -dev entX -perm -attr jumbo_frames=yes large_receive=yes largesend=1
chdev -dev entX -perm -attr accounting=enabled
Check SEA mapping⚓︎
List active VLAN's being sent over the SEA⚓︎
SEA en* device needs to be up in ifconfig, but doesn't need an IP address
Manually change SEA failover mode⚓︎
Reset ethernet adapter statistics⚓︎
SEA statistics⚓︎
Requires accounting to be enabled on adapter
-cresets statistics-nsearch on particular criteriamac=<value>ip=<value>vlan=<value>host=<value>
Preallocate virtual ethernet buffers⚓︎
lsdev | awk '/Virtual I\/O Ethernet Adapter/{ print $1 }' | while read -r VETH; do chdev -l "${VETH}" -a max_buf_tiny=4096 -a min_buf_tiny=4096 -a max_buf_small=4096 -a min_buf_small=4096 -a max_buf_medium=2048 -a min_buf_medium=2048 -a max_buf_large=256 -a min_buf_large=256 -a max_buf_huge=128 -a min_buf_huge=128 -P; done
Storage⚓︎
NPIV map client adapter to server FCS port⚓︎
To unassign the mapping, just leave the physical adapter off the command
View NPIV mappings⚓︎
Specific client adapter mapping
All client adapter mappings (CSV formatting)
Show all client WWPN's from the VIOS⚓︎
Verbose adapter stats⚓︎
Replace FCS adapter being used with NPIV⚓︎
1. Verify port(s) that are offline⚓︎
The output below shows fcs5 isn't listed as NPIV capable. Even after a port down/up by the SAN team, the port still shows as offline.
$ lsnports
name physloc fabric tports aports swwpns awwpns
fcs0 U78CA.001.CSS134Y-P1-C2-C1-T1 1 64 30 3088 2984
fcs1 U78CA.001.CSS134Y-P1-C2-C1-T2 1 64 29 3088 2981
fcs4 U78CA.001.CSS134Y-P1-C4-C1-T1 1 64 30 3088 2976
fcs6 U78CA.001.CSS112R-P1-C2-C1-T1 1 64 27 3088 2965
fcs7 U78CA.001.CSS112R-P1-C2-C1-T2 1 64 26 3088 2962
fcs10 U78CA.001.CSS112R-P1-C4-C1-T1 1 64 37 3088 3005
fcs11 U78CA.001.CSS112R-P1-C4-C1-T2 1 64 37 3088 3005
2. Put vfchosts into a Defined state⚓︎
As these are two port adapters, fcs4 which is still functional has active NPIV maps, so they need to be put into a Defined state. The below command shows all the current mappings down fcs4 and fcs5. The mappings down fcs5 wont show if the port isn't available.
Loop through above vfchost adapters and put them into a Defined state.
lsmap -all -npiv -fmt : | awk -F: '$7 ~ /fcs[45]/{ print $1 } | while read -r VFC; do rmdev -dev ${VFC} -ucfg; done
3. Put the physical ports of the card being replaced into a Defined state⚓︎
4. Replace adapter and bring it back online⚓︎
Once the card is verified as being back online, bring the devices back into an Available state. This should also put back all the above vfcmap's.
Virtual Media Library⚓︎
Define a VML⚓︎
$ mkrep -sp rootvg -size 10G
Virtual Media Repository Created
Repository created within "VMLibrary" logical volume
Add ISO image(s) to VML⚓︎
# ls -l /var/vio/VMLibrary/AIX-6100-06-01-Disk1.iso
-r-------- 1 root system 4236148736 Apr 06 18:07 /var/vio/VMLibrary/AIX-6100-06-01-Disk1.iso
$ lsrep
Size(mb) Free(mb) Parent Pool Parent Size Parent Free
10198 6158 rootvg 279552 236288
Name File Size Optical Access
AIX-6100-06-01-Disk1.iso 4040 None ro
Create File Backed Optical Device for LPAR⚓︎
Load image into the vtopt0 device⚓︎
$ loadopt -vtd vtopt0 -disk AIX-6100-06-01-Disk1.iso
$ lsmap -vadapter vhost1
SVSA Physloc Client Partition ID
--------------- -------------------------------------------- ------------------
vhost0 U9133.55A.066EB4H-V1-C34 0x00000000
VTD vtopt0
Status Available
LUN 0x8200000000000000
Backing device /var/vio/VMLibrary/AIX-6100-06-01-Disk1.iso
Physloc
Mirrored N/A
Load a second disk⚓︎
Can be used if you're prompted to insert disk 2 (for example)
Unload the image⚓︎
Shared Storage Pools⚓︎
The following parameter are used when working with Shared Storage Pools (SSPs)
| Parameter | Description |
|---|---|
clustername |
Name of the cluster |
repopvs |
Disk which will contain the repository (Around 1GB LUN) |
spname |
Name of the storage pool |
sppvs |
Disks in the storage pool |
hostname |
FQDN of the VIOS |
Create cluster⚓︎
cluster -create -clustername <name> -repopvs <hdiskX> -spname <sp_name> -sppvs <hdiskY> <hdiskX> -hostname <vios_hostname1> <vios_hostname2>
Remove the cluster⚓︎
Add node to cluster⚓︎
List Shared Storage Pools in a cluster⚓︎
Allocate disk to VM⚓︎
<device_name>is the virtual disk name, and can be whatever you want
Remove disk from VM⚓︎
<device_name>The disk udid can be used here instead
Monitor disk pool⚓︎
Add more LUN's to a pool⚓︎
List nodes in a cluster⚓︎
Clean disk of all cluster information⚓︎
Repository disk
Storage Pool Disk
List cluster storage interfaces⚓︎
Storage Pool threshold alerts⚓︎
alert -list -clustername <cluster_name> -spname <sp_name>
alert -set -clustername <cluster_name> -spname <sp_name> -type threshold -value <value>
Miscellaneous⚓︎
Setup PS1 prompt⚓︎
Append the follow in /usr/ios/cli/.profile
Append the following in /home/padmin/.kshrc
export EXTENDED_HISTORY=ON
export EDITOR=/usr/bin/vi
export HOST="$(/usr/bin/uname -n)"
export ENTSTAT_MODE=closed.error
alias aix="ioscli oem_setup_env"
alias history='fc -t'
if [ "$(whoami)" != "root" ]; then
export PS1="[$(whoami)@${HOST}]$ "
else
export PS1="[$(whoami)@${HOST}]# "
fi
set -o vi
Overall monitoring of all LPARs⚓︎
- Press
pto see the Shared Processor Pools - Press
~to toggle between nmon and topas - Press
Eto see SEA stats
See the underlying AIX commands being run from padmin shell⚓︎
Schedule backup of virtual and logical configuration⚓︎
Scripts⚓︎
sea_portinfo⚓︎
Determine the physical switch name and port number by sniffing CDP packets.
#!/bin/ksh
#
# Name:
# sea_portinfo.sh
#
# Description:
# Tries to determine the physical switch name and port number by sniffing
# CDP packets. Only works on Cisco switches and only if the port is configured to
# publish CDP packets.
#
# Usage:
# Optional:
# -c : CSV output format.
#
# Requirements:
# timeout - Comes as part of the coreutils RPM which can be installed with yum.
#
# Note:
# This script isn't perfect. Sometimes the packet captured isn't always
# the CDP one, so you may need to run it multiple times to get the switch details when
# the real adapter is a link aggregation of multiple physical ports.
hostname=$(hostname -s | tr '[:upper:]' '[:lower:]')
# Arguments
while getopts "c" OPTION; do
case ${OPTION} in
c) CSVOUT="yes"
;;
*) CSVOUT="no"
;;
esac
done
if [[ ${CSVOUT} = "no" ]]; then
printf '\n%s\n' "Sniffing Shared Ethernet Adapters (SEA) for switch details"
printf '%s\n' "This may take up to 90 seconds per SEA..."
fi
# Iterate through all SEA's
for sea in $(lsdev -F 'name description' | awk '/Shared Ethernet Adapter/{ print $1 }'); do
# Get SEA real adapter
real_adapter=$(lsattr -E -a real_adapter -F value -l "${sea}")
# If the real adapter is an EtherChannel, get a count of the number of aggregated interfaces
if [ "$(lsdev -l "${real_adapter}" -F 'description')" = "EtherChannel / IEEE 802.3ad Link Aggregation" ]; then
ent_count=$(lsattr -E -a adapter_names -F value -l "${real_adapter}" | awk -F ',' '{ print NF }')
else
ent_count=1
fi
# Bring SEA's en adapter up (if not already)
sea_en_state=$(lsattr -E -a state -F value -l en"${sea#ent}")
if [ "${sea_en_state}" != "up" ]; then
chdev -a state=up -l en"${sea#ent}" > /dev/null 2>&1
fi
# Capture CDP packets from the SEA interface. If tcpdump is still running after 90 seconds,
# we may have hit a switch that either isn't Cisco, or the port doesn't have CDP enabled
unset switchinfo
set -A switchinfo $(/home/padmin/scripts/bin/timeout 90s tcpdump -i en"${sea#ent}" -s 1500 -c "${ent_count}" -v 'ether[20:2] = 0x2000' 2>&1 | grep -E '(Device-ID|Port-ID)' | awk -F ':' 'v && NR==n{ gsub(/ /, "", v); gsub(/ /, "", $3); print v","$3}/Device-ID/{ v=$3; n=NR+1 }')
switchinfo=${switchinfo:-"NONE"}
# If the SEA interface was down when we first checked, lets put it back in that state
if [ "${sea_en_state}" = "down" ]; then
chdev -a state=down -l en"${sea#ent}" > /dev/null 2>&1
ifconfig en"${sea#ent}" down detach
fi
# Print values
if [[ ${CSVOUT} = "yes" ]]; then
if [ "${switchinfo}" = "NONE" ]; then
printf '%s\n' "${hostname},Switch not Cisco, CDP not enabled, or CDP packet not seen in timeout duration."
else
printf '%s\n' "hostname,sea,real_adapter,switchname,switchport"
count=0
while [[ ${count} < ${#switchinfo[*]} ]]; do
switchname=$(echo "${switchinfo[$count]}" | awk -F ',' '{gsub("\047", "", $1); print $1}') # \047 is octal for a single quote
switchport=$(echo "${switchinfo[$count]}" | awk -F ',' '{gsub("\047", "", $2); print $2}') # \047 is octal for a single quote
printf "%s\n" "${hostname},${sea},${real_adapter},${switchname},${switchport}"
(( count+=1 ))
done
fi
else
if [ "${switchinfo}" = "NONE" ]; then
printf '\n%s\n' "+-----------------------------------+"
printf '%s\n' "SEA: ${sea}\n"
printf '%s\n' " -> Backing adapter: ${real_adapter}"
printf '%s\n' "+-----------------------------------+"
printf '%s\n' "Unable to determine switch details."
printf '%s\n' " Switch not Cisco, CDP not enabled, or CDP packet not seen in timeout duration."
else
count=0
printf '\n%s\n' "+-----------------------------------+"
printf '%s\n' "SEA: ${sea}"
printf '%s\n' " -> Backing adapter: ${real_adapter}"
printf '%s\n' "+-----------------------------------+"
printf '%-40s %s\n' "Switch" "Port"
printf '%-40s %s\n' "------" "----"
while [[ ${count} < ${#switchinfo[*]} ]]; do
switchname=$(echo "${switchinfo[$count]}" | awk -F ',' '{gsub("\047", "", $1); print $1}') # \047 is octal for a single quote
switchport=$(echo "${switchinfo[$count]}" | awk -F ',' '{gsub("\047", "", $2); print $2}') # \047 is octal for a single quote
printf "%-40s %s\n" "${switchname}" "${switchport}"
(( count+=1 ))
done
fi
fi
done