Wednesday, November 26, 2008

Clear Swap Space in Linux

There have been times where it has been necessary for me to clear out the swap space on a Linux system. In order to do this, you must first make sure that you have enough free memory to hold what is being used by swap.
I usually do this in a few steps. You do need to be root to do this. First I want to see what is currently being used.

Then I run the actual commands that empty the swap:
swapoff -a && swapon -a

Then I check what is being used after doing this.

I have these three steps in a script and then I just run the script, but, the commands could easily be run from the command line.

Tuesday, November 18, 2008

Create Solaris Package from Source

For this example I will use stunnel since I had to create this package at work today. This software will be compiled from source and created as a package.

First we create a directory structure for our new package. In this example, I'll use /var/tmp/src, but it can be created anywhere.

# cd /var/tmp/src
# mkdir LDSstunnel InfoPath

In the InfoPath directory which we just created, use your favorite text editor (vi) to create a file named pkginfo with the following contents.

DESC=allows to encrypt arbitrary TCP connections inside SSL
VENDOR=stunnel source taken from
- ARCH - is the architecture this package is built for. Can be sparc, i386 or ppc
- CATEGORY - list under which category to display the package
- NAME - short name of the package
- PKG - name of package. It is customary to make the first four letters unique to your company, such as a stock symbol.
- VERSION - version of package. In this case this is the version of stunnel
- DESC - descriptive information about the package
- VENDOR - used to describe the vendor that holds the software copyright
More information about these fields and other fields that can be used is in the pkginfo(4) man page.

Configure, compile, and install the software in a unique place

# ./configure --prefix=/opt/LDSstunnel
# make
# make install
# cd /opt/LDSstunnel
# mv * /
# cd ..
# rmdir LDSstunnel

Make any changes that need to be made to config files, etc.
I copied a default configuration file into /var/tmp/src/LDSstunnel/etc/stunnel/

In the InfoPath directory create a file named prototype. This file can be created manually, however, it is much easier to use the pkgproto tool.
# cd /var/tmp/src
# pkgproto ./LDSstunnel > InfoPath/prototype

Add a line to the end of the prototype file with information about the pkginfo file
# echo "i pkginfo=/var/tmp/src/InfoPath/pkginfo" >> InfoPath/prototype

Use the pkgmk tool to create the package
# pkgmk -f InfoPath/prototype -b /var/tmp/src

We can now use the pkginfo command to get information about this new package which is in the /var/spool/pkg directory
# cd /var/spool/pkg
# pkginfo -d .
application LDSstunnel stunnel

Our package is located in the /var/spool/pkg directory. We could copy the contents of this directory to an nfs export or tarball it and copy it to the destination server and install.

Monday, November 17, 2008

vsftp and /etc/shells

I discovered today that there are a couple of issues with using local accounts with VSFTP. The first issue which is obvious is that local_enable=YES needs to be set in the vsftpd.conf file. The other issue that is not as obvious is that if you have a local user that has a shell set to /bin/false or /sbin/nologin, that user will get a incorrect login error when they try to login. The thing I did to fix this problem was added /sbin/nologin to /etc/shells. This worked on a SUSE Linux Enterprse Server 10 (SLES 10) server. The simple command that I used to do this was:

#echo /sbin/nologin >> /etc/shells

Thursday, September 11, 2008

Display WWN in SLES 10

A key component of setting up a server to a SAN is knowing what the World Wide Name (WWN) is. I was very accustomed to doing this in SLES 9. With SLES 10, the location of finding the WWN has changed and it is now in the file /sys/class/fc_host/host#/node_name. Where # is the number of the host that you want to find the WWN of. 

An even easier way to find this information is to use the systool command:
systool -c fc_host -A node_name

Friday, March 7, 2008

Switch from LSI Logic to BusLogic driver

At the place where I work, we run several SUSE Linux Enterprise Server (SLES) 9.3 VMs on VMWare ESX 3.0.2 servers. When running the LSI Logic driver that ships with SLES 9.3, if there is an interrupt to the disk the disks on the VM can go read-only. This interrupt can be due to SAN fail-over, high I/O, or other issues. This bug has been fixed and doesn't exist in SLES 10.1 or later.
Because of this, we have had the need to switch these from using the LSI Logic driver to use the BusLogic driver. The problem is that the original initial ram disk (initrd) is built with the LSI Logic driver and must be changed. I decided to document the steps required to do this. If you don't take these steps, the server will encounter a kernel panic on reboot after changing the VM to use the BusLogic HBA.

1) Update /etc/sysconfig/kernel with the BusLogic driver. Change the line that reads:

INITRD_MODULES="mptspi reiserfs dm_mod"

to read:

INITRD_MODULES="BusLogic reiserfs dm_mod"

2) Make a backup copy of the initrd file that is currently in use.

cp initrd- initrd-

3) Rebuild the initial ram disk file to incorporate the changes made to /etc/sysconfig/kernel by running mkinitrd as root.


Note: You can pass additional options to the mkinitrd command to use a specific kernel. By default it will build an initrd for all the kernel versions in /boot. This is sufficient for the servers in my environment.

4) Update the virtual machine to use the BusLogic HBA

Use the VirtualCenter Client
- Shutdown the VM
- Right click on the VM and select Edit Settings
- Select SCSI Controller 0 and click the Change Type button
- Select the BusLogic radio button and click OK
- Click OK to exit the Virtual Machine Properties
- Power on the VM
- Answer the "change the adapter type for scsi0:0 disk" by selecting the Yes radio button and clicking OK

Thursday, January 24, 2008

What's that line in /proc/mounts?

When I view the /proc/mounts file, the first line looks like:
rootfs / rootfs rw 0 0
I found myself wondering what this line was. Today I figured it out.

My first thought was that this is my mounted / directory, however, this is not the case. My mounted / directory appears in /proc/mounts as:
/dev/root / ext3 rw,data=ordered 0 0

The first line is actually the initial ram disk (initrd). When the system boots up, this initial ram disk is mounted as the root filesystem. Many Linux systems then just mount the actual root filesystem over top of that. I found this page,, to be very helpful in explaining this.

How to add disk space with LVM on Linux

I have often had the need to add disk space to a server. The newer distributions of Linux (SUSE Linux Enterprise Server - "SLES" 9 and greater, Red Hat Enterprise Linux - "RHEL" 4 and greater) use Logical Volume Manager (LVM) which makes this a fairly simple task.
The general steps are:
  1. Physically put the disk in the server and make it available either in an array or some other way.
  2. Use fdisk to create new partition on the disk.
  3. Extend existing volume group onto new partition.
  4. Extend existing logical volume onto new space.
  5. Extend filesystem.
I'll go into more detail how to do each of these steps on SLES and RHEL. For this example we are going to assume that our new disk that has been added to our server is /dev/sdc. We will also assume that we have a volume group named rootvg and a logical volume on that volume group named homelv. Also in this example, /dev/rootvg/homelv is mounted on our Linux system as /home. Let's get started.
  1. Physically put the disk in the server and make it available either in an array or some other way.
    • This can vary widely depending on what hardware you are on, so we will not cover this portion in this tutorial. You may want to use Google to search for how to do this on your hardware.
  2. Use fdisk to create new partition on the disk.
    • As root run fdisk on the new disk. For example you would run fdisk /dev/sdc.
    • On this new disk you will create a new partition. Inside of the fdisk program you create a new partition by typing the letter "n" followed by the enter key.
    • It will then ask you if you want it to be a primary partition or an extended partition. For this example we will just assume we want it to be a primary partition. To do this we type the letter "p" followed by the enter key.
    • Next it will ask for the starting point and ending point of this partition. For this example, we will simply select the defaults by hitting the enter key twice.
    • If you want to view the details of the new partition, you can type the letter "p" from the fdisk prompt.
    • Next we need to change the type for this new partition. We do this by typing the letter "t" followed by the enter key.
    • It asks to enter in what type we want it to be. We need it to be of the Linux LVM type. The Hex code for Linux LVM is 8e. We type in "8e" followed by the enter key and it will tell us that it changed the system type for this partition to Linux LVM.
    • We then need to save these changes and exit fdisk. We do this by typing the letter "w" (for write) followed by the enter key.
  3. Use pvcreate to lay down the "setup" on the physical partition.
    • This sets up physical extents and other things that LVM needs. The command we run is "pvcreate /dev/sdc1"
  4. Extend existing volume group onto new partition.
    • For this example we are going to assume that we have an existing volume group named rootvg. We can display information about this volume group using the vgdisplay command. If we type "vgdisplay" without any arguments, it will display all the volume groups. If we just want information about the "rootvg" volume group, we would type "vgdisplay rootvg".
    • To extend the rootvg volume group onto the new partition, we use the vgextend command. Type "vgextend rootvg /dev/sdc1" followed by the enter key. This will extend the rootvg volume group onto the new partition, /dev/sdc1.
  5. Extend existing logical volume onto new space.
    • For this example we are going to assume that we have an existing logical volume on the rootvg volume group that is named homelv. The full path to this logical volume would be "/dev/rootvg/homelv". We can view information about this logical volume by typing "lvdisplay /dev/rootvg/homelv".
    • To extend this existing logical volume onto the new space we use the lvextend command. Type "lvextend -L +20G /dev/rootvg/homelv /dev/sdc1". This command says that we want to increase the /dev/rootvg/homelv logical volume by 20GB. This is only possible if /dev/sdc1 is a member of volume group rootvg and there is enough free disk space on it.
  6. The last thing we need to do is increase the filesystem.
    • Which command we use to increase the filesystem depends on what filesystem type we are currently using. If we are using reiserfs, we will use the "resize_reiserfs" command. If we are using ext3, we will use either the "ext2online" or the "resize2fs" command. On RHEL 5, we can use the "resize2fs" command, which will recognize that the filesystem is currently mounted and perform an "on-line" resize.
    • On both resize_reiserfs and ext2online, the size is optional. If we want the filesystem to take up all the available space on our logical volume, we don't need to put the size. To extend the filesystem type either "ext2online /dev/rootvg/homelv" or "resize_reiserfs /dev/rootvg/homelv".
You should now be able to run "df -h" and see the additional disk space available in the /home directory.