Forum Linux.noyau Création d'une distribution à partir de rien

Posté par .
Tags : aucun
0
24
avr.
2009
J'ai un travail sur la création d'une distribution qui fonctionne directement sur une clé USB (USBLive). Voici lles étapes que j'ai suivi:
1-creation du root file système
- mkdir bin sbin root tmp etc ......... (archittecture)
- MAKEDEV -v generic console
- compiler et installer BUSYBOX dans le root files system
- compiler et installer du uCLibc ..........
- création des fichiers: inittab, group, passwd, fstab, init.d/rcS
- création de initrd-2.6.25 par l'utilitaire: mkinitramfs -o /root_fs/boot/initrd 2.6.25
2 - compilation du noyau 2.6.25
- make gconfig ->Je ne sais pas les option à inclure?? ce que j'ai fait: SCSI, USB, EXT2,EXT3, ......
(pouvez me donner un detail)
- make bzImage
- copier bzImage généré dans le /boot du root file system
- copier aussi les modules
3- Préparation de la clé
-mke2fs /dev/sdb1
-copier le contenu de system de fichier dans la clé
4- Installer GRUB
- grub-install --root-directory ...........

Command de lancement dans grub:
kernel /boot/bzImage root=UUID=xxxxxxxx root-delay=100
initrd /boot/initrd

Mon problème est que lors de démarage voici l'érreur:

Starting up ...

Decompresssing Linux... done.

PCI: BIOS Bug: MCFG area at f80000000 is not E820-reserved

PCI: Not using MMCONFIG

Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)


Aider moi SVP
  • # Galère ...

    Posté par . Évalué à 2.

    T'es courageux de te lancer là-dedans ... tu utilises quoi comme référence pour te guider ?
    D'abord, juste un petit truc : fais l'initrd _après_ avoir compilé le kernel et les modules, vu que ce sont certains de ces derniers qui vont se retrouver dedans.
    Ensuite, pour ton erreur, as-tu vraiment mis root=UUID=xxxxxxxx comme paramètre ? Il faut mettre l'UID de ta clé USB ... En gros, il te dit qu'il ne trouve pas le système de fichier racine, quoi.
    • [^] # Re: Galère ...

      Posté par . Évalué à 1.

      Sans udev il faudrai peut être mettre root=/dev/sdc1
  • # Si cela peut t'aider ...

    Posté par . É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."
  • # reponse

    Posté par . Évalué à 1.

    Le fait d'utiliser UUID=xxx n'est pas un problème, il rend l'acces d'une manière absolu (ie independant du nomage du système).
    Parce que j'ai modifier l'UUID de la partition avec la commande blkid -U xxxxxx.........
    Mon grand problème c'est dans les options (make gconfig ou make menuconfig) de compilation du noyau.
    J'avais intégré tous les options en dur comme:
    - driver scisi, ide, ....

    Pouver m'envoyer des doc de préference en fr sur les options de compilations du noyau.

    Merci

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.