View previous topic :: View next topic |
Author |
Message |
ZX-81 Guru
Joined: 23 Jul 2003 Posts: 355 Location: Germany
|
Posted: Thu May 12, 2005 1:09 am Post subject: Script zum Erstellen der initrd für verschlüsselte Root |
|
|
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 |
|
|
psyqil Advocate
Joined: 26 May 2003 Posts: 2767
|
Posted: Thu May 12, 2005 3:04 am Post subject: |
|
|
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 |
|
|
ZX-81 Guru
Joined: 23 Jul 2003 Posts: 355 Location: Germany
|
Posted: Thu May 12, 2005 4:16 am Post subject: |
|
|
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
|
entfernt alle Zeilen in denen kein '/' vorkommt.
löscht alles bis zum ' /'.
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 |
|
|
slick Bodhisattva
Joined: 20 Apr 2003 Posts: 3495
|
Posted: Thu May 12, 2005 6:59 am Post subject: |
|
|
ZX-81 wrote: | löscht alles bis zum ' /'. |
Du könntest auch dirname und basename verwenden. Ist übersichtlicher und "sicherer" ... sonst gute HowTo. |
|
Back to top |
|
|
ZX-81 Guru
Joined: 23 Jul 2003 Posts: 355 Location: Germany
|
Posted: Fri May 13, 2005 9:13 am Post subject: |
|
|
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) | sollextrahiert werden)
Habe jetzt meine erste Crypto-Root am Laufen. Hat ganz schön lange gedauert (v.a. wegen Ärger mit udev ) _________________ ... and Windows is for Solitaire. |
|
Back to top |
|
|
slick Bodhisattva
Joined: 20 Apr 2003 Posts: 3495
|
Posted: Fri May 13, 2005 10:06 am Post subject: |
|
|
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 |
|
|
|