Setting up a Hosting Environment, Part 3: RedHat Cluster and GFS2

Previous posts in this series:

Part 1: Setting up the servers

Part 2: Connecting the Array

RedHat Cluster and GFS2 Setup

Set date/time to be accurate and within a few minutes of each other.

  • Install the ntp program and update to current time.
    • yum install ntp
    • ntpdate time.nist.gov
  • Set time servers and start ntpd
    • service ntpd start
    • Edit the /etc/ntp.conf file to use the following servers:
    • server 0.pool.ntp.org
      server 1.pool.ntp.org
      server 2.pool.ntp.org
      server 3.pool.ntp.org
  • Restart ntpd
    • service ntpd restart
    • chkconfig ntpd on

Cluster setup

RedHat Cluster must be set up before the GFS2 File systems can be created and mounted.

  • Instal the necessary programs
    • yum install openais cman rgmanager lvm2-cluster gfs2-utils ccs
    • Create a /etc/cluster/cluster.conf REMEMBER: Always increment the “config_version” parameter in the cluster tag!
      • <?xml version=“1.0”?>
            <cluster config_version=“24” name=“web-production”>
                <cman expected_votes=“1” two_node=“1”/>
                <fence_daemon clean_start=“1” post_fail_delay=“6” post_join_delay=“3”/>
                <totem rrp_mode=“none” secauth=“off”/>
                <clusternodes>
                    <clusternode name=“bill” nodeid="1">
                        <fence>
                            <method name="ipmi">
                                <device action=“reboot” name=“ipmi_bill”/>
                            </method>
                        </fence>
                    </clusternode>
                    <clusternode name=“ted” nodeid="2">
                        <fence>
                            <method name="ipmi">
                                <device action=“reboot” name=“ipmi_ted”/>
                            </method>
                        </fence>
                    </clusternode>
                </clusternodes>
                <fencedevices>
                    <fencedevice agent=“fence_ipmilan” ipaddr=“billsp” login=“root” name=“ipmi_bill” passwd=“PASSWORD-HERE”/>
                    <fencedevice agent=“fence_ipmilan” ipaddr=“tedsp” login=“root” name=“ipmi_ted” passwd=“PASSWORD-HERE”/>
                </fencedevices>
                <rm log_level="5">
                    <resources>
                        <clusterfs device=“/dev/mapper/StorageTek2530-sites” fstype=“gfs2” mountpoint=“/sites” name=“sites”/>
                        <clusterfs device=“/dev/mapper/StorageTek2530-databases” fstype=“gfs2” mountpoint=“/databases” name=“databases”/>
                        <clusterfs device=“/dev/mapper/StorageTek2530-logs” fstype=“gfs2” mountpoint=“/logs” name=“logs”/>
                    </resources>
                    <failoverdomains>
                        <failoverdomain name=“bill-only” nofailback=“1” ordered=“0” restricted="1">
                            <failoverdomainnode name=“bill”/>
                        </failoverdomain>
                        <failoverdomain name=“ted-only” nofailback=“1” ordered=“0” restricted="1">
                            <failoverdomainnode name=“ted”/>
                        </failoverdomain>
                    </failoverdomains>
                </rm>
            </cluster>
    • We’ll be adding more to this later, but this will work for now.
    • Validate the config file
      • ccs_config_validate
    • Set a password for the ricci user
      • passwd ricci
    • Start ricci, and set to start on boot
      • service ricci start
      • chkconfig ricci on
    • Start modclusterd and set to start on boot
      • service modclusterd start
      • chkconfig modclusterd on
    • Sync the cluster.conf file to other node
      • ccs -f /etc/cluster/cluster.conf -h ted --setconf
    • Start cman on both servers at the same time
      • service cman start
    • Set cman to start on boot
      • chkconfig cman on
  • Check the tutorial on testing the fencing

Create GFS2 partitions

Create a partition on the new scsi device /dev/mapper/mpatha using parted. NOTE: This part only needs to be done once on one server

  • parted /dev/mapper/mpatha
  • mklabel gpt
  • mkpart primary 1 -1
  • set 1 lvm on
  • quit
  • Now you can see a partition for the storage array.
    • parted -l

Edit the /etc/lvm/lvm.conf file and set the value for locking_type = 3 to allow for cluster locking.

In order to enable the LVM volumes you are creating in a cluster, the cluster infrastructure must be running and the cluster must be quorate.

  • service clvmd start
  • chkconfig clvmd on
  • chkconfig gfs2 on

Create LVM partitions on the raw drive available from the StorageTek. NOTE: This part only needs to be done once on one server.

  • pvcreate /dev/mapper/mpatha1
  • vgcreate -c y StorageTek2530 /dev/mapper/mpatha1

Now create the different partitions for the system: sites, databases, logs, home, root

  • lvcreate --name sites --size 350GB StorageTek2530
  • lvcreate --name databases --size 100GB StorageTek2530
  • lvcreate --name logs --size 50GB StorageTek2530
  • lvcreate --name root --size 50GB StorageTek2530

Make a temporary directory /root-b and copy everything from root’s home directory to there, because it will be erased when we make the GFS2 file system.

Copy /root/.ssh/known_hosts to /etc/ssh/root_known_hosts so the file is different for both servers.

Before doing the home directory, we have to remove it from the local LVM.

  • unmount /home
  • lvremove bill_local/home and on ted lvremove ted_local/home
  • Remove the line from /etc/fstab referring to the /home directory on the local LVM
  • Then add the clustered LV.
    • lvcreate --name home --size 50GB StorageTek2530

Create GFS2 files systems on the LVM partitions created on the StorageTek. Make sure they are unmounted, first. NOTE: This part only needs to be done once on one server.

  • mkfs.gfs2 -p lock_dlm -j 2 -t web-production:sites /dev/mapper/StorageTek2530-sites
  • mkfs.gfs2 -p lock_dlm -j 2 -t web-production:databases /dev/mapper/StorageTek2530-databases
  • mkfs.gfs2 -p lock_dlm -j 2 -t web-production:logs /dev/mapper/StorageTek2530-logs
  • mkfs.gfs2 -p lock_dlm -j 2 -t web-production:root /dev/mapper/StorageTek2530-root
  • mkfs.gfs2 -p lock_dlm -j 2 -t web-production:home /dev/mapper/StorageTek2530-home

Mount the GFS2 partitions

  • NOTE: GFS2 file systems that have been mounted manually rather than automatically through an entry in the fstab file will not be known to the system when file systems are unmounted at system shutdown. As a result, the GFS2 script will not unmount the GFS2 file system. After the GFS2 shutdown script is run, the standard shutdown process kills off all remaining user processes, including the cluster infrastructure, and tries to unmount the file system. This unmount will fail without the cluster infrastructure and the system will hang.
  • To prevent the system from hanging when the GFS2 file systems are unmounted, you should do one of the following:
    • Always use an entry in the fstab file to mount the GFS2 file system.
    • If a GFS2 file system has been mounted manually with the mount command, be sure to unmount the file system manually with the umount command before rebooting or shutting down the system.
  • If your file system hangs while it is being unmounted during system shutdown under these circumstances, perform a hardware reboot. It is unlikely that any data will be lost since the file system is synced earlier in the shutdown process.

Make the appropriate folders on each node (/home is already there).

  • mkdir /sites /logs /databases

Make sure the appropriate lines are in /etc/fstab

#GFS2 partitions shared in the cluster
/dev/mapper/StorageTek2530-root        /root        gfs2   defaults,acl    0 0
/dev/mapper/StorageTek2530-home        /home        gfs2   defaults,acl    0 0
/dev/mapper/StorageTek2530-databases      /databases      gfs2   defaults,acl    0 0
/dev/mapper/StorageTek2530-logs        /logs        gfs2   defaults,acl    0 0
/dev/mapper/StorageTek2530-sites    /sites    gfs2   defaults,acl    0 0

Once the GFS2 partitions are set up and in /etc/fstab, rgmanager can be started. This will mount the GFS2 partions.

  • service rgmanager start
  • chkconfig rgmanager on

Starting Cluster Software

To start the cluster software on a node, type the following commands in this order:

  • service cman start
  • service clvmd start
  • service gfs2 start
  • service rgmanager start

Stopping Cluster Software

To stop the cluster software on a node, type the following commands in this order:

  • service ossec-hids stop
    • (ossec monitors the apache log files, so the /logs partition will not be unmounted unless ossec is stopped first.)
  • service rgmanager stop
  • service gfs2 stop
  • umount -at gfs2
  • service clvmd stop
  • service cman stop

Cluster tips

If a service shows as ‘failed’ when checking on services with clustat

  • Disable the service first: clusvcadm -d service-name
  • Then re-enable it: clusvcadm -e service-name

Have Shorewall start sooner in the boot process.

  • It was necessary to move shorewall up in the boot process, otherwise cman had no open connection to detect the other nodes.
  • Edit the /etc/init.d/shorewall and change the line near the top from # chkconfig: - 28 90 to
    • # chkconfig: - 18 90
  • Then use chkconfig to turn off shorewall and then back on.
    • chkconfig shorewall off
    • chkconfig shorewall on

Making Multiple MySQL Instances on One Server

I’m trying this new idea for backing up our production MySQL servers. I have a backup server that basically runs rdiff-backup in the morning across several servers, but then does nothing for the rest of the day. It’s a pretty decent machine, so I’d like to utilize some resources. Replicating a MySQL server is a good way to ensure High Availability in case of a failure. The backup server acts as a slave to the master (production) server. Basically, the slave is an exact copy of the master. They are two separate instances of MySQL server running on two physical servers. Whatever queries run on the master are sent to the slave so it can do the same. This way they are kept completely in sync. You could also have the slave take over for the master, should the master server happen to fail.

The slave is an ever updating duplicate of the master.

The only problem I face with this set up, though, is that I have multiple production servers out there. So this only works if this backup server could be a slave for multiple machines.

No slave can serve two masters.

This is not possible, though, because, of course, no slave can serve two masters. Fortunately, a server can have multiple instances of MySQL running on it! So, in a sense, we have a server with multiple MySQL instances, to which a master can replicate. More about that set up in an upcoming post.

The slave has multiple instances of MySQL running.

A how to on this blog, shows how this can be done. I’ll replicate the process below.

STEPS TO MULTIPLE MYSQL MADNESS

On the slave server

Step 1. Install MySQL

We’ll be working with CentOS 5.8, but this could really apply for any OS. First we’ll need to install MySQL like normal.

yum install mysql mysql-server

There are plenty of good tutorials out there on how to install the specific version of MySQL you want on the specific OS you’re running.

Step 2. Set up the data area.

You’ll need to have a different folder for each of the MySQL instances, say /dbases/master-a/, /dbases/master-b/, and /dbases/master-c/.

mkdir -p /dbases/{master-a,master-b,master-c}

Step 3. Copy the default my.cnf file

This is the default MySQL config file, it may be named differently on other OSes.

cp /etc/my.cnf /etc/master-a.cnf; cp /etc/my.cnf /etc/master-b.cnf; cp /etc/my.cnf /etc/master-c.cnf

Step 4. Edit the new MySQL config files.

For each new config file, you’ll need to specify some unique variables.

[mysqld]
port=3307
datadir=/dbases/master-a
socket=/dbases/master-a/mysql.sock
user=mysql
server_id=3307
log-bin=/dbases/master/mysql-bin.log

# Disabling symbolic-links is recommended to prevent assorted security risks;
# to do so, uncomment this line:
symbolic-links=0

[mysqld_safe]
log-error=/dbases/master-a/mysqld.log
pid-file=/dbases/master-a/mysqld.pid

The port option sets this MySQL instance on a different port than the default 3306. The datadir, socket, log-bin, log-error, and pid-file options make sure the necessary files are not using the default files.

Step 5. Create new init scripts.

The init script allows the server to start and stop the service at boot time, and allows for easy start up and shutdown (on CentOS/RedHat, at least – with an easy service mysqld start).

cp /etc/init.d/mysqld /etc/init.d/mysqld-master-a

Just do one for now. We’ll copy the new one to create the others, then just do a quick search and replace in those files to change the master-a to master-b and master-c.

Step 6. Edit the init script

#!/bin/bash
#
# mysqld        This shell script takes care of starting and stopping
#               the MySQL subsystem (mysqld).
#
# chkconfig: - 64 36
# description:  MySQL database server.
# processname: mysqld
# config: /etc/master-a.cnf
# pidfile: /dbases/master-a/mysqld.pid

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

prog="MySQL"

# extract value of a MySQL option from config files
# Usage: get_mysql_option SECTION VARNAME DEFAULT
# result is returned in $result
# We use my_print_defaults which prints all options from multiple files,
# with the more specific ones later; hence take the last match.
get_mysql_option(){
        result=/usr/bin/my_print_defaults "$1" | sed -n "s/^--$2=//p" | tail -n 1
        if [ -z "$result" ]; then
            # not found, use default
            result="$3"
        fi
}

get_mysql_option mysqld datadir "/dbases/master-a"
datadir="/dbases/master-a"
get_mysql_option mysqld socket "/dbases/master-a/mysql.sock"
socketfile="/dbases/master-a/mysql.sock"
get_mysql_option mysqld_safe log-error "/dbases/master-a/mysqld.log"
errlogfile="/dbases/master-a/mysqld.log"
get_mysql_option mysqld_safe pid-file "/dbases/master-a/mysqld.pid"
mypidfile="/dbases/master-a/mysqld.pid"

defaultfile="/etc/master-a.cnf"

start(){
        touch "$errlogfile"
        chown mysql:mysql "$errlogfile"
        chmod 0640 "$errlogfile"
        [ -x /sbin/restorecon ] && /sbin/restorecon "$errlogfile"
        if [ ! -d "$datadir/mysql" ] ; then
            action $"Initializing MySQL database: " /usr/bin/mysql_install_db --datadir="$datadir" --user=mysql
            ret=$?
            chown -R mysql:mysql "$datadir"
            if [ $ret -ne 0 ] ; then
                return $ret
            fi
        fi
        chown mysql:mysql "$datadir"
        chmod 0755 "$datadir"
        # Pass all the options determined above, to ensure consistent behavior.
        # In many cases mysqld_safe would arrive at the same conclusions anyway
        # but we need to be sure.
        /usr/bin/mysqld_safe  --defaults-file="$defaultfile" --datadir="$datadir" --socket="$socketfile" \
                --log-error="$errlogfile" --pid-file="$mypidfile" \
                --user=mysql >/dev/null 2>&1 &
        ret=$?
        # Spin for a maximum of N seconds waiting for the server to come up.
        # Rather than assuming we know a valid username, accept an "access
        # denied" response as meaning the server is functioning.        
        if [ $ret -eq 0 ]; then
            STARTTIMEOUT=30
            while [ $STARTTIMEOUT -gt 0 ]; do
                RESPONSE=/usr/bin/mysqladmin --socket="$socketfile" --user=UNKNOWN_MYSQL_USER ping 2>&1 && break
                echo "$RESPONSE" | grep -q "Access denied for user" && break
                sleep 1
                let STARTTIMEOUT=${STARTTIMEOUT}-1
            done
            if [ $STARTTIMEOUT -eq 0 ]; then
                    echo "Timeout error occurred trying to start MySQL Daemon."
                    action $"Starting $prog: " /bin/false
                    ret=1
            else
                    action $"Starting $prog: " /bin/true
            fi
        else
            action $"Starting $prog: " /bin/false
        fi
        [ $ret -eq 0 ] && touch /dbases/master-a/mysqld
        return $ret
}

stop(){ 
        MYSQLPID=cat "$mypidfile"  2>/dev/null 
        if [ -n "$MYSQLPID" ]; then
            /bin/kill "$MYSQLPID" >/dev/null 2>&1
            ret=$?
            if [ $ret -eq 0 ]; then
                STOPTIMEOUT=60
                while [ $STOPTIMEOUT -gt 0 ]; do
                    /bin/kill -0 "$MYSQLPID" >/dev/null 2>&1 || break
                    sleep 1
                    let STOPTIMEOUT=${STOPTIMEOUT}-1
                done
                if [ $STOPTIMEOUT -eq 0 ]; then
                    echo "Timeout error occurred trying to stop MySQL Daemon."
                    ret=1
                    action $"Stopping $prog: " /bin/false
                else
                    rm -f /dbases/master-a/mysqld
                    rm -f "$socketfile"
                    action $"Stopping $prog: " /bin/true
                fi
            else
                action $"Stopping $prog: " /bin/false
            fi
        else
            ret=1
            action $"Stopping $prog: " /bin/false
        fi
        return $ret
}

restart(){
    stop
    start
}

condrestart(){
    [ -e /dbases/master-a/mysqld ] && restart || :
}

# See how we were called.
case "$1" in
  start)
    start
    ;;
  stop)
    stop
    ;;
  status)
    status mysqld
    ;;
  restart)
    restart
    ;;
  condrestart)
    condrestart
    ;;
  *)
    echo $"Usage: $0 {start|stop|status|condrestart|restart}"
    exit 1
esac

exit $?

Step 7. Start each MySQL instance.

Now you can start each instance with the handy service command.

service mysqld-master-a start

Step 8. Connect to MySQL instances.

Now, to connect to each MySQL instance, you’ll need to specify the port and/or socket file.

mysql -P3307 --socket="/dbases/mysql-master-a/mysql.sock"

Setting up a Hosting Environment – Part 2: Connecting the Storage Array

[See Part 1: The Servers]

One of the most frustrating parts of this set up was getting the storage array talking to the servers. I finally got it figured out. I’m using a StorageTek 2530 to connect to two SunFire X2100 M2’s via SAS (Serial Attached SCSI) cables. I put in a dual port SAS HBA (Host Bus Adapter) in the X2100 M2’s, but for real redundancy, I should have used two single port HBA’s. The Sun/Oracle documentation is pretty good about how to physically set up the servers and storage array, but are pretty lacking from there on.

StorageTek 2530 Set Up

Replace the parts in squares brackets below with whatever you want.

  • Install the Sun CAM software.
    • Grab the latest version from http://support.oracle.com
      • You’ll need an active support contract and have an account.
      • Go to the ‘Patches and Updates’ tab.
      • Click on the ‘Product or Family (Advanced)’ link
      • In the ‘Product is’ section start typing in ‘Sun Storage Common Array Manager (CAM)’ and select it from the list
      • In the ‘Release is’ section select the most recent version
      • For the last section, select ‘Platform’ and then select ‘Linux x86-64’
      • Click ‘Search’
      • Click the ‘Download’ link for the software.
      • Upload the tar file to the server.
    • Pre-requisite software that needs to be installed.
      • yum install ksh bc /lib/ld-linux.so.2 libgcc.i686 libstdc++.i686 libzip.i686 gettext
    • Once CAM software is downloaded, un-zipped, un-tarred or what have you, change directories to HostSoftwareCD_6.9.0.16/components and install the jdk available there:
      • rpm -Uvh jdk-6u20-linux-i586.rpm
    • Next run the RunMe.bin file in the HostSoftwareCD_6.9.0.16 folder
      • ./RunMe.bin -c
    • Agree to all License Agreement stuffs
    • Select the Typical install.
  • Add the /opt/sun/cam/binfolder to path
    • With root using tcsh add this to .tcshrc
      • setenv PATH ${PATH}:/opt/sun/cam/bin
    • Then do source .tcshrc
  • Make sure there is an IP on the same subnet as the array (192.168.128.xxx)
    • Make a /etc/sysconfig/network-scripts/ifcfg-eth1:1file and put this in there
      • DEVICE=“eth1:1”
        BOOTPROTO=static
        HWADDR=“xx:xx:xx:xx:xx:xx:xx”
        IPADDR=192.168.128.xxx
        NM_CONTROLLED=“no”
        ONBOOT=“yes”
    • Install the RAID Proxy Agent package located in the Add_On/RaidArrayProxy directory of the latest CAM software distribution. (I found this to be optional.)
      • rpm -ivh SMruntime.xx.xx.xx.xx-xxxx.rpm
      • rpm -ivh SMagent-LINUX-xx.xx.xx.xx-xxxx.rpm
  • Register the StorageTek with the host. Process can take several minutes.
    • sscs register -d storage-system
  • Once registered, you can name the array anything you want. Note what the array is named from the previous step.
  • sscs modify -T [Array-Name] array ARRAY1
  • Set up the storage profile, pool, disk, volume, mapping. Use the command line commands below, or set it up via the web interface. NOTE: This part only needs to be done on one of the hosts.
    • If using the web interface, you have to use a windows laptop hooked up to the local network (192.168.128.xxx), or perhaps a server in the same local network that is not running CentOS 6, which has a known issue where the web interface does not work. For the web interface connect to https://localhost:6789 using the laptop or server Administrator/root account information.
    • sscs create -a knox pool [Pool-Name]
    • sscs create -a knox -p [Pool-Name] -n 11 vdisk [Vdisk-Name]
    • sscs create -a knox -p [Pool-Name] -s max -v [Vdisk-Name] volume [Volume-Name]
  • Create the host group and apply to host.
    • sscs create -a knox hostgroup [ApacheHosts]
  • Create hosts and assign to hostgroup
    • sscs create -a knox -g [ApacheHosts] host [Host-Name] and repeat for other hosts.
  • Map volume to host group
    • sscs map -a knox -g ApacheHosts volume Volume-Name
  • The array volume should now be available as /dev/sdb and /dev/sdc because the hosts are connected by two SAS cables each.
  • It took me a while to grasp the meaning for the different terms: pool, volume, volume groups, disks, etc. I drew up a chart with the appropriate commands to create the different aspects.

    To utilize both cables connecting the server to the storage array, the OS needs to use multi-pathing. I had lots of troubles trying to set this up after the OS was installed, so I just let it be done by the installer. Here’s what should happen if you find the OS already installed and need to set up multi-paths.

    • Set up DM-Multipath
      • NOTE: This is taken care of during the OS installation.
      • Multipath allows both SAS connections to the storage array to appear as one connection to the server. This allows for data to pass through even if one cable suddenly stops working, it seamlessly fails to the other path. For example, taken the image above, if the connection between hba1->cntrlr1 goes down, you still have connection hba2->cntrlr2. The OS sees one connection, and just uses whichever path is working.
      • After Multipath is set up, the storage array will be available as a device at /dev/mapper/mpatha. This will be the device to partition, format, and throw LVM on.
      • Install the multipath program and dependents
        • yum install device-mapper-multipath
      • Run mpathconf --enable to create a default /etc/multipath.conffile or create one using the following:
        • #  multipath.conf written by anacondadefaults {
          user_friendly_names yes
          }
          blacklist {
          devnode “^(ram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*”
          devnode “^hd[a-z]”
          devnode “^dcssblk[0-9]*”
          device {
          vendor “DGC”
          product “LUNZ”
          }
          device {
          vendor “IBM”
          product “S/390.*”
          }
          # don’t count normal SATA devices as multipaths
          device {
          vendor “ATA”
          }
          # don’t count 3ware devices as multipaths
          device {
          vendor “3ware”
          }
          device {
          vendor “AMCC”
          }
          # nor highpoint devices
          device {
          vendor “HPT”
          }
          wwid “3600508e000000000c9c1189277b84b05”
          device {
          vendor TEAC
          product DV-28E-V
          }
          wwid “*”
          }
          blacklist_exceptions {
          wwid “3600a0b80003abca4000007284f33c167”
          }
          multipaths {
          multipath {
          uid 0
          gid 0
          wwid “3600a0b80003abca4000007284f33c167”
          mode 0600
          }
          }
      • Set multipathd to start on boot, and if not on, turn it on
        • chkconfig multipathd on
        • service multipathd start

    Setting up a Hosting Environment: Part 1 – The servers

    I’ve spent a lot of time at work setting up a few servers to be our new production environment. Much of it was accomplished by reading the documentation over and over again. Not much out there on the Net, so I’m hoping this series of posts benefits someone else out there.

    First of all, I’ll cover what set up I would like to achieve and why.

    Hardware

    I’m using two Sun SunFire X2100 M2 connected to a StorageTek 2530 with 4.5TB of drive space. The servers attach to the storage array via SCSI cables for quick data transfer speeds. The array also has the ability to handle iSCSI connections. This will give me a decent base set up, with room to grow.

    Set up

    I’ll put the two servers in a cluster and make the services available over the cluster. They will share the storage using GFS2. In the future, I’ll add a couple of load balancer/proxy machines to farm out the Web traffic, and add a couple more SunFire X2100 M2’s to take that load. One of the main reasons to set up a new configuration with new servers is to provide a clean environment for the many WordPress and Omeka installations we host. We’ve had to hang on to some legacy services to support some older projects, so this will allow us to keep up to date. It will also allow me to set up Apache and PHP to run as a server user, locked down to it’s own directory. That way each of the 100+ sites won’t be able to access any other site’s content. I picked CentOS as the OS because it has cluster and GFS2 options of RedHat, but without the cost.

    Sun X2100 M2 OS Install steps

    1. Boot up with CentOS 6.x Minimal Install CD for x86_64
    2. Select the option to ‘Install or upgrade an existing system’, then hit the Enter key
    3. Skip the media test.
    4. You are now in graphic install mode.
    5. Hit Enter for ‘OK’ for ’English as the language.
    6. Hit Enter for ‘OK’ to US keyboard.
    7. Select the option to do a “Specialized Storage Devices” install
    8. Enter the computer name ‘bill.com’ or ‘ted.com’, etc
    9. Click the button to ‘Configure Network’.
      1. Eth2 seems to be the one associated with port 0 on the servers, so select that one and then ‘Add’
      2. Select ‘Connect Automatically’.
      3. Click the ‘IPv4 Settings’ tab.
      4. Choose ‘Manual’ for the ‘Method’.
      5. Enter the following for the info in ‘Addresses’.
        1. Address: 192.168.1.1
        2. Netmask: 255.255.255.0
        3. Gateway: 192.168.1.1
      6. For ‘DNS servers’, enter 192.168.1.100
      7. Then ‘Apply’
    10. Select ‘Next’ to keep the defaults for time zone and system clock.
    11. Enter a root password
    12. DRIVE PARTITION SETUP
      1. On the ‘Basic Devices’ tab, select the local drive and on the ‘Multipath Devices’ tab, select the storage array, and click ‘Next’.
      2. Select the ‘Fresh Installation’ option for a fresh install, or ‘Upgrade an Existing Installation’ to upgrade. Hit ‘Next’.
      3. Select ‘Create custom layout.’ and ‘Next’
      4. Delete all of the current LVM and other partitions.
      5. Select the free remaining drive for the local drive (should be /dev/sda). Click ‘Create’
      6. BOOT PARTITION
        1. Select ‘Standard Partition’ and click ‘Create’
        2. Set the Mount Point as /boot, the File System Type as ‘ext4’ and the Size (MB) as 500, then click ‘OK’
      7. Select the free space and click ‘Create’
      8. LVM PARTITION(NOTE: The sizes are different based on the size of the hard drives.)
        1. Select ‘LVM Physical Volume’ and click ‘Create’
        2. Select ‘Fill to maximum allowable size’ and click ‘OK’
        3. Select the new LVM partition and click ‘Create’
        4. Select ‘LVM Volume Group’ and click ‘Create’
        5. Set the ‘Volume Group Name’ as ‘Local’  then click the ‘Add’ button
        6. Set the ‘File System Type’ as swap, the ‘Logical Volume Name’ as ‘swap’ and the ‘Size(MB)’ as ‘12288’, then click ‘OK’.
        7. Click the ‘Add’ button again. Set the ‘Mount Point’ to ‘/’, the ‘File System Type’ to ext4, the ‘Logical Volume Name’ to ‘root’, and the ‘Size(MB)’ to ‘51200’. Then click ‘OK’.
        8. Click the ‘Add’ button again. Set the ‘Mount Point’ to ‘/home’, the ‘File System Type’ to ext4, the ‘Logical Volume Name’ to ‘home’, and the ‘Size(MB)’ to ‘500’. Then click ‘OK’.
        9. Click the ‘Add’ button again. Set the ‘Mount Point’ to ‘/var’, the ‘File System Type’ to ext4, the ‘Logical Volume Name’ to ‘var’, and the ‘Size(MB)’ to the remaining space available. Then click ‘OK’.
        10. Click ‘OK’
      9. Click ‘Next’ and ‘Write changes to disk’ to finish the partition creation.
    13. Leave the boot loader settings as is, and click ‘Next’
    14. Select the ‘Minimal’ option and click ‘Next’

    One of the most important things to have with servers is some form of remote management. That way you don’t need to trek down to the data center each time the server hangs while testing (and it happens a lot). For Sun systems, that means setting up the ELOM (Embedded Lights Out Manager).

    Steps to set up the Remote Console (Embedded Lights Out Manager – ELOM) for SunFire X2100 M2

    Set the SP serial port rate to 115200.

    • Log into the web based console, or through ssh via a computer on the same subnet (https://192.168.1.10) The IP is whatever the IP is set for the ELOM device. Check in BIOS for the IP.
      • Go to the Configuration tab, then the Serial Port tab.
      • Change the Baud Rate to 115200.

    Set BIOS

    IPMI Config
       Set LAN Config
       Set PEF Config
         PEF Support ........ [Enabled]
         PEF Action Global
            All of them ..... [Enabled]
         Alert Startup Discover ..... [Disabled]
         Startup Delay .............. [Disabled]
         Event Message For PEF ...... [Disabled]
       BMC Watch Dog Timer Action ... [Disabled]
       External Com Port ............ [BMC]
    Remote Access
       Remote Access ................ [Serial]
       Serial Port Number ........... [Com2]
       Serial Port Mode ............. [115200 8,n,1]
       Flow Control ................. [Hardware]
       Post-Boot Support ............ [Always]
       Terminal Type ................ [VT100]
       VT-UTF8 Combo Key ............ [Enabled]
    • Other options for the Serial Port Mode are 9600, 19200, 38400, and 57600

    Edit Linux Config Files

    Add a /etc/init/serial-ttyS1.conf file

    RedHat in EL 6, and thereby CentOS, moved to Upstart instead of Sysv, so we create a new serial-ttyS1.conf file instead of editing the /etc/inittab file.

    #  This service maintains a getty on /dev/ttyS1.
    stop on runlevel [016]
    
    respawn
    instance $TTY
    exec /sbin/mingetty $TTY

    Change grub.conf

    # grub.conf generated by anaconda
    #
    # Note that you do not have to rerun grub after making changes to this file
    # NOTICE:  You have a /boot partition.  This means that
    #          all kernel and initrd paths are relative to /boot/, eg.
    #          root (hd0,0)
    #          kernel /vmlinuz-version ro root=/dev/Logical/root
    #          initrd /initrd-version.img
    #boot=/dev/sda
    default=0
    timeout=5
    #splashimage=(hd0,0)/grub/splash.xpm.gz
    #hiddenmenu
    serial --unit=0 --speed=115200 --word=8 --parity=no --stop=1
    terminal --timeout=10 serial console
    
    title CentOS Linux (2.6.32-71.29.1.el6.x86_64)
            root (hd0,0)
            kernel /vmlinuz-2.6.32-71.el6.x86_64 ro root=/dev/mapper/Local-root \
    rd_LVM_LV=Local/root rd_LVM_LV=Local/swap rd_NO_LUKS rd_NO_MD rd_NO_DM \
    console=tty1 console=ttyS1,115200n8
              initrd /initramfs-2.6.32-71.29.1.el6.x86_64.img

    Add line to securetty

    console
    vc/1
    vc/2
    vc/3
    vc/4
    vc/5
    vc/6
    vc/7
    vc/8
    vc/9
    vc/10
    vc/11
    tty1
    tty2
    tty3
    tty4
    tty5
    tty6
    tty7
    tty8
    tty9
    tty10
    tty11
    ttyS1

    SUN SP Commands

    Connect to the ELOM by ssh into the IP address.
    ssh root@192.168.xxx.xxx

    • To power on the host, enter the following command:
      • set /SP/SystemInfo/CtrlInfo PowerCtrl=on
    • To power off the host gracefully, enter the following command:
      • set /SP/SystemInfo/CtrlInfo PowerCtrl=gracefuloff
    • To power off the host forcefully, enter the following command:
      • set /SP/SystemInfo/CtrlInfo PowerCtrl=forceoff
    • To reset the host, enter the following command:
      • set /SP/SystemInfo/CtrlInfo PowerCtrl=reset
    • To reboot and enter the BIOS automatically, enter the following command:
      • set /SP/SystemInfo/CtrlInfo BootCtrl=BIOSSetup
    • To change the IP address for the ELOM, enter:
      • set /SP/AgentInfo IpAddress=xxx.xxx.xxx.xxx
    • The default user name is root, and the default password is changeme.
      • set /SP/User/[username] Password=[password]
    • To start a session on the server console, enter this command:
      • start /SP/AgentInfo/console
      • To revert to CLI once the console has been started, press Esc-Shift-9 keys.
    • 
To terminate a server console session started by another user, enter this command:
      • stop /SP/AgentInfo/console

    Next we secure the new servers with some software updates and a firewall.

    Software Updates and installs:

    1. Edit /etc/resolve.conf
    2. nameserver 192.168.1.100
      options single-request-reopen

    3. yum install openssh-clients tcsh ksh bc rpm-build gcc gcc-c++ redhat-rpm-config acl gcc gnupg make vim-enhanced man wget which mlocate bzip2-devel libxml2-devel screen sudo parted gd-devel pam_passwdqc.x86_64 rsync zip xorg-x11-server-utils gettext
    4. disable SELinux. Edit the /etc/sysconfig/selinux file and set SELINUX=disabled.
      • Change takes affect on next reboot.
    5. Add the following lines to the /etc/vimrcfile:
      set autoindent ” auto indent after {
      set smartindent ” same
      set shiftwidth=4 ” number of space characters inserted for indentation
      set expandtab ” inserts spaces instead of tabs
      set tabstop=4 ” number of spaces the tab is.
      set pastetoggle=<C-P> ” Ctrl-P toggles paste mode
    6. Switch root shell to tcsh
      • Edit the /etc/passwdfile to have root use tcshroot:x:0:0:root:/root:/bin/tcsh
      • Edit the .tcshrcfile in root’s home.
        #  .tcshrc#  User specific aliases and functionsalias rm ‘rm -i’
        alias cp ‘cp -i’
        alias mv ‘mv -i’set prompt='[%n@%m %c]# ‘

        setenv PATH ${PATH}:/opt/sun/cam/bin

        #  Make command completion (TAB key) cycle through all possible choices
        #  (The default is to simply display a list of all choices when more than one
        #  match is available.)
        bindkey “^I” complete-word-fwd

      • Logout and back in for it to take affect.
    7. Edit /etc/hosts. Add a line with IP and domain name.
      #  Do not remove the following line, or various programs
      #  that require network functionality will fail.
      127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
      ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6#  External IPs
      192.168.1.1 bill.com
      192.168.1.2 ted.com192.168.1.3 domain.com # this needs to be an IP that the cluster server can manage#  Internal IPs
      192.168.1.11 bill.localdomain bill # notice the .localdomain, this is necessary for mysql later
      192.168.1.12 ted.localdomain ted othernode # this is bill’s hosts file. othernode would be on the bill line for ted’s hosts file.
      #  ServicePort IPs
      192.168.1.21 billsp # I like to have a short name to use to connect to the service port (ELOM)
      192.168.1.22 tedsp

      #  Internal Services
      192.168.1.100 http.localdomain httpd.localdomain
      192.168.1.101 mysql.localdomain
      192.168.1.102 memcached.localdomain

    8. Run updatedb to set up the locate database.
    9. Edit password settings to allow for stricter control over passwords. This requires strong passwords or the use of passphrases.
    10. [Optional] Firefox: yum update, and then ayum install firefox xorg-x11-xauth xorg-x11-fonts-Type1There will be more you’ll need too.
      • If you get this error: process 702: D-Bus library appears to be incorrectly set up; failed to read machine uuid: Failed to open "/var/lib/dbus/machine-id": No such file or directory. Then run the following command as root.
        • dbus-uuidgen > /var/lib/dbus/machine-id
    11. Set up ssh keys
      • ssh-keygen
      • Copy the id_rsa.pub file to the other node
      • Copy the contents of id_rsa.pub to cat id_rsa.pub >> ~/.ssh/authorized_keys
      • Double check permission on authorized_keys and id_rsa both set to rw-------
      • You should now be able to log in from bill to ted (and vice versa) without a password.
    
    

    Shorewall

    • Yum Install:
      • Get EPEL repository. Visit http://fedoraproject.org/wiki/EPEL to get the URL for the correct rpm. Something like: epel-release-6-5.noarch.rpm.
      • Copy that URL and runrpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-5.noarch.rpmon the machine.
      • Edit the /etc/yum.repos.d/epel.repo file and set the first “enabled” line to equal 0. That disables yum from using the EPEL repo by default.
      • Install shorewall with yum.yum --enablerepo=epel install shorewall
    • Enable program to run by editing the /etc/shorewall/shorewall.conf file. Change the STARTUP_ENABLED=NOtoSTARTUP_ENABLED=Yes
    • Edit the shorewall config files.
    • Edit the /etc/shorewall/zonesfile:
      • #
        #  Shorewall version 4 – Zones File
        #
        #  For information about this file, type “man shorewall-zones”
        #
        #  The manpage is also online at
        #  http://www.shorewall.net/manpages/shorewall-zones.html
        #
        ###############################################################################
        #ZONE TYPE OPTIONS IN OUT
        #  OPTIONS OPTIONSnet ipv4 # The big bad Internet
        loc ipv4 # Internal LAN
        fw firewall#LAST LINE – ADD YOUR ENTRIES ABOVE THIS ONE – DO NOT REMOVE#LAST LINE – ADD YOUR ENTRIES ABOVE THIS ONE – DO NOT REMOVE
    • Edit the /etc/shorewall/interfacesfile:
      • #
        #  Shorewall version 4 – Interfaces File
        #
        #  For information about entries in this file, type “man shorewall-interfaces”
        #
        #  The manpage is also online at
        #  http://www.shorewall.net/manpages/shorewall-interfaces.html
        #
        ###############################################################################
        #ZONE INTERFACE BROADCAST OPTIONS
        net eth2
        loc eth1
    • Edit the /etc/shorewall/policyfile:
      • ###############################################################################
        #SOURCE DEST POLICY LOG LIMIT: CONNLIMIT:
        #  LEVEL BURST MASK
        #  To/from internal lan
        fw loc ACCEPT
        loc fw ACCEPT
        #  To/from net
        fw net ACCEPT
        net all DROP info
        #
        #  THE FOLLOWING POLICY MUST BE LAST
        #
        all all REJECT info
        #LAST LINE — DO NOT REMOVE
    • Edit the /etc/shorewall/rulesfile:
      • ######################################################################################
        #ACTION SOURCE DEST PROTO DEST SOURCE ORIGINAL
        #  PORT PORT DEST
        #SECTION ESTABLISHED
        #SECTION RELATED
        SECTION NEWSECTION NEW#  Standard services
        #
        ACCEPT  net      fw      tcp     ssh
        ACCEPT  net      fw      tcp     80,443Ping/ACCEPT      net      fw

        #LAST LINE — ADD YOUR ENTRIES BEFORE THIS ONE — DO NOT REMOVE

    • Edit the /etc/shorewall/routestoppedfile:
      • #
        #  Shorewall version 4 – Routestopped File
        #
        #  For information about entries in this file, type “man shorewall-routestopped”
        #
        #  The manpage is also online at
        #  http://www.shorewall.net/manpages/shorewall-routestopped.html
        #
        #  See http://shorewall.net/starting_and_stopping_shorewall.htm for additional
        #  information.
        #
        ###############################################################################
        #INTERFACE HOST OPTIONS PROTO DEST SOURCE
        PORT PORT
        eth1     –
        eth2     –
    • Set shorewall to start on reboots.chkconfig shorewall on
    • Start shorewall:service shorewall start

    The next part will be connecting the servers to the storage array.

    CentOS 6, iDrac6 and PowerEdge R510

    1. RedHat changed an important part of their system with the upgrade from version 5 to 6. This affects CentOS which is the same thing, but rebranded.

    I was updating one server to use CentOS 6, and ran into this issue of setting up the iDRAC for remote console use. In previous versions, I would add a line to the /etc/inittab file. This is now unused. RedHat is favoring the “Upstart” system developed by and for Ubuntu. It starts services on request, rather than all at once.

    So here is how I set up my Dell PowerEdge R510 with CentOS 6 to use the iDRAC6.

    Info was taken from the RedHat manual, the Dell iDRAC manual, and probably a bunch of other sites that I googled for.

    These steps are by no means comprehensive or detailed. I barely even know what’s going on myself, but it seems to work. It’s kind of cool to see a system boot up in your terminal. It’s like your terminal turns into a monitor connected to the server.

    Setting up the iDrac6

    Edit BIOS

    1. Boot the server.
    2. Press F2 to enter the BIOS setup utility during POST.
    3. Scroll down and select Serial Communication by pressing <Enter>.
    4. Set the Serial Communication screen options as follows:
      • serial communication....On with serial redirection via com2
      • NOTE: You can set serial communication to ‘On with serial redirection via com1’ as long as the serial port address field, serial device2, is set to com1, also.
      • serial port address....Serial device1 = com1, serial device2 = com2
      • external serial connector....Serial device 1
      • failsafe baud rate....57600
      • remote terminal type....vt100/vt220
      • redirection after boot....Enabled
    5. Save the changes and exit.

    Edit iDRAC settings

    1. Turn on or restart your system.
    2. Press <Ctrl><E> when prompted during POST. If your operating system begins to load before you press <Ctrl><E>, allow the system to finish booting, and then restart your system and try again.
    3. Configure the LOM.
    1. Use the arrow keys to select LAN Parameters and press <Enter>. NIC Selection is displayed.
    2. Use the arrow keys to select one of the following NIC modes:
      • Dedicated — Select this option to enable the remote access device to utilize the dedicated network interface available on the iDRAC6 Enterprise. This interface is not shared with the host operating system and routes the management traffic to a separate physical network, enabling it to be separated from the application traffic. This option is available only if an iDRAC6 Enterprise is installed in the system. After you install the iDRAC6 Enterprise card, ensure that you change the NIC Selection to Dedicated. This can be done either through the iDRAC6 Configuration Utility, the iDRAC6 Web Interface, or through RACADM.
    • Configure the network controller LAN parameters to use DHCP or a Static IP address source.
    1. Using the down-arrow key, select LAN Parameters, and press <Enter>.
    2. Using the up-arrow and down-arrow keys, select IP Address Source.
    3. Using the right-arrow and left-arrow keys, select DHCP, Auto Config or Static.
    4. If you selected Static, configure the Ethernet IP Address, Subnet Mask, and Default Gateway settings.
    5. Press <Esc>.
    • Press <Esc>.
    • Select Save Changes and Exit.

    Set up Linux OS (to do after OS is installed)

    • Configuring Linux for Serial Console Redirection During Boot
    • The following steps are specific to the Linux GRand Unified Bootloader (GRUB). Similar changes would be necessary if you use a different boot loader.
    • NOTE: When you configure the client VT100 emulation window, set the window or application that is displaying the redirected console to 25 rows x 80 columns to ensure proper text display; otherwise, some text screens may be garbled.
    1. Make a copy of the /boot/grub/grub.conffile as follows:cp /boot/grub/grub.conf /boot/grub/grub.conf.orig
    2. Edit the /boot/grub/grub.conf file as follows:
    1. Locate the General Setting sections in the file and add the following two new lines:serial --unit=0 --speed=57600terminal --timeout=10 serial console
    2. Append two options to the kernel line:kernel ............. console=ttyS1,57600 console=tty1
    3. If the /etc/grub.conf contains a splashimage directive, comment it out.Sample File: /boot/grub/grub.conf
      #  grub.conf generated by anaconda
      #
      #  Note that you do not have to rerun grub after making changes to this file
      #  NOTICE: You have a /boot partition. This means that
      #  all kernel and initrd paths are relative to /boot/, eg.
      #  root (hd0,0)
      #  kernel /vmlinuz-version ro root=/dev/Logical1/LogVol00
      #  initrd /initrd-version.img
      #boot=/dev/sda
      default=0
      timeout=5
      #splashimage=(hd0,0)/grub/splash.xpm.gz
      #hiddenmenu
      serial –unit=1 –speed=57600
      terminal –timeout=5 console serialtitle CentOS (2.6.18-164.11.1.el5) SOL Redirection
      root (hd0,0)
      kernel /vmlinuz-2.6.18-164.11.1.el5 ro root=/dev/Logical1/LogVol00 console=tty1 console=ttyS1,57600
      initrd /initrd-2.6.18-164.11.1.el5.img
      title CentOS (2.6.18-164.el5)
      root (hd0,0)
      kernel /vmlinuz-2.6.18-164.el5 ro root=/dev/Logical1/LogVol00
      initrd /initrd-2.6.18-164.el5.img

    Enabling Login to the Console After Boot

    1. Create a new /etc/init/serial-ttyS1.conffile.Sample File: /etc/inittab
      #  This service maintains a getty on /dev/ttyS1.start on stopped rc RUNLEVEL=[2345]
      stop on starting runlevel [016]respawn
      exec /sbin/agetty -h -L 57600 ttyS1 vt102

    Edit the file /etc/securetty

    1. Make a copy of the /etc/securettyfile as follows:cp /etc/securetty /etc/securetty.orig
    2. Edit the file /etc/securettyas follows:Add a new line with the name of the serial tty for COM2:ttyS1Sample File: /etc/securetty
      vc/1
      vc/2
      vc/3
      vc/4
      vc/5
      vc/6
      vc/7
      vc/8
      vc/9
      vc/10
      vc/11
      tty1
      tty2
      tty3
      tty4
      tty5
      tty6
      tty7
      tty8
      tty9
      tty10
      tty11
      *ttyS1*

    Redirect the video output over ssh connections

    Starting a Text Console Through SSH (Remote Access, SOL)

    To connect to the managed system text console, open an iDRAC6 command prompt (displayed through an SSH session):

    ssh root@xxx.xxx.xxx.xxx

    and type:

    console com2

    Only one console com2 client is supported at a time. The console -h com2 command displays the contents of the serial history buffer before waiting for input from the keyboard or new characters from the serial port.

    To exit the console type these three keys: <Ctrl ><Shift >\

    The default (and maximum) size of the history buffer is 8192 characters. You can set this number to a smaller value using the command:

    racadm config -g cfgSerial -o cfgSerialHistorySize < number >

    Making SMF static

    We have a few legacy forums powered by the good software SMF (SimpleMachines Forum). Like many of the WordPress installs, it’s a pain and a security risk to keep these up-to-date when they are no longer needed as content creation platforms. So, once again I need to convert a web app into static HTML pages. This process proved a bit harder than converting WordPress to static HTML.

    Step 1: Upgrade

    The first thing to do is update to the latest version. This ensures that if you need to turn this back into a dynamic site, it should hopefully be compatible with whatever the latest version is at that time.

    Step 2: Make it public

    Next, we’ll need to make it public to guests, so that wget has access to the pages.

    Go to the Admin->Features and Options page and check the “Allow guests to browse the forum” box, then click save. Now we have to change the permissions on each board separately. Or with a bit of MySQL magic, we can change them all at once using the CONCAT operator. Open of phpMyAdmin, or something else of your choice. Before we mess with the data, make a copy of the table, just in case we totally hose it.

    Browse to the ‘boards’ table, and then to the SQL tab. We’re going to enter an SQL command that will pre-pend (that’s append but onto the front rather than the end) some data.

    UPDATE boards SET member_groups=CONCAT('-1,', member_groups) WHERE 1

     

    This will add a -1, to the beginning of each field, which makes the board viewable by guests. No need to log in, which means wget can scrape the pages and turn them into HTML.

    Step 3: Edit Theme files

    Now we get to play around with the theme files to get rid of forum specific items that we won’t need, like links to member info, the login, help, and search links, and anything else that we don’t want.

    Here are some items to delete or alter, and the files I found them in for our home-made theme based off of an old default theme.

    index.template.php

    • Add a title
    • Get rid of date stamp
    • Get rid of the main menu (Home, Help, Search, Login, etc)

    BoardIndex.template.php

    • Search for [‘member’][‘link’] and change it to [‘member’][‘name’] This will take out all links to member profile pages.

    Display.template.php

    • Search for [‘member’][‘link’] and change it to [‘member’][‘name’] This will take out all links to member profile pages.
    • Get rid of the drop down menu to select pages.

    MessageIndex.template.php

    • Search for [‘member’][‘link’] and change it to [‘member’][‘name’] This will take out all links to member profile pages.
    • Delete the ‘Jump to’ drop-down box and the icons explaining post/board types

    Step 4: Fix the URLs

    As it stands, SMF has some pretty ugly URLs. There are a couple of mods that I could never get to work. But editing a file and adding an .htaccess file seems to do the trick.

    Open the Sources/QueryString.php file and look for the line like this:

    $scripturl = $boardurl . '/index.php';

    and get rid of the /index.php

    Now create a .htaccess file in the root of the forum (in the same folder as the Settings.php file). It should look similar to this:

    RewriteEngine On
    RewriteBase /7tah/forum/
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /7tah/forum/index.php [L]

     

    Step 5: Wget it

    Now we run wget on the command line to grab the pages.

    wget --mirror -P static-forum -nH -np -p -k -E --cut-dirs=2 http://domain.com/path/forum/

    All of the static HTML files will now be located in a directory called static-forum.

    Step 6: Fix filenames

    Some filenames will be a bit broken. Specifically the style.css has an extra “?fin11” in the html files where the file is called. Also, it get’s name that way. So fix that by changing the name of the file to just style.css (it’s in your Theme directory). Then run this one-line command to search and replace throughout all of the static html files (run the command when you are in the static-forum directory.

    find . -name '*.html' -type f -exec perl -pi -e 's/style.css%3Ffin11/style.css/g' {} \;

     

    This will look for all of the references to the style.css%3Ffin11 file and change them to style.css. Then the pretty colors and formatting will work. Just for clarification, the %3F is code for a question mark. It shows up as such in the HTML source when viewing from a browser, but is displayed as such in the actual code.

    Don’t forget to change the the actual name of the css file to style.css.

    Step 7: Protect it

    Depending on  your needs, you may want to password protect your new static forum with an htaccess account. The good peoples at Dynamic Drive have an helpful tool for making the two files necessary to make this happen. Just plug in your desired user name, password, and location of the htpasswd file, and then it’s copy and paste into those files on the server.

    I change the last line of the htaccess file to require user username so that it works only with the given user, not any valid. But since it only pulls from the specified htpasswd file, it’s kind of pointless.

    Step 8: Backup the old

    It’s a good idea to make a backup of the database and site files before getting rid of them. I just make a mysqldump of the database, throw it in the forum folder, and then make a tar or zip file of that and put the file in the new static forum folder for safe keeping.

    Step 9: That’s it.

    Sit back and relax. Your forum is interactive no longer.