* Pour la configuration du noyau, je te conseille de compiler en dur tous les pilotes utiles au boot.
* Ta distribution se trouve-t-elle entièrement dans l'initrd ou bien sur une partition de ta clé ?
Dans le second cas, ton initrd doit contenir un fichier linuxrc qui doit rechercher la partition de ta clé.
Personnellement, j'utilisais pour une clé Voyager contenant trois partitions (la première sous fat et les suivantes sous système fichiers linux contenant la distribution à lancer) le fichier linuxrc ci-dessous.
Note1 : pour que la clé soit en lecture seule, la racine de la partition est en fait une union réalisé avec unionfs.
Note2 : l'initrd contenait l'éxecutable blkid qui permet de trouver le système de fichiers utilisé sur une partition.
# garder une trace du message et l'afficher à l'écran après une étoile verte
EchoLog()
{ echo "LIVECD:" "$@" >>/var/log/livelog
echo -e "033円[0;32m""* ""033円[39m""$@"
}
AfficheEnGras()
{ echo -e "033円[0;1m""$@""033円[0;0m"
} # gras texte normal
# Chaque code d'échappement doit débuter par 033円
# qui donne le code ascii d'escape (Echap)
#commande lancée en mode débug
debug()
{ echo "===================== mode débug ======================"
echo "Lancez les commandes souhaitées "
echo "puis appuyez surCtrl+D pour poursuivre le boot"
ash < /dev/console
echo # Pour que la suite du texte soit sur une nouvelle ligne
}
#commande lancée quand quelque chose va très mal
sos()
{ echo "L'erreur grave suivante est apparue :"
echo "1ドル"
echo "Utiliser le shell pour solutionner ou rebooter avec Ctrl+ALt+Del"
ash </dev/console >/dev/console
}
# Titre
AfficheEnGras "exécution du script linuxrc"
EchoLog "montage des systèmes de fichiers /proc et /sys"
mount -t proc proc /proc
mount -t sysfs sysfs /sys
ln -sf /proc/mounts /etc/mtab # cela nous permet d'utiliser umount -a
#DEBUGCMD="debug"
#$DEBUGCMD
EchoLog "prise en compte de la ligne de commande"
# option debug : lancer un shell après chaque étape pour déboguer
DEBUGCMD=""
if cat /proc/cmdline | grep debug 2>/dev/null 1>/dev/null ; then
DEBUGCMD="debug"
EchoLog "débogage activé"
fi
## AFAIRE
## A enlever pour un système en production
#DEBUGCMD="debug"
#$DEBUGCMD
EchoLog "attendre 5 secondes pour que le noyau prenne en compte les supports
usb"
for i in 1 2 3 4 5 6 ; do sleep 1 ; echo -n "." ; done ; echo
$DEBUGCMD
EchoLog "création pour les périphériques bloc des entrées dans /dev"
for BLOCK in `ls -A1d /sys/block/*/dev /sys/block/*/*/dev 2>/dev/null` ; do
DEVICE="/dev/`basename \`dirname $BLOCK\``"
if [ ! -b $DEVICE ]; then
MAJORMINOR="`head -n 1 $BLOCK | tr ':' ' '`"
mknod $DEVICE b $MAJORMINOR
fi
done
ls /dev
$DEBUGCMD
EchoLog "montage de tmpfs"
mkdir /mnt/temporaire
mount -t tmpfs -o size=90% tmpfs /mnt/temporaire
$DEBUGCMD
EchoLog "montage de la partition racine"
mkdir /mnt/rac2 /mnt/rac3
mount -o ro ${DEVICE_RACINE}2 /mnt/rac2
mount -o ro ${DEVICE_RACINE}3 /mnt/rac3
$DEBUGCMD
EchoLog "création de l'union"
mount -t unionfs -o dirs=/mnt/temporaire:/mnt/rac3:/mnt/rac2 unionfs /mnt/rac
ine
mount -t unionfs -o remount,mode=/mnt/rac3=ro /mnt/racine
mount -t unionfs -o remount,mode=/mnt/rac2=ro /mnt/racine
$DEBUGCMD
# le fichier /proc/partitions contient :
# une ligne d'entêtes
# une ligne vide
# le 4ième champ des lignes suivantes est une partition reconnue par le système
# Attention, les devices comme sda sont renvoyées
# On élimine les périphériques loop éventuellement montés
Liste_des_partitions="`awk '!/loop/&&NR>2 {print 4ドル}' /proc/partitions`"
echo "Liste des partitions : $Liste_des_partitions"
$DEBUGCMD
if [ "$TROUVE" = "non" ]; then
sos " Partition racine non trouvée."
fi
$DEBUGCMD
# Attention le fichier est /mnt/racine/etc/fstab
EchoLog "création du fichier /etc/fstab"
FSTAB="/mnt/racine/etc/fstab"
mkdir -p /mnt/racine/etc /mnt/racine/mnt # au cas où
touch $FSTAB
# ajouter le support pour la racine, les terminaux virtuels, proc, sys
# et le lecteur de disquette
#FS="`blkid -s TYPE $DEVICE | cut -d = -f 2 | tr -d ' \"'`"
#echo "$DEVICE_RACINE / $FS defaults 0 0" >$FSTAB
echo "/dev/root / unionfs defaults 0 0" >$FSTAB
echo "devpts /dev/pts devpts gid=5,mode=620 0 0" >>$FSTAB
echo "proc /proc proc defaults 0 0" >>$FSTAB
echo "sysfs /sys sysfs defaults 0 0" >>$FSTAB
echo "/dev/fd0 /mnt/floppy auto noauto,users,sync 0 0" >>$FSTAB
mkdir -p /mnt/racine/mnt/floppy
# les cdrom
for BLOCK in $Liste_des_cdrom ; do
MOUNTDIR="/mnt/${BLOCK}_cdrom"
mkdir -p /mnt/racine/$MOUNTDIR
echo "/dev/$BLOCK $MOUNTDIR iso9660 noauto,users,exec 0 0" >>$FSTAB
done
# les partitions de disque
#for DEVICE in `awk '!/loop/&&NR>2 {print "/dev/"4ドル}' /proc/partitions`; do
for DEV in $Liste_des_partitions ; do
DEVICE="/dev/$DEV"
unset REMOVABLE; unset OPT
# DEV="`basename $DEVICE`"
DEV0="`echo $DEV | cut -b 1-3`"
if [ "0`cat /sys/block/$DEV0/removable 2>/dev/null`" -ne 0 ]; then
REMOVABLE="_removable"
fi
MOUNTDIR="/mnt/$DEV$REMOVABLE"
FS="`blkid -s TYPE $DEVICE | cut -d = -f 2 | tr -d ' \"'`"
# if the partition has filesystem, add it to fstab
# sans umask, les systèmes de fichiers ntfs sont montés rwr------ !
if [ "$FS" != "" ]; then
if [ "$FS" = "swap" ]; then
echo "$DEVICE swap swap defaults 0 0" >>$FSTAB
elif [ "$FS" = "ntfs" ]; then
echo "$DEVICE $MOUNTDIR $FS auto,users,umask=022$OPT 0 0" >>$FSTAB
mkdir -p "/mnt/racine/$MOUNTDIR"
else
echo "$DEVICE $MOUNTDIR $FS auto,users,suid,dev,exec$OPT 0 0" >>$FSTAB
mkdir -p "/mnt/racine/$MOUNTDIR"
fi
fi
done
$DEBUGCMD
# La partition racine est montée sur /mnt/racine
# On change la racine / à ce répertoire et on déplace la racine du
# du ramdisk initial vers /mnt/live
# Finalement, on exécute /sbin/init pour lancer la distribution
EchoLog "Déplacement de la racine du système de fichiers"
cd /mnt/racine
umount /sys # Nous n'en avons plus besoin
# Une bonne idée mais à mettre en oeuvre : le remontage de /proc
# dans cleanup bloque le script cleanup. Peut-être enlever le lien /etc/mtab
#umount /proc # à remonter dans le script d'arrêt
if [ ! -e dev/console ]; then mknod dev/console c 5 1; fi
if [ -x /mnt/racine/usr/sbin/chroot ];
then CHROOT=/usr/sbin/chroot
else CHROOT=/usr/bin/chroot
fi
AfficheEnGras "Lancement de la distribution"
mkdir -p mnt/live
mount -o remount,ro /mnt/racine
pivot_root . mnt/live
exec $CHROOT . sbin/init <dev/console >dev/console 2>&1
AfficheEnGras "ERREUR!"
EchoLog "Le processus init n'a pas été lancé correctement."
EchoLog "Le noyau a paniqué. Même Ctrl+Alt+Del ne vous aidera pas."
# Si cela peut t'aider ...
Posté par slack . En réponse au message Création d'une distribution à partir de rien. Évalué à 1.
* Pour la configuration du noyau, je te conseille de compiler en dur tous les pilotes utiles au boot.
* Ta distribution se trouve-t-elle entièrement dans l'initrd ou bien sur une partition de ta clé ?
Dans le second cas, ton initrd doit contenir un fichier linuxrc qui doit rechercher la partition de ta clé.
Personnellement, j'utilisais pour une clé Voyager contenant trois partitions (la première sous fat et les suivantes sous système fichiers linux contenant la distribution à lancer) le fichier linuxrc ci-dessous.
Note1 : pour que la clé soit en lecture seule, la racine de la partition est en fait une union réalisé avec unionfs.
Note2 : l'initrd contenait l'éxecutable blkid qui permet de trouver le système de fichiers utilisé sur une partition.
Bon courage
slack
-------------------------------- linuxrc ------------------------------------------
#!/bin/ash
#echo -e "033円[0;32m""* ""033円[39m""$@"
export PATH=.:/:/usr/sbin:/usr/bin:/sbin:/bin
# garder une trace du message et l'afficher à l'écran après une étoile verte
EchoLog()
{ echo "LIVECD:" "$@" >>/var/log/livelog
echo -e "033円[0;32m""* ""033円[39m""$@"
}
AfficheEnGras()
{ echo -e "033円[0;1m""$@""033円[0;0m"
} # gras texte normal
# Chaque code d'échappement doit débuter par 033円
# qui donne le code ascii d'escape (Echap)
#commande lancée en mode débug
debug()
{ echo "===================== mode débug ======================"
echo "Lancez les commandes souhaitées "
echo "puis appuyez surCtrl+D pour poursuivre le boot"
ash < /dev/console
echo # Pour que la suite du texte soit sur une nouvelle ligne
}
#commande lancée quand quelque chose va très mal
sos()
{ echo "L'erreur grave suivante est apparue :"
echo "1ドル"
echo "Utiliser le shell pour solutionner ou rebooter avec Ctrl+ALt+Del"
ash </dev/console >/dev/console
}
# Titre
AfficheEnGras "exécution du script linuxrc"
EchoLog "montage des systèmes de fichiers /proc et /sys"
mount -t proc proc /proc
mount -t sysfs sysfs /sys
ln -sf /proc/mounts /etc/mtab # cela nous permet d'utiliser umount -a
#DEBUGCMD="debug"
#$DEBUGCMD
EchoLog "prise en compte de la ligne de commande"
# option debug : lancer un shell après chaque étape pour déboguer
DEBUGCMD=""
if cat /proc/cmdline | grep debug 2>/dev/null 1>/dev/null ; then
DEBUGCMD="debug"
EchoLog "débogage activé"
fi
## AFAIRE
## A enlever pour un système en production
#DEBUGCMD="debug"
#$DEBUGCMD
EchoLog "attendre 5 secondes pour que le noyau prenne en compte les supports
usb"
for i in 1 2 3 4 5 6 ; do sleep 1 ; echo -n "." ; done ; echo
$DEBUGCMD
EchoLog "création pour les périphériques bloc des entrées dans /dev"
for BLOCK in `ls -A1d /sys/block/*/dev /sys/block/*/*/dev 2>/dev/null` ; do
DEVICE="/dev/`basename \`dirname $BLOCK\``"
if [ ! -b $DEVICE ]; then
MAJORMINOR="`head -n 1 $BLOCK | tr ':' ' '`"
mknod $DEVICE b $MAJORMINOR
fi
done
ls /dev
$DEBUGCMD
EchoLog "recherche de la partition racine"
TROUVE="non" ; DEVICE_RACINE=""
DEVICE_RACINE="`grep VoyagerGT /sys/block/sd*/device/model | cut -d '/' -f 4`
"
echo $DEVICE_RACINE
TROUVE="oui"
DEVICE_RACINE="/dev/$DEVICE_RACINE"
echo $DEVICE_RACINE
$DEBUGCMD
EchoLog "montage de tmpfs"
mkdir /mnt/temporaire
mount -t tmpfs -o size=90% tmpfs /mnt/temporaire
$DEBUGCMD
EchoLog "montage de la partition racine"
mkdir /mnt/rac2 /mnt/rac3
mount -o ro ${DEVICE_RACINE}2 /mnt/rac2
mount -o ro ${DEVICE_RACINE}3 /mnt/rac3
$DEBUGCMD
EchoLog "création de l'union"
mount -t unionfs -o dirs=/mnt/temporaire:/mnt/rac3:/mnt/rac2 unionfs /mnt/rac
ine
mount -t unionfs -o remount,mode=/mnt/rac3=ro /mnt/racine
mount -t unionfs -o remount,mode=/mnt/rac2=ro /mnt/racine
$DEBUGCMD
# le fichier /proc/partitions contient :
# une ligne d'entêtes
# une ligne vide
# le 4ième champ des lignes suivantes est une partition reconnue par le système
# Attention, les devices comme sda sont renvoyées
# On élimine les périphériques loop éventuellement montés
Liste_des_partitions="`awk '!/loop/&&NR>2 {print 4ドル}' /proc/partitions`"
echo "Liste des partitions : $Liste_des_partitions"
$DEBUGCMD
if [ "$TROUVE" = "non" ]; then
sos " Partition racine non trouvée."
fi
$DEBUGCMD
# Attention le fichier est /mnt/racine/etc/fstab
EchoLog "création du fichier /etc/fstab"
FSTAB="/mnt/racine/etc/fstab"
mkdir -p /mnt/racine/etc /mnt/racine/mnt # au cas où
touch $FSTAB
# ajouter le support pour la racine, les terminaux virtuels, proc, sys
# et le lecteur de disquette
#FS="`blkid -s TYPE $DEVICE | cut -d = -f 2 | tr -d ' \"'`"
#echo "$DEVICE_RACINE / $FS defaults 0 0" >$FSTAB
echo "/dev/root / unionfs defaults 0 0" >$FSTAB
echo "devpts /dev/pts devpts gid=5,mode=620 0 0" >>$FSTAB
echo "proc /proc proc defaults 0 0" >>$FSTAB
echo "sysfs /sys sysfs defaults 0 0" >>$FSTAB
echo "/dev/fd0 /mnt/floppy auto noauto,users,sync 0 0" >>$FSTAB
mkdir -p /mnt/racine/mnt/floppy
# les cdrom
for BLOCK in $Liste_des_cdrom ; do
MOUNTDIR="/mnt/${BLOCK}_cdrom"
mkdir -p /mnt/racine/$MOUNTDIR
echo "/dev/$BLOCK $MOUNTDIR iso9660 noauto,users,exec 0 0" >>$FSTAB
done
# les partitions de disque
#for DEVICE in `awk '!/loop/&&NR>2 {print "/dev/"4ドル}' /proc/partitions`; do
for DEV in $Liste_des_partitions ; do
DEVICE="/dev/$DEV"
unset REMOVABLE; unset OPT
# DEV="`basename $DEVICE`"
DEV0="`echo $DEV | cut -b 1-3`"
if [ "0`cat /sys/block/$DEV0/removable 2>/dev/null`" -ne 0 ]; then
REMOVABLE="_removable"
fi
MOUNTDIR="/mnt/$DEV$REMOVABLE"
FS="`blkid -s TYPE $DEVICE | cut -d = -f 2 | tr -d ' \"'`"
# if the partition has filesystem, add it to fstab
# sans umask, les systèmes de fichiers ntfs sont montés rwr------ !
if [ "$FS" != "" ]; then
if [ "$FS" = "swap" ]; then
echo "$DEVICE swap swap defaults 0 0" >>$FSTAB
elif [ "$FS" = "ntfs" ]; then
echo "$DEVICE $MOUNTDIR $FS auto,users,umask=022$OPT 0 0" >>$FSTAB
mkdir -p "/mnt/racine/$MOUNTDIR"
else
echo "$DEVICE $MOUNTDIR $FS auto,users,suid,dev,exec$OPT 0 0" >>$FSTAB
mkdir -p "/mnt/racine/$MOUNTDIR"
fi
fi
done
$DEBUGCMD
# La partition racine est montée sur /mnt/racine
# On change la racine / à ce répertoire et on déplace la racine du
# du ramdisk initial vers /mnt/live
# Finalement, on exécute /sbin/init pour lancer la distribution
EchoLog "Déplacement de la racine du système de fichiers"
cd /mnt/racine
umount /sys # Nous n'en avons plus besoin
# Une bonne idée mais à mettre en oeuvre : le remontage de /proc
# dans cleanup bloque le script cleanup. Peut-être enlever le lien /etc/mtab
#umount /proc # à remonter dans le script d'arrêt
if [ ! -e dev/console ]; then mknod dev/console c 5 1; fi
if [ -x /mnt/racine/usr/sbin/chroot ];
then CHROOT=/usr/sbin/chroot
else CHROOT=/usr/bin/chroot
fi
AfficheEnGras "Lancement de la distribution"
mkdir -p mnt/live
mount -o remount,ro /mnt/racine
pivot_root . mnt/live
exec $CHROOT . sbin/init <dev/console >dev/console 2>&1
AfficheEnGras "ERREUR!"
EchoLog "Le processus init n'a pas été lancé correctement."
EchoLog "Le noyau a paniqué. Même Ctrl+Alt+Del ne vous aidera pas."