|
|
 |
Example of Section Blog layout (FAQ section)
|
Veritas Volume Management |
|
|
|
|
Written by Martijn van Leeuwen
|
|
Monday, 01 September 2008 10:57 |
VxVM Manual ch 4, 5
The correct procedure for remirroring bootdisk from bootmirror so that they are nearly identical in paritioning scheme should be: (after many tries):
/etc/vx/bin/vxdisksetup -i c1t0d0 format=sliced Add disk c1t0d0 to vertias control, using sliced format for boot-able di sk.
vxdg -g rootdg adddisk bootdisk=c1t0d0
vxmirror -g rootdg bootmirror bootdisk This mirror partition and cyl in right seq.
/etc/vx/bin/vxbootsetup -g rootdg rootdisk just in case vtoc or boot sector info is missing.
----
Some more notes from the try, vxassist command used as per book suggestion.
fix later, from try 2 on oaprod2
vxplex -g rootdg dis rootvol-01 vxplex -g rootdg dis var-01 u01-01 swapvol-01 vxedit -g rootdg -fr rm rootvol-01 vxedit -g rootdg -fr rm swapvol-01 var-01 u01-01 vxdg -g rootdg rmdisk bootdisk vxdisk rm c1t0d0
/etc/vx/bin/vxdisksetup -i c1t0d0 format=sliced Add disk c1t0d0 to vertias control, using sliced format for boot-able disk.
vxdg -g rootdg adddisk bootdisk=c1t0d0
vxassist -g rootdg mirror swapvol bootdisk & Mirror swap slide try mirror swap first so that it will start at cyl 2 It won't put any partition info in vtoc yet.
/etc/vx/bin/vxrootmir bootdisk mirror the root partition, it will need slide 0 be avail. This would probably work, except somehow var was placed in disk earlier than root, so will need to do that first. vxassist -g rootdg mirror var bootdisk & vxassist -g rootdg mirror u01 bootdisk &
So instead, use vxmirror... vxmirror -g rootdg bootmirror bootdisk This mirror partition and cyl in right seq. oaprod2 seems to be fine.
vxmirror : mirror root disk
Missing!! Try in test "4" /etc/vx/bin/vxbootsetup -g rootdg rootdisk Configure bootable info on vxvm boot disk in rootdg disk group. This include boot sector and solaris VTOC info that match location of root, swap, /usr, /var. Optional media name(s) at end (rootdisk) specify action to be carried out on specified disk only (if omitted, done for all disk in dg).
More info: http://www.sun.com/blueprints/0800/vxvmref.pdf
vxbootsetup would be needed for vxassist, and slide indeed show up in vtoc/format. but vxassist method req more work to copy partition in the right cyl manner. Maybe if bootmirror was created using vxassist, then that would have been good. But right now, vxmirror works great and don't really need vxbootsetup (at least in 4.0)
---
VxVM commands on oaprod1, clean tba
544 vxmirror -g rootdg c1t1d0 c1t0d0 545 vxmirror c1t1d0s2 c1t0d0s2 546 vxdg -g rootdg c1t1d0s2 c1t0d0s2 547 vxmirror -g rootdg c1t1d0s2 c1t0d0s2 548 vxmirror -g rootdg c1t1d0s2 c1t0d0s2 549 vxmirror -g rootdg c1t1d0s0 c1t0d0s0 550 vxprint -hrt 556 vxdisk list 564 vxdmpadm -h 565 vxtask list 566 vxprint -hrt 567 vxdisk list 576 vxdisk list 577 man vxdisk 578
vxdisk list display all disk managed by Veritas vxdisk -s list much more detailed version than above vxprint print disk slice/mirroring info, plex,vol, etc vxprint -hrt diff version than above, useful to see boot disk mirroring location on disk.
vxvol -g oracledg stopall stop all veritas volume on the specified disk group oracledg. all volume must be unmounted first
vxdg deport oracledg export the disk group oracledg this would make all the disk/volume of the said disk group to be available for import by other hosts. optional -h parameter tell who is expected to do import vxdg list list all disk group vxdisk -o alldgs list scan all disk, incl those not currently managed by veritas. those with disk group name inside () are exported dg, ready for import.
vxdg import oracledg import the said disk group oracledg
vxvol -g oracledg startall start all disk in said disk group oracledg This will make all vol in said disk group to be avail for mounting and general use. Veritas may have some locking mechanism based in scsi3 to fence off multiple host from importing a disk group, even if forceful. (as maybe problem on SAN disks shared in cluster). Check this first though.
----
vxddladm addjbod VID=DGC pagecode=0x83 offset=8 length=16 disable Veritas DMP (dynamic MultiPath) and use EMC PowerPath driver instead (EMCpower pkg need to be installed).
vxddladm listjbod Display current settings
vxddladm rmjbod vid=DGC Undo use of EMC PowerPath, and let Veritas DMP do its thing again.
Veritas DMP will continue to be used, PowerPath sits at lower layer and intercept the calls to the different disks. Veritas will know multiple path to the LUN, and it will know they are the same. If fiber is removed, DMP won't know as power path work behind the scene. Syslog will log error. After using vxddladm addjbod, reboot machine w/ reconfigure to ensure all devices are seen.
vxdmpadm getdmpnode enclosure=Disk list paths to various disks/luns
May 3 15:05:15 oaprod1 vxio: WARNING: VxVM vxio V-5-0-181 Illegal vminor encountered
The error is said due to vm disk starting up before vxconfigd, but my experience is that vxconfigd is already running. Other things to check: There is no files named: /VXVM-UPGRADE/.start_runed /etc/vx/reconfig.d/state.d/install-db
ls -l /dev/vx/dsk/ reminor disk group whose import is in conflict w/ existing disk group.
ls -l /dev/vx/dsk/oracledg brw------- 1 root root 259,52001 May 4 17:10 u02 brw------- 1 root root 259,52000 May 4 17:10 u03 ^^^^^ ^^^^^ 52000 is the minor number, shown also in vxprint -l oracledg
vxdg -g oracledg -f reminor 53011 # change the minor number of a disk group, # must be done while disk group is mounted # but changes take effect only in the next import run # and this minor number belongs to the disk group, which get carried to # another node when it is imported there.
Other commands
vxassist
/usr/sbin/modinfo | grep vx : look for loaded veritas modules (to see if veritas was running)
vxlicense -p : list licenses available in the system vxlicense -c : interactive program to enter veritas license key : license files are stored in /etc/vx/elm/ /usr/sbin/vxdisk list : list veritas disks, status
/usr/sbin/vxprint -ht : show some long config, /usr/sbin/vxprint -m : : veritas setup, etc
vxdiskadm : encaptulate root disk vxmirror : mirror root disk vxassistmirror
vxrecover : rebuild? failed vx slide vsedvtoc : edit the veritas "fdisk/format" info
vxvol stop : stop all veritas volumes on root disk vxedit -r : remove volume
Veritas Cluster Server
Volume Management consideration under VCS
Disabling io fencing:
/etc/rc2.d/S97vxfen stop echo "vxfen_mode=disabled" > /etc/vxfenmode /etc/rc2.d/S97vxfen start Above will still load driver, which allows Veritas Cluster VM to work w/o io fencing disks, but driver need to be loaded. This is supported for certain CVM config, but not for RAC.
/var/adm/messages that kernel driver is loaded. AND error on console that it is disabled (where command was started).
Best way is still to turn iofencing off completely in the init script.
modinfo | egrep vx\|gab\|llt 31 12490f9 26abc 258 1 vxdmp (VxVM 4.1z: DMP Driver) 32 78216000 20f869 259 1 vxio (VxVM 4.1z I/O driver) 34 126d9f0 1499 260 1 vxspec (VxVM 4.1z control/status driver) 277 7859f205 c7b 261 1 vxportal (VxFS 4.1_REV-4.1B18_sol_GA_s10b) 278 78a24000 170105 8 1 vxfs (VxFS 4.1_REV-4.1B18_sol_GA_s10b) 282 78bc2000 22467 266 1 llt (LLT 4.1) 283 78be6000 46a88 267 1 gab (GAB device 4.1) 284 78c2e000 39491 268 1 vxfen (VRTS Fence 4.1)
IOFencing. driver get loaded by kernel. it search for vxfendg to find which disk group to use, then run vx... cmd to generate /etc/vxfentab, which has list of device path for LUN beloging to io fencing dg. 4.0 use /dev/rdsk/cXtXdXsX, 4.1 use the multipath devices, such as /dev/rdsk/emcpowerXc the driver is much more robust than the vxfentsthdw script. 4.0 vxfentsthdw -g vxfencoorddg fails, though driver should be all good. 4.1 vxfentsthdw -g will work correctly using emcpowerX devices and know that they may not be the same device path on different nodes. 4.1 resolved all io fencing issues found in 4.0.
4.1 vxdisk -o alldgs list will also show the emcpowerX as device name, instead of generic DISK_X. The naming now is at the mercy of PowerPath, veritas see them just as solaris format command see them. It may still not be persistent binding, but at least easy corss ref b/w veritas, solaris format, and info presented in EMC Navisphere. No ASL (Array Support Lib) was needed.
VCS Cluster Config
gabconfig -a : display link config info. a = ??gab port, ie loaded ok by kernel. b = iofencing port. h = cluster port.
GAB Port Memberships =============================================================== Port a gen 1ea001 membership 01 Port b gen 1ea00f membership 01 Port h gen 1ea012 membership 01
vxfenadm -i /dev/rdsk/emcpower0c Display serial number of the device (LUN, disk) vxfenadm -g /dev/rdsk/emcpower0c Show IO Fencing info
graceful shutdown of cluster
hastop -all # stop vcs for the whole cluster, ready for both machine to shutdown. hastop -local # stop vcs on local machine only, it will stop the services, no migration by default. hastop -local -evacuate # stop vcs, migrate (evacuate) service to another node # evacuate a single node, just single node clean exit out of cluster.
hastatus # monitor cluster status, no arg act like tail -f -sum # display summary and exit.
lltstat # general summary -nvv # see cluster interconnect link info (heartbeat).
hares -online Mount_u02 -sys oaprod1 # online the give resource at the specified system # resource name is as per config (Main.cf) # resource and group name are listed by hastatus cmd. hares -offline Oracle_oaprod -sys oaprod2 # offline the whole resrouce group on the specified system # migration to another node will NOT happen for -offline. hagrp -switch oracle_group -to oaprod1 # switch a service group to the specified system hares -modify Oracle_oaprod Owner oracle # change resouce=Oracle_oaprod attribute=Owner newvalue=oracle haconf -dump # save vcs config to Main.cf (edited via special command) # do not edit Main.cf while cluster is up, it will be ignored. haconf -dump -makero # equiv of "close config" of hagui, config still kept by conf editor
seq of offline commands: hares -offline Netlsnr_oaprod -sys oaprod2 hares -offline Oracle_oaprod -sys oaprod2 hares -offline Mount_u02 -sys oaprod2 hares -offline Mount_u03 -sys oaprod2 hares -offline Volume_u02 -sys oaprod2 hares -offline Volume_u03 -sys oaprod2 hares -offline DiskGroup_oracledg -sys oaprod2 # some sort of high level container wrapper. hares -offline IPMultiNICB_oaprod -sys oaprod2
hares -clear Oracle_oaprod -sys oaprod1 hares -online Oracle_oaprod -sys oaprod1 # bring up oracle service group, w/ all deps hagrp -switch oracle_group -to oaprod2
--- config eg, for adding oracle test group.
haconf -makerw hagrp -freeze oracle_group hares -modify Oracle_oaprod User veritas_monitor hares -modify Oracle_oaprod Pword veritas_password hares -modify Oracle_oaprod Table monitor hares -modify Oracle_oaprod MonScript "./bin/Oracle/SqlTest.pl" hares -modify Oracle_oaprod DetailMonitor 1 haconf -dump -makero hagrp -unfreeze oracle_group
---
config commands (typically located in /opt/VRTS/bin):
hacf -verify /etc/VRTSvcs/conf/config/ verify that the main.cf config file is correct, parseable.
haconf -makerw turn config to be read write, so that changes can be made via haclus haconf -dump -makero save and close config from rw, must remember to do this, or else reboot will have issues! haclus ... change cluster config param. (CLI change instead of gui).
hauser -add vcsuser Add a new user that can use hagui, it will prompt for the new password of the new user.
hauser -modify Administrators -add vcsuser The new user is placed in admin group so that full control is granted. Best way to add admin when password is forgotten :)
hagui GUI, java, for monitor and making changes to cluster
VCS config files
/etc/VRTSvcs/conf/config/main.cf config file for vcs, usually changed using hagui or haclus command. Once cluster is live, config is in memory, and this file is only backup. Changes to it will be ignored if cluster is up. Cluster start does read this file, so easy manual chage of config if cluster is down.
/etc/init.d/vx* vxvm-relocover starts several deamon, which also take argument and email root at local machines. change these!
3 files in /etc need to be copied to each of the node in the cluster (rsh of install should create these if doing multinode install w/ install script).
/etc/llttab :: set-node oaprod1 # diff for each node, reflect local node name set-cluster 1 link ce1 /dev/ce:1 - ether - - link ce3 /dev/ce:3 - ether - - link-lowpri ce0 /dev/ce:0 - ether - -
/etc/llthosts :: 0 oaprod1 1 oaprod2
/etc/gabtab :: /sbin/gabconfig -c -n2
|
|
|
SNMP - Zing TCP Stats on Solaris 8 |
|
|
|
Written by Martijn van Leeuwen
|
|
Friday, 03 April 2009 06:47 |
|
I've been using the Zing TCP Stats for Cacti for awhile now.
It gives a nice display on the tcp connections status on you machine.
But by default it doesn't work for Solaris 8, and we have a lot of Solaris 8 at work.
I've rebuild the scripts and here's a small howto to get it working..
First a nice graphical view of what the Zing TCP Stats look like:

By default the scripts were written in Python. Since we don't have Python installed I've rewritten the scripts to Perl.
To collect the information:
First we need to create the file that is read by the perl script for SNMP.
We do this by creating a file in /etc/cron.d: netstat (make it executable)
The contents of the file:
#!/usr/bin/ksh
cd /tmp && netstat -an -f inet -P tcp | grep -v "-" | grep -v "TCP" | awk '{print $7}' | sort | uniq -c > net.tmp && mv -f net.tmp net.cache
Now to enable it by using CRON:
#
# Collect Network statistics
#
0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48,51,54,57 * * * * /etc/cron.d/netstat > /dev/null 2>&1
You can also schedule to run at a 2min interval.
Due to the fact that the cron on Solaris 8 is a bit old, your not able to use the */3 * * * * notation.
To get the information into SNMP:
Here is the script that collects the information, I've stored it in /usr/local/bin:
#!/usr/bin/perl -w
# Debug level used for differing verbosity.
# Put val into %ENV so all modules can access.
# 0 = print only errs
# 1 = print basic progress
# 2 = print actions
# 3 = print details inside subs
#
my $DEBUG_LEVEL = 3; # default to 1
# Perl settings.
if ($DEBUG_LEVEL == 3){
# Include Library files
use Data::Dumper;
use diagnostics;
}
#use strict;
use Time::Local;
#########################################################
#
# Scriptname: netstat.prl
#
# Author: Martijn van Leeuwen
#
# Purpose of script: Collect Network Statistics
#
#########################################################
#
# Version & Change history
#
# 0.1.0 Initial start
# 0.2.0 First run.
#
#########################################################
#
# Script checked by:
#
# -
#
#
#
#########################################################
# Set version
#########################################################
my $VERSION="0.2.0";
#########################################################
# Function Prototypes
#########################################################
sub open_log;
sub close_log;
sub write_log ($);
sub displayversion;
sub read_data_file;
sub getnextoid($);
sub getoid($);
#########################################################
# Set variables
#########################################################
my $systemname = qx(uname -n);chomp $systemname;
my $scriptname="netstat";
my $TMP_DIR="/tmp";
my $LOG_DIR="/var/log";
my $LOGHANDLER;
my $LOG_FILE="$LOG_DIR/$scriptname.log";
my $SYNTAX="true";
my $Errormsg="";
my $CS="false";
my $LOGGING="false";
my $TMP_DATADUMPFILE="$TMP_DIR/$scriptname-datadumpfile.txt";
my $WRITE_LOG_AND_SCREEN="false";
my $base_oid = ".1.3.6.1.3.2";
my $netstat_cache="/tmp/net.cache";
my %stats= (
'CLOSE_WAIT' => '0',
'CLOSING' => '0',
'ESTABLISHED' => '0',
'FIN_WAIT1' => '0',
'LISTEN' => '0',
'SYN_RECV' => '0',
'TIME_WAIT' => '0');
my $GETOID="FALSE";
my $NEXTOID="FALSE";
my $INPUTOID;
#################################################
# #
# MAIN #
# #
#################################################
MAIN: {
# Check input parameters
if (@ARGV>0)
{
while (@ARGV>0)
{
my $x;
my $param=shift;
if (substr($param,0,1) eq "-")
{
for($x=1;$x {
my $char=substr($param,$x,1);
if ($char eq "l") {$LOGGING="TRUE"}
elsif ($char eq "c") {$CS="TRUE"}
elsif ($char eq "h"){
$Errormsg = "Overview of the parameters.";
$SYNTAX="false";
}
elsif ($char eq "D" && @ARGV>0) {$DEBUG_LEVEL=shift}
elsif ($char eq "v"){
print "\n";
displayversion;
exit 0;}
elsif ($char eq "g" && @ARGV>0){ $GETOID="TRUE";$INPUTOID=shift;}
elsif ($char eq "n" && @ARGV>0){ $NEXTOID="TRUE";$INPUTOID=shift;}
else {
print "Supplied parameter '-$char' is INVALLID!\n";
$SYNTAX="false"
}
}
} else { $INPUTOID=$param}
}
}
else {
$SYNTAX="false";
}
if ($SYNTAX eq "false") {
displayversion;
printf("\t%s\n",$Errormsg);
print "
Syntax: $scriptname [-lhvc -D -g -n OID ]
\n\t-c\t sets output to Comma Sperated.
\n\t-h\t Displays help.
\n\t-v\t Displays version information.
\n\t-l\t Writes output to logfile: ($LOG_FILE).
\n\t-D\t Sets debug level : Currently ($DEBUG_LEVEL).
\n\t-g\t Get OID
\n\t-n\t Get next OID
\n";
exit 1
}
# Enable logging ?
if ($LOGGING eq "TRUE") {
open_log($LOG_FILE);
write_log "Starting $scriptname..";
}
read_data_file();
if (defined $NEXTOID && $NEXTOID eq "TRUE"){
my $next=getnextoid($INPUTOID);
getoid($next);
} elsif ($GETOID eq "TRUE") {
getoid($INPUTOID);
} else {
getoid($INPUTOID);
}
#DumpDataStructure;
#foreach my $KEYS (%stats){
#print "\t $KEYS\n";
#}
#========================================================
#
# Finished
#
# Close open files/Clean Up and Exit
#
#========================================================
#
if($LOGGING eq "TRUE") {
close_log();
}
exit 0;
}
#########################################################
#
#
# Utility functions
#
#
#########################################################
sub read_data_file {
my $FH;
my @line;
open($FH, "<", $netstat_cache) or die "$0: Unable to open $netstat_cache for reading: $!";
while(my $lines = <$FH>){
chomp($lines);
$lines =~ s/^\s+//;
@line=split(/ /,$lines);
if (defined $line[1]){
$stats{$line[1]}=$line[0];
}
}
close($FH) or die "$0: Unable to close $netstat_cache: $!";
}
sub getoid($) {
my $req=shift;
my $stat=0;
if ($req eq ".1.3.6.1.3.2.1") { $stat = $stats{'CLOSE_WAIT'};}
if ($req eq ".1.3.6.1.3.2.2") { $stat = $stats{'CLOSING'};}
if ($req eq ".1.3.6.1.3.2.3") { $stat = $stats{'ESTABLISHED'};}
if ($req eq ".1.3.6.1.3.2.4") { $stat = $stats{'FIN_WAIT1'};}
if ($req eq ".1.3.6.1.3.2.5") { $stat = $stats{'LISTEN'};}
if ($req eq ".1.3.6.1.3.2.6") { $stat = $stats{'SYN_RECV'};}
if ($req eq ".1.3.6.1.3.2.7") { $stat = $stats{'TIME_WAIT'};}
print "$req\n";
print "Counter32\n";
print "$stat\n";
return $stat;
}
sub getnextoid($) {
my $req=shift;
my $num=0;
if ($req eq $base_oid) { $req = "$base_oid".".1";}
else {
$num=int(substr($req,-1));
if ( $num < 7) {
$num++;
$req = "$base_oid"."."."$num";
}
else {return;}
}
return $req;
}
#########################################################
#
# Systemlogging
#
#########################################################
sub open_log {
open($LOGHANDLER, ">>", $LOG_FILE) or die "$0: Can't write $LOG_FILE: $!";
}
sub close_log {
close($LOGHANDLER) or die "$0: $LOG_FILE didn't close: $!";
}
sub write_log ($) {
my $LogOutput=shift;
my $TimeStamp="[ ". ctime(). " ]";
print $LOGHANDLER "$TimeStamp - $LogOutput\n";
}
sub displayversion {
if ($CS eq "TRUE"){
print "File:$scriptname;Version:$VERSION;\n";
}
else {
printf("\t%s\n","$scriptname - v$VERSION\n");
}
}
__END__
To enable the parsing into snmp modify your snmp.conf with the following line:
pass .1.3.6.1.3.2 /usr/local/bin/netstat.pl
This will call the script and parse all information to SNMP.
Do not forget to restart your SNMP (A kill -HUP on the process ID should do the trick)
|
|
Last Updated on Friday, 17 April 2009 13:56 |
|
Create ISO Images from CD/DVD and Folder Files |
|
|
|
|
Written by Martijn van Leeuwen
|
|
Sunday, 26 October 2008 13:40 |
|
With Ubuntu, you can create ISO disk Images directly from CD/DVD and folder files. Then create MD5 Checksum files.
Assumed that the CD/DVD device is located at /dev/cdrom/
Turn a CD/DVD into an .iso
$ sudo umount /dev/cdrom
$ dd if=/dev/cdrom of=file.iso bs=1024
Turn a folder into an .iso
$ mkisofs -r -o file.iso /location_of_folder/
Generate an MD5 checksum file
$ md5sum file.iso > file.iso.md5
Check MD5 checksum of file
$ md5sum -c file.iso.md5
Not only for Ubuntu, you can also use this command to create ISO images and MD5 checksum in any Linux Distro. |
|
|
Host Interface Networking in Sun xVM VirtualBox |
|
Written by Martijn van Leeuwen
|
|
Thursday, 30 October 2008 09:53 |
Accessing the host operating system from a guest is as simple at setting up a network adapter attached to NAT and you will be able to access the Internet, ssh to the host and other things.
So how does this work?
The guest gets a IP address via DHCP which is made possible by the internal DHCP server of VirtualBox. The host also gets a IP address which is only accessible by the guest. We can think of it to be a internal IP address. Hence, we can “talk” to the host OS.
However, we cannot communicate in the same way with the guest OS from the host OS. This is expected as this is the very concept of NAT
Solution: Host Interface Networking
“With Host Interface Networking, VirtualBox creates a new networking interface in software on the host computer. This new software interface will then exist in parallel to your regular interfaces (e.g., on a Linux host vbox0 will exist alongside eth0). When a guest is using such a new software interface, it looks to the host system as though the guest were physically connected to the interface using a network cable: the host can send data to the guest through that interface and receive data from it. This means that you can set up routing or bridging between the guest and the rest of your network.”
Set up a Network bridge to enable Host Interface Networking
The VirtualBox user manual has detailed instructions for setting up host interface networking on Windows, Linux and Solaris.
Here I will reproduce the steps for Ubuntu Linux 8.04.1
- Install the bridge-utils package: sudo apt-get install bridge-utils
- Edit your /etc/network/interfaces to add the following lines:
auto br0 <br />iface br0 inet static <br />address 10.10.3.4 <br /> bridge_ports eth0 <br />
Restart the networkin services: sudo /etc/init.d/networking restart
Create a software host interface: sudo VBoxAddIF vbox0 amit br0 (where 'amit' should be the user who will be running VirtualBox)
Modify the network settings of your virtual machine to add the interface 'vbox0' : VBoxManage modifyvm JeOS -hostifdev1 vbox0 (where 'JeOS' is your VM name)
Boot up the VM and assign a static IP adress to the interface
For eg. You can have a webserver running on your Guest OS and you can acces it from your Host.
Example of a configuration:
auto br0
iface br0 inet static
address 192.168.66.200
network 192.168.66.0
netmask 255.255.255.0
broadcast 192.168.66.255
bridge-ports eth0 |
|
Last Updated on Thursday, 30 October 2008 09:58 |
|
Written by Martijn van Leeuwen
|
|
Thursday, 30 October 2008 10:02 |
U talk Swap?
help.ubuntu.com/community/SwapFaq
|
|
|
|
|
|
|
Page 1 of 4 |
|
|
|
|
 |