Gentoo Forums
Gentoo Forums
Gentoo Forums
Quick Search: in
Script zum Erstellen der initrd für verschlüsselte Root
View unanswered posts
View posts from last 24 hours
View posts from last 7 days

 
Reply to topic    Gentoo Forums Forum Index Deutsches Forum (German) Deutsche Dokumentation
View previous topic :: View next topic  
Author Message
ZX-81
Guru
Guru


Joined: 23 Jul 2003
Posts: 355
Location: Germany

PostPosted: Thu May 12, 2005 1:09 am    Post subject: Script zum Erstellen der initrd für verschlüsselte Root Reply with quote

Nachdem der Aufbau der initrd für eine Crypto-Root recht komplex ist, habe ich dafür ein Script erstellt, das ich Euch nicht vorenthalten will (basiert auf: SECURITY Encrypting Root Filesystem with DM-Crypt)

Code:
#!/bin/sh

#Die folgenden Werte muessen angepasst werden
CRYPTPART=/dev/hda3
CRYPTINITRD=/boot/cryptinitrd
SWAPPART=/dev/hda2

#die folgenden Werte koennen angepasst werden
CRYPTMAJOR=`stat -c %t $CRYPTPART`
CRYPTMINOR=`stat -c %T $CRYPTPART`
SWAPMAJOR=`stat -c %t $SWAPPART`
SWAPMINOR=`stat -c %T $SWAPPART`
LOOPDEVICE=/dev/loop1
MOUNTDIR=/tmp/initrd
TOOLS="
sh
cat
mount
umount
mkdir
chroot
cryptsetup
pivot_root
mkswap
head
tr
echo"

#Initialisierung des Images
touch $CRYPTINITRD
dd if=/dev/zero of=$CRYPTINITRD bs=1024k count=4
losetup $LOOPDEVICE $CRYPTINITRD
mke2fs $LOOPDEVICE
mkdir $MOUNTDIR
mount $LOOPDEVICE $MOUNTDIR
mkdir ${MOUNTDIR}/{etc,dev,lib,bin,proc,new}

#Kopieren der Tools und der dazu notwendigen Libraries
for TOOL in $TOOLS; do
    APPFILE=`which $TOOL`;
    cp $APPFILE ${MOUNTDIR}/bin;
    LIBS=`ldd $APPFILE | grep / | sed 's@.*\s/@/@' | sed 's@ (.*)@@'`;
    for LIB in $LIBS; do
        if [ ! -f "${MOUNTDIR}${LIB}" ]
        then
            cp $LIB ${MOUNTDIR}${LIB}
        fi
    done;
done

#Erstellen der Device-Nodes

mknod ${MOUNTDIR}/dev/null c 1 3
mknod ${MOUNTDIR}/dev/console c 5 1
mknod ${MOUNTDIR}${CRYPTPART} b $CRYPTMAJOR $CRYPTMINOR
mknod ${MOUNTDIR}/dev/tty c 4 0
mkdir ${MOUNTDIR}/dev/mapper
mknod ${MOUNTDIR}/dev/mapper/control c 10 63

#mknod ${MOUNTDIR}/dev/random c 1 8
mknod ${MOUNTDIR}/dev/urandom c 1 9
mknod ${MOUNTDIR}${SWAPPART} b $SWAPMAJOR $SWAPMINOR


#linuxrc
echo "#!/bin/sh
export PATH=/bin

# Get cmdline from proc
mount -t proc proc /proc
CMDLINE=\`cat /proc/cmdline\`
umount /proc

echo activate swap crypto
tr -cd [:alnum:] < /dev/urandom | head -c 127 | cryptsetup -c aes-cbc-essiv:sha256 create swap $SWAPPART
mkswap /dev/mapper/swap

# Mount real root and change to it
cryptsetup -c aes-cbc-essiv:sha256 create root $CRYPTPART
mount /dev/mapper/root /new
cd /new
mkdir initrd
pivot_root . initrd

# Start init and flush ram device
exec chroot . /bin/sh <<- EOF >dev/console 2>&1
umount initrd
rm -rf initrd
blockdev --flushbufs /dev/ram0

exec /sbin/init ${CMDLINE}
" > ${MOUNTDIR}/linuxrc
chmod +x ${MOUNTDIR}/linuxrc

#Einbindung des Images loesen
umount $MOUNTDIR
rmdir $MOUNTDIR
losetup -d $LOOPDEVICE



EDIT1: Das war ursprünglich ein Supportthread zum Erstellen dieses Scripts
EDIT2: Habe noch ein paar kleine Fehler und Probleme beseitigt und einen sichereren Cryptomodus gewählt.
EDIT3: Jetzt wird die Swap-Partition auch verschlüsselt
EDIT: Hier noch der ursprüngliche Text

In den meisten Anleitungen zum Erstellen der initrd für eine verschlüsselte Wurzelpartition, steht eine Menge von Einzelanweisungen um diese zu erstellen. Ich denke, dass es eine Menge von Systemveränderungen (z.B. neuer Kernel) gibt, die es notwendig machen die initrd neu zu erstellen. Wenn ich das dann immer händisch mache, etwas vergesse und deshalb das System nicht mehr booten kann, würde mich das ganz schön ankotzen. Also bastle ich gerade an einem Script das die initrd automatisch generiert (ich befürchte jedoch, dass es da schon irgendwo was gibt). Jetzt ärgere ich mich gerade mit der automatischen Bestimmung der für ein Tool notwendigen Libraries herum. Der übliche Weg geht über ldd, aber das hat dafür einen recht schrottigen Output. z.B.
Code:
root # ldd /bin/dir
        linux-gate.so.1 =>  (0xffffe000)
        librt.so.1 => /lib/librt.so.1 (0xb7fd2000)
        libncurses.so.5 => /lib/libncurses.so.5 (0xb7f8f000)
        libc.so.6 => /lib/libc.so.6 (0xb7e73000)
        libpthread.so.0 => /lib/libpthread.so.0 (0xb7e20000)
        /lib/ld-linux.so.2 (0xb7fea000)


Suche etwas besseres als ldd oder eine Anweisung für z.B. awk die mir aus obigem Output
Code:
/lib/librt.so.1
/lib/libncurses.so.5
/lib/libc.so.6
/lib/libpthread.so.0
/lib/ld-linux.so.2

liefert.
_________________
... and Windows is for Solitaire.


Last edited by ZX-81 on Mon May 23, 2005 5:43 am; edited 4 times in total
Back to top
View user's profile Send private message
psyqil
Advocate
Advocate


Joined: 26 May 2003
Posts: 2767

PostPosted: Thu May 12, 2005 3:04 am    Post subject: Reply with quote

Nimmst Du sowas für den Anfang?
Code:
~$ ldd /bin/dir|cut -f 3 -d " "

/lib/librt.so.1
/lib/libncurses.so.5
/lib/libc.so.6
/lib/libpthread.so.0

Back to top
View user's profile Send private message
ZX-81
Guru
Guru


Joined: 23 Jul 2003
Posts: 355
Location: Germany

PostPosted: Thu May 12, 2005 4:16 am    Post subject: Reply with quote

Klar, meine bisherige Variante liefert
Code:
ldd /bin/dir | awk '/=>/ { print $3 }'
(0xffffe000)
/lib/librt.so.1
/lib/libncurses.so.5
/lib/libc.so.6
/lib/libpthread.so.0


Bei Deiner ist zumindest die erste Zeile weg (bzw. durch eine Leerzeile ersetzt), die Leerzeilen am Anfang und Ende scheinen auch nicht zu stören, fehlt nur noch die /lib/ld-linux.so.2.

Nachtrag: Habe jetzt eine vollständige Lösung gefunden (hatte mich zu sehr auf awk eingeschossen, durch Dein 'cut' habe ich mal wieder an 'sed' gedacht (obwohl ich das Teil eigentlich nicht mag)).

Lösung sieht so aus:
Code:
root # ldd /bin/dir | grep / | sed 's@.*\s/@/@' | sed 's@ (.*)@@'
/lib/librt.so.1
/lib/libncurses.so.5
/lib/libc.so.6
/lib/libpthread.so.0
/lib/ld-linux.so.2


Code:
grep /
entfernt alle Zeilen in denen kein '/' vorkommt.

Code:
sed 's@.*\s/@/@'
löscht alles bis zum ' /'.

Code:
sed 's@ (.*)@@'
löscht alles zwischem ' (' und ')'.

Wahrscheinlich kann man die drei Anweisungen aber auch mit einer einzigen 'sed' Anweisung ausdrücken.
_________________
... and Windows is for Solitaire.
Back to top
View user's profile Send private message
slick
Bodhisattva
Bodhisattva


Joined: 20 Apr 2003
Posts: 3495

PostPosted: Thu May 12, 2005 6:59 am    Post subject: Reply with quote

ZX-81 wrote:
Code:
sed 's@.*\s/@/@'
löscht alles bis zum ' /'.

Du könntest auch dirname und basename verwenden. Ist übersichtlicher und "sicherer" ... sonst gute HowTo.
Back to top
View user's profile Send private message
ZX-81
Guru
Guru


Joined: 23 Jul 2003
Posts: 355
Location: Germany

PostPosted: Fri May 13, 2005 9:13 am    Post subject: Reply with quote

slick wrote:
Du könntest auch dirname und basename verwenden.


Nein, dirname und basename gehen leider nicht. (Aus
Code:
libdl.so.2 => /lib/libdl.so.2 (0xb7fe2000)
soll
Code:
/lib/libdl.so.2
extrahiert werden)


Habe jetzt meine erste Crypto-Root am Laufen. Hat ganz schön lange gedauert (v.a. wegen Ärger mit udev :roll: )
_________________
... and Windows is for Solitaire.
Back to top
View user's profile Send private message
slick
Bodhisattva
Bodhisattva


Joined: 20 Apr 2003
Posts: 3495

PostPosted: Fri May 13, 2005 10:06 am    Post subject: Reply with quote

Ich meinte da so (ungetestet). Zumindest finde ich den Einsatz von basename besser, da basename für den Zweck "entwickelt" wurde und evt. Fälle berücksichtigt die das sed nicht mehr schafft. Habe zwar kein Beispiel, aber mir gehts auch eher ums Prinzip. ;-) Ok, ist wahrscheinlich OT ;-)
Code:
for TOOL in $TOOLS; do
    APPFILE=`which $TOOL`;
    cp $APPFILE ${MOUNTDIR}/bin;
    LIBS=`ldd $APPFILE | grep / | cut -f 3 -d " "`;
    for LIB in $LIBS; do
        BASELIB=`basename $LIB`
        if [ ! -f "${MOUNTDIR}/${BASELIB}" ]
        then
            cp $LIB ${MOUNTDIR}/${BASELIB}
        fi
    done;
done
Back to top
View user's profile Send private message
Display posts from previous:   
Reply to topic    Gentoo Forums Forum Index Deutsches Forum (German) Deutsche Dokumentation All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum