UnionFS als Root-FS

Du kommst mit der Installation nicht voran oder willst noch was nachfragen? Schau auch in den "Tipps und Tricks"-Bereich.
Antworten
Benutzeravatar
Leonidas
Beiträge: 2032
Registriert: 28.04.2003 13:48:49
Lizenz eigener Beiträge: MIT Lizenz
Kontaktdaten:

UnionFS als Root-FS

Beitrag von Leonidas » 20.10.2007 09:33:11

Hallo,

ich bin gerade dabei mein System etwas zu optimieren und wollte meinen Root-Ordner aus mehreren Volumen zusammensetzen. Dabei geht es darum, die Schreibzugriffe auf meine Compact Flash-Karte zu verringern. So wie ich das sehe, muss ich das Setup in meinem ``initramfs`` erledigen. Daher habe ich mir mal die initramfs-Dateien angeschaut und folgendes in der ``/usr/src/initramfs-tools/scripts/local`` hinzugefügt:

Code: Alles auswählen

        # FIXME This has no error checking
        # Mount root
        #mount ${roflag} -t ${FSTYPE} ${ROOTFLAGS} ${ROOT} ${rootmnt}

        # unionfs?
        mkdir -p /CFCARD
        mkdir -p /RAMDISK
        mount -r -t ${FSTYPE} ${ROOTFLAGS} ${ROOT} /CFCARD
        mount -w -t tmpfs -o size=128M tmpfs /RAMDISK

        mount -t unionfs -o dirs=/RAMDISK:/CFCARD unionfs ${rootmnt}
        mkdir -p ${rootfs}/CFCARD
        mkdir -p ${rootfs}/RAMDISK

        mount /CFCARD -o move ${rootmnt}/CFCARD
        mount /RAMDISK -o move ${rootmnt}/RAMDISK
        # end of unionfs
Jetzt funktioniert das, ich würde sagen halb. Ich habe danach eine auf ``ro`` gemountete CF-Karte und eine Ramdisk. Ich habe auch ``/CFDISK``, somit kann ich bei Bedarf auch die CF-Karte ``rw`` mounten. Was ich aber nicht habe und dennoch brauche ist ``/RAMDISK`` welches irgendwie nicht erstellt wird und nicht umgemountet wird.

Jedoch geht es nicht anders, da ich die Synchronisation von Ramdisk und CF nicht hinbekomme, ohne zu wissen, was in der Ramdisk steht.

Ich vermute es ist irgendein Detail, aber ich komme einfach nicht drauf. Hat jemand eine Idee, wie man das lösen könnte?
Wir wollten einen Marsch spielen, aber wir hatten nur Xylophone.

Benutzeravatar
Leonidas
Beiträge: 2032
Registriert: 28.04.2003 13:48:49
Lizenz eigener Beiträge: MIT Lizenz
Kontaktdaten:

Beitrag von Leonidas » 21.10.2007 09:48:55

Ok, ich habe es nun so gelöst:

Code: Alles auswählen

        # FIXME This has no error checking                                      
        # Mount root                                                            
        #mount ${roflag} -t ${FSTYPE} ${ROOTFLAGS} ${ROOT} ${rootmnt}           
                                                                                
        # unionfs?                                                              
        mkdir -p /CFCARD                                                        
        #mkdir -p /RAMDISK                                                      
        mount -r -t ${FSTYPE} ${ROOTFLAGS} ${ROOT} /CFCARD                      
        # an empty directory called RAMDISK has to exist on the flash card      
        mount -w -t tmpfs -o size=128M tmpfs /CFCARD/RAMDISK                    
                                                                                
        mount -t unionfs -o dirs=/CFCARD/RAMDISK:/CFCARD unionfs ${rootmnt}     
        mkdir -p ${rootfs}/CFCARD                                               
        #mkdir -p ${rootfs}/RAMDISK                                             
                                                                                
        mount /CFCARD -o move ${rootmnt}/CFCARD                                 
        #mount /RAMDISK -o move ${rootmnt}/RAMDISK                              
        # end of unionfs
Wobei er mir hängen bleibt, wenn in im UnionFS eine Datei lösche. Wie ich im einzigen Unionfs-Artikel gelesen habe, wird die Union als DELETE_ALL gemountet. Im "Trockentest" habe ich es allerdings schon erfolgreich mit /CFCARD=ro und DELETE_WHITEOUT ausprobiert.

Ich denke, es wäre gut, das alles mal im Wiki zusammenzuschreiben. Wenn Lenny Stable wird, wird man es wohl auf ``aufs`` übertragen müssen, aber da erwarte ich keine großen Probleme.
Wir wollten einen Marsch spielen, aber wir hatten nur Xylophone.

Shane
Beiträge: 1
Registriert: 13.11.2007 15:30:33

Beitrag von Shane » 16.11.2007 15:48:45

Ich habe das ganze jetzt sauber*) in den Bootvorgang eingebaut, d.h.:
mit Hilfe eines einfachen Parameters den man beim Booten mit angibt, kann man auf read-only RootFS mit überlagertem ramfs als unionfs umschalten. Ohne diesen Parameter läuft alles unverändert, genau wie bisher!

*) im laufenden System werden (bei aktiviertem unionfs) die mounts ($> mount) für das RootFS und das RamFS nicht korrekt angezeigt. Falls jemand abhilfe weiss, lasst es uns bitte wissen!

How-To
  1. unionfs-module installieren: uname -r und dann mit apt-get install unionfs-modules-<kernelversion>
  1. initramfs-tools installieren: apt-get install initramfs-tools
  1. eigene initrd mit den initramfs-tools erzeugen, dazu folgende Schritte ausführen:

Code: Alles auswählen

echo "unionfs" >> /etc/initramfs-tools/modules
echo "export FSTYPE" >> /etc/initramfs-tools/conf.d/unionfs_root
echo "export ROOTFLAGS" >> /etc/initramfs-tools/conf.d/unionfs_root
  1. Datei /etc/initramfs-tools/scripts/local-premount/unionfs_root mit folgendem Inhalt anlegen. chmod +x nicht vergessen für die Datei!

Code: Alles auswählen

#!/bin/sh

PREREQS=""

prereqs() { echo "$PREREQS"; }

case "$1" in
   prereqs)
   prereqs
   exit 0
   ;;
esac

export unionfs

for x in $(cat /proc/cmdline); do
   case $x in
   unionfs=*)
      unionfs=${x#unionfs=}
      ;;
   esac
done

if [ ! -z "${unionfs}" ]; then
   mkdir -p /unionroot
   mount -w -t ${FSTYPE} ${ROOTFLAGS} ${ROOT} /unionroot
   mkdir -p /unionroot/uniontmp
   mount -o remount,ro /unionroot
   mount -w -t ramfs -o maxsize=${unionfs} ramfs /unionroot/uniontmp
   echo "FSTYPE=\"unionfs\"" >> /conf/param.conf
   echo "ROOTFLAGS=\"-o dirs=/unionroot/uniontmp=rw:/unionroot=ro,delete=whiteout\"" >> /conf/param.conf
   echo "ROOT=\"unionfs\"" >> /conf/param.conf
   echo "readonly=n" >> /conf/param.conf
fi
  1. Datei /etc/initramfs-tools/scripts/local-bottom/unionfs_root mit folgendem Inhalt anlegen. chmod +x nicht vergessen für die Datei!

Code: Alles auswählen

#!/bin/sh

PREREQS=""

prereqs() { echo "$PREREQS"; }

case "$1" in
   prereqs)
   prereqs
   exit 0
   ;;
esac

if [ ! -z "${unionfs}" ]; then
   mkdir -p ${rootmnt}/unionroot
   mount /unionroot -o move ${rootmnt}/unionroot
   touch ${rootmnt}/fastboot
fi
  1. eine neue initrd mit dem Befehl update-initramfs -u erstellen.
  1. beim booten kann dem Kernel jetzt ein Parameter unionfs=maxsize der Ramdisk in KB übergeben werden. So erzeugt unionfs=32000 eine ramdisk mit ramfs, die maximal 32MB gross werden kann und mounted root ro, ergänzt durch ein unionfs wird es damit wieder rw, ohne dass physikalisch auf die root-partition geschrieben wird!
Ich hoffe es ist verständlich und hilft anderen weiter :idea: !

Antworten