Sunday, May 13, 2012

Axis2 Clustering

Clustering concept is a remarkable and noteworthy model. I have comprehended the axis2 cluster mechanism.

A cluster consists of a group of independent but interconnected server client whose combined resources can be applied to a processing task. A common cluster feature is that it should appear to an application as though it were a single server. Apache Axis2 works the same.

Main requirement of any clustering enterprise deployment are High Availability & scalability. High Availability, which services, monitors, and restarts all other resources as required. Scalability challenges are ability to serve large capacity and speed continues to grow at an exponential rate due to a variety of factors like large number of request.

We can simply enable Axis2 Clustering in the axis2.xml file enabling attribute to true locate in the "Clustering".The services provided by Axis2 clusteringe include the Axis2 clustering management API.

The axis2.xml file clustering configuration section include below main parts.

Clustering Agent & Clustering Agent Parameters
Agents normally have parameters that can be changed in order to tweak their initialization & performance. Following is a brief introduction about the important parameters that are  useful.

synchronizeAll- Ensures Synchronization  that all synchronized content
is identical across the cluster member
maxRetries- Define the timestamps to retry to send message among the
cluster members before the node fail
localMemberHost- Include the IP addresses or host name of the cluster members
memberDropTime- If a if a member does not respond in a cluster axis2.xml include time interval to left the group,It include under this in milliseconds
AvoidInitiation- To be the cluster has automatically initialized this parameter include

        <parameter name="synchronizeAll">true</parameter>
        <parameter name="maxRetries">10</parameter>
        <parameter name="localMemberHost">127.0.0.1</parameter>
        <parameter name="memberDropTime">3000</parameter>
        <parameter name="AvoidInitiation">true</parameter>



State Management
If we have a load balanced cluster State Management it requires synchronizing to the state across the members. State Management Clustering behaviour maintain keeping track of a user's activity across sessions.

Node Management
Node Management, you can add nodes to your cluster, monitor node
status, and perform management actions on nodes

<nodeManager class="org.apache.axis2.clustering.management.DefaultNodeManager"
            enable="true"/>

Group Management
This Managing resource groups in a cluster.It describes adding and
removing resource groups, and changing resource group attribute

<groupManagement enable="true">
    <applicationDomain name="group1"
                      description="This is the first group"

agent="org.apache.axis2.clustering.management.DefaultGroupManagementAgent"/>
    <applicationDomain name="group2"
                      description="This is the second group"

agent="org.apache.axis2.clustering.management.DefaultGroupManagementAgent"/>
</groupManagement>

Members
A set of identifiers are used to give a cluster member an identity within the cluster with different Ip addresses & ports in axis2
cluster

Saturday, May 12, 2012

WSO2 Message Broker Integrated With Zookeeper & Cassandra

WSO2 implemented the new Distributed Message Broker by developing the WSO2 Message Broker Integrated with Zookeeper & Cassandra.

When we consider distributed systems this is arguably one the technologies involved in a distributed systems are complicated and not easy to understand because distributed systems are hard to program. Testing a distributed system can also be quite intricate. Verifying of the behaviour and impact of code in the system is not that easy and requires a lot of careful thought and planning during the testing phase.

In this blog post first I elaborate WSO2 Message Broker Integrated With Zookeeper & Cassandra

Apache Zookeeper

Zookeeper is a centralized service coordinator where distributed applications synchronize, all of which services that are used by other distributed applications. When we integrate WSO2 MB with Zookeeper MB the distributed application is going to use the services provided by the Zookeeper. Zookeeper determines which node in the ZooKeeper service is alive at any given time and the handling of the node failures. ZooKeeper supports high-availability, therefore all clients making requests receive consistent and immediate data.

Getting started with Apache Zookeeper

Download Apache Zookeeper (http://www.apache.org/dyn/closer.cgi/zookeeper/)

Create a zoo.config file in zookeeper-3.3.5/conf & include below

# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
dataDir=/tmp/zookeeper
# the port at which the clients will connect
clientPort=2181

Then locate to bin folder and start Zookeeper server by executing the command “zkServer.sh
start”

In MB instance qpid-config.xml file which locate repository/conf/advanced/ include the Zookeeper host and port configuration

<coordination>
<!-- Apache Zookeeper Host name -->
<ZooKeeperHost>127.0.0.1</ZooKeeperHost>
<!-- Apache Zookeeper port -->
<ZooKeeperPort>2181</ZooKeeperPort>
<!-- Format yyyy-MM-dd HH:mm:ss -->
<ReferenceTime>2012-02-29 08:08:08</ReferenceTime>
</coordination>

Default port for Zookeeper will be “2181”

Configure Cassandra

Download Apache Cassandra from http://cassandra.apache.org/download/

Cassandra will generate several log files that are usefula.there for we need to make create directoryies to include their paths in cassandra.yaml.We create followe directoryies data_file_directories, commitlog_directory, and saved_caches_directory & sure that the paths exist in conf/cassandra.yaml

Create system.log file & include conf/log4j.properties
log4j.appender.R.File=/var/log/cassandra/system.log

Navigate to bin folder and execute sh cassandra -f to start cassandra

There is a configuration in  MB instance to have in the distributed cluster details in MB /repository/conf/advanced/qpid-virtualhosts.xml file
<virtualhost>
<name>carbon</name>
<carbon>
<store>
<class>org.wso2.andes.server.store.CassandraMessageStore</class>
<username>admin</username>
<password>admin</password>
<cluster>ClusterOne</cluster>
<host>localhost</host>
<port>9160</port>
</store>

Running WSO2 MB

Download the WSO2 MB
using the export command Set the JAVA_HOME to your Java home
Execute the ./wso2server.sh in CARBON_HOME/bin
Login user name & password as "admin"


When we navigate to
Home-> Manage-> Message Broker Clusters -> Node List we can view Zookeeper ID c


Now Message broker can running, message sender and receiver.It can send messages to that cluster and consume messages from that cluster using sample client.I will come with the code next time

Thursday, May 10, 2012

Web Security With OAuth & OpenID

I was participated to a web security workshop and session while I have captured about web features called OAuth & OpenID. Below I have brief down about the two technologies.

Web Service Security is a major requirement & crucial part of the enterprise  services.WS-Security supports multiple formats for tokens multiple trust domains, multiple signature formats and multiple encryption technologies.Both OAuth and OpenID systems tend to live longer because those are  two powerful features of WS-Security.

OAuth

OAuth is an open protocol that allows users to share their private resources, it can simply stored resources in one site with another site without having to hand out their username and password. Users have to share their credentials with potentially untrustworthy. There for data spread across various websites like Flickr, Twitter.With OAuth can be haven. Further access rights can be granted over the limited period of time without being required to expose their user name and password.WSO2 Identity Server include the feature that delegation via OAuth. It is representing the user as an authority

According to OAuth mechanism when user use of a service to login the authentication process It will redirects the user to where the serviceruns. In here OAuth provider uses its own OAuth credentials (token) toretrieve credentials for User. OAuth provider stores users credentialsalong with User's account allow him to use & access the service. OAuth important when someone hacked all the passwords of OAuth providers Even though user have lost his OAuth provider password the unauthorized person doesn’t have his service user password.

OpenID

OpenID enables to keep control over your own identity by separating the identity. Currently most people use the same username and password for every site that they are accessing to authenticate purposes. However this becomes very insecurity and not a recommended way of accessing. OpenID limit this risk by reducing the number of sites that you can access with same username and password. Using OpenID technology will be allowing one username/password to access any number of websites or online services. Further OpenID provider a secure channel and validate your identity.

In OpenID scenario it provides web redirections to communicate between the relying party and OpenID. Assume you want to login to web service but you don’t have a web service user credentials when other web services supporting OpenID there will be a possibility of using  the supporting OpenID’s web services account as to login to the web service that we dont have user ID. There for web services supporting OpenID authorizations eliminating the need of remember more than one user id and password.

I'm willing to focus on discovering & presenting those two features how support in WSO2 Identity Server.










Saturday, March 17, 2012

Retrieve Data from Excel Spreadsheet & Insert Data into a Database using WSO2 Data Service Server

Assume a particular user has some data stored in the form of Excel  files and he needs to get those data exported into a MySQL database.WSO2 Data Service Server allows to expose the data stored in data sources such as relational databases, CSV files , MS-Excel files and Google spreadsheets as web services.

We can be using Nested query features provide by WSO2 Data Service Server when writing this data service. Nested query feature is possible for a particular data service query to feed the result obtained after the execution of that particular query, as an input to some other query and eventually integrate both results to an unified format before presenting it to the user.


Create a mySQL database with one table, EXCEL.

mysql> CREATE DATABASE EXCEL_SHEET;

mysql> CREATE TABLE EXCEL(ID int,Name varchar(100),Address varchar(200));

Now create the data service:
Add Excel spreadsheet as a data source

<data name="Excel">                 
   <config id="dss">                                   
      <property name="excel_datasource">/home/amal/Desktop/EmployeeList.xls</property>                 
   </config> 
</data>

Add EXCEL_SHEET database as a data source.

<config id="Excel_db">
      <property name="org.wso2.ws.dataservice.driver">com.mysql.jdbc.Driver</property>
      <property name="org.wso2.ws.dataservice.protocol">jdbc:mysql://localhost:3306/EXCEL_SHEET</property>
      <property name="org.wso2.ws.dataservice.user">root</property>
      <property name="org.wso2.ws.dataservice.password">mysql123</property>
</config>


Create a query that retrieve the data from Excel spread sheet.In this query the column names of the output mappings should be same as the column titles in Excel spreadsheet.

<query id="getExcel" useConfig="excel_data">
      <excel>
         <workbookname>Sheet3</workbookname>
         <hasheader>true</hasheader>
         <startingrow>2</startingrow>
         <maxrowcount>-1</maxrowcount>
      </excel>
      <result element="Employees" rowName="Employee">
         <element name="ID" column="ID" xsdType="xs:integer" />
         <element name="Name" column="Name" xsdType="xs:string" />
         <element name="Address" column="Address" xsdType="xs:string" />
      </result>
</query>

Then create a operation that use the above query. Using that operation we can test whether query works properly.

<operation name="op1">
      <call-query href="getExcel" />
   </operation>

Click on the try it and check whether operation works properly.
It should return the all EXCEL details when you click on the operation.


Create a query "q2" that calls to  insert data into tables.

<query id="q2" useConfig="EXCEL_list">                                   
      <sql>insert into Employee_List values(?,?,?)</sql>                                   
      <param name="ID" sqlType="STRING" />                                   
      <param name="Name" sqlType="STRING" />                                   
      <param name="Address" sqlType="STRING" />                 
   </query> 


Then you need to give the data retrieved from the Excel spreadsheet as input to the "q2" query.To do this use Data Service nested query feature and call q2 query inside getExcel query.

      <call-query href="outExcel">
         <with-param name="ID" query-param="ID" />
         <with-param name="Name" query-param="Name" />
         <with-param name="Address" query-param="Address" />
      </call-query>


We are almost done with the data service configuration.Now, go to the TryIt screen of the data service and execute the operations as below.

Now when you execute the getExcel operation both data retrieving from Excel spreadsheet and inserting data to tables is happenning.
Check the two tables.Data should have entered.

mysql> select * EXCEL_SHEET;

Saturday, February 25, 2012

WSO2 Message Broker to publish in Message Boxes(SQS) using WSO2 ESB

In this post i’ll describe how we can configure WSO2 Message Broker and WSO2 ESB together. (Note : Here I'm using ESB_HOME as WSO2 ESB installation directory path and MB_HOME as WSO2 MB installation directory path.)

In this first instance we are going to get the WSO2 ESB and MB to work together.
Once you have downloaded and unzipped

Open carbon.xml in MB_HOME/repository/conf directroy and set the offset value to 1,then

Start WSO2 Message Broker.


Open event-broker.xml file in ESB_HOME/repository/conf directory and change deliveryManager type "remote".Then uncomment remoteMessageBroker details & set service port to 9444  & qpidPortto 5673 as below


<deliveryManager name="deliveryManager"
                         class="org.wso2.carbon.event.core.internal.delivery.jms.QpidJMSDeliveryManagerFactory"
                         type="remote">

             <remoteMessageBroker>
                <hostName>localhost</hostName>
                <servicePort>9444</servicePort>
                <webContext>/</webContext>
                <userName>admin</userName>
                <password>admin</password>
                <qpidPort>5673</qpidPort>
                <clientID>clientID</clientID>
                <virtualHostName>carbon</virtualHostName>
            </remoteMessageBroker>
        </deliveryManager>


After Start WSO2 ESB

Then create topic name test in WSO2 ESB & subscribe. You can create a subscription to the topic by providing the information on subscription as below

1.Topic
2.Subscription Mode
The default mode for the subscription is "Topic Only". With this mode , user creates the subscription only to the topic

3.Event Sink URL
you can create a subscription by providing the Event Sink URL : https://localhost:9443/services/EventSinkService/getOMElement
(Note : You can create a simple axis2service and use it's URL as the EventSinkURL . Inorder to create an axis2service ,
Browse the location : /wso2mb-1.0.3/samples/services/EventSinkService
Type the command : ant)
Now you can create a subscription by providing the Event Sink URL : https://localhost:9443/services/EventSinkService/getOMElement

Create a topic & message box with same name in WSO2 MB & subscribe as sqs://admin/topic_name.Message box provides the Simple Queue Service(SQS) operations.
In SQS, When a message is received by an user, that message is unaccessible for a specified time duration, and this message is not visible for other users till that specified time duration is over. If the message received user did not delete the message in that time duration, the message is visible for other users. This time duration is named as visibility timeout.

After that we Publish xml message in WSO2 ESB it will successfully prompted to WSO2 MB


Using the message box in WSO2 MB User can view the content of the message box by going through link in list view.

Setting up Governance Registry with Oracle RAC

Oracle Real Application Clusters (RAC) is an option for the Oracle Database for clustering and high availability in Oracle database environments.
In an Oracle RAC environment, some of the commands we have used in our oracle.sql is considered inefficient.If someone is testing products on a Oracle RAC, please rename oracle_rac.sql to oracle.sql before running -Dsetup.

Create a new database. This can be done by either using oracle db configuration assistant (dbca) or manually. Do necessary changes to oracle tnsnames.ora and listner.ora files in order to define databases addresses for establishing connections to newly created database. After configuring them, connect to oracle as System DBA using SQL*Plus

 $ sqlplus sys/sys-password as sysdba

As SYS DBA Create a database user,and grant privileges to the user as below:

 Create user USER_NAME identified by PASSWORD account unlock; 
grant connect to USER_NAME; 
grant create session, dba to USER_NAME; 
commit;     


Setup Configuration File

Edit $GREG_HOME/repository/conf/registry.xml and give the following:


 <currentDBConfig>oracle-db</currentDBConfig>
    <dbConfig name="oracle-db">
        <url>jdbc:oracle:thin:@(DESCRIPTION=(LOAD_BALANCE=on)
                 (ADDRESS=(PROTOCOL=TCP)(HOST=host_1) (PORT=1521))
                 (ADDRESS=(PROTOCOL=TCP)(HOST=host_2) (PORT=1521))
                 (CONNECT_DATA=(SERVICE_NAME=service)))
            </url>
        <userName>USER_NAME</userName>
        <password>PASSWORD</password>
        <driverName>oracle.jdbc.driver.OracleDriver</driverName>
        <maxActive>80</maxActive>
        <maxWait>60000</maxWait>
        <minIdle>5</minIdle>
    </dbConfig>


Edit $GREG_HOME/repository/conf/user-mgt.xml and give the following

<Configuration>
        ...
        <Property name="url">jdbc:oracle:thin:@(DESCRIPTION=(LOAD_BALANCE=on)
                             (ADDRESS=(PROTOCOL=TCP)(HOST=host_1) (PORT=1521))
                             (ADDRESS=(PROTOCOL=TCP)(HOST=host_2) (PORT=1521))
                             (CONNECT_DATA=(SERVICE_NAME=service)))</Property>
        <Property name="userName">USER_NAME</Property>
        <Property name="password">PASSWORD</Property>
        <Property name="driverName">oracle.jdbc.driver.OracleDriver</Property>
        <Property name="maxActive">50</Property>
        <Property name="maxWait">60000</Property>
        <Property name="minIdle">5</Property>
    </Configuration>

 Copy JDBC Driver

When we connecting WSO2 Governance Registry with Oracle 11g versions we want to copy the newest version oracle jdbc libraries to
$CARBON_HOME/repository/components/lib.If we used previous one ArrayIndexOutOfBoundsException arise.

 Create the database tables

Windows users can run $GREG_HOME/bin/wso2server.bat -Dsetup to create the database tables when starting WSO2 Governance Registry for the first time. Linux users should use $GREG_HOME/bin/wso2server.sh -Dsetup



Sunday, February 5, 2012

Perform a Generic OEL 5.4 installation

Perform a Generic OEL 5.4 installation

prepare the os as with rpm and kernal settings
as follows
General Cd/DVD mount
mkdir /media/cdrom
mount -t iso9660 -o ro /dev/cdrom /media/cdrom
cd /media/cdrom/Server
Specific mount

cd /media/Enterprise\ Linux\ dvd\ 20090908/Server/

# rpm -ivh libaio-devel*rpm

warning: libaio-devel-0.3.106-3.2.i386.rpm: Header V3 DSA signature: NOKEY, key ID 1e5e0159
Preparing...                ########################################### [100%]
   1:libaio-devel           ########################################### [ 50%]
   2:libaio-devel           ########################################### [100%]
[root@host5 Server]# rpm -ivh unixODBC-2*rpm unixODBC-devel-2*rpm 
warning: unixODBC-2.2.11-7.1.i386.rpm: Header V3 DSA signature: NOKEY, key ID 1e5e0159
Preparing...                
########################################### [100%]
   1:unixODBC               ########################################### [ 25%]
   2:unixODBC               ########################################### [ 50%]
   3:unixODBC-devel         ########################################### [ 75%]
   4:unixODBC-devel         ########################################### [100%]


    

As root, open a terminal window and perform these steps:

Edit /etc/hosts. The file should contain text similar to the following:
vi /etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1 localhost.localdomain localhost
192.168.100.58  host5.localdomain host5

Configure the kernel.

vi /etc/sysctl.conf

Add the following to the file:

# Kernel paramaters required by Oracle 11gR1
fs.file-max = 6553600
kernel.shmall = 2097152
kernel.shmmax = 2147483648
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
net.ipv4.ip_local_port_range = 1024 65000
net.core.rmem_default = 4194304
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 262144

For the /etc/sysctl.conf changes to take effect now issue this command.

sysctl -p 

vi /etc/security/limits.conf

Add these lines:

oracle           soft    nproc           2047
oracle           hard    nproc           16384
oracle           soft    nofile          1024
oracle           hard    nofile          65536
grid           soft    nproc           2047
grid           hard    nproc           16384
grid           soft    nofile          1024
grid           hard    nofile          65536

vi /etc/pam.d/login

Add these lines:

session    required     /lib/security/pam_limits.so
session    required     pam_limits.so
       
 vi /etc/profile

Add these lines: 


if [ \$USER = "oracle" ] || [ \$USER = "grid" ]; then
    if [ \$SHELL = "/bin/ksh" ]; then
        ulimit -p 16384 
        ulimit -n 65536
    else
        ulimit -u 16384 -n 65536
    fi
    umask 022
fi

 Create Groups and User for Grid Infrastructure

Lets start this section by creating the recommended OS groups and user for Grid Infrastructure on both Oracle RAC nodes:

[root@racnode1 ~]#                               
groupadd -g 1000 oinstall
                             
groupadd -g 1200 asmadmin
                                
groupadd -g 1201 asmdba
                                
groupadd -g 1202 asmoper

groupadd -g 1300 dba
                               
useradd -m -u 1100 -g oinstall -G asmadmin,asmdba,asmoper,dba -d /home/grid -s /bin/bash -c "Grid Infrastructure Owner" grid

                                
id grid
uid=1100(grid) gid=1000(oinstall) groups=1000(oinstall),1200(asmadmin),1201(asmdba),1202(asmoper)
                              

Set the password for the grid account:

[root@racnode1 ~]#  
                                
passwd grid
Changing password for user grid.
New UNIX password:  
                                
xxxxxxxxxxx
Retype new UNIX password:  
                                
xxxxxxxxxxx
passwd: all authentication tokens updated successfully.


[grid@host5 ~]$ vi .bash_profile

# User specific environment and startup programs

PATH=$PATH:$HOME/bin

export PATH
# Oracle Settings
TMP=/tmp; export TMP
TMPDIR=$TMP; export TMPDIR

ORACLE_HOSTNAME=host5.localdomain; export ORACLE_HOSTNAME
ORACLE_BASE=/u01/app/grid; export ORACLE_BASE
ORACLE_HOME=$ORACLE_BASE/product/11.2.0/grid; export ORACLE_HOME
ORACLE_SID=orcl; export ORACLE_SID
ORACLE_TERM=xterm; export ORACLE_TERM
PATH=/usr/sbin:$PATH; export PATH
PATH=$ORACLE_HOME/bin:$PATH; export PATH

LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib; export LD_LIBRARY_PATH
CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib; export CLASSPATH

if [ \$USER = "oracle" ] || [ \$USER = "grid" ]; then
    if [ \$SHELL = "/bin/ksh" ]; then
        ulimit -p 16384
        ulimit -n 65536
    else
        ulimit -u 16384 -n 65536
    fi
    umask 022
fi

  Create Groups and User for Oracle Database Software

Next, create the the recommended OS groups and user for the Oracle database software

[root@racnode1 ~]#
groupadd -g 1301 oper
  
                                
useradd -m -u 1101 -g oinstall -G dba,oper,asmdba -d /home/oracle -s /bin/bash -c "Oracle Software Owner" oracle

[root@racnode1 ~]#  
                                
id oracle
uid=1101(oracle) gid=1000(oinstall) groups=1000(oinstall),1201(asmdba),1300(dba),1301(oper)
                            

[root@host5 Server]# passwd oracle
Changing password for user oracle.
New UNIX password: 
BAD PASSWORD: it is based on a dictionary word
Retype new UNIX password: 
passwd: all authentication tokens updated successfully.
[root@host5 Server]# 

[root@host5 Server]# su - oracle
[oracle@host5 ~]$ vi .bash_profile


# User specific environment and startup programs

PATH=$PATH:$HOME/bin

export PATH
# Oracle Settings
TMP=/tmp; export TMP
TMPDIR=$TMP; export TMPDIR

ORACLE_HOSTNAME=host5.localdomain; export ORACLE_HOSTNAME
ORACLE_BASE=/u01/app/oracle; export ORACLE_BASE
ORACLE_HOME=$ORACLE_BASE/product/11.2.0/dbhome_1; export ORACLE_HOME
ORACLE_SID=orcl; export ORACLE_SID
ORACLE_TERM=xterm; export ORACLE_TERM
PATH=/usr/sbin:$PATH; export PATH
PATH=$ORACLE_HOME/bin:$PATH; export PATH

LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib; export LD_LIBRARY_PATH
CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib; export CLASSPATH

if [ \$USER = "oracle" ] || [ \$USER = "grid" ]; then
    if [ \$SHELL = "/bin/ksh" ]; then
        ulimit -p 16384
        ulimit -n 65536
    else
        ulimit -u 16384 -n 65536
    fi
    umask 022
fi


  Create the Oracle Base Directory Path

The final step is to configure an Oracle base path compliant with an Optimal Flexible Architecture (OFA) structure and correct permissions. This will need to be performed on both Oracle RAC nodes in the cluster as root.

This guide assumes that the /u01 directory is being created in the root file system. Please note that this is being done for the sake of brevity and is not recommended as a general practice. Normally, the /u01 directory would be provisioned as a separate file system with either hardware or software mirroring configured. 


[root@racnode1 ~]#  
                                
mkdir -p /u01/app/grid
[root@racnode1 ~]#  
                                
mkdir -p /u01/app/11.2.0/grid
[root@racnode1 ~]#  
                                
chown -R grid:oinstall /u01
[root@racnode1 ~]#  
                                
mkdir -p /u01/app/oracle
[root@racnode1 ~]#  
                                
chown oracle:oinstall /u01/app/oracle
[root@racnode1 ~]#  
                                
chmod -R 775 /u01