xcat-core/xCAT/postscripts/createFS
2010-09-16 09:34:26 +00:00

208 lines
5.5 KiB
Bash

#!/bin/sh
#set -x
#-----------------------------------------------------------------------------
# createFS
#
# This script is used to create new FS on xCAT Service Node to hold the nim
# resources. Currently it support AIX system, will support Linux later.
#
# By default, the new FS is created as 5G based on rootvg. But it can be
# customized, the options are compatible with AIX crfs command.
#
# If we need to create multiple file systems, then we need to call "create_FS"
# multiple times at the bottom of this script, passing it different parameters.
#
# For example:
# FS1 = ("/install", "jfs2", "rootvg","" , "yes", "size=5G");
# FS2 = ("/install", "jfs2", "datavg", "hdisk2 hdisk3", "yes", "size=5G frag=512 nbpi=1024");
#
# create_FS $FS1
# create_FS $FS2
#
#-----------------------------------------------------------------------------
# For AIX system
# MountPiont, VfsType, VolumeGroup, harddisks, AutoMount, Attributes
FS1="/install,jfs2,rootvg,,yes,size=5G"
#FS2="/install,jfs2,datavg,hdisk2 hdisk3,yes,size=5G frag=512 nbpi=1024"
# To-DO
# For Linux system
# MountPiont, VfsType, fs-options
#-----------------------------------------------------------------------------
create_FS(){
fs=$1
os=`uname`
if [[ $os = AIX* ]]; then
echo "To create File System on AIX"
create_FS_AIX $fs
else
echo "To create File System on Linux"
create_FS_Linux $fs
fi
}
#----------------------------------------------
create_FS_AIX(){
aixfs=$1
# parse input
IFS=','
set $aixfs
mp=$1
vfs=$2
vg=$3
hd=$4
mnt=$5
attrs=$6
unset IFS
echo "MountPiont: $mp, VfsType: $vfs, VolumeGroup: $vg, harddisks: $hd, AutoMount: $mnt, Attributes: $attrs"
# First, check if mp is already FS
old_mp=`df -m $mp |tail -1|awk '{print $7}' 2>/dev/null`
if [ "$old_mp" != "" ] && [ $old_mp = $mp ]; then
echo "$mp is already a file system, will not create it."
exit 0
fi
if [ "$vg" != "" ]; then
# check if vg exists
result=`lsvg |grep $vg`
if [ $? -eq 0 ]; then
# vg exists
# check if "harddisks" is provided
if [ "$hd" != "" ]; then
# harddisk provided
# check if hardisk is the same with current ones
old_hd=`lsvg -p $vg|grep 'hd'|awk '{print $1}'|tr "\n" " "`
if [ "$old_hd" = "$hd" ]; then
# use the existed vg
tocr_fs=1
else
# extendvg
result=`extendvg $vg $hd`
if [ $? -eq 0 ]; then
# to create fs
tocr_fs=1
else
echo "Can not extend VG $vg with hard disk $hd"
exit 1
fi
fi
else
# use the provided vg
tocr_fs=1
fi
else
# not exist
# check if "harddisks" is provided
if [ "$hd" != "" ]; then
# harddisk provided
# create VG first, then FS
tocr_vg=1
tocr_fs=1
else
# no vg, no hd, give error msg and exit
echo "No harddisks provided, can not create VG and FS."
exit 1
fi
fi
else
echo "use rootvg to create FS $mp"
$vg="rootvg"
fi
# create VG if needed
if [ "$tocr_vg" = "1" ]; then
result=`mkvg -y $vg $hd`
if [ $? -ne 0 ]; then
echo "Can not make VG $vg using harddisk $hd."
exit 1
fi
fi
# create FS if needed
if [ "$tocr_fs" = "1" ]; then
# if /install exists, then back up first
result=`ls $mp 2>/dev/null`
if [ $? -eq 0 ]; then
# exist
# do backup first
tmp_mp="/install_createFS"
echo "Running command: mv $mp $tmp_mp"
result=`mv $mp $tmp_mp`
if [ $? -ne 0 ]; then
echo "Can not back up $mp to $tmp_mp"
exit 1
fi
echo "Back up $mp to $tmp_mp"
bakup=1
fi
# create fs
cmd="crfs"
if [ "$vfs" != "" ]; then
cmd="$cmd -v $vfs"
fi
if [ "$vg" != "" ]; then
cmd="$cmd -g $vg"
fi
if [ "$mp" != "" ]; then
cmd="$cmd -m $mp"
fi
if [ "$mnt" != "" ]; then
cmd="$cmd -A $mnt"
fi
if [ "$attrs" != "" ]; then
cmd="$cmd -a $attrs"
fi
echo "Running command: $cmd"
result=`$cmd`
if [ $? -ne 0 ]; then
echo "Can not create file system $mp"
exit 1
fi
result=`mount $mp`
if [ $? -ne 0 ]; then
echo "Can not mount file system $mp"
exit 1
fi
# restore /install to FS
if [ "$bakup" = "1" ]; then
echo "Restore $tmp_mp to new FS $mp"
result=`cd $tmp_mp;find . -print | cpio -pdlvu $mp`
if [ $? -ne 0 ]; then
echo "Can not restore $tmp_install to file system $mp"
exit 1
fi
result=`rm -rf $tmp_mp`
if [ $? -ne 0 ]; then
echo "Can not remove $tmp_mp"
exit 1
fi
fi
fi
}
# main
create_FS $FS1