25 сентября 2017 г.

Анализ места на диске в Unix

Как вы знаете из поста "35 лет или как я попал в SAP", я начинал свою профессиональную карьеру с администрирования Unix систем. И я обожаю Unix. Во всём многообразии систем, называемых Unix-подобными, мне нравится ядро, концепция, которая лежит в основе их всех, начиная от AIX и заканчивая Linux.

Сегодня хочу остановиться на файловой системе.

В операционной системе Unix файловая система это отдельный столп, на котором базируется ядро этой системы.

В Windows, в отличии от Unix, понятие файловой системы не выходит на первый план. Есть набор дисков, которые подключены к компьютеру или серверу. Каждый диск имеет привязку к букве латинского алфавита. Без этой привязки работать с диском операционная система не сможет. А уже внутри диска создается файловая система. В Windows это может быть FAT, HPFS или NTFS. Подробности про них можно посмотреть тут.

Рис. 1. Пример жестких дисков в операционной системе Windows.

В Unix есть единый корень файловой системы: "/" (root). Это начало всего. Не зря суперпользователь в Unix так же носит имя "root". Все остальные файловые системы монтируются, как ветки общего дерева.

Это ещё не всё. Все объекты в Unix это файлы. С точки зрения программиста, программа обращается к файлу с помощью четырех системных вызовов: open(), read(), write() и close(). Таким образом, всё, с чем можно работать через данные вызовы, это файлы. Хотя, например в Linux, файлы в каталоге /proc не существуют физически. Это лишь представление внутренних данных ядра в виде файлов. Но работать с ними можно как с файлами. Это просто, универсально и удобно.

В операционной системе Unix есть следующие типы файлов:
  • обычный файл (или жесткая ссылка),
  • каталог,
  • символическая ссылка,
  • блочное и символьное устройства,
  • именованный канал и доменный сокет Unix.

Обычный файл в Unix может быть многоликим, то есть иметь больше одного имени или жестких ссылок. Причем, это будут просто жесткие ссылки на один и тот же фрагмент памяти на жестком диске, который называется inode. 

Каталоги это тоже файлы. Файлы, содержащие список имён файлов с ссылками на inode (рис. 2). 

Рис. 2. Схема хранения файлов в Unix.

Inode хранит атрибуты файла, такие как тип файла, владелец, группа, права доступа, временные метки, и указатели на блоки данных. Про права доступа в Unix я писал в посте "Oracle + Unix: полномочия на директории". Пока на inode файла существует хоть одна жесткая ссылка, файл удален не будет. Стоит еще отметить, что таблица inodes существует в рамках файловой системы и жесткие ссылки могут быть созданы только внутри одной файловой системы.

Для указания на файлы из других файловых систем существуют символьные ссылки. Которые не что иное, как просто указатель на существующий файл в каком-либо каталоге. Пример использования символьных ссылок на файлы устройств для ленточной библиотеки я описывал в посте "Подружить кластер и brbackup/brarchive".

Блочные и символьные устройства - это файлы, через которые можно работать с теми или иными физическими устройствами. Например, устройство записи на магнитные ленты (символьное), жесткие диски (блочное).

Именованные каналы и сокеты используются для организации взаимодействия между разными программами.

Тип файла отображается в результатах команды ls, в виде первого символа перед правами доступа (рис. 3).

Рис. 3. Пример вывода команды ls.

Прочерк - признак обычного файла, d - каталога, l - ссылки и так далее.

Команда find, про которую я рассказывал в посте "HP-UX. Многоликая команда find", может помочь найти те или иные типы файлов. Например, сокеты (рис. 4).

Рис. 4. Пример вывода результатов поиска сокетов Unix.

Одной из основных задач администратора операционной системы является задача по мониторингу места в файловых системах. Необходимо следить за ростом данных, свободным местом и, освобождать место, если оно вдруг закончилось.

В посте "Файл-пустышка" я уже затрагивал эту тему применительно к одной директории. Я рассказал как создать небольшую заглушку в директории, содержащей оффлайн журналы Oracle. Чтобы в случае заполнения файловой системы до 100% срочно освободить немного места одной командой. В ситуациях отсутствия необходимого пространства в данной директории - это место нужно, как глоток свободного воздуха. Иначе база данных Oracle просто "подвиснет", как и SAP система, которая работает на ней.

Просмотреть место в файловых системах поможет команда df (рис. 5).

Рис. 5. Пример вывода команды df в операционной системе Linux.

Данная команда показывает общее количество блоков (1 Кб), занятых (в Кб и процентах) и свободных блоков по каждой смонтированной файловой системе.

В операционной системе HP-UX более читабельной является команда bdf (рис. 6).

Рис. 6. Пример вывода команды bdf в операционной системе HP-UX.

Если свободное пространство где-то резко уменьшилось, то необходимо выяснить кто и чем его занял. В этом случае поможет команда du. Например,
 # du -ks ./* 
отобразит все каталоги в текущей директории и занимаемое ими пространство в файловой системе в Кб (рис. 7). Опция -k - отображает результаты в Кб, а ключ -s - диктует отображать только суммарное значение занимаемого пространства по каждой директории.

Рис. 7. Пример списка каталогов в директории /var с их размерами.

Еще очень хороший вариант (рис. 8):
 # du -xks / 
Рис. 8. Пример вывода команды, отображающей занимаемое пространство в корневой файловой системе.

При использовании ключа -х команда отображает занимаемое пространство только файлами корневой файловой системы, без других смонтированных файловых систем.

Таким образом, при выявлении проблем с пространством в файловых системах Unix необходимо руководствоваться следующим алгоритмом:
  1. С помощью команд df (bdf) проанализировать файловые системы и свободное пространство в них.
  2. Перейти в необходимую файловую систему и проанализировать пространство, занимаемое каждой директорией, с помощью команды du с необходимыми опциями.
  3. Спуститься по дереву каталогов до конца, собрав информацию по пространству.
  4. Принять решение по удалению файлов, если это возможно, или расширению файловой системы.

Так же для поиска старых, самых больших или определённых файлов (например, дампов core) можно воспользоваться командой find, про которую я писал в посте "HP-UX. Многоликая команда find".

Дополнительные ключи и опции команд Unix или Linux всегда можно найти в справке man, набрав команду вида:
 # man <command_name> 

P.S. Для Linux есть различные графические утилиты, которые помогают визуализировать занимаемое пространство. Но еще раз повторюсь, команды из командной строки это самый универсальный инструмент, который есть во всех дистрибутивах, версиях и более или менее постоянен.




Комментариев нет:

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