¿Es posible saber si mi kernel de Linux es personalizado (es decir, compilado) en lugar de distro?

10

Tomando ejemplo de Ubuntu, ¿podemos decir si el kernel fue compilado a medida en lugar de lo que viene con la distribución?

bytefire
fuente
Revise este hilo: unix.stackexchange.com/questions/43164/…
nomadrc
2
Bueno, solo binario compare con el archivo del paquete ... y vea, si es el núcleo original o si fue alterado ...
kravemir

Respuestas:

13

Claro, solo verifique si lo dpkgsabe.

Primero verifique la versión del kernel que está ejecutando.

uname -a
Linux orwell 3.2.0-4-amd64 #1 SMP Debian 3.2.65-1+deb7u2 x86_64 GNU/Linux

Luego diga dpkgque busque el archivo de imagen del núcleo en la dpkgbase de datos.

dpkg -S /boot/vmlinuz-3.2.0-4-amd64
linux-image-3.2.0-4-amd64: /boot/vmlinuz-3.2.0-4-amd64

O, mejor, usar dlocatedel dlocatepaquete. dlocateprimero crea un caché a partir de la dpkgbase de datos y lo usa. Entonces es rápido.

dlocate /boot/vmlinuz-3.2.0-4-amd64
linux-image-3.2.0-4-amd64: /boot/vmlinuz-3.2.0-4-amd64

Finalmente, verifique que los archivos de Debian contengan este paquete.

apt-cache policy linux-image-3.2.0-4-amd64

linux-image-3.2.0-4-amd64:
  Installed: 3.2.68-1+deb7u1
  Candidate: 3.2.68-1+deb7u1
  Version table:
 *** 3.2.68-1+deb7u1 0
        500 http://security.debian.org/ wheezy/updates/main amd64 Packages
        100 /var/lib/dpkg/status
     3.2.65-1 0
        500 http://httpredir.debian.org/debian/ wheezy/main amd64 Packages

Si no lo hacen, entonces es un paquete personalizado. Por supuesto, si dpkg no conoce el archivo de imagen, su núcleo no forma parte de un paquete, sino que se ha compilado localmente.

Tenga en cuenta que apt puede notar la diferencia entre un paquete en el archivo de Debian y uno compilado localmente del mismo nombre. Creo que comprueba el md5sum del paquete, pero olvido los detalles de cómo lo hace. Los paquetes binarios contienen información sobre hashes, consulte la parte inferior de apt-cache show linux-image-3.2.0-4-amd64, por ejemplo. p.ej

Package: linux-image-3.2.0-4-amd64
Source: linux
Version: 3.2.68-1+deb7u1
Installed-Size: 105729
[...]
Size: 23483788
MD5sum: f9736f30f8b68ae79b2747d8a710ce28
SHA1: 64bfde903892801dccd04b52b12316901a02cd96
SHA256: 775814b3eff4a964b593c0bdeaac20587a4e3ddb1257a9d2bfcf1e9d3b9bfd15
Faheem Mitha
fuente
1
Por favor, vea mis comentarios sobre la respuesta de exussum. ¿Qué sucede si simplemente vuelve a compilar el mismo núcleo, con diferentes opciones, pero no le da otro nombre?
terdon
@terdon ver ediciones.
Faheem Mitha
2
¡Ah, sí, los hash deberían hacerlo, listos!
terdon
Aunque este enfoque funciona en la mayoría de los casos, no funciona en el mío, ya que tengo un repositorio privado para paquetes compilados localmente, por lo que aparece como un paquete de proveedor incluso cuando uso un paquete compilado localmente. por supuesto, puede detectar la diferencia fácilmente ya que los paquetes de proveedores tienen el nombre del proveedor como parte de la versión, donde mis paquetes tienen mi nombre.
hildred
1
@bytefire apt-cache show ...funciona. Veo que escribí mal. Corrigiendo ahora.
Faheem Mitha
7

Mínimamente, uname -rdará la versión kernal, como 3.18.6. Sin embargo, cuando se compila el núcleo, se puede configurar una cadena adicional y adjuntarla, y las distribuciones generalmente hacen esto para indicar su propio nivel de parche (después de un guión) y sabor, como 3.18.6-32-generic. Esa es una pista; obviamente, usar su propia cadena cuando crea un núcleo personalizado puede ser otra.

uname -v da una cadena que por defecto es algo como esto

#4 SMP PREEMPT Mon Mar 9 13:55:25 EDT 2015

El número es arbitrario en el sentido de que es la cantidad de veces que se construyó este kernel utilizando un árbol de origen específico sin que se reinicie el árbol; esto podría ser útil cuando está construyendo el suyo propio. SMPindica un núcleo multitarea (es decir, no en tiempo real) y PREEMPT es otra opción de configuración relacionada con el "modelo de preferencia" del planificador. Pero la gran pista aquí es probablemente el momento en que se construyó. Esto podría usarse para hacer coincidir la marca de tiempo de modificación / cambio en el núcleo mismo, teniendo en cuenta que se puede cambiar, por ejemplo, con touch. Por ejemplo, staten ese núcleo se ve así:

  File: ‘3.19-goldilocksSpecial’
  Size: 6858880         Blocks: 13400      IO Block: 4096   regular file
Device: 801h/2049d      Inode: 3156605     Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2015-02-15 15:32:29.000000000 -0500
Modify: 2015-03-03 13:55:21.000000000 -0500
Change: 2015-03-03 14:02:26.767045553 -0500
 Birth: -

Lo cual está bastante en línea con Mon Mar 9 13:55:25 EDT 2015.

encerrada dorada
fuente
2

Igual que cualquier otro

sudo apt-cache policy linux-generic

es la versión instalada a través del administrador de paquetes y

uname -r

compara las versiones

para mi es

linux-generic:
  Installed: 3.19.0.15.14
  Candidate: 3.19.0.15.14

y

3.19.0-15-generic

que indican la misma versión

exussum
fuente
1
¿Cambiará eso si recompila la misma versión con diferentes opciones? No veo por qué la cadena de versión cambiaría en ese caso.
terdon
No estoy seguro de que se instalarán 2 con el mismo nombre. No lo he probado. Personalmente, cuando vuelvo a compilar con diferentes opciones
elimino
Supongo que el mismo nombre simplemente se sobrescribirá /boot. Mi punto es que no veo por qué esperarías que la salida de unamecambie si solo vuelves a compilar mientras cambias algunas opciones. En ese caso, esperaría eso apt-cachey uname -rdevolveré la misma información, a pesar del hecho de que ha compilado localmente.
terdon
@terdon La cadena de versión se puede personalizar en la configuración del kernel, lo cual es una buena idea si está utilizando la fuente de distribución.
Ricitos
@goldilocks sí, lo vi en tu respuesta y eso tiene sentido. Sin embargo, si fuera lo suficientemente tonto como para no haberlo hecho, y hubiera recompilado el kernel de stock de mi distribución cambiando algunas opciones, las cadenas de versión serán idénticas, ¿verdad? Su sugerencia sobre el número de compilaciones podría ayudar, pero, que yo sepa, no es lo que se sugiere aquí.
terdon
0

Yo diría que la respuesta más verdadera en general es "no, no puedes". Existen varios métodos que pueden ayudar en ciertos casos y estos ya se han sugerido, pero todos parecen perder de vista cómo surgió esta situación. En verdad, si está utilizando un kernel personalizado, ese kernel puede hacer cualquier cosa, incluso ocultar su presencia o parecer un kernel diferente.

Me preocuparía si realmente está ejecutando un núcleo personalizado y no lo sabía. La única forma confiable de saber qué kernel se está utilizando es realizar un seguimiento cuidadoso de qué kernel compila e instala.

Si realmente no está seguro de qué núcleo está ejecutando el sistema o de qué fuentes se construyó este núcleo o de dónde proviene, consideraría seriamente reinstalar el sistema operativo desde una buena imagen conocida y ser más cuidadoso en el futuro sobre qué núcleos intentará arrancar de o uso.

La realidad
fuente