Как узнать версию дистрибутива GNU/Linux из терминала


angel2s2 аватар

angel2s2 - Posted on 12 Февраль 2009

Как-то мне постучался в аську один знакомый и спросил как поставить программу в линуксе (он купил ноут, а на нем уже линь стоял). Я долго тупил, но решение нашел. Но было бы куда проще дать человеку совет зная какая сборка линукса у него установлена.

Информация о версии линукса хранится в файле(-ах) /etc/*release*. В Ubuntu это /etc/lsb-release. В RedHat, на сколько я помню, 2 файла, поэтому я обрамил звездочками слово release.

Чтобы узнать что же за релиз, достаточно прочитать этот файл(-ы):

$ cat /etc/*release*
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=8.04
DISTRIB_CODENAME=hardy
DISTRIB_DESCRIPTION="Ubuntu 8.04.1"

Думаю тут и так все понятно и комментировать нечего.

Если вы пишите скрипт, который должен что-либо сделать в зависимости от сборки линукса, то можете сделать это так (любой из вариантов на вкус и цвет):

$ cat /etc/*release* | grep DESCRIPTION | sed 's/^.*=//;s/"//g'
$ cat /etc/*release* | grep DESCRIPTION | sed 's/^.*=//' | tr -d '"'
$ cat /etc/*release* | awk -F= '/DESCRIPTION/{print $2}' | tr -d '"'

Теоретически это должно работать в любой сборке линукса.

Для убунту (и наверное для всех дистрибутивов собранных на Debian, проверить нет возможности) можно использовать команду:

$ lsb_release -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 8.04.1
Release:	8.04
Codename:	hardy

Чтобы вывести только поле "Description":

$ lsb_release -d | cut -f2
Ubuntu 8.04.1
4
Ваша оценка: Ничего Рейтинг: 4 (1 vote)

[root@Master ~]# ls -l /etc/*release
-rw-r--r-- 1 root root 38 Дек  3 19:42 /etc/altlinux-release
lrwxrwxrwx 1 root root 16 Янв 25 18:45 /etc/fedora-release -> altlinux-release
lrwxrwxrwx 1 root root 16 Янв 25 18:45 /etc/redhat-release -> altlinux-release
lrwxrwxrwx 1 root root 16 Янв 25 18:45 /etc/system-release -> altlinux-release
[root@Master ~]# lsb_release -a
-bash: lsb_release: команда не найдена
[root@Master ~]# cat /etc/issue
Welcome to \R / \l
[root@Master ~]# cat /etc/*release*
ALT Linux 6.0.0 Club-small  (Cheiron)
ALT Linux 6.0.0 Club-small  (Cheiron)
ALT Linux 6.0.0 Club-small  (Cheiron)
ALT Linux 6.0.0 Club-small  (Cheiron)
[root@Master ~]#

root@localhost:/home/dezdemona# uname -rs
GNU/kFreeBSD 8.1-1-686-smp

root@localhost:/home/dezdemona# cat /etc/issue
Debian GNU/kFreeBSD 6.0 \n \l

в slax 6.2.1
*cat /etc/slax-version*

cat /etc/issue

в Arch`е файл /etc/arch-release есть, но он пустой. Но система определяется по 'uname -r' результат будет примерно таким: 2.6.32-ARCH

в Slackware не один из ваших способов не работает =) Только так
cat /etc/slackware-version
Slackware 12.2.0

Спасибо

вот что у меня получилось (т.е. команда работает и в redhat-based дистрибах)

[arkady@sint ~]$ lsb_release -a
LSB Version: :core-3.1-ia32:core-3.1-noarch:graphics-3.1-ia32:graphics-3.1-noarch
Distributor ID: CentOS
Description: CentOS release 5.2 (Final)
Release: 5.2
Codename: Final

arkady@nixdev:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 8.04.2
Release: 8.04
Codename: hardy

arkady@km23255-03:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description: Debian GNU/Linux 4.0 (etch)
Release: 4.0
Codename: etch

т.е. знание данной команды спасет в большинстве случаев )

[root@gent ~]# lsb_release
-bash: lsb_release: command not found
[root@gent ~]# cat /etc/*release*
CentOS release 4.6 (Final)

Респект! Буду знать :)

Интересно, а в *BSD системах прокатит? Может кто проверить?

% uname -rs 
FreeBSD 7.0-RELEASE-p5

from man uname:
...
-r Write the current release level of the operating system to stan-
dard output.
-s Write the name of the operating system implementation to standard
output.
...

То ?

Взято на заметку, спасибо

а зачем BSD системам поддерживать спецификацию Linux Standard Base (lsb)? :-)
касательно lsb_release -a - такое не прокатит в том же Debian. Самый универсальный вариант, который я для себя нашел - это

cat /etc/issue

на всех Linux-дистрах :)
в BSD можно поглядеть /etc/motd

да, у меня в арче ни одна из команд не пашет
а тут показало - арч линукс =)
пасиба!

зы
можно конечно и по имени образха ядра догадаться =\

cat /etc/issue - опаньки... действительно оно так и есть :)) Респект!

На счет BSD не знал, т.к. опыта с ними почти нет. Спасибо, за разъяснения :)

cat /etc/*release* | grep DESCRIPTION | sed 's/^.*=//;s/"//g'

Зачем???? Это же стандартный скрипт, чего не сделать-то тоже стандартно:
if [ -f /etc/lsb-release ]; then # Debian-Like
. /etc/lsb-release
echo $DESCRIPTION
fi

Почему с if. Потому что одно дело просто вывести содержимое файлов, но не во всех далеко дистрибутивах они такого содержания, на Федоре например далеко не так все:
# grep -H '' /etc/*release
/etc/fedora-release:Fedora release 10 (Cambridge)
/etc/redhat-release:Fedora release 10 (Cambridge)
/etc/system-release:Fedora release 10 (Cambridge)

То есть просто записано имя. Ну и почему 3 файла, так это просто симлинки именно для совместимости:
# ls -l /etc/*release
-rw-r--r-- 1 root root 30 Ноя 6 23:06 /etc/fedora-release
lrwxrwxrwx 1 root root 14 Ноя 12 12:31 /etc/redhat-release -> fedora-release
lrwxrwxrwx 1 root root 14 Ноя 12 12:31 /etc/system-release -> fedora-release

Спасибо за информацию.

Получается что

$ cat /etc/*release* | grep DESCRIPTION | sed 's/^.*=//;s/"//g'
$ cat /etc/*release* | grep DESCRIPTION | sed 's/^.*=//' | tr -d '"'
$ cat /etc/*release* | awk -F= '/DESCRIPTION/{print $2}' | tr -d '"'

можно использовать далеко не везде... и, как сказано, ниже не везде есть этот файл... Тогда думаю оптимально будет так:

$ cat /etc/*release* /etc/*_version
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=8.04
DISTRIB_CODENAME=hardy
DISTRIB_DESCRIPTION="Ubuntu 8.04.1"
lenny/sid

хотя некоторых новичков это может сбить с толку... но все же лучше чем ничего.

По видимости, речь идёт о сборке и версии чего-то вроде "дистрибутива ОС семейства GNU/Linux", а не о "версии и сборке Linux" ;)

Версию и сборку Linux можно узнать "из терминала" командой "uname -v" и "uname -r" соответственно.

> Версию и сборку Linux можно узнать "из терминала" командой "uname -v" и "uname -r" соответственно.

$ uname -v
#1 SMP Tue Dec 2 07:56:33 UTC 2008

Какая у меня версия линукса? :)

Да, ты прав, не корректно я озаглавил пост. :( Жаль нельзя поменять тему...

Модераторы, смените пожалуйста тему этого поста, если возможно,на "Узнать какой дистрибутив GNU/Linux из терминала".

Спасибо.

сделано :)

Спасибо большое :)

Поддержка LSB(Linux Stantart Base) в debian осуществлятся специальными пакетами lsb, lsb-base и подобные.
И по умолчанию они не ставятся. Зато есть /etc/debian_version. Помоему в Ubuntu этот файл тоже есть.
Но что интересно lsb_release есть и работает. Я посмотрел код (он на питоне), то информация узнается из разных источников (uname, /etc/debian_version, apt-cache policy), но может быть установлена принудительно в /etc/lsb-release.
Поставил все lsb* пакеты и файлик так и не появился

PS
кстати в sed тоже есть /паттерн/{ команды } как и в awk Ж:-P

Да, ты прав.
У меня в убунте /etc/debian_version такой:

$ cat /etc/*_version
lenny/sid

А файл /etc/lsb-release и утилита lsb_release были с самого начала.

За sed спасибо, не знал (а может забыл?) :)

$apt-file search lsb_release
lsb-release: /usr/bin/lsb_release
lsb-release: /usr/share/man/man1/lsb_release.1.gz

а вот и вывод

$lsb_release -a 
No LSB modules are available.
Distributor ID:	Debian
Description:	Debian GNU/Linux 5.0 (lenny)
Release:	5.0
Codename:	lenny

Отправить комментарий

Google Friend Connect (leave a quick comment)
loading...
Содержание этого поля является приватным и не предназначено к показу.