Hinweis: Diese Projektbeschreibung wurde unverändert von http://lugsaar.de übernommen. Sie sollte an die Wiki-Syntax angepasst werden und die Infobox rechts mit den richtigen Informationen gefüllt werden.
Vor allem sollte die Dokumentation überarbeitet werden und auf den aktuellen Stand gebracht werden.
Danach kann dieser Hinweis entfernt werden.
mobileRoot
—- datatemplateentry project —- template : templates:project name : mobileRoot imgname_img90 : none.png person_pages : mancas start_dt : end_dt : status_ : unbekannt
Live-CDs gibt es viele. Umfangreiche, wie z. B. http://www.knopper.net/knoppix zeigen, was Linux alles kann. Kleinere, wie http://damnsmalllinux.org und http://www.puppyos.com zeigen, wie klein man ein Linux machen kann.
Hier wird eine Möglichkeit vorgestellt, wie man genau sein eigenes Linux mit seinen persönlichen Einstellungen, dem gewählten Benutzernamen und den richtigen Rechten an den Dateien im Homeverzeichnis in der Tasche mitnehmen kann. Die richtigen Rechte sind z. B. eine Voraussetzung, um sein mobiles Homeverzeichnis mit dem Rechner zuhause synchronisieren zu können, z. B. mit unison. Und natürlich möchte man unterwegs die gleichen Pakete wie zu Hause nutzen. Dazu packen wir unser Linux, so wie es sein soll, auf eine USB-Festplatte - es gibt ja fast überall genügend Rechner, die man mit einem solchen Live-System booten kann. Nicht alle Rechner können allerdings direkt von USB-Devices booten und so benötigen wir eine zusätzliche Boot-CD.
<i>mobileRoot-0.4</i>
<b>Schritt 1 - Installation eines Linux Systems </b> <hr width=„300“ align=„left“> Man kann auf einer freien Partition oder auch direkt auf der USB-Festplatte ein weiterse Linux installieren. Oder man kopiert das derzeitige System einfach rüber. Zum Kopieren sollte sollte das System nicht in Benutzung sein; also dazu z. B. Knoppix booten, alles beimounten und los (Beispiel ggf. anpassen):
<font color=„808080“> # mkdir /mnt/meinSystem # mkdir /mnt/usbplatte # mount /dev/hda3 /mnt/meinSystem # mount /dev/sda1 /mnt/usbplatte # cd /mnt/meunSystem # tar -cvpf - . | tar -C /mnt/usbplatte -xpf - # umount /mnt/meinSystem # umount /mnt/usbplatte </font>
Damit wir später beim Booten die device wiederfinden geben wir ihr das Label mobile Root:
<font color=„808080“> # tune2fs -L mobileRoot /dev/sda1 </font>
<b> Schritt 2 - Kernel anpassen </b> <hr width=„300“ align=„left“> Wir verwenden den Origalkernel der Installation. Er sollte folgendes einkompiliert enthalten: - RAM Disk support und initrd support mit 8192 kB Größe - Loopback Block Device Support - ext2/ext3 Filesystem Support - tmpfs Filesystem Support
<b> Schritt 3 - Das linuxrc Script</b> <hr width=„300“ align=„left“> Das Booten von der CD in die USB-Festplatte läuft so ab, dass wir ein Mini-Linux in die Ramdisk laden und über das linuxrc Script dann auf das System der Platte wechseln. Hier das Script:
<font color=„808080“> #!/bin/sh
# linuxrc Skript # wird vom kernel von der cd ausgefuehrt und startet das umhaengen zum usb-device
# wir suchen das device mit diesem label SUCHE=„mobileRoot“ # also vorher label mit tune2fs auf der richtigen partition am usb device setzen
echo echo „+++++++++++++++++++++++++++++“ echo „+ starte usb-device +“ echo „+ © Linux User Group Saar +“ echo „+++++++++++++++++++++++++++++“ echo
export PATH=„/bin:/sbin:/usr/bin“
# Speichern der Kernel CMDLINE mount -t proc none /proc CMDLINE=`cat /proc/cmdline` umount /proc
# cd-rom Laufwerk suchen und baum der module mounten for x in hda hdb hdc hdd do
mount -t iso9660 -r /dev/${x} /cdrom >/dev/null 2>&1 if [ "$?" = "0" ] then CDROM="${x}" echo "cdrom Laufwerk als /dev/$CDROM gefunden" FIND="1" echo "lade module von der cd" mount --bind /cdrom/modules /lib/modules # cryptomodule laden #/sbin/modprobe aes #/sbin/modprobe dm-crypt break fi
done
if [ „${CDROM}“ == „“ ] then
echo "FEHLER: cdrom nicht gefunden, kann keine module laden" #exec /bin/sh #exit
fi
# warten bis der Kernel das usb-Laufwerk findet echo echo „partition mit label $SUCHE suchen“ sleep 8
for device in sda1 sda2 sda3 sdb1 sdb2 sdb3 sdc1 sdc2 sdc3 sdd1 sdd2 sdd3 sde1 sde2 sde3 do
echo "teste, ob $device das richtige device ist ..." MYLABEL=`tune2fs -l /dev/$device 2>/dev/null | grep -c -e $SUCHE 2>/dev/null` sleep 1 if [ "$MYLABEL" = 1 ] then echo "$device gefunden" mount -t ext3 -o rw /dev/$device /new >/dev/null 2>&1 break fi
if [ "$device" = sde3 ] then echo "kein usb-device mit label $SUCHE gefunden - starte mini shell" exec /bin/sh exit fi
done
if [ „$FIND“ = „1“ ]
then echo "cdrom auswerfen" umount /cdrom/modules umount /cdrom eject /dev/$CDROM
fi
echo „pivot root ausfuehren“ # pivot root umhaengen und den eigentlichen bootprozess starten
cd /new /sbin/pivot_root . newroot exec chroot . /bin/sh -c „exec /sbin/init ${CMDLINE}“ </font>
<b> Schritt 4 - initrd anlegen</b> <hr width=„300“ align=„left“> Hier kommt ein Script, das aus dem bestehenden System dir nötigen Daten extrahiert und in ein initrd-File schreibt. Im Kopf des Scriptes müssen die Quell- und Zielverzeichnisse und der Kernel (so wie er in /boot heißt) angepasst werden.
<font color=„808080“> #!/bin/bash
DIR=`pwd` echo „Arbeitsverzeichnis $DIR“ Quelle=/mnt/usbplatte echo „Quellverzeichnis $Quelle“ echo Kernel=2.6.12-gentoo-r10 echo „Kernel $Kernel“ echo echo „[enter] fuer weiter oder [ctr]-[c] fuer stop“ read user_reply
#cd $Quelle
# beim ersten Durchlauf dieses entkommentieren, damit leeres loop file angelegt wird # dann wieder einkommentieren
#touch $DIR/initrd #dd if=/dev/zero of=$DIR/initrd bs=1024k count=8
echo echo „initrd als loopfile anlegen und ext2 formatieren“ losetup /dev/loop0 $DIR/initrd mke2fs /dev/loop0 echo mounten mount /dev/loop0 $DIR/mntpnt
echo echo „das loop Abbild mit notwendigen Dateien und Verzeichnissen fuellen“
cd $DIR/mntpnt
mkdir etc dev lib bin proc new img usb tmpfs newroot base cdrom home sbin usr mnt sys rfsys mkdir lib/modules mkdir usr/bin mkdir usr/lib touch etc/mtab touch etc/fstab
cp -a $DIR/linuxrc .
for x in sh ls cat mount umount dmesg mkdir chroot tar cp sleep echo cut grep cryptsetup do
cp -v $Quelle/bin/${x} ./bin
done
for x in pivot_root modprobe tune2fs e2fsck grub fdisk dmsetup do
cp -v $Quelle/sbin/${x} ./sbin
done
cp -v $Quelle/usr/bin/test ./usr/bin cp -v $Quelle/usr/bin/mkdir ./usr/bin cp -v $Quelle/usr/bin/eject ./usr/bin
# Hinweis: module sind 23MB gross echo „/etc/modules.conf“ #cp -a $Quelle/lib/modules/ ./lib/modules cp $Quelle/etc/modules.conf ./etc
echo echo „benoetigte libraries hinzu“
cd $Quelle/lib
cp -v `ldd $Quelle/usr/bin/test |egrep lib|cut -d „=“ -f1` $DIR/mntpnt/lib 2> $DIR/log cp -v `ldd $Quelle/usr/bin/eject |egrep lib|cut -d „=“ -f1` $DIR/mntpnt/lib 2> $DIR/log cp -v `ldd $Quelle/usr/bin/mkdir |egrep lib|cut -d „=“ -f1` $DIR/mntpnt/lib 2> $DIR/log
cp -v `ldd $Quelle/usr/bin/dmesg |egrep lib|cut -d „=“ -f1` $DIR/mntpnt/lib 2> $DIR/log
for x in sh ls cat mount umount chroot tar cp sleep echo cut grep do
cp -v `ldd $Quelle/bin/${x}|egrep lib|cut -d "=" -f1` $DIR/mntpnt/lib 2> $DIR/log
done
for x in pivot_root modprobe tune2fs e2fsck grub fdisk dmsetup do
cp -v `ldd $Quelle/sbin/${x}|egrep lib|cut -d "=" -f1` $DIR/mntpnt/lib 2> $DIR/log
done
# cryptomodule fuer cryptsetup-luks cp -a $Quelle/usr/lib/libcrypt* $DIR/mntpnt/usr/lib cp -a $Quelle/lib/libcrypt* $DIR/mntpnt/lib
echo echo „devices anlegen“
mknod $DIR/mntpnt/dev/console c 5 1 mknod $DIR/mntpnt/dev/null c 1 3
mknod $DIR/mntpnt/dev/hda b 3 0 mknod $DIR/mntpnt/dev/hda1 b 3 1 mknod $DIR/mntpnt/dev/hda2 b 3 2 mknod $DIR/mntpnt/dev/hda3 b 3 3
mknod $DIR/mntpnt/dev/hdb b 3 64 mknod $DIR/mntpnt/dev/hdb1 b 3 65 mknod $DIR/mntpnt/dev/hdb2 b 3 66 mknod $DIR/mntpnt/dev/hdb3 b 3 67
mknod $DIR/mntpnt/dev/hdc b 22 0 mknod $DIR/mntpnt/dev/hdc1 b 22 1 mknod $DIR/mntpnt/dev/hdc2 b 22 2 mknod $DIR/mntpnt/dev/hdc3 b 22 3
mknod $DIR/mntpnt/dev/hdd b 22 64 mknod $DIR/mntpnt/dev/hdd1 b 22 65 mknod $DIR/mntpnt/dev/hdd2 b 22 66 mknod $DIR/mntpnt/dev/hdd3 b 22 67
mknod $DIR/mntpnt/dev/hde b 33 0 mknod $DIR/mntpnt/dev/hde1 b 33 1 mknod $DIR/mntpnt/dev/hde2 b 33 2 mknod $DIR/mntpnt/dev/hde3 b 33 3
mknod $DIR/mntpnt/dev/tty c 4 0
mknod $DIR/mntpnt/dev/loop0 b 7 0 mknod $DIR/mntpnt/dev/loop1 b 7 1 mknod $DIR/mntpnt/dev/loop2 b 7 2
mknod $DIR/mntpnt/dev/sda1 b 8 1 mknod $DIR/mntpnt/dev/sda2 b 8 2 mknod $DIR/mntpnt/dev/sda3 b 8 3
mknod $DIR/mntpnt/dev/sdb1 b 8 17 mknod $DIR/mntpnt/dev/sdb2 b 8 18 mknod $DIR/mntpnt/dev/sdb3 b 8 19
mknod $DIR/mntpnt/dev/sdc1 b 8 33 mknod $DIR/mntpnt/dev/sdc2 b 8 34 mknod $DIR/mntpnt/dev/sdc3 b 8 35
mknod $DIR/mntpnt/dev/sdd1 b 8 49 mknod $DIR/mntpnt/dev/sdd2 b 8 50 mknod $DIR/mntpnt/dev/sdd3 b 8 51
mknod $DIR/mntpnt/dev/sde1 b 8 65 mknod $DIR/mntpnt/dev/sde2 b 8 66 mknod $DIR/mntpnt/dev/sde3 b 8 67
mkdir $DIR/mntpnt/dev/mapper mknod $DIR/mntpnt/dev/mapper/control c 10 62 #mknod $DIR/mntpnt/dev/mapper/cryptpart b 253 0
umount $DIR/mntpnt losetup -d /dev/loop0 echo echo „fertig, abmounten“
# logeintrag mit cp: cannot stat `(0xb7fc6000)': No such file or directory # ist nur ein kleiner schoenheitsfehler rm $DIR/log
echo „jetzt kann die boot cd erstellt werden“ </font>
<b> Schritt 5 - Boot-CD erstellen</b> <hr width=„300“ align=„left“> Auch hier wieder im Kopf des Scriptes die Verzeichnisse usw. anpassen.
<font color=„808080“> #!/bin/bash
Quelle=/mnt/usbplatte Kernel=kernel-2.6.12-gentoo-r10 Kernelmod=2.6.12-gentoo-r10
DIR=`pwd`
echo echo „boot cd anlegen aus der Quelle $Quelle“ echo „der kernel $Quelle/boot/$Kernel und die initrd (muss vorher erstellt sein!) werden reinkopiert“ echo „diese angaben koennen ueber die configzeilen in diesem script angepasst werden“ echo „[enter] fuer weiter oder [ctrl]-[c] fuer stop“ read user_reply
echo echo „boot verzeichnis in target anlegen“ rm -rd target 2> $DIR/log mkdir target
echo „kernel, grub verzeichnisse und initrd reinkopieren“ mkdir target/boot cp -a $Quelle/boot/$Kernel target/boot cp -a $Quelle/boot/grub target/boot cp -a $DIR/initrd target/boot cp -a $Quelle/lib/modules/ $DIR/target
echo „schreibe grubs menu.lst“ unlink target/boot/grub/menu.lst 2> $DIR/log rm target/boot/grub/grub.conf 2> $DIR/log # anmerkung iso9660 kann keine links
echo „default 0“ > target/boot/grub/menu.lst echo „timeout 3“ » target/boot/grub/menu.lst echo „title=GNU-Linux live usb-device“ » target/boot/grub/menu.lst echo „root (cd)“ » target/boot/grub/menu.lst echo „kernel (cd)/boot/$Kernel video=vesafb-tng:1024×768-16@60 root=/dev/ram0 rw init=/linuxrc cdroot“ » target/boot/grub/menu.lst echo „initrd (cd)/boot/initrd“ » target/boot/grub/menu.lst
echo echo „bootCD.iso schreiben“
mkisofs -R -b boot/grub/stage2_eltorito -no-emul-boot -boot-load-size 4 -boot-info-table -iso-level 4 -hide boot.catalog -o bootCD.iso target
#rm -rd target 2> $DIR/log #rm $DIR/log echo echo „fertig, jetzt etwa so brennen: cdrecord -v dev=/dev/hdc bootCD.iso“ </font>
<b> Schritt 6 - Boot-CD Brennen</b> <hr width=„300“ align=„left“>
<font color=„808080“> # cdrecord -v dev=/dev/hdc bootCD.iso„ </font>
<b> Schritt 7 - Verschlüsseltes Filesystem</b> <hr width=„300“ align=„left“> Als Erweiterung ist es geplant, von einem Verschlüsselten Filesystem zu booten. Demnächst mehr.
<b> Schritt 8 - Danke</b> <hr width=„300“ align=„left“> Ich danke allen für Erklärungen, Hilfen, Beschreibungen und freie Software.