D'où provient uname -i
l'information?
Les détails existent-ils en /etc/
?
Les détails existent-ils en /proc/
?
Si oui, à quel fichier fait-il référence pour produire ces détails?
D'où provient uname -i
l'information?
Les détails existent-ils en /etc/
?
Les détails existent-ils en /proc/
?
Si oui, à quel fichier fait-il référence pour produire ces détails?
Réponses:
uname
utilise l'appel système uname(2)
pour obtenir les informations relatives au noyau qu'il affiche.
Le synopsis est:
#include <sys/utsname.h>
int uname(struct utsname *buf);
où uname(2)
renvoie des informations dans la structure pointée par buf
. Vous pouvez également lire le fichier d' en- tête utsname.h
de /usr/include/"$(arch)"-linux-gnu/sys/utsname.h
creuser plus profond.
Jetez un oeil à man 2 uname
pour avoir plus d'idée à ce sujet.
locate --regex '^/usr/include/.*/sys/utsname.h$'
?
uname -i
la sortie est x86_64
. Quand j'exécute locate --regex '^/usr/include/.*/sys/utsname.h$'
la sortie revient/usr/include/x86_64-linux-gnu/sys/utsname.h
Le programme strace
nous permet de visualiser les appels système qu'une application peut effectuer. Avec uname -a
il est évident que les seuls open
appels vont aux bibliothèques système, donc techniquement il n'y a pas de fichier sur le système de fichiers qui uname
s'ouvre pour la lecture. Il effectue plutôt des appels système à l'aide des bibliothèques C.
Comme heemayl l'a souligné à juste titre, il existe un appel sys pour récupérer les informations stockées dans la uname
structure. 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 utsname est également accessible via / proc / sys / ker‐ nel / {ostype, hostname, osrelease, version, domainname}.
Une partie des informations utsname est également accessible via / proc / sys / ker‐ nel / {ostype, hostname, osrelease, version, domainname}.
/proc
le système de fichiers 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 le noyau ou les bibliothèques système.
Enfin, en parcourant le code source uname.c
dont on peut se procurer avec apt-get source coreutils
, on constate qu'il utilise bien la utsname.h
bibliothèque (imprimée avec des 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
sortie:
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 +++
uname.c
n'est pas nécessairement nécessaire d'utiliser une bibliothèque pour cela - nous pouvons bien sûr regarder le code source.
machine.h
machine.h
semble être parsemé dans tout le système. machine.h
Sur quel fichier s'appuie-t-il?
machine.h
sur mon système semblent être dans le /usr/src/linux-headers-3.19.0-33
répertoire. Il est très probable qu'il utilise la bibliothèque fournie par le noyau en cours d'exécution
Bien sûr, la réponse de heemayl est correcte.
Juste pour le plaisir, voici un extrait de travail C présentant les données retournées par uname()
(une sorte de maison uname
si vous le souhaitez): compilez-le 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
printf("%\n", utsname.machine);
extraction de ses informations?
utsname
, qui est remplie lors de l'appel à uname()
. L'exemple n'est probablement pas trop simple pour quelqu'un qui n'a pas les bases de C, mais voici plus ou moins ce qui se passe: un struct
(type de données C) de type utsname
nommé utsname
(type défini dans <sys/utsname.h>
) est déclaré; puis un pointeur sur celui-ci nommé utsname_ptr
est déclaré (puisqu'il uname()
accepte un pointeur sur un struct
type utsname
comme argument, bien que cela aurait pu être évité dans ce cas, mais c'est une autre histoire).
uname()
a pour effet de remplir la structure utsname
qui, au moment de l' printf()
appel, contient les différentes valeurs à l'intérieur des différents champs. Malheureusement, si vous n'êtes pas familier avec C, cela ne sera probablement pas facile à saisir en détail, mais le fait est qu'il uname()
remplit une structure de données construite à dessein, dont les champs sont ensuite imprimés via printf()
.
En complément de la réponse de heemayl, vous pouvez obtenir des informations comme dans la uname
commande de /proc/version
.