Attention, ceci est une version alpha. Pour l’utiliser il faut avoir des systèmes de fichiers en ext2|3|4 pour fabriquer la racine (ces systèmes seront protégés, pas les autres).
Il faut également aufs dans le noyau (module aufs.ko en général)
Pour installer le bazar:
- Rajouter aufs au fichier /etc/initramfs-tools/modules
- Mettre le fichier tempo suivant dans /etc/initramfs-tools/scripts/ avec les droits 755
[code]# F.Boisson Mars 2013
tempo: montage root en aufs
SOL=/terre
BASE=$SOL/tempo
M_ROOT=$BASE/ROOT
RW_ROOT=$BASE/RW_ROOT
pre_mountroot()
{
[ “$quiet” != “y” ] && log_begin_msg "Running /scripts/local-top"
run_scripts /scripts/local-top
[ “$quiet” != “y” ] && log_end_msg
wait_for_udev 10
# Load ubi with the correct MTD partition and return since fstype
# doesn't work with a char device like ubi.
if [ -n "$UBIMTD" ]; then
modprobe ubi mtd=$UBIMTD
return
fi
# Don't wait for a root device that doesn't have a corresponding
# device in /dev (ie, mtd0)
if [ "${ROOT#/dev}" = "${ROOT}" ]; then
return
fi
# If the root device hasn't shown up yet, give it a little while
# to deal with removable devices
if [ ! -e "${ROOT}" ] || ! $(get_fstype "${ROOT}" >/dev/null); then
log_begin_msg "Waiting for root file system"
# Default delay is 30s
slumber=${ROOTDELAY:-30}
slumber=$(( ${slumber} * 10 ))
while [ ! -e "${ROOT}" ] \
|| ! $(get_fstype "${ROOT}" >/dev/null); do
/bin/sleep 0.1
slumber=$(( ${slumber} - 1 ))
[ ${slumber} -gt 0 ] || break
done
if [ ${slumber} -gt 0 ]; then
log_end_msg 0
else
log_end_msg 1 || true
fi
fi
# We've given up, but we'll let the user fix matters if they can
while [ ! -e "${ROOT}" ]; do
# give hint about renamed root
case "${ROOT}" in
/dev/hd*)
suffix="${ROOT#/dev/hd}"
major="${suffix%[[:digit:]]}"
major="${major%[[:digit:]]}"
if [ -d "/sys/block/sd${major}" ]; then
echo "WARNING bootdevice may be renamed. Try root=/dev/sd${suffix}"
fi
;;
/dev/sd*)
suffix="${ROOT#/dev/sd}"
major="${suffix%[[:digit:]]}"
major="${major%[[:digit:]]}"
if [ -d "/sys/block/hd${major}" ]; then
echo "WARNING bootdevice may be renamed. Try root=/dev/hd${suffix}"
fi
;;
esac
echo "Gave up waiting for root device. Common problems:"
echo " - Boot args (cat /proc/cmdline)"
echo " - Check rootdelay= (did the system wait long enough?)"
echo " - Check root= (did the system wait for the right device?)"
echo " - Missing modules (cat /proc/modules; ls /dev)"
panic "ALERT! ${ROOT} does not exist. Dropping to a shell!"
done
}
mountroot()
{
pre_mountroot
# Get the root filesystem type if not set
if [ -z "${ROOTFSTYPE}" ]; then
FSTYPE=$(get_fstype "${ROOT}")
else
FSTYPE=${ROOTFSTYPE}
fi
[ "$quiet" != "y" ] && log_begin_msg "Running /scripts/local-premount"
run_scripts /scripts/local-premount
[ "$quiet" != "y" ] && log_end_msg
if [ "${readonly}" = "y" ]; then
roflag=-r
else
roflag=-w
fi
# FIXME This has no error checking
modprobe ${FSTYPE}
# FIXME This has no error checking
# Mount root
# well that's the difference
unset TEMPO
for x in $(cat /proc/cmdline); do
case $x in
tempo=*)
tempop=${x#tempo=}
TEMPO="/dev/disk/by-uuid/${tempop#UUID=}"
;;
esac
done
mkdir -p $SOL
if [ -z "$TEMPO" ] ; then
mount $ROOT $SOL
if [ -f $SOL/TEMPO ] ; then
NOMTEMPO=$(cat $SOL/TEMPO)
TEMPO="/dev/disk/by-uuid/${NOMTEMPO#UUID=}"
fi
umount $SOL
fi
echo "recherche du périphérique temporaire "$TEMPONON
sleep 8
if [ ! -z "$TEMPO" ] && [ -b $TEMPO ] ; then
# yes men, il y a le perif
# well on monte $TEMPO
pour cela on fait un système de fichier en RAM qu’on déplacera après dans la racine
mount -t tmpfs none $SOL
mkdir -p $BASE
mount $TEMPO $BASE
# Bon, la racine maintenant
modprobe aufs
mkdir -p $M_ROOT
if [ "${FSTYPE}" != "unknown" ]; then
mount -r -t ${FSTYPE} ${ROOTFLAGS} ${ROOT} $M_ROOT
else
mount -r ${ROOTFLAGS} ${ROOT} $M_ROOT
fi
echo "Periphérique "$NOMTEMPO" trouvé, fabrication de la racine..."
ROOT="/dev/disk/by-uuid/${ROOT#UUID=}"
#BASE=/tempo
#M_ROOT=$BASE/root
#RW_ROOT=$BASE/rw_root
mkdir -p $RW_ROOT
[ -f $RW_ROOT/etc/fstab ] && rm $RW_ROOT/etc/fstab
mount -t aufs aufs ${rootmnt} -o dirs=$RW_ROOT=rw:$M_ROOT=ro
# bien, maintenant on parcourt le fstab
mv ${rootmnt}/etc/fstab ${rootmnt}/etc/fstab.old
touch ${rootmnt}/etc/fstab
cat ${rootmnt}/etc/fstab.old | while read LIGNE; do
if (echo $LIGNE | grep -q “^#”) ; then echo $LIGNE >> ${rootmnt}/etc/fstab
elif (echo $LIGNE | grep -q " ext[3|4]" ) ; then
PERIFP=$(echo $LIGNE | awk ‘{print $1}’)
PERIF="/dev/disk/by-uuid/${PERIFP#UUID=}"
REP=$(echo $LIGNE | awk ‘{print $2}’)
NOM=$(basename $REP)
if [ $REP != “/” ] && [ ! $PERIF -ef $TEMPO ] ; then
echo "Installation de "$REP
mkdir -p ${BASE}/RW_${NOM}
mkdir -p ${BASE}/M_${NOM}
mount $PERIF ${BASE}/M_${NOM}
mount -t aufs aufs ${rootmnt}/$REP -o dirs=${BASE}/RW_${NOM}=rw:${BASE}/M_${NOM}=ro
else
echo "$REP ($PERIF) ignoré"
fi
else echo $LIGNE >> ${rootmnt}/etc/fstab
fi
done
on déplace le bazar
mkdir ${rootmnt}$SOL
mount --move $SOL ${rootmnt}$SOL
else
if [ "${FSTYPE}" != "unknown" ]; then
mount ${roflag} -t ${FSTYPE} ${ROOTFLAGS} ${ROOT} ${rootmnt}
else
mount ${roflag} ${ROOTFLAGS} ${ROOT} ${rootmnt}
fi
fi
mount
sleep 10
[ "$quiet" != "y" ] && log_begin_msg "Running /scripts/local-bottom"
run_scripts /scripts/local-bottom
[ "$quiet" != "y" ] && log_end_msg
}
[/code]
3) Refaire l’initrd.
-
Ajouter boot=tempo dans /etc/default/grub à la ligne GRUB_CMDLINE_LINUX_DEFAULT=…
-
Refaites l’initrd
Si vous boutez comme cela, rien ne changera, mais si vous rajoutez à la racine un fichier TEMPO contenant
L’UUID est celui de la partition sur laquelle seront installés les répertoires en lecture/ecriture. Cette partition ne sera pas montée si elle est listée dans /etc/fstab.
Le système démarrera en montant la racine en aufs suivant un fonctionnement comme précédemment, voir appel-testeurs-audacieux-t42536.html à ce sujet