[Eisfair] nochmal..Installation eisfair1 auf vServer -- geht es einfacher?

Thomas Bork tom at eisfair.org
Fr Aug 25 20:59:34 CEST 2017


Am 24.08.2017 um 23:08 schrieb Kay Martinen:

> Und ich nahm an man könnte das gleiche prozedere nehmen, nur das man 
> eben ein virtio(modul?) für Platte und net direkt lädt und diese dann 
> ebenso benutzen kann wie es der normale kernel tut. Da hab ich mangels 
> besserer Kenntniss wohl zu einfach gedacht.

Da sind dann eben eventuell andere Devices in Benutzung. Darauf ist die 
Logik im Installer nicht ausgelegt. Und diese Logik schüttele ich nicht 
einfach aus dem Ärmel, sondern muss sie mir per trial and error mühsam 
erarbeiten.

>> Experimentieren eine entsprechende (lokale) Gegenstelle fehlt, die ich 
>> ständig im Zugriff habe. Und ein anderer hat sich bisher nicht 
>> gefunden, das zu implementieren und mir die nötigen Patches 
>> zuzuschicken...
> Tja, da ich es auch nicht kann, Würde es dir denn weiter helfen zugriff 
> auf einen Proxmox VE (KVM/QEMU) Server zu bekommen auf dem du das testen 
> könntest? Oder ist das nicht das gleiche oder nicht genug?

Siehe oben. Da das eine langwierige Aktion wird (ich habe für so etwas 
auch nicht immer Zeit und Lust) benötige ich idealerweise eine lokale 
Installation, mit der ich spielen kann und deren Parameter ich verändern 
kann. Weil bei anderen Emulation eben andere Devices verwendet werden.

>> Sieh Dir die Logik für IDE, SCSI, SATA, USB, Stick hier
>> http://int-ch.starwarsfan.de/browse/eisfair/trunk/install/eisfair-1/initramfs/init?r=46683 
>> http://int-ch.starwarsfan.de/browse/eisfair/trunk/install/eisfair-1/eis-installer/opt/linuxrc2?r=46683 
>> http://int-ch.starwarsfan.de/browse/eisfair/trunk/install/eisfair-1/eis-installer/scsi.sh.316?r=46499 
> Puh, ein bisschen zu viel für meiner einer. Aber in dem Zusammenhang ne

Ein Beispiel aus linuxrc2, es wird nach installierbaren Festplatten und 
ihren Devices gesucht:

#----------------------------------------------------------------------------
# search for harddisks and cdroms
#----------------------------------------------------------------------------
#echo "Boot media : ${boot_media}"
#echo "Boot device: ${boot_dev}"
#ask "show boot dev"
echo
colecho "Searching hard disks ..." gn
disk=none
cdrom=none
ide_found=false
scsi_found=false
cpqscsi_found=false
cpqprefix=''
disk_other=''
ide_devices="hda hdb hdc hdd hde hdf hdg hdh"
scsi_devices="sda sdb sdc sdd sde sdf sdg"
cpq_devices="c0d0 c0d1 c0d2 c0d3 c0d4 c0d5 c0d6 c0d7"

for j in $ide_devices
do
     eval $j=`cat /proc/ide/$j/media 2>/dev/null`
     eval type='$'$j
     case "$type" in
     disk)
         ide_found=true
         if [ "$disk" = "none" ]
         then
             disk=$j
         fi
         ;;
     cdrom)
         ide_found=true
         if [ "$cdrom" = "none" ]
         then
             cdrom=$j
         fi
         ;;
     "")
         eval $j=none
         ;;
     esac
done

for j in $scsi_devices
do
     grep " $j" /proc/partitions >/dev/null 2>&1
     if [ $? = 0 ]
     then
         scsi_found=true
         eval $j=disk

         if [ "$disk" = "none" ]
         then
             if [ "${j}" != "`echo ${boot_dev} | cut -c6-8 `" ]
             then
                 disk=$j
             fi
         else
             disk_other=$j
         fi

         if [ "${boot_media}" = "USB-Stick" ]
         then
             if [ "${j}" = "`echo ${boot_dev} | cut -c6-8 `" ]
             then
                 eval ${j}="USB-Stick"
             fi
         fi
     else
         eval $j=none
     fi
done

for cpqprefix in ida cciss
do
     for j in $cpq_devices
     do
         grep " $cpqprefix/$j$" /proc/partitions >/dev/null 2>&1
         if [ $? = 0 ]
         then
             cpqscsi_found=true
             eval $j=disk
             j=$cpqprefix/$j

             if [ $disk = none ]
             then
                 disk=$j
             else
                 disk_other=$j
             fi
         else
             eval $j=none
         fi
     done

     if [ $cpqscsi_found = true ]
     then
         break
     fi
done

sizeMB=''
sizeKB=''

if [ $ide_found = true ]
then
     header=1
     for a in $ide_devices
     do
         eval new_disk='$'${a}
         if [ "$new_disk" = "disk" ]
         then
             sizeKB=`sfdisk -s /dev/${a}`
             # disk fuer RAID rausschreiben
             echo "${sizeKB} ${a}" >>/have_raid_disk

             if [ -n "$sizeKB" ]
             then
                 sizeMB=`expr ${sizeKB} / 1024`
                 sizeMB="($sizeMB MiB)"
             fi

             if [ ${header} -ne 0 ]
             then
                 echo
                 echo " IDE-Disk                     | Device   | Type"
                 echo " 
-----------------------------+----------+-------------------------------------"
                 header=0
             fi

             case "${a}" in
                 hda)    echo " hda Master on 1st controller |/dev/hda 
|${new_disk} ${sizeMB}" ;;
                 hdb)    echo " hdb Slave  on 1st controller |/dev/hdb 
|${new_disk} ${sizeMB}" ;;
                 hdc)    echo " hdc Master on 2nd controller |/dev/hdc 
|${new_disk} ${sizeMB}" ;;
                 hdd)    echo " hdd Slave  on 2nd controller |/dev/hdd 
|${new_disk} ${sizeMB}" ;;
                 hde)    echo " hde Master on 3nd controller |/dev/hde 
|${new_disk} ${sizeMB}" ;;
                 hdf)    echo " hdf Slave  on 3nd controller |/dev/hdf 
|${new_disk} ${sizeMB}" ;;
                 hdg)    echo " hdg Master on 4nd controller |/dev/hdg 
|${new_disk} ${sizeMB}" ;;
                 hdh)    echo " hdh Slave  on 4nd controller |/dev/hdh 
|${new_disk} ${sizeMB}" ;;
             esac
         fi
         sizeMB=''
         sizeKB=''
     done
     echo
fi

if [ ${scsi_found} = true ]
then
     if [ "${boot_media}" = "USB-Stick" ]
     then
         new_boot_dev="`echo ${boot_dev} | cut -c6-8 `"
     fi

     header=1
     for a in $scsi_devices
     do
         eval new_disk='$'${a}
         if [ "${a}" = "${new_boot_dev}" ]
         then
             new_disk="USB-Stick"
         fi

         if [ "$new_disk" = "disk" -o "$new_disk" = "USB-Stick" ]
         then
             sizeKB=`sfdisk -s /dev/${a}`

             if [ "${new_disk}" != "USB-Stick" ]
             then
                 # disk fuer RAID rausschreiben
                 echo "${sizeKB} ${a}" >>/have_raid_disk
             fi

             if [ -n "$sizeKB" ]
             then
                 sizeMB=`expr ${sizeKB} / 1024`
                 sizeMB="($sizeMB MiB)"
             fi

             if [ ${header} -ne 0 ]
             then
                 echo
                 echo " SCSI-/SATA-/USB-Disk         | Device   | Type"
                 echo " 
-----------------------------+----------+-------------------------------------"
                 header=0
             fi

             echo " ${a}                          |/dev/${a} 
|${new_disk} ${sizeMB}"
         fi
         sizeMB=''
         sizeKB=''
     done
     echo
fi

if [ $cpqscsi_found = true ]
then
     if [ "$cpqprefix" = "ida" ]
     then
         fill='  '
     elif [ "$cpqprefix" = "cciss" ]
     then
         fill=''
     fi

     header=1
     for a in $cpq_devices
     do
         eval new_disk='$'${a}
         if [ "$new_disk" = "disk" ]
         then
             sizeKB=`sfdisk -s /dev/${cpqprefix}/${a}`
             # disk fuer RAID rausschreiben
             echo "${sizeKB} ${cpqprefix}/${a}" >>/have_raid_disk

             if [ -n "$sizeKB" ]
             then
                 sizeMB=`expr ${sizeKB} / 1024`
                 sizeMB="($sizeMB MiB)"
             fi

             if [ ${header} -ne 0 ]
             then
                 echo
                 echo " SmartArray-Disk      | Device           | Type"
                 echo " 
---------------------+------------------+-------------------------------------"
                 header=0
             fi

             echo " ${a}                 |/dev/$cpqprefix/${a} ${fill} 
|${new_disk} ${sizeMB}"
         fi
         sizeMB=''
         sizeKB=''
     done
     echo
fi


Es fehlt z.B. eine Erkennung für /dev/vd*-Devices. Die tauchen natürlich 
erst auf, wenn die entsprechenden Treiber geladen wurden. Dabei muss 
sich der Installer merken, welche Treiber das sind, um diese nachher in 
die initramfs zu packen

> Frage. Ich hab gestern einen Eis neu installiert und mich gefragt wieso 
> der eth0 bis eth3 durch probiert wo doch eine einzige Karte reichen 
> würde? Weitere kann man doch später hinzu fügen.

Es hängt von der Anbindung Deiner Karte ab, ob die nun als eth0 oder was 
auch immer auftaucht.

> Da wäre es nach meinem Denken schon einfacher gewesen direkt mit einem 
> virt-kernel zu installieren. Das brachte mich eben auch auf die 
> Eingangs-Frage.

Es gibt schon mal einen simplen Grund, warum der Installer nicht auf 
einem VIRT-Kernel basiert. Bei jeder Veröffentlichung eines Kernels 
schreibe ich:

###
Der SMP-Kernel unterstützt Systeme mit einem oder mehreren Prozessoren 
und Prozessoren mit einem oder mehreren physikalischen oder virtuellen 
Kernen.

Der PAE-Kernel ist der SMP-Kernel plus PAE und Sparse-Memory-Model. Die 
CPU muss die Features cmov und pae unterstützen - das wird bei der 
Installation überprüft.

Ein emulierter mathematischer Co-Prozessor (CONFIG_MATH_EMULATION) ist 
nur noch bei SMP gesetzt (um auch alte 486 ohne Co-Prozessor zu 
unterstützen). Ab PAE ist sowieso immer ein solcher Co-Prozessor 
vorhanden, PAE und VIRT bringen die Emulation deswegen bei uns nicht mit 
- das spart Platz.
Ab PAE ist das NX-Bit gesetzt, PAE und VIRT sind somit sicherer als SMP. 
Ab PAE ist ausserdem CONFIG_TRANSPARENT_HUGEPAGE gesetzt.
###

Basiert der Installer auf dem VIRT, sind alle Systeme mit Prozessoren 
raus, die cmov und pae nicht unterstützen. Auf diese Systemen lässt sich 
dann einfach nicht mehr installieren.

>> Es müssen virtuelle Treiber geladen werden, es muss gecheckt werden, 
>> ob dann virtuelle Festplatten existieren, es müssen die richtigen 
>> Devices für boot, swap, root, data angesprochen werden, es muss eine 
>> initrd mit den virtuellen Treibern erstellt werden, es müssen die 
>> richtigen Devices in die fstab geschrieben werden, usw.
> swap in einer VM? Macht m.E. keinen sinn solange genug RAM da ist.
> Wie gesagt, ich dachte "einfach" das mit dem virt-kernel eh klar wäre 
> das es nur virtuelle devices gäbe und es dadurch genau so einfach ist 
> wie mit dem normalen. Man hat ein blockdevice zum installieren und ein 
> netzwerk-device zur Außenwelt - nur eben in "virtuell". :)

Da geht es schon mal los:
Welches Blockdevice habe ich denn? Aus "eisfair unter KVM/Proxmox":

###
3. device-nodes anlegen:
#mknod /dev/vda b 253 0
#mknod /dev/vda1 b 253 1
#mknod /dev/vda2 b 253 2
#mknod /dev/vda3 b 253 3
###

Hier sind das /dev/vd*-Devices. Unter einer anderen Emulation eventuell 
/dev/sd*-Devices. Ich schlage vor, die siehst doch einmal in die oben 
von mir genannten Dateien aus dem Installer hinein, um festzustellen, 
dass dort exzessiv mit den Devices gearbeitet wird.
Ausserdem muss das System feststellen, welche Treiber zum Booten in der 
initramfs benötigt werden, welche Devices in die fstab geschrieben 
werden müssen, mit welchen Devices und Einstellungen die lilo.conf 
geschrieben werden muss usw.

> Worin unterscheidet sich das partitionieren einer virtuellen platte denn 
> von dem einer echten, wenn man da die Logik anpassen müsste?

Z.B. durch die Devices.

>> Das macht sich alles irgendwie von selbst? Glaub ich nicht ;-)
> Oh, das wird nicht (zumindest Teil-)automagisch von einem Script 
> zusammengeklöppelt? Das wusste ich nicht. Ernsthaft!

Die Skripte (die Logik im Installer) erstellt kein Skript. Wenn Du eins 
dafür kennst, schicke es mir :-)

-- 
der tom
[eisfair-team]


Mehr Informationen über die Mailingliste Eisfair