Aneesh Kumar K.V
2002-12-09 07:07:01 UTC
Also there
is some difference in the option supported by swapon ( -e ) between what
i found in redhat and the mount code base( from debian ). So redhat
startup script may need a close check.
is some difference in the option supported by swapon ( -e ) between what
i found in redhat and the mount code base( from debian ). So redhat
startup script may need a close check.
Also, I think we want to have the commands use /etc/fstab, not
/etc/fstab.ssi. That would be less surprising to a new user. IIUC, no
modifications need to be made to /etc/fstab for the first node. Perhaps
the original /etc/fstab can be saved when addnode or chnode is first
used to add entries for other nodes. It can then be restored if
mount-ssi and e2fsprogs-ssi are uninstalled.
I guess we need to have fstab.ssi . Otherwise user is going to be more/etc/fstab.ssi. That would be less surprising to a new user. IIUC, no
modifications need to be made to /etc/fstab for the first node. Perhaps
the original /etc/fstab can be saved when addnode or chnode is first
used to add entries for other nodes. It can then be restored if
mount-ssi and e2fsprogs-ssi are uninstalled.
confused. I am attaching below a small perl script that will auto
generate the needed fstab.ssi. Run it on the first node. One can also
import the already existing fstab( new fstab with entires node=x will be
auto generated ). The output file name is taken as the argument.
If one is not importing already existing fstab ( which will be case for
other nodes ) the script will ask certain set of questions depending on
the hardware configuration and file system supported. ( I am reading
this from /proc ).
Hope the script will be useful.
-aneesh
#! /usr/bin/perl -w
#
#
# Date : Dec 09 2002
# Authors: Aneesh Kumar K.V ( ***@digital.com )
#
#
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 2 of
# the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE
# or NON INFRINGEMENT. See the GNU General Public License for more
# details.
#
#
use strict;
sub generate_fstab_ssi {
my($node_num,$fstab,$fstab_out) = @_;
my($input_line);
my(@line_entry);
my($i);
open(INFILE,$fstab) || die ("Unable to open the file $fstab");
open(OUTFILE,">>$fstab_out") || die ("Unable to open the file $fstab_out");
while(! eof(INFILE) ) {
$input_line = <INFILE>;
@line_entry = split(/[\t ]+/ ,$input_line);
if ($line_entry[0] =~ /^#/ ) {
print OUTFILE $input_line;
next ;
}
if (@line_entry != 6 ) {
next;
}
$i = 0;
while( $i < @line_entry ) {
if( $i == 3) {
if ($line_entry[2] =~ /proc/ || $line_entry[2] =~ /devfs/ ) {
print OUTFILE $line_entry[$i].",node=*\t";
} else {
print OUTFILE $line_entry[$i].",node=$node_num\t";
}
} else {
print OUTFILE "$line_entry[$i]\t";
}
$i++;
}
print OUTFILE "\n";
}
close(INFILE);
close(OUTFILE);
}
sub partition_print
{
my(@ex_list) = @_;
my($input_line);
my(@line_entry);
my($ex);
open(PROC_PARTITION,"/proc/partitions") || die( "/proc/partitions not found");
# Skip the starting line
$input_line = <PROC_PARTITION>;
print "\nAvailable partions are:\n";
read_proc: while(! eof(PROC_PARTITION) ) {
$input_line = <PROC_PARTITION>;
@line_entry = split(/[\t ]+/ ,$input_line);
if (@line_entry == 5) {
chop($line_entry[4]);
if( $line_entry[4] =~ /[0-9]$/ ) {
foreach $ex (@ex_list) {
if( $ex eq $line_entry[4]) {
next read_proc;
}
}
print "$line_entry[4]\n";
}
}
}
close(PROC_PARTITION);
}
sub filesystem_print
{
my($input_line);
my(@line_entry);
open(PROC_FILESYSTEM,"/proc/filesystems") || die( "/proc/filesystems not found");
print "\nAvailable filesystems are:\n";
print "swap\n";
while(! eof(PROC_FILESYSTEM) ) {
$input_line = <PROC_FILESYSTEM>;
@line_entry = split(/[\t ]+/ ,$input_line);
if ($line_entry[0] ne "nodev" ) {
print @line_entry;
}
}
close(PROC_FILESYSTEM);
}
sub write_fstab_entry
{
my($partition_name,$file_system,$node_num,$fstab_out)=@_;
my($mount_point,$create_mount);
open(OUTFILE,">>$fstab_out") || die ( "Unable to open $fstab_out");
if( $file_system eq "swap" ) {
print OUTFILE "/dev/$partition_name\tnone\t$file_system\t";
print OUTFILE "sw,node=$node_num\t\t0\t0\n";
}else {
print "Enter the mount point for /dev/$partition_name :";
$mount_point = <STDIN>;
chop($mount_point);
unless ( -d $mount_point ) {
print "\n";
print "$mount_point not found ";
print "Shall I create it ?[y/n] :";
$create_mount = <STDIN>;
chop($create_mount);
if ( $create_mount eq "y") {
mkdir($mount_point,0755);
}else {
print "Mount point not created !!!!\n";
}
}
print OUTFILE "/dev/$partition_name\t$mount_point\t$file_system\t";
print OUTFILE "defaults,node=$node_num\t\t0\t2\n";
}
close (OUTFILE);
}
sub usage() {
print "\n";
print "Usage:\n";
print "perl $0 <out_file_name>";
print "\n";
}
sub main
{
my($node_num);
my($import_fstab,@ex_list,$partition_name,$more,$file_system);
$node_num = `/sbin/clusternode_num`;
chop($node_num);
# Anything other than digit
if ($node_num =~ /\D/) {
die(" This Program need to run on a SSI cluster!!!!");
}
if (@ARGV < 1 ) {
usage();
exit();
}
print "Cluster fstab generation script\n";
if ( -e "/etc/fstab" ){
print "Found /etc/fstab Do you want to import[y/n]:";
$import_fstab = <STDIN>;
chop($import_fstab);
if ( $import_fstab eq "y" ) {
generate_fstab_ssi($node_num,"/etc/fstab",$ARGV[0]);
return;
}
}
while (1) {
partition_print(@ex_list);
print "Select a partition : ";
$partition_name = <STDIN>;
chop($partition_name);
filesystem_print();
print "Select the file system on ";
print "the partion /dev/$partition_name :";
$file_system =<STDIN>;
chop($file_system);
write_fstab_entry($partition_name,$file_system,
$node_num,$ARGV[0]);
@ex_list = (@ex_list,$partition_name);
print "Add another entry[y/n]:";
$more = <STDIN>;
chop($more);
if ($more ne "y" ) {
last;
}
}
}
main