¿De dónde uname -i
saca la información?
¿Existen los detalles en /etc/
?
¿Existen los detalles en /proc/
?
Si es así, ¿a qué archivo hace referencia para generar esos detalles?
command-line
kernel
Roy Hernández
fuente
fuente
Respuestas:
uname
usa la llamadauname(2)
al sistema para obtener la información relacionada con el núcleo que muestra.La sinopsis es:
donde
uname(2)
devuelve información en la estructura señalada porbuf
. También se puede leer el archivo de cabecerautsname.h
de/usr/include/"$(arch)"-linux-gnu/sys/utsname.h
cavar más profundo.Echa un vistazo
man 2 uname
para tener más idea sobre esto.fuente
locate --regex '^/usr/include/.*/sys/utsname.h$'
?uname -i
la salida esx86_64
. Cuando ejecutolocate --regex '^/usr/include/.*/sys/utsname.h$'
la salida vuelve/usr/include/x86_64-linux-gnu/sys/utsname.h
El programa
strace
nos permite ver las llamadas al sistema que puede hacer una aplicación. Conuname -a
que es evidente que las únicasopen
llamadas van a las bibliotecas del sistema, por lo que técnicamente no hay ningún archivo en el sistema de archivos que launame
abre para la lectura. Más bien realiza llamadas al sistema utilizando las bibliotecas C.Como heemayl señaló correctamente, existe una llamada sys para recuperar la información almacenada en la
uname
estructura. Es la página de manual, sugiere lo siguiente:/proc
sin embargo, el sistema de archivos es virtual, lo que significa que existe solo mientras el sistema operativo se está ejecutando. Por lo tanto, hasta cierto punto, se establece dentro del núcleo o las bibliotecas del sistema.Finalmente, leyendo el código fuente del
uname.c
cual se puede obtenerapt-get source coreutils
, podemos ver que de hecho usa lautsname.h
biblioteca (impresa con números de línea):strace
salida:fuente
uname.c
, no necesariamente necesita usar una biblioteca para eso; podemos mirar el código fuente, por supuesto, para estar seguros.machine.h
machine.h
parece estar salpicada en todo el sistema. ¿En quémachine.h
archivo se basa?machine.h
en mi sistema parecen estar en el/usr/src/linux-headers-3.19.0-33
directorio. Es muy probable que use la biblioteca proporcionada por el núcleo actualmente en ejecuciónPor supuesto, la respuesta de heemayl es correcta.
Solo por diversión, aquí hay un fragmento de C en funcionamiento que muestra los datos devueltos por
uname()
(una especie de caserouname
si lo desea): compílelogcc uname.c -o uname
y ejecútelo con./uname
:fuente
printf("%\n", utsname.machine);
saca la información?utsname
, que se rellena durante la llamada auname()
. El ejemplo probablemente no sea demasiado sencillo para alguien sin los conceptos básicos de C, pero aquí está más o menos lo que sucede: se declara unstruct
(tipo de datos C) de tipoutsname
llamadoutsname
(tipo definido en<sys/utsname.h>
); luegoutsname_ptr
se declara un puntero al nombre (ya queuname()
acepta un puntero a unstruct
tipoutsname
como argumento, aunque esto podría haberse evitado en este caso, pero esa es otra historia).uname()
tiene el efecto de llenar la estructurautsname
, que en el momento de laprintf()
llamada contiene los diversos valores dentro de los diversos campos. Desafortunadamente, si no está familiarizado con C, esto probablemente no será fácil de comprender en detalle, pero el punto es queuname()
puebla una estructura de datos construida a propósito, cuyos campos se imprimen más tardeprintf()
.Como una adición a la respuesta de heemayl, puede obtener información como en el
uname
comando/proc/version
.fuente