• # Si cela peut t'aider ...

    Posté par . En réponse au message Création d'une distribution à partir de rien. Évalué à 1.

    * Quelles sources d'informations utilises-tu ?

    * 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."