Comment déterminer l'architecture du noyau Linux?

92

uname -mdonne i686 et uname -mi686 en sortie sur la machine Red Hat Enterprise Linux Server version 5.4 (Tikanga). Je dois installer Oracle Database 10g Release 2 sur cette machine. Alors, comment puis-je décider si l'architecture du noyau est 32 bits ou 64 bits?

utilisateur2914
la source
10
Est-ce une faute de frappe sur la première phrase: uname -met uname -m?
Tshepang
Voir aussi la commande Linux pour retourner le nombre de bits (32 ou 64)? . Si uname -mmontre i? 86, vous avez un système 32 bits.
Gilles
La question relie Gilles à donne une solution intéressante: getconf WORD_BIT.
Mikel
7
getconf WORD_BITrenvoie 32 sur mon Ubuntu 64 bits
minaev

Réponses:

90

i386 et i686 sont tous deux 32 bits.
x86_64 est 64 bits

exemple pour 64 bits:

behrooz@behrooz:~$ uname -a  
Linux behrooz 2.6.32-5-amd64 #1 SMP Mon Mar 7 21:35:22 UTC 2011 **x86_64** GNU/Linux

EDIT:
Voir est mon linux ARM 32 ou 64 bits? pour ARM

Behrooz
la source
Qu'en est-il d'armv7l? Dans tous les cas, une commande avec une simple réponse booléenne serait délicieuse.
user7543
1
@ user7543 C'est ARM 32 bits, car nous n'avons pas encore ARM 64 bits. Lorsque nous le ferons, ce sera quelque chose de différent.
Behrooz
Je pense que je devrais faire mon wiki de communauté de réponses mais je ne sais pas comment.
Behrooz
1
Essayez: uname -m. Cela ne fera que montrer l'architecture.
Alexej Magura
32

@ Behrooz est correct. Malheureusement, unamevous devez connaître les architectures. En fait, je cherchais une liste d'architectures et j'ai trouvé cet article qui répond à votre question. En ce qui concerne uname -m:

x86_64 GNU / Linux indique que vous utilisez un noyau Linux 64 bits. Si vous utilisez, voir i386 / i486 / i586 / i686, il s’agit d’un noyau 32 bits.

Pour déterminer si le matériel est capable d'exécuter un noyau 64 bits

grep flags /proc/cpuinfo

Cherchez ce qui suit dans la sortie (tous les drapeaux extraits de cette réponse de stackoverflow répondent à la même question)

  • lm indicateur signifie cpu en mode long - CPU 64 bits
  • tm indicateur signifie mode protégé - CPU 32 bits
  • rm drapeau signifie mode réel - CPU 16 bits
xénoterracide
la source
L'indicateur lm signifie-t-il simplement que le processeur prend en charge la version 64 bits ou est-ce que cela signifie qu'il s'exécute en 64 bits? Je vous recommande de vous fier à l'arch, sachant qu'il s'agira de x86_64 pour 64 bits ou i? 86 pour 32 bits.
Penguin359
1
@ penguin359 cela signifie que le cpu prend en charge la version 64 bits.
xenoterracide
@xeno ne peut donc pas être utilisé pour déterminer l'architecture du noyau.
Penguin359
@ penguin359 non, est-ce que cela n'était pas clair dans la réponse?
xenoterracide
1
@ penguin359, non, mais il est souvent utile de savoir si votre système d'exploitation fonctionne sous 64 bits et si le matériel en est capable, imo
xenoterracide
22

(EDIT: cette réponse est fausse. Merci au commentaire de @ Lizardx)

Dans Bash, en utilisant un dépassement d'entier:

if ((1<<32)); then
  echo 64bits
else
  echo 32bits
fi

C'est beaucoup plus efficace que d'invoquer un autre processus ou d'ouvrir des fichiers.

Luchostein
la source
3
si intelligent et nous rappelle également quelle est l'architecture de la puce
code_monk
2
Bien que élégant, ce n’est malheureusement pas correct: uname -m == i686 BUT if ((1 << 32)); then echo 64bits; fi == 64bits Il s'agit d'un noyau PAE 32 bits et non de 64 bits. Le cpu est cependant compatible 64 bits, amd64. Puisque la question était de savoir comment déterminer l'archive du noyau, cette solution produirait des résultats incorrects.
Lizardx
1
Note ((est un et non défini bash par POSIX mywiki.wooledge.org/Bashism#Conditionals
Steven Penny
J'ai essayé ceci sur certaines architectures 32 bits et cela me semble être du 64 bits.
Dannyw
Cela peut fonctionner((1<<32)-1)
Ivijan Stefan Stipić
15

Pour Debian :

Sur mon pc

    ~> dpkg --print-architecture
    amd64
    ~> dpkg --print-foreign-architectures
    i386

Mon Raspberry Pi 2

    ~> dpkg --print-architecture
    armhf
Артем Телешев
la source
1
cela fonctionne mieux pour déterminer l'architecture de paquet à utiliser avec checkinstall, merci!
Aquarius Power
Je vous remercie. Je cherchais quelque chose qui supprime les noms d'architecture "standard" "amd64" / "i386" plutôt que simplement "x86_64". Personne n'utilise cette terminologie pour nommer les versions précompilées.
Cliff
12

Le moyen le plus simple consiste à exécuter:

getconf LONG_BIT

qui affichera 64 ou 32 en fonction du format 32 ou 64 bits.

par exemple:

dannyw@dannyw-redhat:~$ getconf LONG_BIT
64
Dannyw
la source
2
Cette réponse est trompeuse. Si vous activez le support multiarch et que vous installez un noyau 64 bits, l'installation getconf LONG_BITsera imprimée 32bien que vous utilisiez un noyau 64 bits.
Kenn
2

utiliser syscap à partir du projet Formake

syscap permet de sonder de nombreuses propriétés système et de tester des dépendances. C'est un script shell portable.

Obtenir l'architecture du processeur:

syscap info -arch

Obtenez le nom du noyau et la version:

syscap info -kernel -kernver
Alex
la source
1

Une autre méthode consiste à vérifier l’architecture pour laquelle un fichier système a été compilé, comme

$ file /usr/bin/ld
/usr/bin/ld: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, stripped
minaev
la source
1
C'est l'architecture du système, qui n'est pas toujours l'architecture du noyau. Voir cette réponse à SU pour plus de variations.
Gilles
Théoriquement, ils peuvent différer, mais y a-t-il une chance qu'ils ne correspondent pas à une installation réelle?
minaev
Certaines distributions livrent un noyau amd64 sur la version x86. Je ne sais pas combien de personnes les utilisent, j'ai vérifié Debian Popcon mais cela ne correspond pas aux différentes statistiques. Je pense que le principal cas d'utilisation est d'avoir un système d'exploitation principal 32 bits et d'exécuter un système d'exploitation 64 bits dans un chroot ou une machine virtuelle.
Gilles
@ Gilles Vous allez adorer ce que vous allez lire sur la nouvelle architecture x32, si je ne suis pas trop en retard, bien sûr. wiki.debian.org/X32Port
Behrooz Le
0

Ou vous pouvez utiliser le même principe que la commande uname en interne si vous souhaitez implémenter vous-même certaines choses:

#include <sys/utsname.h>
#include <stdio.h>

int main() {
    struct utsname name;
    uname(&name);
    printf("%s\n",name.machine);
    return 0;
}
Miaou
la source
0

Voici une autre méthode utilisant uname.

De man uname:

... -i, --hardware-platform print the hardware platform or "unknown" ...

# uname -i x86_64 #

clusterdude
la source
Jusqu'à ce que cela donne "inconnu"
Dagelf
0

Si vous recherchez une solution simple, cette solution est la plus fiable à ce jour et renvoie 64 ou 32 . Peu importe que vous utilisiez ARM ou non, et cela devrait fonctionner sur tout système utilisant bash ou sh .

Attention, cela suppose que le système est en 32 bits ou en 64 bits. Voir l'explication ci-dessous si vous devez détecter une architecture 8-16 ou autre.

[$ ((0xffffffff)) -eq -1] && echo 32 || echo 64

Qu'est-ce qui se passe ici?
La logique est très simple et tout se résume à la façon dont les ordinateurs stockent les entiers signés. Une architecture 32 bits ne comporte que 32 bits et peut être utilisée pour stocker des entiers signés, alors qu'une architecture 64 bits en a 64! En d'autres termes, l'ensemble des entiers pouvant être stockés est fini. La moitié de cet ensemble représente des nombres négatifs et l'autre moitié des nombres positifs. L'entier signé égal à -1 est représenté par le plus grand nombre pouvant être stocké dans un nombre donné de bits pour cette architecture. Sur un système 32 bits, -1 peut être représenté par la valeur hexadécimale 0xFFFFFFFF (qui correspond à 32 bits binaires, tous égaux à 1). Sur un système 64 bits, 0xFFFFFFFF correspond à 4 294 967 295, base 10, tandis que 0xFFFFFFFFFFFFFFFF correspond à la représentation de -1). Vous pouvez voir comment cela évoluerait facilement pour les systèmes de 8 ou 16 bits égaux à -1 en 0xFF et 0xFFFF,

b_laoshi
la source