Comment obtenir le code source du noyau?

25

Je prévois d'écrire des pilotes de périphériques et j'ai besoin d'obtenir la source du noyau Linux. Ma version du noyau Linux est 3.2.0-23-generic-pae et j'ai téléchargé l'image à partir de cela . Dans de nombreux articles que j'ai lus, il me dit que j'ai besoin d'avoir l'arborescence du noyau entière pour commencer à insérer de nouveaux modules.

Est-ce suffisant si je télécharge cette image et la colle dans le usr/src/dossier ou dois-je faire autre chose?

Sab
la source
1
En général, j'installe simplement le package 'linux-source' de synaptic lorsque je compile pour une de mes machines, mais étant donné que vous faites du développement, vous pourriez avoir besoin de la version la plus récente. Ce lien pourrait vous être utile: help.ubuntu.com/community/Kernel/Compile
Mark Paskal

Réponses:

27

Cela obtiendra la source du noyau de stock:

apt-get source linux-source

Vous pouvez vérifier quelle version du noyau fonctionne comme ceci:

uname -r

Qui imprimera quelque chose comme:

3.13.0-46-generic

Vous pouvez trouver une liste des versions actuelles des packages source disponibles sur votre système via:

apt-cache search linux-source

Pour obtenir la version amont du noyau:

git clone git://kernel.ubuntu.com/ubuntu/ubuntu-trusty.git

Dans le lien ci-dessus, «trusty» est le nom de code de la version d'Ubuntu. Vous pouvez trouver le nom de code de la version d'Ubuntu que vous avez installée via:

cat /etc/lsb-release
Bryce
la source
Si j'utilise git pour cloner, comment spécifier la version. Aussi, si je clone, il suffit que je le copie dans le dossier usr / src
Sab
Ce dépôt git est spécifiquement gardé à 3.2.0; il suit ce qui se trouve dans Ubuntu Precise (12.04). Si vous voulez une version différente, changez ubuntu-precise.git en ubuntu-quantal.git ou autre. Il devrait être bien de simplement copier dans usr / src.
Bryce
Ok. Merci - Mais comment avez-vous trouvé ce lien git?
Sab
Et où dois-je pouvoir trouver l'arborescence source lors de l'installation avec ... Merde, je devrais lire mieux. La réponse dit apt-get sourcenon apt-get install. Ensuite, l'arborescence source se retrouvera dans votre chemin actuel .
Pro Backup
8
apt-get source linux

est le moyen le plus simple. Il téléchargera la source à partir de votre référentiel - et ce sera la même que la version que vous exécutez (en supposant que vous ne l'ayez pas déjà personnalisée).

Mais si vous voulez trouver où la source est gérée, vous pouvez exécuter:

apt-cache showsrc linux

Recherchez l'attribut 'Vcs-' (système de contrôle de version). Ce sera généralement un dépôt git (Vcs-Git) ou mercurial.

Remarque - ces commandes fonctionnent avec n'importe quel package. Remplacez simplement 'linux' par le paquet qui vous intéresse. Et notez également que 'apt-get source' n'a pas besoin d'un accès sudo et va vider la source dans votre répertoire actuel.

Brendan McGrath
la source
Pour cela, la machine sur laquelle vous téléchargez doit correspondre à la machine cible. Ne fonctionne vraiment que si vous avez un réseau. La plupart des lecteurs arrivant sur cette page n'auront pas de réseau (d'où la raison pour laquelle ils ont soudainement besoin de la source). J'en ai besoin comme tarball sur une clé USB et je n'ai pas d'aptitude au travail.
mckenzm
Cela n'a téléchargé que les en-têtes linux dans /usr/src- pas la source complète du noyau - sur Ubuntu 16.04
Pierz
4

Téléchargez la source directement depuis Launchpad

Curieusement, tout le monde recommande apt-get source ce qui ne fonctionne pas la plupart du temps si vous recherchez une version spécifique du noyau:

Imaginons que vous ayez besoin de la source du noyau pour 3.19.0-58:
apt-get source linux-image-3.19.0-58-genericobtiendra la source du dernier noyau de la série: 3.19.0-80 dans ce cas, ce qui n'est pas ce que vous avez demandé.

Vous avez donc deux options:

1) Abandonnez, installez le noyau 3.19.0-80 et utilisez apt-get source

2) Obtenez la source directement depuis le tableau de bord:

liens

  • Mettez-les dans un nouveau répertoire, décompressez avec dpkg-source -x *.dsc

Remarques:

  • Il doit y avoir un meilleur moyen.
  • Vous pouvez obtenir la version que vous voulez de git, mais vous êtes dans un gros téléchargement. Voir "Obtention des sources du noyau pour une version d'Ubuntu à l'aide de git" dans Ubuntu Wiki Kernel Source Code .
citronnelle
la source
Merci d'avoir expliqué cela si clairement. Cependant, je ne parviens toujours pas à trouver la source de linux-image-4.15.0-39-generic. Ce processus est inutilement compliqué. J'ai essayé de googler pour cela, mais je continue de trouver des packages de quelques kilo-octets seulement. Des conseils?
oublie
3

Choisissez-en un parmi:

sudo apt install linux-source  # downloads into system directory
sudo apt source linux-source  # downloads into working directory

Si on vous dit de donner des URL 'sources' dans votre sources.list, allez modifier votre /etc/apt/sources.listfichier et décommentez la deb-srcligne souhaitée , par exemple (si vous utilisez Xenial):

deb http://fr.archive.ubuntu.com/ubuntu/ xenial main restricted
# deb-src http://fr.archive.ubuntu.com/ubuntu/ xenial main restricted

La suppression #de cette dernière ligne permet de télécharger les référentiels de sources, y compris les sources du noyau.

Remarques:

  • Utilisez des outils modernes; éviter apt-get.
  • Ces commandes téléchargent le code source de votre noyau actuel (dans mon cas 4.4.0-75-genericpar exemple).
  • Une fois téléchargés dans le répertoire système, les fichiers sont stockés dans /usr/src/linux-source-4.4.0/(par exemple).
Tim
la source
Ne fonctionne pas pour moi (mais pas non plus la version apt-get). J'utilise Ubuntu 16.04.4, le noyau 4.4.0-98-générique. Il dit: "Vous devez mettre des URI" source "dans votre sources.list". Je ne sais pas comment faire ça.
Andrew Bainbridge
@AndrewBainbridge J'ai ajouté des informations à ce sujet. Ça vous va maintenant?
Tim
Oui merci. C'était un commentaire stupide de ma part. Je n'avais besoin que de google le message d'erreur. Quoi qu'il en soit, ayez un vote positif pour vos efforts.
Andrew Bainbridge