uname
Информация о системе — вывод сведений об ОС, ядре и аппаратной архитектуре
Описание
uname (unix name) — утилита для получения системной информации: имя операционной системы, версия ядра, имя хоста, архитектура процессора и тип аппаратной платформы. Данные читаются через системный вызов uname(2) — это мгновенная операция без обращения к диску.
Команда незаменима при первом знакомстве с незнакомым сервером, при написании кросс-платформенных скриптов, при диагностике проблем совместимости. Версия ядра (uname -r) критична при установке заголовочных файлов, модулей ядра или при проверке применимости CVE-патчей.
Для получения дополнительных сведений о дистрибутиве Linux используйте cat /etc/os-release или lsb_release -a — uname показывает информацию о ядре, а не о дистрибутиве. Например, uname -s на Ubuntu, Debian и Arch одинаково вернёт Linux.
Синтаксис
Без аргументов выводит только имя операционной системы (обычно Linux).
Расшифровка полей uname -a:
| Поле | Значение в примере | Флаг |
|---|---|---|
| Kernel name | Linux | -s |
| Node name | hostname | -n |
| Kernel release | 6.1.0-21-amd64 | -r |
| Kernel version | #1 SMP PREEMPT_DYNAMIC … | -v |
| Machine | x86_64 | -m |
| OS | GNU/Linux | -o |
Флаги и опции
| Флаг | Описание | Пример вывода |
|---|---|---|
-a | All: вывести все доступные поля в одну строку | Linux host 6.1.0 #1 SMP x86_64 GNU/Linux |
-s | Kernel name: имя операционной системы | Linux |
-n | Node name: сетевое имя хоста (hostname) | webserver-01 |
-r | Kernel release: версия ядра. Используется при установке заголовков | 6.1.0-21-amd64 |
-v | Kernel version: дата сборки и дополнительные флаги компиляции | #1 SMP PREEMPT_DYNAMIC |
-m | Machine: аппаратная архитектура (тип процессора) | x86_64 / aarch64 / armv7l |
-p | Processor: тип процессора (часто совпадает с -m или выводит unknown) | x86_64 |
-i | Hardware platform: аппаратная платформа (может быть unknown) | x86_64 |
-o | Operating 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) особенно полезна в командах установки пакетов. Например, apt install linux-headers-$(uname -r) всегда установит заголовки именно для работающего ядра, независимо от его версии. Это надёжнее, чем вводить версию вручную.
На системах с systemd команда
hostnamectl выводит более полный набор данных: имя машины, chassis type (server/laptop/vm/container), операционную систему, ядро и архитектуру — всё в читаемом формате. Удобна для первичного осмотра сервера.
uname -s всегда вернёт Linux для любого Linux-дистрибутива. Для определения дистрибутива (Ubuntu, CentOS, Alpine) читайте /etc/os-release или используйте lsb_release -a. Скрипты, использующие uname для определения дистрибутива, работают некорректно.
Ubuntu 22.04 LTS может работать с ядром 5.15 или 6.5 — зависит от установленных обновлений. Не делайте предположений о версии ядра на основании версии дистрибутива. Всегда проверяйте
uname -r перед установкой зависящих от ядра компонентов.