• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[gelöst] ssh und "network" in initrd einfügen

Hallo,

ich möchte mich per ssh in die initrd einloggen können. Was muss ich tun, damit die initrd einen ssh server (z. B. dropbear) und die netzwerk config übernimmt?

Gruß schnurzelat
 
A

Anonymous

Gast
schnurzelat schrieb:
ich möchte mich per ssh in die initrd einloggen können. Was muss ich tun, damit die initrd einen ssh server (z. B. dropbear) und die netzwerk config übernimmt?

Und was möchtest du dann dort auf der Konsole machen wenn da gar keine Programme und Tools sind die du ausführen könntest :schockiert:

Du darfst dir da nicht vorstellen das in der initrd da eine komplette Konsolumgebung vorhanden ist, da sind eine nackte Bash ein paar Kernelmodule, und eine handvoll primitiver Befehle samt der dazu benötigten Libs und noch einige Konfigurationsdateien aus dem Orginalsystem die zur Ausführung der Script dort gebraucht werden, und das wars auch schon. Mehr ist dort nicht,

Wenn du sowas machen willst, dann musst du ein kleines komplettes Linuxsystem nehmen, zB das Rescue von der CD. Dort die fehlenden Programme oder Pakete hinzufügen und das ganze System fertig für einen speziellen Rechner (oder auch universell für alle möglichen Rechner) komplett fertig konfigurieren und dann genau wie eine initrd verpacken und ablegen. Eventuell müssen noch ein paar Aufgaben aus der urspünglichen initrd mit dort hin übernommen werden. Wichtig ist, dort müssen die passenden Kernel-Module zu dem Kernel drin sein, mit dem du das dann auch starten willst. Bei den Bootoptionen dann dieses Ram-System dann als initrd angeben und den Wert für ramdisk entsprechend der Größe dieses Systems anpassen.

Wenn du aus dieser Ramdisk dann ohne erneuten Reboot ein anderes Linux starten willst, so wie es eine normale initrd machen würde, dann sind noch ein paar nicht alltägliche Konfigurationsarbeiten mehr zu machen.

Erste Information und Grundlegende Hilfe dazu findest du in der Dokumentation in deinem Kernelcode unter anderem unter Documentation/initrd.txt und Documentation/ramdisk.txt

Ist bestimmt nichts für Anfänger, das sage ich dir gleich.

robi
 
OP
S

schnurzelat

Member
Danke für deine ausführliche Antwort!

Es geht mir letztendlich um das hier. Ich möchte nach einem remote reboot das luks lvm starten können. Für Ubuntu gibt es ein script, das funktioniert. Mein Server läuft aber unter Suse...... Und daür habe ich nix gefunden.

Ich habe auch schon mal in die Verzeichnisse reingeschaut. Wie ich module da rein bekomme ist klar. Wie sieht das aber mit Anwendungen aus? Dropbear, busybox etc.

Gruß schnurzelat
 
A

Anonymous

Gast
schnurzelat schrieb:
Ich habe auch schon mal in die Verzeichnisse reingeschaut. Wie ich module da rein bekomme ist klar. Wie sieht das aber mit Anwendungen aus? Dropbear, busybox etc.

Ob es da was fertiges für Suse gibt? wenn du schon nichts gefunden hast, suche ich mal lieber gar nicht erst. Währe aber wahrscheinlich das selbst wenn es sowas gibt, dieses nicht unbedingt auf allen Suse-Versionen läuft, in diesem Umfeld hat es in den letzten Versionen enorme Änderungen in den Scripten gegeben.

Entweder alles per Hand, die initrd auspacken, das Zeugs mitsamt den benötigten Libs da reinKopieren und konfigurieren dann das ganze wieder einpacken. muss allerdings dann auf Suse-Seite dafür gesorgt werden das keine initrds mehr von Suse automatisch erstellt werden dürfen. So oder So nach dem nächsten Kernelupdate ist Schluss mit Lustig. Wie du die initrd aus- und wieder einpackst, steht hier http://www.linux-club.de/viewtopic.php?f=4&t=104512&p=642626&hilit=robi+cpio+initrd#p642626
Wenn man sich das Schrittweise alles fein notiert hat, dann kann man daraus dann auch ein Script machen, das dann eine neue initrd automatisch nach einem Kernelupdate genauso anpassen könnte.

Oder angefangen von /sbin/mkinitrd die eingebundenen Suse Bash- und Perlscripte zur Erstellung der initrd entsprechen durchforsten und sehen wo du ein ähnliches Script unterbringen könntest, die Vorlage hast du ja, ein paar Änderunge währen aber schon vonnöten, glaube irgendwie nicht das sich alles was da gemacht wird, Suse so einfach gefallen läßt. Das funktioniert dann theoretisch etwas länger und würde auch einen Kernelupdate überstehen, allerdings wenn hier mal zufällig ein Update für mkinitrd eingepielt würde :schockiert: :???: ist auch hier Pumpe. Wie du das System dann wieder zum Booten bewegen willst, solltest du dir auf alle Fälle schon mal rechtzeitig überlegen. Aber wie gesagt, immer mit Vorsicht zu genießen, es gab hier in diesem Umfeld jede Menge Änderungen zwischen und bei einigen Versionen auch innerhalb der Version.

Beides auf alle Fälle jede Menge Handarbeit.

robi
 
OP
S

schnurzelat

Member
Nochmals Danke für die wieder ausführlich Antwort. Ja, bei Suse läuft das alles ein bisschen anders, das ist mir auch schon aufgefallen. ;) Ich würde schon gerne versuchen den "offiziellen Weg" zu gehen. Leider habe ich noch keine passende Doku dazu gefunden. Auch in der Suse Referenz steht nur sehr wenig.

Ich habe schon mal busybox nachinstalliert. Daraufhin legt er ein script unter /lib/mkinitrd/scripts an und linkt es nach /lib/mkinitrd/setup. Was ich nicht weiß ist, wie man Suse dazu bekommt das entsprechende script auch zu verwenden. Module lassen sich einfach hinzufügen.

Als ich die Vollverschlüsselung mit luks und lvm gemacht habe, musste ich die Datei /etc/sysconfig/initrd anlegen und zwei Zeilen hinzufügen (Link). Ich habe für diese Datei aber keine auch Dokumentation gefunden.

Danke noch mal für deine Zeit und Mühe.

Gruß schnurzelat



EDIT:

Ich bin einen Schritt weiter: Die Scripte unter /lib/mkinitrd/scripts haben eine Abfrage nach einer variable - bei busybox heißt die variable "use_script". In der datei /etc/sysconfig/initrd wird dann angegeben: "use_script=busybox". Das veranlasst mkinitrd busybox in dir initrd mit aufzunehmen.


EDIT2: WARNUNG!! Die initrd läuft bei mir nicht mehr, wenn busybox inkludiert wurde!!!
 
OP
S

schnurzelat

Member
So habe es selbst geschafft! Da dies mein erstes modfiziertes shell script ist, sind verbesserungsvorschläge willkommen!


/lib/mkinitrd/scripts/boot-dropbear.sh
Code:
#!/bin/sh
#%stage: block
# we start the network and ssh-server

PREREQ=""
prereqs()
{
echo "$PREREQ"
}

case $1 in
prereqs)

prereqs
exit 0
;;
esac

################# CHANGE THE LINES BELOW #################
# The network setup: edit ip address and gateway to match your needs
/sbin/ifconfig eth0 192.168.178.10 netmask 255.255.255.0
/sbin/route add default gw 192.168.178.1
################# CHANGE THE LINES ABOVE #################

# display the network settings for double check
#ifconfig
/bin/sleep 3
# We will use /dev/urandom because /dev/random gets easily blocked
mv /dev/random /dev/random.old
ln -s /dev/urandom /dev/random
# /usr/sbin/dropbear -E -F -b /etc/dropbear/banner -d /etc/dropbear/dropbear_dss_host_key -r /etc/dropbear/dropbear_rsa_host_key -p 22
/sbin/dropbear -d /etc/dropbear/dropbear_dss_host_key -r /etc/dropbear/dropbear_rsa_host_key -p 22
#ls -al
rm -f /dev/random
mv /dev/random.old /dev/random

/lib/mkinitrd/scripts/setup-dropbear.sh
Code:
#!/bin/bash
#
#%stage: boot
#
# add dropbear to the initrd to be able to mount crypto partitions from remote


PREREQ=""
prereqs()
{
     echo "${PREREQ}"
}

case $1 in
prereqs)
     prereqs
     exit 0
     ;;
esac
mkdir /etc/dropbear 2>/dev/null
dropbearconvert openssh dropbear /etc/ssh/ssh_host_dsa_key /etc/dropbear/dropbear_dss_host_key
dropbearconvert openssh dropbear /etc/ssh/ssh_host_rsa_key /etc/dropbear/dropbear_rsa_host_key
cp -pr /usr/bin/killall $tmp_mnt/bin/
cp -pr /usr/sbin/dropbear $tmp_mnt/sbin/
cp -pr /sbin/ifconfig $tmp_mnt/sbin/
cp -pr /sbin/route $tmp_mnt/sbin/
cp -pr /bin/ps $tmp_mnt/bin/
cat /etc/passwd | grep root | sed s/\\/bash/\\/sh/ > $tmp_mnt/etc/passwd
cp -pr /bin/grep $tmp_mnt/bin/
cp -pr /root/unlock.sh $tmp_mnt/root/
mkdir $tmp_mnt/etc/dropbear 2>/dev/null
cp -pr /etc/dropbear/dropbear_dss_host_key $tmp_mnt/etc/dropbear/dropbear_dss_host_key
cp -pr /etc/dropbear/dropbear_rsa_host_key $tmp_mnt/etc/dropbear/dropbear_rsa_host_key

/root/unlock.sh
Code:
#!/bin/sh

killall -9 cryptsetup
/sbin/cryptsetup luksOpen /dev/sda7 root #Hier die Partition anpassen
killall -9 dropbear
killall -9 dropbear

dropbear gibt es hier.

Verbesserungsmöglichkeiten:

-Wiederholte Eingabe des Passwortes ermöglichen.
-Automatisches erkennen, der luks Partition - ps -ef gibt den Pfad aus, ich weiß aber nicht wie ich nur einen Teil der Zeile weiterverwenden kann.

Zuerst sollte die alte initrd gesichert werden!!!! Eine Rettungs CD/DVD sollte auch da sein.

Dann mkinitrd_setup
anschließend mkinitrd -m <Netzwerkkartentreiber> (bei mir tg3). Oder unter /etc/sysconfig/kernel dazufügen.

Mann kann sich dann per ssh einloggen und unlock.sh aufrufen. Das Passwort muss beim ersten mal richtig sein.

Das war's. Bei mir funktioniert es so. Alles ohne Garantie und Gewährleistung! Dies ist mein ERSTES shell script!

Gruß schnurzelat
 
OP
S

schnurzelat

Member
So habe meine initrd auf OpenSuse 11.2 angepasst:

boot-dropbear.sh in /lib/mkinitrd/scripts/
Code:
#!/bin/sh
#%stage: block
# we start the network and ssh-server

PREREQ=""
prereqs()
{
echo "$PREREQ"
}

case $1 in
prereqs)

prereqs
exit 0
;;
esac
mount -t devpts devpts /dev/pts
################# CHANGE THE LINES BELOW #################
# The network setup: edit ip address and gateway to match your needs
/sbin/ifconfig eth0 192.168.100.10 netmask 255.255.255.0
/sbin/route add default gw 191.168.100.1
################# CHANGE THE LINES ABOVE #################

# display the network settings for double check
ifconfig
#/bin/sleep 3
# We will use /dev/urandom because /dev/random gets easily blocked
mv /dev/random /dev/random.old
ln -s /dev/urandom /dev/random
# /usr/sbin/dropbear -E -F -b /etc/dropbear/banner -d /etc/dropbear/dropbear_dss_host_key -r /etc/dropbear/dropbear_rsa_host_key -p 22
/sbin/dropbear -d /etc/dropbear/dropbear_dss_host_key -r /etc/dropbear/dropbear_rsa_host_key -p 22 
#ls -al
rm -f /dev/random
mv /dev/random.old /dev/random

setup-dropbear.sh in /lib/mkinitrd/scripts
Code:
#!/bin/bash
#
#%stage: boot
#
# add dropbear to the initrd to be able to mount crypto partitions from remote


PREREQ=""
prereqs()
{
     echo "${PREREQ}"
}

case $1 in
prereqs)
     prereqs
     exit 0
     ;;
esac
mkdir /etc/dropbear 2>/dev/null
dropbearconvert openssh dropbear /etc/ssh/ssh_host_dsa_key /etc/dropbear/dropbear_dss_host_key
dropbearconvert openssh dropbear /etc/ssh/ssh_host_rsa_key /etc/dropbear/dropbear_rsa_host_key
cp -pr /usr/bin/killall $tmp_mnt/bin/
cp -pr /usr/sbin/dropbear $tmp_mnt/sbin/
cp -pr /sbin/ifconfig $tmp_mnt/sbin/
cp -pr /sbin/route $tmp_mnt/sbin/
cp -pr /bin/ps $tmp_mnt/bin/
cat /etc/passwd | grep root | sed s/\\/bash/\\/sh/ > $tmp_mnt/etc/passwd
cat /etc/shadow | grep root | sed s/\\/bash/\\/sh/ > $tmp_mnt/etc/shadow
cp -pr /bin/grep $tmp_mnt/bin/
cp -pr /root/unlock.sh $tmp_mnt/root/
mkdir $tmp_mnt/etc/dropbear 2>/dev/null
cp -pr /etc/dropbear/dropbear_dss_host_key $tmp_mnt/etc/dropbear/dropbear_dss_host_key
cp -pr /etc/dropbear/dropbear_rsa_host_key $tmp_mnt/etc/dropbear/dropbear_rsa_host_key
cp /lib/libpam.so.0 $tmp_mnt/lib/
cp /lib/libcrypt.so.1 $tmp_mnt/lib/
cp /lib/libaudit.so.0 $tmp_mnt/lib/

unlock.sh in /root
Code:
#!/bin/sh

killall -9 cryptsetup
/sbin/cryptsetup luksOpen /dev/sda6 system ##Hier Namen und Partition anpassen
killall -9 dropbear
killall -9 dropbear

Unter /etc/sysconfig/kernel im Abschnitt INITRD_MODULES= noch den Netzwerkkartentreiber angeben.

Gruß schnurzelat
 

titocarni

Newbie
Dude thanks for this post, you've made my day. I was looking for that kind of solution for OpenSuse 11.2 for quite a while! the only thing i want to include is openssh not drobbear i want the heavy stuff! cheers,
 
OP
S

schnurzelat

Member
Hier mal ein Update meiner Scripte für Opensuse 12.2 x86_64 Mantis:

Code:
cat /lib/mkinitrd/scripts/boot-dropbear.sh
#!/bin/sh
#%stage: block
# we start the network and ssh-server

PREREQ=""
prereqs()
{
echo "$PREREQ"
}

case $1 in
prereqs)

prereqs
exit 0
;;
esac
mount -t devpts devpts /dev/pts
################# CHANGE THE LINES BELOW #################
# The network setup: edit ip address and gateway to match your needs
/sbin/ifconfig eth0 192.168.178.5 netmask 255.255.255.0
/sbin/route add default gw 192.168.178.1
################# CHANGE THE LINES ABOVE #################

# display the network settings for double check
ifconfig
#/bin/sleep 3
# We will use /dev/urandom because /dev/random gets easily blocked
mv /dev/random /dev/random.old
ln -s /dev/urandom /dev/random
# /usr/sbin/dropbear -E -F -b /etc/dropbear/banner -d /etc/dropbear/dropbear_dss_host_key -r /etc/dropbear/dropbear_rsa_host_key -p 22
/sbin/dropbear -d -F /etc/dropbear/dropbear_dss_host_key -r /etc/dropbear/dropbear_rsa_host_key -p 22
#ls -al
rm -f /dev/random
mv /dev/random.old /dev/random

Code:
cat /lib/mkinitrd/scripts/setup-dropbear.sh
#!/bin/bash
#
#%stage: boot
#
# add dropbear to the initrd to be able to mount crypto partitions from remote


PREREQ=""
prereqs()
{
     echo "${PREREQ}"
}

case $1 in
prereqs)
     prereqs
     exit 0
     ;;
esac
mkdir /etc/dropbear 2>/dev/null
dropbearconvert openssh dropbear /etc/ssh/ssh_host_dsa_key /etc/dropbear/dropbear_dss_host_key
dropbearconvert openssh dropbear /etc/ssh/ssh_host_rsa_key /etc/dropbear/dropbear_rsa_host_key
echo $tmp_mnt
cp -pr /usr/bin/killall $tmp_mnt/bin/
cp -pr /usr/sbin/dropbear $tmp_mnt/sbin/
cp -pr /sbin/ifconfig $tmp_mnt/sbin/
cp -pr /sbin/route $tmp_mnt/sbin/
cp -pr /bin/ps $tmp_mnt/bin/
cat /etc/passwd | grep root | sed s/\\/bash/\\/sh/ > $tmp_mnt/etc/passwd
cat /etc/shadow | grep root | sed s/\\/bash/\\/sh/ > $tmp_mnt/etc/shadow
cp -pr /bin/grep $tmp_mnt/bin/
cp -pr /usr/bin/nohup $tmp_mnt/bin/
cp -pr /lib/mkinitrd/unlock.sh $tmp_mnt/root/
mkdir $tmp_mnt/etc/dropbear 2>/dev/null
mkdir $tmp_mnt/lib64 2>/dev/null
cp -pr /etc/dropbear/dropbear_dss_host_key $tmp_mnt/etc/dropbear/dropbear_dss_host_key
cp -pr /etc/dropbear/dropbear_rsa_host_key $tmp_mnt/etc/dropbear/dropbear_rsa_host_key
cp /lib64/libpam.so.0 $tmp_mnt/lib64/
cp /lib64/libcrypt.so.1 $tmp_mnt/lib64/
cp /lib64/libaudit.so.1 $tmp_mnt/lib64/
cp /lib64/libpam_misc.so.0 $tmp_mnt/lib64/
cp /usr/lib64/libprocps.so.0 $tmp_mnt/lib64/

Code:
cat /lib/mkinitrd/unlock.sh
#!/bin/sh

#killall -9 cryptsetup
/sbin/cryptsetup luksOpen /dev/sda2 system ##Hier Namen und Partition anpassen
killall -9 plymouth
killall -9 dropbear
killall -9 dropbear
ifconfig eth0 down

Code:
cat /etc/init.d/before.local
#! /bin/sh
/usr/bin/killall -9 dropbear 2>/dev/null
/sbin/ifdown eth0 #2>/dev/null

Gruß schnurzelat


PS. Falls jemand was zu verbessern hat, immer her damit.
 
Oben