>> >> > If you're NFS-mounting the root filesystem, you need either different
>> >> > areas per machine, or local disk for workspace, e.g. for /var.
>> >> /tmp is a local disk partition.
>> >
>> >Maybe you might be interested in LTSP, the "Linux Terminal Server Project"
>> >[1]. They also use a single root filesystem mounted via NFS with a single
>> >central configuration file. Files that needs to be writeable are in a small
>> >symlinked ramdisk under /tmp.
>>
>> Bah. My initramfs script, a beefed up version of what mkinitrd creates,
>> _properly_ mounts an nfs and a local disk, merges them to a unionfs and
>> voila, you get / being an unionfs, without funky symlink hacks like
>> knoppix, with a writable and persistent layer. If desired, the
>> local disk is cleared before building the union, effectively making it
>> a large tmpfs.
>
>Where can we get your script? It looks really interesting.
You can ignore the long minus part where scsi is removed.
--- initrd-devel~/init 2006-09-07 20:47:44.000000000 +0200
+++ initrd-devel/init 2006-10-17 18:57:52.254798736 +0200
@@ -3,6 +3,7 @@
export PATH=/sbin:/usr/sbin:/bin:/usr/bin
die() {
+ /bin/sh
umount /proc
umount /sys
umount /dev
@@ -302,75 +303,6 @@ modprobe ide-disk $params
params=
for p in $(cat /proc/cmdline) ; do
case $p in
- scsi_mod.*)
- params="$params ${p#scsi_mod.}"
- ;;
- esac
-done
-
-# check for SCSI parameters in /proc/cmdline
-devflags=0
-for p in $(cat /proc/cmdline) ; do
- case $p in
- scsi_mod.*)
- params="$params ${p#scsi_mod.}"
- ;;
- scsi_reportlun2=1)
- echo "scsi_reportlun2 compat: Use scsi_mod.default_dev_flags=0x20000
instead"
- devflags=$((131072+$devflags))
- ;;
- scsi_noreportlun=1)
- echo "scsi_noreportlun compat: Use scsi_mod.default_dev_flags=0x40000
instead"
- devflags=$((262144+$devflags))
- ;;
- scsi_sparselun=1)
- echo "scsi_sparselun compat: Use scsi_mod.default_dev_flags=0x40
instead"
- devflags=$((64+$devflags))
- ;;
- scsi_largelun=1)
- echo "scsi_largelun compat: Use scsi_mod.default_dev_flags=0x200
instead"
- devflags=$((512+$devflags))
- ;;
- llun_blklst=*)
- echo "llun_blklst is not supported any more"
- echo "use scsi_mod.dev_flags=VENDOR:MODEL:0x240[,V:M:0x240[,...]]"
- ;;
- max_ghost_devices=*)
- echo "max_ghost_devices is not needed any more"
- ;;
- max_sparseluns=*)
- echo "max_sparseluns not supported any more"
- echo "use scsi_mod.max_luns or enable the new REPORT_LUNS scsi"
- echo "scanning methods; try scsi_mod.default_dev_flags=0x20000"
- ;;
- max_luns=*|max_report_luns=*|inq_timeout=*|dev_flags=*|default_dev_flags=*)
- echo "scsi_mod compat: Please use prefix: scsi_mod.$p"
- params="$params $p"
- ;;
- esac
-done
-if [ $devflags != 0 ]; then
- params="default_dev_flags=$devflags $params"
-fi
-
-echo "Loading scsi_mod"
-modprobe scsi_mod $params
-
-params=
-for p in $(cat /proc/cmdline) ; do
- case $p in
- sd_mod.*)
- params="$params ${p#sd_mod.}"
- ;;
- esac
-done
-
-echo "Loading sd_mod"
-modprobe sd_mod $params
-
-params=
-for p in $(cat /proc/cmdline) ; do
- case $p in
mii.*)
params="$params ${p#mii.}"
;;
@@ -431,54 +363,6 @@ modprobe piix $params
params=
for p in $(cat /proc/cmdline) ; do
case $p in
- scsi_transport_spi.*)
- params="$params ${p#scsi_transport_spi.}"
- ;;
- esac
-done
-
-echo "Loading scsi_transport_spi"
-modprobe scsi_transport_spi $params
-
-params=
-for p in $(cat /proc/cmdline) ; do
- case $p in
- mptbase.*)
- params="$params ${p#mptbase.}"
- ;;
- esac
-done
-
-echo "Loading mptbase"
-modprobe mptbase $params
-
-params=
-for p in $(cat /proc/cmdline) ; do
- case $p in
- mptscsih.*)
- params="$params ${p#mptscsih.}"
- ;;
- esac
-done
-
-echo "Loading mptscsih"
-modprobe mptscsih $params
-
-params=
-for p in $(cat /proc/cmdline) ; do
- case $p in
- mptspi.*)
- params="$params ${p#mptspi.}"
- ;;
- esac
-done
-
-echo "Loading mptspi"
-modprobe mptspi $params
-
-params=
-for p in $(cat /proc/cmdline) ; do
- case $p in
sis900.*)
params="$params ${p#sis900.}"
;;
@@ -514,7 +398,9 @@ modprobe sis5513 $params
if [ -z "$rootdev_cmdline" ]; then
case "$ROOTPATH" in
- "") ;;
+ "")
+ rootfstype="unionfs"
+ ;;
*:*)
rootfstype="nfs"
rootdev="$ROOTPATH" ;;
@@ -528,10 +414,8 @@ if [ -z "$rootdev_cmdline" ]; then
fi ;;
esac
if [ -z "$rootdev" ]; then
- echo "no local root= kernel option given and no root" \
- "server set by the dhcp server."
+ echo "Building root from union"
echo 256 > /proc/sys/kernel/real-root-dev
- die 0
fi
fi
@@ -657,6 +541,26 @@ done
echo "Loading nfs"
modprobe nfs
+params=
+for p in $(cat /proc/cmdline) ; do
+ case $p in
+ unionfs.*)
+ params="$params ${p#unionfs.}"
+ ;;
+ esac
+done
+
+echo "Loading unionfs"
+modprobe unionfs
+
+for p in $(cat /proc/cmdline); do
+ case "$p" in
+ (live)
+ live_readwrite=1;
+ ;;
+ esac;
+done;
+
# Wait for udev to settle
/sbin/udevsettle --timeout=$udev_timeout
# Check for a resume device
@@ -712,7 +616,7 @@ elif [ -x /bin/fsck.${rootfstype} ]; the
fi
opt="-o ro"
-[ -n "$read_write" ] && opt="-o rw"
+[ -n "$read_write" -o "$rootfstype" == "unionfs" ] && opt="-o rw"
[ "$rootfstype" = "nfs" ] && opt="${opt},nolock"
# tell kernel root is /dev/ram0, prevents remount after initrd
@@ -723,12 +627,62 @@ echo "Mounting root $rootdev"
[ "$rootfstype" = "xfs" -a -n "$journaldev" ] &&
opt="${opt},logdev=$journaldev"
[ "$rootfstype" = "xfs" -a -n "$rootfsflags" ] && opt="${opt},$rootfsflags"
[ "$rootfstype" = "reiserfs" -a -n "$journaldev" ] &&
opt="${opt},jdev=$journaldev"
+
+###set -x;
+if [ "$rootfstype" = "unionfs" ]; then
+ mkdir -p /.STATIC /.DYNAMIC;
+ ip link set lo up;
+ ip addr add 127.0.0.1/8 dev lo;
+ ip route add 127.0.0.1/8 dev lo scope link;
+ dhclient -sf /sbin/dhclient-script -lf /dhclient.leases eth0;
+ NFS=1;
+
+ if [ -n "$live_readwrite" ]; then
+ nfsextraopt="-r";
+ opt="$opt,dirs=/.STATIC=rw";
+ else
+ opt="$opt,dirs=/.DYNAMIC=rw:/.STATIC=nfsro";
+ fi;
+
+ if [ "$NFS" -gt 0 ]; then
+ echo -en "\e[0;33m""Using NFS""\e[0m\n"; # ]]
+ portmap -d &
+ portmap_id=$!;
+ mount `cat /.DYNAMIC/.next-server`:/tftpboot/terran /.STATIC \
+ -o async,nolock,rsize=512,wsize=512 $nfsextraopt || {
+ echo -en "\e[0;31m""nfsroot could not be mounted""\e[0m\a\n"; # ]]
+ die 1;
+ };
+ kill -TERM $portmap_id;
+ else
+ echo -en "\e[0;33m""Using CIFS""\e[0m\n"; # ]]
+ mount -t cifs -o username=tftpboot,password=tftpboot $nfsextraopt \
+ //`cat /.DYNAMIC/.next-server`/terran /.STATIC || {
+ echo -en "\e[0;31m""cifsroot could not be mounted""\e[0m\a\n"; # ]]
+ die 1;
+ };
+ fi;
+
+ mount LABEL=tmp /.DYNAMIC || {
+ echo -en "\e[1;31m""Not good.""\e[0;31m"" Will use RAM for temporal
storage for now.""\e[0m\a\n"; # ]]]
+ mount -t tmpfs none /.DYNAMIC;
+ };
+ echo "Clearing DYNAMIC";
+ rm -Rf /.DYNAMIC/* /.DYNAMIC/.[A-Za-z]*;
+ rootdev="none";
+fi;
+
[ -n "$rootfstype" ] && opt="${opt} -t $rootfstype"
if [ -x /bin/nfsmount -a "$rootfstype" = "nfs" ]; then
nfsmount $rootdev /root || die 1
else
mount $opt $rootdev /root || die 1
fi
+
+mkdir -p /root/{.STATIC,.DYNAMIC};
+mount -n --move /.STATIC /root/.STATIC;
+mount -n --move /.DYNAMIC /root/.DYNAMIC;
+
# Look for an init binary on the root filesystem
if [ -n "$init" ] ; then
if [ ! -f "/root$init" ]; then
#<EOF>
-`J'
--
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]