linux processes

uname

Информация о системе — вывод сведений об ОС, ядре и аппаратной архитектуре

Описание

uname (unix name) — утилита для получения системной информации: имя операционной системы, версия ядра, имя хоста, архитектура процессора и тип аппаратной платформы. Данные читаются через системный вызов uname(2) — это мгновенная операция без обращения к диску.

Команда незаменима при первом знакомстве с незнакомым сервером, при написании кросс-платформенных скриптов, при диагностике проблем совместимости. Версия ядра (uname -r) критична при установке заголовочных файлов, модулей ядра или при проверке применимости CVE-патчей.

Для получения дополнительных сведений о дистрибутиве Linux используйте cat /etc/os-release или lsb_release -auname показывает информацию о ядре, а не о дистрибутиве. Например, uname -s на Ubuntu, Debian и Arch одинаково вернёт Linux.

Синтаксис

uname [options]

Без аргументов выводит только имя операционной системы (обычно Linux).

# Пример полного вывода uname -a Linux hostname 6.1.0-21-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.90-1 (2024-05-03) x86_64 GNU/Linux # ^ ^ ^ ^ ^ # -s -n -r -v -m

Расшифровка полей uname -a:

ПолеЗначение в примереФлаг
Kernel nameLinux-s
Node namehostname-n
Kernel release6.1.0-21-amd64-r
Kernel version#1 SMP PREEMPT_DYNAMIC …-v
Machinex86_64-m
OSGNU/Linux-o

Флаги и опции

ФлагОписаниеПример вывода
-aAll: вывести все доступные поля в одну строкуLinux host 6.1.0 #1 SMP x86_64 GNU/Linux
-sKernel name: имя операционной системыLinux
-nNode name: сетевое имя хоста (hostname)webserver-01
-rKernel release: версия ядра. Используется при установке заголовков6.1.0-21-amd64
-vKernel version: дата сборки и дополнительные флаги компиляции#1 SMP PREEMPT_DYNAMIC
-mMachine: аппаратная архитектура (тип процессора)x86_64 / aarch64 / armv7l
-pProcessor: тип процессора (часто совпадает с -m или выводит unknown)x86_64
-iHardware platform: аппаратная платформа (может быть unknown)x86_64
-oOperating system: имя ОС (обычно GNU/Linux)GNU/Linux

Связанные команды для получения информации о системе:

КомандаЧто показывает
cat /etc/os-releaseИмя и версия дистрибутива Linux (Ubuntu, Debian, CentOS...)
lsb_release -aСведения о дистрибутиве в стандартизованном формате LSB
hostnamectlИмя хоста, операционная система, ядро, архитектура (systemd)
archКраткий аналог uname -m — только архитектура
nprocКоличество доступных процессорных ядер
lscpuПодробная информация о процессоре

Паттерны использования

Первый осмотр нового сервера

# Быстрый обзор системы
uname -a

# Дистрибутив + версия ядра
cat /etc/os-release && uname -r

# Всё вместе через hostnamectl
hostnamectl

Установка заголовков ядра

# Узнать текущую версию ядра
uname -r
# Например: 6.1.0-21-amd64

# Установить заголовки для этой версии
sudo apt install linux-headers-$(uname -r)

# Для сборки модулей ядра / DKMS
sudo apt install dkms linux-headers-$(uname -r)

Условная логика в скриптах

# Определить ОС для кросс-платформенного скрипта
OS=$(uname -s)
case "$OS" in
    Linux)   echo "Linux detected" ;;
    Darwin)  echo "macOS detected" ;;
    FreeBSD) echo "FreeBSD detected" ;;
    *)       echo "Unknown OS: $OS" ;;
esac

# Проверить архитектуру
ARCH=$(uname -m)
if [ "$ARCH" = "x86_64" ]; then
    wget "https://example.com/app-amd64"
elif [ "$ARCH" = "aarch64" ]; then
    wget "https://example.com/app-arm64"
fi

Проверка версии ядра для CVE

# Получить версию ядра
uname -r
# 5.15.0-107-generic

# Сравнить версии в скрипте
KERNEL=$(uname -r | cut -d. -f1-2)
# KERNEL = 5.15

# Проверить минимальную версию
python3 -c "
import sys
v = tuple(map(int, '$KERNEL'.split('.')))
print('OK' if v >= (5,10) else 'Update kernel!')"

Имя хоста в скриптах

# Получить имя хоста
uname -n
# или
hostname

# Использование в именах файлов логов
LOG="/var/log/app/$(uname -n)-$(date +%Y%m%d).log"

# В prompt или сообщениях
echo "Running on: $(uname -n) [$(uname -m)]"

Системная информация для отчётов

# Полная системная информация
echo "=== System Info ==="
echo "OS:     $(uname -s)"
echo "Host:   $(uname -n)"
echo "Kernel: $(uname -r)"
echo "Arch:   $(uname -m)"
echo "Distro: $(. /etc/os-release && echo $PRETTY_NAME)"
echo "Cores:  $(nproc)"
echo "RAM:    $(free -h | awk '/Mem:/{print $2}')"

Советы и предупреждения

Совет: uname -r в подстановке команд
Конструкция $(uname -r) особенно полезна в командах установки пакетов. Например, apt install linux-headers-$(uname -r) всегда установит заголовки именно для работающего ядра, независимо от его версии. Это надёжнее, чем вводить версию вручную.
Совет: hostnamectl содержит больше информации
На системах с systemd команда hostnamectl выводит более полный набор данных: имя машины, chassis type (server/laptop/vm/container), операционную систему, ядро и архитектуру — всё в читаемом формате. Удобна для первичного осмотра сервера.
Внимание: uname показывает ядро, не дистрибутив
uname -s всегда вернёт Linux для любого Linux-дистрибутива. Для определения дистрибутива (Ubuntu, CentOS, Alpine) читайте /etc/os-release или используйте lsb_release -a. Скрипты, использующие uname для определения дистрибутива, работают некорректно.
Внимание: версия ядра и версия дистрибутива — разные вещи
Ubuntu 22.04 LTS может работать с ядром 5.15 или 6.5 — зависит от установленных обновлений. Не делайте предположений о версии ядра на основании версии дистрибутива. Всегда проверяйте uname -r перед установкой зависящих от ядра компонентов.