Forums

Skip to content

Advanced search
  • Quick links
    • Unanswered topics
    • Active topics
    • Search
  • FAQ
  • Login
  • Register
  • Board index International Gentoo Users Deutsches Forum (German) Deutsche Dokumentation
  • Search

Script zum Erstellen der initrd für verschlüsselte Root

Dokumentation, Tipps und Tricks.
Post Reply
  • Print view
Advanced search
6 posts • Page 1 of 1
Author
Message
ZX-81
Guru
Guru
User avatar
Posts: 355
Joined: Wed Jul 23, 2003 9:13 am
Location: Germany

Script zum Erstellen der initrd für verschlüsselte Root

  • Quote

Post by ZX-81 » Thu May 12, 2005 1:09 am

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: Select all

#!/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: Select all

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: Select all

/lib/librt.so.1
/lib/libncurses.so.5
/lib/libc.so.6
/lib/libpthread.so.0
/lib/ld-linux.so.2
liefert.
Last edited by ZX-81 on Mon May 23, 2005 5:43 am, edited 4 times in total.
... and Windows is for Solitaire.
Top
psyqil
Advocate
Advocate
User avatar
Posts: 2767
Joined: Mon May 26, 2003 8:17 pm

  • Quote

Post by psyqil » Thu May 12, 2005 3:04 am

Nimmst Du sowas für den Anfang?

Code: Select all

~$ ldd /bin/dir|cut -f 3 -d " "

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

Top
ZX-81
Guru
Guru
User avatar
Posts: 355
Joined: Wed Jul 23, 2003 9:13 am
Location: Germany

  • Quote

Post by ZX-81 » Thu May 12, 2005 4:16 am

Klar, meine bisherige Variante liefert

Code: Select all

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: Select all

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: Select all

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

Code: Select all

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

Code: Select all

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.
Top
slick
Bodhisattva
Bodhisattva
User avatar
Posts: 3495
Joined: Sun Apr 20, 2003 11:44 am

  • Quote

Post by slick » Thu May 12, 2005 6:59 am

ZX-81 wrote:

Code: Select all

sed 's@.*\s/@/@' 
löscht alles bis zum ' /'.
Du könntest auch dirname und basename verwenden. Ist übersichtlicher und "sicherer" ... sonst gute HowTo.
Top
ZX-81
Guru
Guru
User avatar
Posts: 355
Joined: Wed Jul 23, 2003 9:13 am
Location: Germany

  • Quote

Post by ZX-81 » Fri May 13, 2005 9:13 am

slick wrote:Du könntest auch dirname und basename verwenden.
Nein, dirname und basename gehen leider nicht. (Aus

Code: Select all

libdl.so.2 => /lib/libdl.so.2 (0xb7fe2000)
soll

Code: Select all

/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.
Top
slick
Bodhisattva
Bodhisattva
User avatar
Posts: 3495
Joined: Sun Apr 20, 2003 11:44 am

  • Quote

Post by slick » Fri May 13, 2005 10:06 am

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: Select all

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 
Top
Post Reply
  • Print view

6 posts • Page 1 of 1

Return to “Deutsche Dokumentation”

Jump to
  • Assistance
  • ↳   News & Announcements
  • ↳   Frequently Asked Questions
  • ↳   Installing Gentoo
  • ↳   Multimedia
  • ↳   Desktop Environments
  • ↳   Networking & Security
  • ↳   Kernel & Hardware
  • ↳   Portage & Programming
  • ↳   Gamers & Players
  • ↳   Other Things Gentoo
  • ↳   Unsupported Software
  • Discussion & Documentation
  • ↳   Documentation, Tips & Tricks
  • ↳   Gentoo Chat
  • ↳   Gentoo Forums Feedback
  • ↳   Duplicate Threads
  • International Gentoo Users
  • ↳   中文 (Chinese)
  • ↳   Dutch
  • ↳   Finnish
  • ↳   French
  • ↳   Deutsches Forum (German)
  • ↳   Diskussionsforum
  • ↳   Deutsche Dokumentation
  • ↳   Greek
  • ↳   Forum italiano (Italian)
  • ↳   Forum di discussione italiano
  • ↳   Risorse italiane (documentazione e tools)
  • ↳   Polskie forum (Polish)
  • ↳   Instalacja i sprzęt
  • ↳   Polish OTW
  • ↳   Portuguese
  • ↳   Documentação, Ferramentas e Dicas
  • ↳   Russian
  • ↳   Scandinavian
  • ↳   Spanish
  • ↳   Other Languages
  • Architectures & Platforms
  • ↳   Gentoo on ARM
  • ↳   Gentoo on PPC
  • ↳   Gentoo on Sparc
  • ↳   Gentoo on Alternative Architectures
  • ↳   Gentoo on AMD64
  • ↳   Gentoo for Mac OS X (Portage for Mac OS X)
  • Board index
  • All times are UTC
  • Delete cookies

© 2001–2026 Gentoo Foundation, Inc.

Powered by phpBB® Forum Software © phpBB Limited

Privacy Policy

 

 

magic