Определить дистрибутив Linux
Идентификация дистрибутива дело не сложное, для этого есть несколько способов, представленных ниже.
Через компилятор GCC
Самый простой и эффективный способ (работает для большинства систем) это спросить у компилятора GCC
(GNU Compiler Collection)
$ gcc -v
Для своего хостера я получил:
Using built-in specs. Target: amd64-undermydesk-freebsd Configured with: FreeBSD/amd64 system compiler Thread model: posix gcc version 4.2.1 20070831 patched [FreeBSD]
Используя lsb_release (Ubuntu)
$ lsb_release -a
Для своей настольной Ubuntu я получил:
No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu quantal (development branch) Release: 12.10 Codename: quantal
Либо через uname
$ uname -a
В настольной Ubuntu:
Linux mihdan-ubuntu 3.2.0-27-generic-pae #43-Ubuntu SMP Fri Jul 6 15:06:05 UTC 2012 i686 i686 i686 GNU/Linux
Через issue
(OpenSUSE/Debian)
$ cat /etc/issue $ cat /etc/issue.net
Через *version
(Slackware/Ubuntu)
$ cat /etc/*version
Через *release
(Debian/RedHat/Gentoo/Fedora/Ubuntu)
$ cat /etc/*release
Для справки
Дистрибутив | Путь |
---|---|
Annvix | /etc/annvix-release |
Arch Linux | /etc/arch-release |
Arklinux | /etc/arklinux-release |
Aurox Linux | /etc/aurox-release |
BlackCat | /etc/blackcat-release |
Cobalt | /etc/cobalt-release |
Conectiva | /etc/conectiva-release |
Debian | /etc/debian_version/etc/debian_release (редко) |
Fedora Core | /etc/fedora-release |
Gentoo Linux | /etc/gentoo-release |
Immunix | /etc/immunix-release |
Knoppix | knoppix_version |
Linux-From-Scratch | /etc/lfs-release |
Linux-PPC | /etc/linuxppc-release |
Mandrake | /etc/mandrake-release |
Mandriva/Mandrake Linux | /etc/mandriva-release/etc/mandrake-release/etc/mandakelinux-release |
MkLinux | /etc/mklinux-release |
Novell Linux Desktop | /etc/nld-release |
PLD Linux | /etc/pld-release |
Red Hat | /etc/redhat-release/etc/redhat_version (редко) |
Slackware | /etc/slackware-version/etc/slackware-release (редко) |
SME Server (Formerly E-Smith) | /etc/e-smith-release |
Solaris SPARC | /etc/release |
Sun JDS | /etc/sun-release |
SUSE Linux | /etc/SuSE-release/etc/novell-release |
SUSE Linux ES9 | /etc/sles-release |
Tiny Sofa | /etc/tinysofa-release |
TurboLinux | /etc/turbolinux-release |
Ubuntu Linux | /etc/lsb-release |
UltraPenguin | /etc/ultrapenguin-release |
UnitedLinux | /etc/UnitedLinux-release (covers SUSE SLES8) |
VA-Linux/RH-VALE | /etc/va-release |
Yellow Dog | /etc/yellowdog-release |
Автоматизируем процесс
Из всего вышесказанного пробуем собрать скрипт
#!/bin/sh 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}
Увы, способы не самые надежные. Тем не менее, на большинстве дистрибутивов подсказку получить можно.
Например, в
Cent OS
следующие результаты:lsb-release не существует:
$ lsb-release -a
-bash: lsb-release: команда не найдена
Едиинственная подсказка из gcc — это ключевое слово «redhat», исходя из которого можно уже поискать информации в /etc/redhat-release
$ gcc --v
Используются внутренние спецификации.
Целевая архитектура: i686-redhat-linux
Параметры конфигурации: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk --disable-dssi --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-1.5.0.0/jre --enable-libgcj-multifile --enable-java-maintainer-mode --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --disable-libjava-multilib --with-ppl --with-cloog --with-tune=generic --with-arch=i686 --build=i686-redhat-linux
Модель многопоточности: posix
gcc версия 4.4.6 20120305 (GCC)
uname -a вообще очень редко отображает информацию о дистрибутиве:
$ uname -a
Linux host 2.6.32-279.9.1.el6.i686 #1 SMP Tue Sep 25 20:26:47 UTC 2012 i686 i686 i386 GNU/Linux
Тут на поиск истины может натолкнуть окончание «el6.i686», по которому легко гуглится RedHat, а дальше см. предыдущий пункт.
В Debian все тоже не очень гладко: lsb-release нету, gcc сейчас нету под рукой на Debian-дистрибутиве (кстати, это тоже вариант развития событий — компилятор просто не установлен в бинарном дистрибутиве по умолчанию), а uname показывает следующее:
$ uname -a
Linux host 2.6.32-5-amd64 #1 SMP Mon Oct 3 05:12:50 UTC 2011 x86_64 GNU/Linux
Своих вариантов нет? Я бы добавил в статью.
Единственный проверенный способ на Linux-дистрибутивах, которй я знаю — это
$ cat /etc/issue
Результат:
Debian GNU/Linux 6.0
У меня на
FreeBSD
нет вообщеissue
🙂Во Фрюхе
uname -r