Determinar la distribución de Linux


11

Estoy tratando de determinar qué sabor del servidor Linux se está ejecutando. No estoy tratando de determinar la versión del kernel, sino evaluar el distribuidor.

gcc está instalado, y en la salida de la versión, dice RedHat

# gcc --version
gcc (GCC) 3.4.6 20060404 (Red Hat 3.4.6-11)

¿Esto significa que puedo asumir con seguridad que mi servidor es un servidor RedHat? ¿Existe un mejor método 100% a prueba de balas para descubrir esto? También para otros sabores de Linux, ¿no solo este servidor?

Editar: contenido /etc/en caso de que ayude, pero me gustaría una solución que funcione para otras versiones de Linux también.

# ls /etc/
./              backupmxhosts  domainusers     host.conf     localdomains  mailips        pam.d/      relayhosts               shadow              trustedmailhosts
../             bashrc*        exim.conf       inputrc       localtime     man.config     passwd      resolv.conf              skipsmtpcheckhosts  userdomains
DIR_COLORS      cron.deny      exim.pl         ld.so.cache   lynx.cfg      mtab           profile     secondarymx              spammeripblocks     vimrc
aliases         demodomains    exim.pl.local*  ld.so.conf    mail/         my.cnf         profile.d/  senderverifybypasshosts  sudoers
antivirus.exim  demouids       group           localaliases  mailhelo      nsswitch.conf  protocols   services                 termcap

No tengo *releaseni *versionarchivos en/etc/

# ls /etc*release; ls /etc/*version
/bin/ls: /etc/*release: No such file or directory
/bin/ls: /etc/*version: No such file or directory

Probé LSB

# lsb_release -a
LSB Version:
Distributor ID: n/a
Description:    (none)
Release:        n/a
Codename:       n/a

Además, supongo que estoy dentro de un chroot jail(no estoy seguro de qué es eso), que probablemente podría ser la causa de este problema.


Actualizado:

Creo que esto lo hace por mí. Creo que puedo asumir con seguridad que estoy usando cent-os.

# cat /proc/version
Linux version 2.6.9-103.plus.c4smp (mockbuild@builder10.centos.org) (gcc version 3.4.6 20060404 (Red Hat 3.4.6-11)) #1 SMP Wed Dec 21 16:17:23 EST 2011

¿Por qué necesitas saberlo? ¿Quizás, en cambio, probar las herramientas comunes específicas de distribución (administradores de paquetes, por ejemplo) hará lo que desea?
Daniel Pryden

1
Bueno, lo que realmente quiero saber es si puedo replicar el servidor como una máquina virtual localmente, y luego instalar cosas en la máquina virtual local, luego copiar los binarios en la máquina remota. Pensé que encontrar la plataforma correcta sería un buen punto de partida.
Billy Moon

2
La lista del directorio anterior está incompleta (por ejemplo, faltan hosts, init.d, rc *). ¿Es esto una prueba?

¿Cómo estás accediendo a este servidor? ¿Es posible que no tenga acceso al sistema de archivos del servidor directamente, sino que esté dentro de una cárcel chroot?
Daniel Pryden

Supongo que podría estar dentro de una cárcel chroot, ¿significa esto que no puedo descubrir cuál es el sistema subyacente?
Billy Moon

Respuestas:


4
cat /proc/version

Ejemplos:

  1. Ubuntu:

    $ cat /proc/version
    Linux version 3.11.0-13-generic (buildd@roseapple) (gcc version 4.8.1 \
    (Ubuntu/Linaro 4.8.1-10ubuntu8) ) #20-Ubuntu SMP Wed Oct 23 07:38:26 UTC 2013
    
  2. Red Hat / CentOS:

    $ cat /proc/version
    Linux version 2.6.32-220.13.1.el6.x86_64 (mockbuild@c6b6.bsys.dev.centos.org) \
    (gcc version 4.4.6 20110731 (Red Hat 4.4.6-3) (GCC) ) #1 SMP Tue Apr 17 23:56:34 BST 2012
    

Consulte también ¿Cómo saber qué distribución de Linux está utilizando?


Esto muestra dónde se compiló el kernel, no en qué distribución se ejecuta. En muchos casos, el núcleo se está compilando en la misma distribución pero en una versión anterior.
Pabouk

13

En la mayoría de las distribuciones de Linux modernas, el siguiente comando le dará su información:

lsb_release -a

1
No, esto no es verdad. Esto funciona solo para Debian y derivados
MariusMatutiae

1
Este comando no está instalado por defecto en Red Hat y derivados (es decir, CentOS). Usted tiene que instalar de forma explícita antes de su uso: yum install redhat-lsb-core.
Pabouk

@MariusMatutiae en realidad está mucho más extendido que eso, pero no siempre se instala por defecto.
terdon

@terdon gracias, no lo sabía.
MariusMatutiae

@MariusMatutiae vea aquí para obtener más información, parece estar ausente de SuSe pero debe instalarse en RH.
terdon

9

/etc/issue podría ser un buen punto de partida.

Se podría encontrar más inspeccionando los archivos de información para diferentes distribuciones:

Novell SuSE    /etc/SuSE-release
OpenSuSE       /etc/SuSE-release, /etc/os-release
Red Hat,CentOS /etc/redhat-release, /etc/redhat_version
Fedora         /etc/fedora-release, /etc/redhat-release, /etc/os-release
Slackware      /etc/slackware-release, /etc/slackware-version
Debian         /etc/debian_release, /etc/debian_version
Mandrake       /etc/mandrake-release
Yellow dog     /etc/yellowdog-release
Sun JDS        /etc/sun-release 
Solaris/Sparc  /etc/release 
Gentoo         /etc/gentoo-release
Amazon Linux   /etc/system-release
PLD Linux      /etc/pld-release, /etc/os-release
ArchLinux      /etc/arch-release, /etc/os-release

Vea el foro de Unix para más detalles.


1
por desgracia no tengo ningún archivo que termina releaseo versionen mi etcdirectorio
Billy Luna

4

Si /etc/issuefalta, puede haber uno o más /etc/*_releasearchivos.

Por ejemplo, mi sistema Ubuntu tiene /etc/lsb-release:

DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=11.04
DISTRIB_CODENAME=natty
DISTRIB_DESCRIPTION="Ubuntu 11.04"

El sistema CentOS de un amigo (basado en Red Hat) tiene /etc/redhat-release:

CentOS release 5.6 (Final)

No sé cuán universal es esto.


no releaseo versionarchivos en mi/etc/
Billy Moon

@BillyMoon Creo que es solo reciente que las distribuciones de Linux comenzaron a agregar la utilidad lsb_release en su distribución. lsb_release -a
Alpha01

Gracias por el consejo - desafortunadamente no me ayuda esta vez
Billy Moon

2

cat / etc / issue podría responder a su pregunta.

Los fabricantes de distro no son amigables contigo aquí. Primero, cada uno piensa que es la única forma verdadera.

Lo más probable es que, en lugar de tratar de olfatear la distribución, debería mirar con más detalle la pregunta particular que realmente necesita responder. Concéntrese en la funcionalidad que está viendo, no en la distribución que la proporciona. Después de todo, una nueva versión de una distribución puede dar la vuelta e ir en la dirección opuesta en cualquier eje en particular.


3
no hay /etc/issueen mi servidor
Billy Moon

Si. Tenga en cuenta que /etc/issuepuede contener secuencias de escape como \ny \l. Para ver lo que significan, man 5 issuey man getty(el /etc/issuearchivo está destinado principalmente para su uso por getty). Por supuesto, el propietario del sistema podría editar /etc/issuepor alguna razón nefasta.
Keith Thompson

No creo que /etc/issuesea ​​necesario existir o contener información sobre el proveedor de distribución. Comúnmente lo hace, pero no creo que pueda confiar en ello.
Daniel Pryden

@DanielPryden bien uno aprende algo todos los días. Nunca me había encontrado con la ausencia de uno antes.
bmargulies

1

Uso facter(sí, así es como se deletrea).

Facter es un compañero de la marioneta, proporciona variables que pueden consultarse que contienen información sobre el sistema.

Por ejemplo, aquí hay algunas de las docenas de variables que el factor puede devolver

$ facter
...
operatingsystem => CentOS
operatingsystemmajrelease => 6
operatingsystemrelease => 6.4
osfamily => RedHat
...

Simplemente puede consultar el hecho de la familia para ver que el servidor está ejecutando RedHat

$ facter osfamily
RedHat

Consulte la documentación: http://puppetlabs.com/facter


0

uname -a

Funciona siempre para cualquier Tux


1
Eso informa la cadena de versión del kernel , que podría estar muy mal si su host está ejecutando un kernel desde una distribución diferente, ya sea en metal desnudo o debido a una herramienta como OpenVZ o VServers.
sarnold

Sí, pero supongo que en este caso el autor de Q sabrá algo. sobre la situación El núcleo "extranjero" es un caso bastante extraño
Lazy Badger

0

No hay una única forma segura de hacer esto. Hice una pregunta similar en unix.se y la mejor manera de obtener esta información es un script que verifica una variedad de fuentes:

#!/bin/sh
# Detects which OS and if it is Linux then it will detect which Linux
# Distribution.

OS=`uname -s`
REV=`uname -r`
MACH=`uname -m`

GetVersionFromFile()
{
    VERSION=`cat $1 | tr "\n" ' ' | sed s/.*VERSION.*=\ // `
}

if [ "${OS}" = "SunOS" ] ; then
    OS=Solaris
    ARCH=`uname -p` 
    OSSTR="${OS} ${REV}(${ARCH} `uname -v`)"
elif [ "${OS}" = "AIX" ] ; then
    OSSTR="${OS} `oslevel` (`oslevel -r`)"
elif [ "${OS}" = "Linux" ] ; then
    KERNEL=`uname -r`
    if [ -f /etc/redhat-release ] ; then
        DIST='RedHat'
        PSUEDONAME=`cat /etc/redhat-release | sed s/.*\(// | sed s/\)//`
        REV=`cat /etc/redhat-release | sed s/.*release\ // | sed s/\ .*//`
    elif [ -f /etc/SuSE-release ] ; then
        DIST=`cat /etc/SuSE-release | tr "\n" ' '| sed s/VERSION.*//`
        REV=`cat /etc/SuSE-release | tr "\n" ' ' | sed s/.*=\ //`
    elif [ -f /etc/mandrake-release ] ; then
        DIST='Mandrake'
        PSUEDONAME=`cat /etc/mandrake-release | sed s/.*\(// | sed s/\)//`
        REV=`cat /etc/mandrake-release | sed s/.*release\ // | sed s/\ .*//`
    elif [ -f /etc/debian_version ] ; then
        DIST="Debian `cat /etc/debian_version`"
        REV=""

    fi
    if [ -f /etc/UnitedLinux-release ] ; then
        DIST="${DIST}[`cat /etc/UnitedLinux-release | tr "\n" ' ' | sed s/VERSION.*//`]"
    fi

    OSSTR="${OS} ${DIST} ${REV}(${PSUEDONAME} ${KERNEL} ${MACH})"

fi

echo ${OSSTR}

La otra opción es usar gcc --version, ya gccque siempre se compila para una distribución particular, será relativamente portátil. Le recomiendo que lea la respuesta aceptada en mi pregunta en U&L que explica muy bien la situación.


0

Este comando funcionó para distribuciones basadas en Debian y Redhat: usando el filtro tr, convierte el documento al formato de una palabra por línea y luego cuenta la primera línea que contiene el nombre de la distribución.

tr -s ' \011' '\012' < /etc/issue | head -n 1

-1

Es el mejor método.

cat /etc/*release

Enumeré mi /etcdirectorio en la pregunta. Como se discutió en otras respuestas, esta solución no funciona para mí.
Billy Moon

U intentó liberar ls / etc *; . Está mal. Pruebe la liberación ls / etc / *. Funcionará .am bastante seguro
Unnikrishnan

También hice ls en /etc/el directorio y se puede ver que no hay archivos de allí a finales derelease
Billy Luna
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.