setup_harddisks/mount2dir-mkdir-Unterstützung

Edgar Fuß ef at math.uni-bonn.de
Tue Jan 29 18:18:50 CET 2008


Moin.

Wir brauchten bei FAI die Möglichkeit, Verzeichnisse anzulegen, die später von Mounts überdeckt werden, speziell var/run und var/lock auf dem root fs (also NICHT nur run und lock auf dem fs, das auf /var gemounted wird).

Hintergrund: RAMRUN und RAMLOCK brauchen das. Ich will das garnicht genau verstehen, aber der Verantwortliche (Petter Reinholdtsen <pere at hungry.com>) schrieb dazu:

To avoid this, some effort is taken to make sure the root file system
include /var/run/ on the file system, to allow it to be mounted before
/var/ is mounted, and then moved to the new /var/run/ when /var/ is
mounted.  An interesting question is why this is not the case for your
machine.  It should have been created when initscripts was installed
or upgraded.

Also offenbar wird das bei einer Installation von CD oder so gemacht.

Meine Lösung ist, die disk_config-Files um eine Option mkdir=dir1,dir2,... zu erweitern.
Dann schreibt setup_harddisks neben fstab eine zusätzliche Datei fstab.mkdir raus, in der Zeilen der Form

mountpount dir1 dir2 ...

stehen.
Diese Datei (wenn sie existiert) wird dann von mount2dir ausgelesen, und die nötigen mkdir-Befehle werden zur richtigen Zeit (also wenn der mountpoint gerade reingehängt wurde) ausgeführt.

Das ganze scheint bei uns zu funktionieren.

Warum ich das so implementiert habe:
Die meiner Meinung nach sauberste Stelle, die mkdirs anzugeben, ist die disk_config. Da setup_harddisks und mount2dir praktisch nur über die fstab kommunizieren, braucht man einen ähnlichen Kanal. Die fstab selber ist ungünstig, weil die auf das Zielsystem kopiert wird (ich hatte zwischenzeitlich die Idee, mount2disk einfach so zu ändern, daß es die jetzt schon vorhandenen mkdirs auch für noauto macht, und dann die zu erstellenden Verzeichnisse in die fstab mit noauto und fstype ,,mkdir`` reinzuschreiben, aber das kam mir dann zu gehackt vor).
Da man mount2disk schwerlich einen zusätzlichen Parameter angeben kann (weil hinten als letzter die optionale Überschreibung der Mount-Optionen sitzt), habe ich <fstabfile>.mkdir benutzt. Alternative wäre, als zweiten Parameter fstabfile,mkdirfile oder etwas in der Art zu nehmen.
Rückwärtskompatibel ist das auf jeden Fall. Falls keine mkdir=xxx-Option vorkommt, wird von setup_harddisks kein fstab.mkdir erzeugt. Wenn die Datei nicht existiert, verhält sich mount2dir wie bisher (zumindest ist so der Plan und grob getestet scheint es auch zu klappen).

Was man vielleicht noch haben möchte:
Eine Möglichkeit, modes für das mit mkdir erzeugte Verzeichnis anzugeben.
Eine Möglichkeit, owner/group für das mit mkdir erzeugte Verzeichnis anzugeben.
Idee dazu: mkdir=blah/fasel:mode:owner:group.

Patches im Anhang (ich liebe SVN).

Meinungen?
-------------- nächster Teil --------------
Index: mount2dir/4230-mib/mount2dir
===================================================================
--- mount2dir/4230-mib/mount2dir	(.../4230-mib/mount2dir)	(revision 337)
+++ mount2dir/4230-mib/mount2dir	(.../4230/mount2dir)	(revision 334)
@@ -1,6 +1,6 @@
 #! /bin/bash
 
-# $Id: mount2dir 4230-mib $
+# $Id: mount2dir 4230 2007-02-07 21:36:53Z lange $
 #*********************************************************************
 #
 # mount2dir -- mount partitions to a directory using a fstab file
@@ -35,10 +35,6 @@
 # the remaining partitons
 # mount2dir $target $target/etc/fstab 0 ro
 #
-# if a file having the same name as the fstab file plus a suffix .mkdir exists,
-# it contains lines giving a mount point and a space-separated list of
-# directories to create under that mount point.
-#
 # TODO: option parsing with getopts, option for also mounting nfs directories
 # matching a certain server name
 
@@ -59,9 +55,6 @@
     exit 2
 }
 
-mkdir=${fstab}.mkdir 
-[ -f $mkdir ] || mkdir=""
-
 (
 while read device mountpoint fstype mopt dummy; do
 
@@ -94,14 +87,6 @@
 	    # should we fsck the partition first?
 	    [ "$fscheck" = 1 ] && fsck -nt $fstype $device
 	    mount -t $fstype -o noatime $mopt $device $target$mountpoint
-	    # create any directories specified in the mkdir file
-	    if [ -n "$mkdir" ]; then
-		dirs=$(grep "^${mountpoint}[[:space:]]" "$mkdir") && {
-		    for dir in ${dirs#$mountpoint}; do
-			mkdir -p $target$mountpoint/$dir
-		    done
-		}
-	    fi
     esac
 done
 
-------------- nächster Teil --------------
Index: setup_harddisks/4240-mib/setup_harddisks
===================================================================
--- setup_harddisks/4240-mib/setup_harddisks	(.../4240-mib/setup_harddisks)	(revision 337)
+++ setup_harddisks/4240-mib/setup_harddisks	(.../4240/setup_harddisks)	(revision 334)
@@ -1,6 +1,6 @@
 #!/usr/bin/perl
 
-# $Id: setup_harddisks 4240-mib $
+# $Id: setup_harddisks 4240 2007-03-07 13:50:11Z lange $
 #*********************************************************************
 #
 # setup_harddisks -- create partitions and filesystems on harddisk
@@ -141,9 +141,6 @@
 #       -h <hash>  : set reiserfs hash
 #       -v <ver>   : set reiserfs version
 #
-#     mkdir=dir1,dir2,...
-#		   : write entries to fstab.mkdir filee 
-
 use strict;
 # getopts variables:
 our ($opt_X, $opt_f, $opt_c, $opt_d);
@@ -155,7 +152,7 @@
 # Variables
 #****************************************************
 
-my $Version = "version 0.42fai-mib";
+my $Version = "version 0.42fai";
 
 my $megabyte = 1024 * 1024;    # guess
 # $gigabyte = 1024 * $megabyte;
@@ -246,7 +243,6 @@
 &PartitionPersfdisk;
 &FormatDisks;
 &WriteFSTab;
-&WriteMkdir;
 &WriteFAIVariables;
 exit 0;
 #****************************************************
@@ -931,28 +927,6 @@
 }
 
 #****************************************************
-# Optionally build mkdir file and write it to <root>/etc/fstab.mkdir
-#****************************************************
-sub WriteMkdir{
-    my ($MkdirTab, $filename);
-    foreach my $mountpoint (%PartMountpoint){
-	if ($MPOptions{$mountpoint} =~ /\bmkdir=(\S+)/){
-           $MkdirTab .= ($mountpoint . " "  . join(' ',split(/[,;:]/,$1)) . "\n");
-	}
-    }
-    return if !defined($MkdirTab);
-    # write it
-    $filename = "$ENV{LOGDIR}/fstab.mkdir";
-#    print $MkdirTab;
-    print "Write mkdir file to $filename\n" if $verbose;
-    if($test != 1){
-	open(FILE, ">$filename") || die "unable to write mkdir file $filename\n";
-	print FILE $MkdirTab;
-	close(FILE);
-    }
-}
-
-#****************************************************
 # Build fstab line
 #****************************************************
 sub BuildfstabLine{


More information about the linux-fai-devel mailing list