So, hab's gerade mal ausprobiert und sieht soweit ganz gut aus. Folgt dem bereits erwähnten
Live-CD customization howto von ubuntu.
Um Probleme mit Berechtigungen vorzubeugen führe ich alles als root aus, müsste man sich mal im Detail angucken wo das nötig ist und wo nicht.
Schritt 1: Ordnerstruktur anlegen und squashfs entpacken
Code: Alles auswählen
# Die nötigen Programme installieren, xnest nur falls X in der chroot benötigt wird
apt-get install squashfs-tools genisoimage xnest
# Ordner erstellen
mkdir -p {mnt,iso}
# iso-image einhängen
mount -o loop <ISO_IMAGE> mnt
# Alle Dateien außer dem squashfs kopieren
rsync --exclude=/live/filesystem.squashfs -a mnt/ iso
# squashfs entpacken
unsquashfs mnt/live/filesystem.squashfs
# iso-image aushängen
umount mnt
Schritt 2: chroot vorbereiten und ausführen
Code: Alles auswählen
# resolv.conf kopieren damit es keine Probleme bei der Namensauflösung gibt
cp /etc/resolv.conf squashfs-root/etc/
# /dev im chroot-Verzeichnis verfügbar machen
mount --bind /dev/ squashfs-root/dev
# eine Kopie des sauberen root home-Verzeichnisses erstellen
mv squashfs-root/root squashfs-root/root.save
cp -a squashfs-root/root.save squashfs-root/root
chroot squashfs-root
Schritt 3: in chroot
Code: Alles auswählen
# Umgebungsvariablen setzen
export HOME=/root
export LC_ALL=C
# Dateisysteme einhängen
mount -t proc none /proc
mount -t sysfs none /sys
mount -t devpts none /dev/pts
# machine-id erzeugen (keine Ahnung ob das nötig ist oder nicht)
dbus-uuidgen > /var/lib/dbus/machine-id
# initctl durch dummy ersetzen
dpkg-divert --local --rename --add /sbin/initctl
ln -s /bin/true /sbin/initctl
Schritt 4: jetzt können die eigentlichen Arbeiten am System beginnen, contrib und non-free in die sources.list eintragen, apt-get update ausführen und gewünschte Pakete installieren etc. Am Ende innerhalb der chroot aufräumen und chroot verlassen
Code: Alles auswählen
# Dateien löschen
apt-get clean
rm /etc/resolv.conf /var/lib/dbus/machine-id
unlink /sbin/initctl
dpkg-divert --rename --remove /sbin/initctl
# Dateisysteme aushängen
umount /dev/pts
umount /sys
umount /proc || umount -lf /proc
# chroot verlassen
exit
# noch ein bisschen aufräumen
rm -rf squashfs-root/root squashfs-root/tmp/*
mv squashfs-root/root.save squashfs-root/root
umount squashfs-root/dev || umount -lf squashfs-root/dev
Schritt 5: falls Kernel oder initrd aktualisiert wurden, müssen sie aus squashfs-root/boot/ nach iso/live/ kopiert werden. vmlinuz ist der 486-kernel, vmlinz2 der 686-kernel
Schritt 6: neues squashfs und iso-image erstellen
Code: Alles auswählen
# Liste installierter Pakete aktualisieren
chmod +w iso/live/filesystem.packages
chroot squashfs-root dpkg-query -W --showformat='${Package}\t${Version}\n' > iso/live/filesystem.packages
# Altes squashfs löschen (falls aus vorheriger Bearbeitung vorhanden) und neues erstellen
rm -f iso/live/filesystem.squashfs
mksquashfs squashfs-root iso/live/filesystem.squashfs
# Alte Prüfsummen löschen und neue erstellen
cd iso
rm md5sum.txt
find -type f -print0 | xargs -0 md5sum | grep -v isolinux/boot.cat | tee md5sum.txt
# iso-image erstellen
genisoimage -D -r -V "<IMAGE_NAME>" -cache-inodes -J -l -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -o "../<ISO_NAME>" .
Damit wäre zumindest das Live-System angepasst. um die installierten Pakete auch bei einer Installation von der Live-CD zu haben müsste man sie wohl nach iso/pool/non-free/.. kopieren und iso/dists/squeeze/ noch entsprechend anpassen.
EDIT: um X-Anwendungen in der chroot ausführen zu können muss man als Benutzer, der gerade den xserver belegt 'Xnest -ac :2' starten und dann die DISPLAY Variable in der chroot setzen mit 'export DISPLAY=:2' .
Viel Spaß