construction de l'image du noyau (.img), y compris le disque virtuel

12

J'ai construit mon noyau Linux (3.0.1) pour mon Raspberry Pi avec ces étapes suivantes:

1. Downloading kernel source
2. tar xvf source.tar.bz2
3. downloading arm cross compilation tool.
4. tar xvf arm-2010q1-202-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
5. setting up path for cross tool export PATH=$PATH:/home/shan/<cross tool folder>/bin/
6. after entering linux source dir make ARCH=arm versatile_defconfig (is this reliable   with raspberry pi)
7. make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
8. zImage is generated in /arch/arm/boot

Ma question est, comment puis-je construire kernel.img? Je pense qu'il contient zImage + ramdisk mais comment puis-je le construire?

Quelqu'un peut-il me guider pour créer un disque virtuel et les intégrer dans le fichier kernel.img? Je veux démarrer ce noyau sur mon Raspberry Pi.

Shantanu Banerjee
la source
C'est une excellente question qui, je m'étonne, n'ait pas encore été posée.
Jivings
Pourquoi utilisez-vous le noyau 3.0.1? Ce noyau de vanille est-il trouvé sur kernel.orgplace?
Krzysztof Adamski
oui, je l'ai trouvé sur kernel.org
Shantanu Banerjee
J'ai ajouté une nouvelle question sur qemu et le noyau pi-2 de framboise compilé de manière croisée avec busybox dans initramfs: raspberrypi.stackexchange.com/questions/56302/…
42n4

Réponses:

8

fichier kernel.img

Lors de l'utilisation du noyau Linux, le kernel.imgfichier est simplement renommé linux/arch/arm/boot/Image. Il devrait également être possible (ou du moins c'était possible la dernière fois que j'ai vérifié) d'utiliser la version compressée de ce fichier - zImage. Il peut contenir des initramfsdisques intégrés (ramdisk) mais il n'est pas requis. Par exemple, le kernel.imgfichier de stock ne contient pas initramfswhile kernel_emergency.img.

Remarque: Le guide officiel de compilation du noyau sur le wiki eLinux suggère que vous devez utiliser l' imagetool-uncompressed.pyoutil pour préparer le kernel.imgfichier. Il était nécessaire dans les premiers jours de RaspberyPi mais de nos jours bootloader peut traiter régulièrement Imageet les zImagefichiers.

Problème avec les sources du noyau

Ce qui est très important, c'est que lors de la construction du noyau pour RaspberryPi, vous ne pouvez pas utiliser n'importe quelle version de celui-ci. Seule la version spéciale portée sur RaspberryPi fonctionnera. Malheureusement, la version en amont actuelle (trouvée sur le kernel.orgsite) n'est pas compatible avec RaspberryPi. En outre, versatil_confign'est pas bon pour RaspberryPi, vous devez utiliser à la bcmrpi_defconfigplace (trouvé sur les sources de noyau compatibles RaspberryPi) ou bcmrpi_emergency_defconfigsi vous prévoyez d'utiliser buildin initramfs.

Instructions de construction du noyau

Le meilleur endroit pour récupérer les sources du noyau pour RaspberryPi est sur github de fondation . Vous pouvez également trouver des explications utiles sur la façon de l'obtenir et de le compiler sur le wiki officiel de RasbperryPi . Voici ma petite version simplifiée des étapes impliquées (REMARQUE: je suppose que vous voulez compiler le noyau de manière croisée. C'est beaucoup plus rapide et devrait créer les mêmes résultats mais la construction native du noyau sur RaspberryPi est également possible):

  1. Téléchargez la chaîne d'outils officielle pour créer la vôtre. Plus simplement, je suppose qu'il est installé dans /usr/bin/arm-linux-gnueabi-*. Si vous l'avez ailleurs, vous devez changer d' CROSS_COMPILEoption dans toutes vos makecommandes.

  2. Accédez au site https://github.com/raspberrypi/linux où vous pouvez trouver les sources officielles du noyau RapsberryPi. Vous pouvez télécharger le code de deux manières:

    • En tant que fichier compressé (pour utiliser cette option, vous n'avez pas besoin d'installer l' gitutilitaire et vous pouvez le faire même sur RapsberryPi lui-même): Cliquez sur l' ZIPicône, un petit Codeonglet ci-dessous en haut du site. Cela devrait vous permettre de télécharger les fichiers source lates en tant que zipfichier. Vous pouvez utiliser git à la place, mais cela (comme décrit sur le wiki) aura besoin de beaucoup plus d'espace et de temps. Décompressez ensuite le fichier pour obtenir l'arborescence source.
    • Utiliser l' gitutilitaire (cela ne fonctionnait pas pour moi sur RaspberryPi car il y a probablement une petite quantité de RAM mais devrait fonctionner correctement sur les systèmes de bureau (notez l' --depth 1argument qui empêche git de télécharger tout l'historique du développement (ce qui est énorme):

      git clone --depth 1 git://github.com/raspberrypi/linux.git
      
  3. Utilisez la configuration par défaut fournie par la fondation:

    cp arch/arm/configs/bcmrpi_defconfig .config
    
  4. Exécutez make oldconfiget répondez à certaines questions (il devrait être possible d'appuyer sur Entrée dans chaque question en laissant la réponse par défaut):

    make ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi- oldconfig
    
  5. Compilez le noyau:

    make ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi-
    
  6. Copiez les modules du noyau dans /tmp/modules:

    make ARCH=arm modules_install INSTALL_MOD_PATH=/tmp/modules
    
  7. Utiliser le Imagefichier commekernel.img

  8. Téléchargez tous les modules de à partir /tmp/modules/lib/modules/de votre ordinateur vers le /lib/modules/répertoire de vos rootfs RaspberryPi.

Ajout d'initramfs

initramfsCependant, cela ne fournit pas d'instructions sur la création . Comme il s'agit d' un sujet très large (en gros, vous devez créer un environnement Linux fonctionnel et qu'il n'y a vraiment aucune limite à la complexité), je ne vais pas en parler ici maintenant. Je noterai seulement que cela initramfspeut être utilisé sous deux formes différentes - une seule, où c'est un fichier séparé et buildin où elle est intégrée avec le fichier image du noyau (comme c'est le cas kernel_emergency.img). La deuxième option devrait être prise en charge par le chargeur de démarrage RaspberryPi mais il y a des rumeurs selon lesquelles il est cassé sur la version actuelle du firmware, vous devriez donc probablement utiliser la version intégrée.

La meilleure façon de commencer est d'utiliser le contenu initramfs de travail (qui est utilisé pour kernel_emergency.img) en le téléchargeant à partir d'un autre référentiel github de fondation et seulement après avoir pu démarrer le noyau en utilisant cette iniramfsimage, essayez de construire la vôtre. Tout ce qui devrait être nécessaire pour cela est de pointer vers l' CONFIG_INITRAMFS_SOURCEoption de configuration du répertoire téléchargé avec le noyau.

Notes finales

Vous devez donc le faire en 3 étapes:

  1. Essayez de construire et de démarrer le noyau sans initramfsfichier.
  2. Essayez d'ajouter du initramfscontenu prêt à votre noyau.
  3. Modifiez ce initramfscontenu en fonction de vos besoins.
Krzysztof Adamski
la source
1
Excellente écriture, mais vous ne devriez pas utiliser zip; gittransfère efficacement les fichiers et vous pouvez utiliser depth=1pour empêcher le téléchargement de l'historique (je pense).
Alex Chamberlain
Oui, c'est vrai, mais essayer de le faire sur RaspberryPi lui-même n'est pas vraiment une bonne idée. Le téléchargement de zip fonctionne très bien, d'autre part. J'ajouterai également une courte note sur l'utilisation de git.
Krzysztof Adamski
Compiler le noyau sur le Raspberry Pi est une terrible idée en soi.
Alex Chamberlain
@AlexChamberlain: C'est vraiment lent mais définitivement possible (je l'ai fait moi-même). Ça prend une nuit donc ce n'est pas si mal. A part ça, pourquoi est-ce si horrible?
Krzysztof Adamski
si j'utilise bcmrpi_emergency_defconfig contiendrait-il des initramfs ??
Shantanu Banerjee
0

Si vous utilisez la même version de Debian sur les deux, utiliser X-Apt, dpkg-cross etc ... et les outils emdebian peuvent très bien fonctionner.

Source: utilisé pour développer des applications c ++ pour les systèmes ARM embarqués exécutant emdebian.

James Bennet
la source