web-dev-qa-db-fra.com

D'où "uname" tire-t-il des informations?

uname -i tire-t-il les informations?

Les détails existent-ils dans /etc/?

Les détails existent-ils dans /proc/?

Si tel est le cas, à quel fichier fait-il référence pour afficher ces détails?

24
Roy Hernandez

uname utilise l'appel système uname(2) pour obtenir les informations relatives au noyau affichées.

Le synopsis est:

#include <sys/utsname.h>
int uname(struct utsname *buf);

uname(2) renvoie des informations dans la structure désignée par buf. Vous pouvez également lire le fichier d’en-tête utsname.h de /usr/include/"$(Arch)"-linux-gnu/sys/utsname.h à Dig deeper.

Regardez man 2 uname pour avoir plus d’idées à ce sujet.

31
heemayl

Le programme strace nous permet d’afficher les appels système qu’une application peut effectuer. Avec uname -a, il apparaît que les seuls appels open vont aux bibliothèques système, donc techniquement, il n’existe aucun fichier sur le système de fichiers qui ouvre le uname en lecture. Plutôt, il fait des appels système en utilisant les bibliothèques C.

Comme heemayl l'a bien souligné, il existe un appel système pour récupérer les informations stockées dans la structure uname. C'est la page de manuel, suggère ce qui suit:

Il s’agit d’un appel système et le système d’exploitation connaît probablement son nom, sa version et sa version. . . . . . Une partie des informations du nom de nom d'utilisateur est également accessible via/proc/sys/kernelel/{type, nom d'hôte, version, version, nom de domaine}.

Une partie des informations du nom de nom d'utilisateur est également accessible via/proc/sys/kernelel/{type, nom d'hôte, version, version, nom de domaine}.

Le système de fichiers /proc est cependant virtuel, ce qui signifie qu'il n'existe que lorsque le système d'exploitation est en cours d'exécution. Ainsi, dans une certaine mesure, il est défini dans les bibliothèques du noyau ou du système.

Enfin, en parcourant le code source de uname.c qui peut être obtenu avec apt-get source coreutils, nous pouvons voir qu’il utilise bien la bibliothèque utsname.h (imprimée avec les numéros de ligne):

 19 
 20 #include <config.h>
 21 #include <stdio.h>
 22 #include <sys/types.h>
 23 #include <sys/utsname.h>
 24 #include <getopt.h>
 25 

strace output:

skolodya@ubuntu:$ strace uname -a
execve("/bin/uname", ["uname", "-a"], [/* 58 vars */]) = 0
brk(0)                                  = 0x1478000
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7efee6935000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=137226, ...}) = 0
mmap(NULL, 137226, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7efee6913000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\320\37\2\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1840928, ...}) = 0
mmap(NULL, 3949248, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7efee6350000
mprotect(0x7efee650b000, 2093056, PROT_NONE) = 0
mmap(0x7efee670a000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1ba000) = 0x7efee670a000
mmap(0x7efee6710000, 17088, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7efee6710000
close(3)                                = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7efee6912000
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7efee6910000
Arch_prctl(Arch_SET_FS, 0x7efee6910740) = 0
mprotect(0x7efee670a000, 16384, PROT_READ) = 0
mprotect(0x606000, 4096, PROT_READ)     = 0
mprotect(0x7efee6937000, 4096, PROT_READ) = 0
munmap(0x7efee6913000, 137226)          = 0
brk(0)                                  = 0x1478000
brk(0x1499000)                          = 0x1499000
open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=7216688, ...}) = 0
mmap(NULL, 7216688, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7efee5c6e000
close(3)                                = 0
uname({sys="Linux", node="eagle", ...}) = 0
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7efee6934000
uname({sys="Linux", node="eagle", ...}) = 0
uname({sys="Linux", node="eagle", ...}) = 0
write(1, "Linux eagle 4.1.0-040100rc2-gene"..., 113Linux eagle 4.1.0-040100rc2-generic #201505032335 SMP Mon May 4 03:36:35 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
) = 113
close(1)                                = 0
munmap(0x7efee6934000, 4096)            = 0
close(2)                                = 0
exit_group(0)                           = ?
+++ exited with 0 +++
22
Sergiy Kolodyazhnyy

Bien sûr, la réponse de heemayl est correcte.

Juste pour le plaisir, voici un extrait de code C qui présente les données renvoyées par uname() (une sorte de unamefait maison si vous le souhaitez): compilez-le avec gcc uname.c -o uname et exécutez-le avec ./uname:

#include <stdio.h> // printf()
#include <sys/utsname.h> // uname()

int main() {
        int ret; // stores the return value of uname()
        struct utsname utsname; // stores the data returned by uname()
        struct utsname *utsname_ptr = &utsname; // pointer to the struct holding the data returned by uname()

        ret = uname(utsname_ptr); // calls uname() on utsname_ptr and stores its return value in ret

        /* prints the fields of utsname */

        printf("%s\n", utsname.sysname);
        printf("%s\n", utsname.nodename);
        printf("%s\n", utsname.release);
        printf("%s\n", utsname.version);
        printf("%s\n", utsname.machine);

        /* returns the return value of uname() */

        return(ret);
}
% ./uname 
Linux
user-X550CL
4.2.0-25-generic
#30-Ubuntu SMP Mon Jan 18 12:31:50 UTC 2016
x86_64
6
kos

En complément de la réponse de heemayl, vous pouvez obtenir des informations comme dans la commande uname à partir de /proc/version.

4
Eduardo Cola