Hallo,
so, nun geht das weiter: Um eine angepasste Live-DVD zu haben, braucht man Platz zum Speichern seiner Daten, die originale Live-DVD hält das ja nur im RAM, damit sind die Änderungen beim nächsten Start logischerweise weg. Deshalb bekommt mein Stick/Platte noch eine 2. Partition, um diese Daten aufzunehmen. Auf dieser Partition wird wieder ein Dateisystem angelegt (bei mir wieder ext2) und die Partition wird gemountet z.B. nach /mnt. Dann wird eine Verzeichnisstruktur angelegt und zwei Dateien, die für das Aushängen beim Herunterfahren benötigt werden. Der Pfad auf der 2. Partition ist bei mir /persist/mga4 (jeder andere ist natürlich genau so gut)
- Code: Alles auswählen
mkdir -p /mnt/persist/mga4/etc/systemd/system
mkdir -p /mnt/persist/mga4/usr/local/bin
In /mnt/persist/mga4/etc/systemd/system wird die Datei halt-local.service (uid,gid=root, mode=644) angelegt
- Code: Alles auswählen
# This file is part of systemd.
#
# systemd is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
# persist: /etc/systemd/system/halt-local.service
[Unit]
Description=/sbin/halt.local Compatibility
ConditionFileIsExecutable=/sbin/halt.local
DefaultDependencies=no
After=shutdown.target
Before=final.target
[Service]
Type=oneshot
ExecStartPre=-/usr/local/bin/remount_pmount_ro.sh
ExecStartPre=-/bin/kill -54 1
ExecStartPre=-/usr/bin/plymouth quit
ExecStartPre=-/usr/bin/chvt 1
ExecStart=/sbin/halt.local
TimeoutSec=0
StandardOutput=tty
RemainAfterExit=yes
In /mnt/persist/mga4/usr/local/bin/ wird die Datei remount_pmount_ro.sh angelegt (uid,gid=root, mode=744)
- Code: Alles auswählen
#!/bin/bash
# persist: /usr/local/bin/remount_pmount_ro.sh
echo "1" > /proc/sys/kernel/sysrq
echo "s" > /proc/sysrq-trigger
echo "u" > /proc/sysrq-trigger
Damit ist sichergestellt, daß die Partition zum Speichern der Daten beim Herunterfahren "sauber" bleibt. (Ja ich weiß, ist ziemlich rustikal die Methode, war aber die einzige, die zuverlässig funktioniert hat). Damit ist die 2. Partition auch schon fertig, und kann wieder ausgehängt werden.
Jetzt wird noch in der ausgepackten initrd die Datei /sbin/mgalive-root ersetzt, durch diese (uid,gid=root, mode=755)
- Code: Alles auswählen
#!/bin/sh
# initrd: /sbin/mgalive-root
. /lib/dracut-lib.sh
[ -f /tmp/root.info ] && . /tmp/root.info
PATH=/usr/sbin:/usr/bin:/sbin:/bin
[ -z "$1" ] && exit 1
livedev="$1"
# create live tree
mkdir -m 0755 -p /live/media
mkdir -m 0755 -p /live/distrib
mkdir -m 0755 -p /live/memory
mkdir -m 0755 -p /live/union
mkdir -m 0755 -p /run/mgalive/ovlsize
# fix udev isohybrid LABEL issues (mga #3334)
# by reading the device we get, stripping away partition number,
# and mount the resulting device
realdev=$(echo $livedev |sed 's,\(/dev/sd[a-z]\)1,\1,g')
# mount the live media
getargbool 0 UEFI && liveuefi="yes"
if [ -n "$liveuefi" ]; then
mount -n -t vfat -o ro $livedev /live/media
else
mount -n -t iso9660 -o ro $realdev /live/media
fi
LOOPDEV=$( losetup -f )
losetup -r $LOOPDEV /live/media/loopbacks/distrib-lzma.sqfs
mount -n -t squashfs -o ro $LOOPDEV /live/distrib
mount -n -t squashfs -o ro $LOOPDEV /run/mgalive/ovlsize
if [ -n "$persist" ]; then
pdev=$(echo "$persist" | sed 's,:.*$,,g')
pdir=$(echo "$persist" | sed 's,^.*:,,g')
if [ ! -z "$pdev" -a ! -z "$pdir" ]; then
pmount="/live/pmount"
test -d "$pmount" || mkdir -m 0755 -p "$pmount"
pblock=$(blkid -U "$pdev")
pdevfs=$(blkid -s TYPE -o value "$pblock")
grep -q "$pmount" /proc/mounts || mount -t "$pdevfs" "$pblock" "$pmount" > /dev/null 2>&1
if [ -d "${pmount}${pdir}" ]; then
mount -n -t overlayfs -o lowerdir=/live/distrib,upperdir="${pmount}${pdir}" overlayfs /live/union
else
mount -n -t tmpfs -o mode=755 /live/memory /live/memory
mount -n -t overlayfs -o lowerdir=/live/distrib,upperdir=/live/memory overlayfs /live/union
fi
fi
else
mount -n -t tmpfs -o mode=755 /live/memory /live/memory
mount -n -t overlayfs -o lowerdir=/live/distrib,upperdir=/live/memory overlayfs /live/union
fi
ln -s /live/union /dev/root
printf '/bin/mount --rbind /live/union %s\n' "$NEWROOT" > $hookdir/mount/01-$$-live.sh
need_shutdown
exit 0
Jetzt fehlt nur noch der 2. Eintrag in der grub.cfg, um das neue Feature zu nutzen:
- Code: Alles auswählen
menuentry 'Mageia-4-LiveDVD-KDE4-x86_64-DVD.iso isofrom persist' {
set isofile="/Mageia-4-LiveDVD-KDE4-x86_64-DVD.iso"
set puuid="6b0722c7-c345-4ff9-beca-a1d9e4483622"
loopback loop $isofile
linux (loop)/boot/vmlinuz root=mgalive:LABEL=Mageia-4-KDE4-LiveDVD ro rd.luks=0 rd.lvm=0 rd.md=0 rd.dm=0 lang=de isofrom=$ruuid:$isofile vga=791 persist=$puuid:/persist/mga4
initrd (loop)/boot/cdrom/initrd.gz
}
Die puuid muß natürlich auf die tatsächliche UUID der Partition angepasst werden. Wenn man jetzt diesen Eintrag bootet, werden Änderungen gegenüber der Live-Version auf der anderen Partition in dem entspr. Pfad gespeichert. Das man in der angepassten Version einen User anlegen, ein Root-PW setzen und den Live-User löschen sollte, ist selbstverständlich. Je nach dem, wie viel Platz man auf der Partition hat, kann man das System seinen Vorstellungen entsprechend anpassen und dann so auch installieren (Wenn man user und root schon angepasst hat, in der Eingabemaske, wo das nach dem ersten booten abgefragt wird, einfach "Abbrechen" wählen). Bootet man den originalen Eintrag hat man wieder eine "jungfräuliche" Live-DVD.
Viel Spaß
Lutz