Часть 5 из 8
Устройства и сведения ядра: /dev, /proc, /sys
В этой части рассмотрим каталоги, содержимое которых не хранится на диске: файлы устройств в /dev и сведения о системе, которые ядро предоставляет через /proc и /sys.
5.1 Файлы устройств: /dev
В Linux к устройствам обращаются так же, как к файлам. Для каждого устройства в каталоге /dev есть специальный файл. Когда программа читает или записывает такой файл, ядро передаёт данные драйверу соответствующего устройства. Например, /dev/sda — первый диск целиком, /dev/sda1 — первый раздел на нём.
Файл устройства можно сравнить с розеткой: программа подключается к файлу, а данные уходят к устройству. Программе не нужно знать, как устроен конкретный диск или звуковая карта: она работает с файлом, а остальное делает драйвер.
Обращение к устройству проходит несколько звеньев: программа → файл устройства в /dev → ядро → драйвер → само устройство. Например, программа записи дисков открывает файл /dev/sr0, ядро передаёт данные драйверу оптического привода, а драйвер управляет приводом. Программе достаточно уметь работать с файлами.
Устройства делятся на символьные и блочные. Символьные устройства передают данные потоком байтов, блочные — блоками фиксированного размера, как диски. В выводе ls -l первая буква строки обозначает тип: c — символьное, b — блочное.
Особое устройство /dev/null принимает любые данные и уничтожает их. В него перенаправляют вывод, который не нужен. Поскольку на экране при этом ничего не появляется, успешность команды проверяют по коду завершения: оболочка хранит его в переменной $?, значение 0 означает успех.
Пример. При поиске по всей системе команда find выводит много сообщений «Permission denied» о каталогах, куда у пользователя нет доступа. Чтобы эти сообщения не мешали читать результат, их направляют в /dev/null: find / -name hosts 2>/dev/null.
ls -l /dev/null /dev/zero# сведения об устройствахчто делает
Что делает команда. Показывает сведения о двух специальных устройствах; буква c означает символьное устройство.
По частям:
ls- вывести содержимое каталога
-l- подробный список: права, владелец, размер, дата
/dev/null- что показать (абсолютный путь)
/dev/zero- что показать (абсолютный путь)
file /dev/null# тип объектачто делает
Что делает команда. Определяет тип объекта /dev/null — символьное устройство.
По частям:
file- определить, что находится в файле
/dev/null- какой файл проверить (абсолютный путь)
printf "test\n" > /dev/null# записать данные в /dev/nullчто делает
Что делает команда. Отправляет строку test в /dev/null — данные уничтожаются, на экране ничего не появляется.
По частям:
printf- вывести текст по шаблону
"test\n"- шаблон текста (\n — перевод строки)
>- записать вывод в файл; если файл есть, он будет перезаписан
/dev/null- файл, в который записывается вывод
printf "exit status: %s\n" "$?"# код завершения предыдущей командычто делает
Что делает команда. Печатает код завершения предыдущей команды; 0 означает, что она выполнилась успешно.
По частям:
printf- вывести текст по шаблону
"exit status: %s\n"- шаблон текста (\n — перевод строки; %s — место, куда подставится значение)
"$?"- код завершения предыдущей команды
lsblk -o NAME,TYPE,SIZE,MOUNTPOINTS# блочные устройства: диски и разделычто делает
Что делает команда. Показывает диски и разделы: имя, тип, размер и куда они подключены.
По частям:
lsblk- показать диски и разделы
-o NAME,TYPE,SIZE,MOUNTPOINTS- вывести только столбцы NAME,TYPE,SIZE,MOUNTPOINTS
- 1символьное устройство
- 2тип объекта по данным команды file
- 3код завершения 0 — запись выполнена
Весь снимок ↗Устройство /dev/null и список блочных устройств виртуальной машины.
Что показывает снимок. /dev/null — символьное устройство; запись в него прошла успешно с кодом 0; lsblk показывает диски и разделы.
Где это пригодится. Код завершения проверяют в скриптах, чтобы понять, выполнилась ли команда. lsblk используют, чтобы найти подключённый диск или флешку перед монтированием.
5.2 Сведения о процессах и системе: /proc
Каталог /proc не находится на диске. На нём смонтирована псевдофайловая система proc: её файлы создаёт ядро, а содержимое формируется в момент чтения. Через эти файлы можно узнать состояние системы: объём памяти, время работы, сведения о каждом запущенном процессе. Для каждого процесса в /proc есть каталог, названный его номером (PID).
Файлы /proc похожи на табло прибытия поездов на вокзале: табло не хранит расписание на месяц вперёд, а показывает текущее положение дел в тот момент, когда вы на него смотрите. Пример. Команды free (сколько свободно памяти) и top (список работающих процессов) берут данные из файлов /proc.
| Путь | Что содержит |
|---|---|
/proc/meminfo | сведения об оперативной памяти |
/proc/uptime | время работы системы в секундах |
/proc/cpuinfo | сведения о процессоре |
/proc/номер процесса/ | каталог конкретного процесса |
/proc/номер процесса/cwd | ссылка на текущий каталог процесса |
/proc/номер процесса/exe | ссылка на исполняемый файл процесса |
head -8 /proc/meminfo# сведения об оперативной памятичто делает
Что делает команда. Выводит первые восемь строк сведений об оперативной памяти, которые формирует ядро.
По частям:
head- оставить только первые строки
-8- сколько первых строк оставить: 8
/proc/meminfo- из какого файла (абсолютный путь)
echo $$# номер процесса текущей оболочкичто делает
Что делает команда. Печатает номер процесса текущей оболочки.
По частям:
echo- вывести текст или значение переменной
$$- номер процесса текущей оболочки
readlink /proc/$$/cwd# текущий каталог этого процессачто делает
Что делает команда. Показывает текущий каталог оболочки, узнавая его через /proc.
По частям:
readlink- показать, куда указывает символическая ссылка
/proc/$$/cwd- какую ссылку проверить (абсолютный путь; $$ — номер процесса текущей оболочки)
readlink /proc/$$/exe# исполняемый файл процессачто делает
Что делает команда. Показывает, какая программа выполняется в процессе оболочки, — /usr/bin/bash.
По частям:
readlink- показать, куда указывает символическая ссылка
/proc/$$/exe- какую ссылку проверить (абсолютный путь; $$ — номер процесса текущей оболочки)
findmnt -T /proc/meminfo -o TARGET,SOURCE,FSTYPE# тип файловой системычто делает
Что делает команда. Показывает, что /proc/meminfo находится на файловой системе proc, а не на диске.
По частям:
findmnt- показать подключённые файловые системы
-T /proc/meminfo- найти файловую систему, в которой лежит путь /proc/meminfo
-o TARGET,SOURCE,FSTYPE- вывести только столбцы TARGET,SOURCE,FSTYPE
- 1общий объём памяти
- 2память, доступная для новых программ
- 3номер процесса оболочки
- 4текущий каталог процесса
- 5файловая система proc
Весь снимок ↗Ядро предоставляет сведения о памяти и о процессе оболочки.
Что показывает снимок. Ядро выдаёт сведения о памяти и о процессе оболочки: его номер, текущий каталог и исполняемый файл.
Где это пригодится. Через /proc узнают, сколько памяти свободно и что делает конкретный процесс. На этих файлах основаны системные мониторы и диспетчеры задач.
Отличие файлов /proc от обычных видно на /proc/uptime, где первое число — время работы системы в секундах. Размер файла равен нулю, но при каждом чтении содержимое новое. Если скопировать файл, копия окажется обычным файлом на диске, и её содержимое меняться не будет.
cd ~/linux-fhs-labчто делает
Что делает команда. Переходит в рабочий каталог урока linux-fhs-lab.
По частям:
cd- сменить текущий каталог
~/linux-fhs-lab- куда перейти (путь от домашнего каталога)
rm -f saved-uptime.txt# удалить копию от прошлого запускачто делает
Что делает команда. Удаляет копию от прошлого запуска, если она есть; если файла нет, ошибки не будет.
По частям:
rm- удалить файл
-f- не выдавать ошибку, если файла нет
saved-uptime.txt- какой файл удалить (путь относительно текущего каталога)
ls -l /proc/uptime# размер файлачто делает
Что делает команда. Показывает сведения о файле /proc/uptime; его размер равен нулю.
По частям:
ls- вывести содержимое каталога
-l- подробный список: права, владелец, размер, дата
/proc/uptime- что показать (абсолютный путь)
cat /proc/uptimeчто делает
Что делает команда. Выводит время работы системы в секундах, которое ядро вычисляет в момент чтения.
По частям:
cat- вывести содержимое файла на экран
/proc/uptime- какой файл вывести (абсолютный путь)
cp /proc/uptime saved-uptime.txt# сделать копиючто делает
Что делает команда. Сохраняет текущее содержимое /proc/uptime в обычный файл saved-uptime.txt.
По частям:
cp- скопировать файл
/proc/uptime- что копировать (абсолютный путь)
saved-uptime.txt- куда копировать (путь относительно текущего каталога)
sleep 5# подождать 5 секундчто делает
Что делает команда. Ничего не делает пять секунд, чтобы следующее чтение показало новое значение.
По частям:
sleep- подождать указанное число секунд
5- 5 секунд
cat /proc/uptimeчто делает
Что делает команда. Выводит время работы системы в секундах, которое ядро вычисляет в момент чтения.
По частям:
cat- вывести содержимое файла на экран
/proc/uptime- какой файл вывести (абсолютный путь)
cat saved-uptime.txt# содержимое копиичто делает
Что делает команда. Выводит содержимое копии — оно не изменилось.
По частям:
cat- вывести содержимое файла на экран
saved-uptime.txt- какой файл вывести (путь относительно текущего каталога)
ls -l saved-uptime.txt# размер копиичто делает
Что делает команда. Показывает сведения о копии; у неё настоящий размер в байтах.
По частям:
ls- вывести содержимое каталога
-l- подробный список: права, владелец, размер, дата
saved-uptime.txt- что показать (путь относительно текущего каталога)
findmnt -n -o TARGET,FSTYPE -T /proc/uptime | cat# файловая система оригиналачто делает
Что делает команда. Коротко показывает, что оригинал лежит на файловой системе proc.
По частям:
findmnt- показать подключённые файловые системы
-n- не выводить строку заголовков
-o TARGET,FSTYPE- вывести только столбцы TARGET,FSTYPE
-T /proc/uptime- найти файловую систему, в которой лежит путь /proc/uptime
|- передать вывод левой команды на вход следующей
cat- вывести полученный текст как есть; findmnt тогда печатает простой список без рамок дерева
findmnt -n -o TARGET,FSTYPE -T saved-uptime.txt | cat# файловая система копиичто делает
Что делает команда. Коротко показывает, что копия лежит на обычной файловой системе.
По частям:
findmnt- показать подключённые файловые системы
-n- не выводить строку заголовков
-o TARGET,FSTYPE- вывести только столбцы TARGET,FSTYPE
-T saved-uptime.txt- найти файловую систему, в которой лежит путь saved-uptime.txt
|- передать вывод левой команды на вход следующей
cat- вывести полученный текст как есть; findmnt тогда печатает простой список без рамок дерева
- 1размер 0 байт
- 2два чтения с интервалом в пять секунд
- 3копия не изменилась
- 4оригинал на proc, копия на обычной файловой системе
Весь снимок ↗Содержимое /proc/uptime меняется при каждом чтении, содержимое копии — нет.
Что показывает снимок. Размер /proc/uptime равен нулю, но содержимое меняется при каждом чтении; копия на диске не меняется.
Где это пригодится. Сведения из /proc нельзя сохранить копированием на будущее. Чтобы следить за изменениями, файл читают заново, например в скрипте мониторинга.
5.3 Сведения об устройствах: /sys
Каталог /sys — ещё одна псевдофайловая система, sysfs. Если /proc в основном описывает процессы, то /sys описывает устройства и драйверы. Каждый файл в нём содержит одно значение — один параметр устройства. Например, в /sys/class/net перечислены сетевые интерфейсы компьютера.
Пример. На ноутбуке в /sys/class/backlight находятся параметры подсветки экрана, а в /sys/class/power_supply — сведения о батарее: уровень заряда и состояние зарядки. Регулятор яркости в настройках Ubuntu меняет значение именно в таком файле.
ls /sys# разделы /sysчто делает
Что делает команда. Показывает разделы /sys со сведениями об устройствах.
По частям:
ls- вывести содержимое каталога
/sys- что показать (абсолютный путь)
ls /sys/class/net# список сетевых интерфейсовчто делает
Что делает команда. Показывает сетевые интерфейсы, которые видит система.
По частям:
ls- вывести содержимое каталога
/sys/class/net- что показать (абсолютный путь)
cat /sys/class/net/lo/operstate# состояние интерфейса loчто делает
Что делает команда. Выводит состояние сетевого интерфейса lo.
По частям:
cat- вывести содержимое файла на экран
/sys/class/net/lo/operstate- какой файл вывести (абсолютный путь)
findmnt -T /sys -o TARGET,SOURCE,FSTYPEчто делает
Что делает команда. Показывает, что /sys находится на файловой системе sysfs.
По частям:
findmnt- показать подключённые файловые системы
-T /sys- найти файловую систему, в которой лежит путь /sys
-o TARGET,SOURCE,FSTYPE- вывести только столбцы TARGET,SOURCE,FSTYPE
- 1сетевая карта
- 2lo — внутренний интерфейс компьютера
- 3файловая система sysfs
Весь снимок ↗Сетевые интерфейсы виртуальной машины в /sys.
Что показывает снимок. В /sys/class/net перечислены сетевые интерфейсы, а файл operstate содержит состояние интерфейса.
Где это пригодится. Через /sys проверяют, какие сетевые карты видит система и включены ли они. Это помогает при настройке и диагностике сети.
Итоги части 5
- Устройства представлены специальными файлами в
/dev;c— символьные,b— блочные. - Код завершения последней команды хранится в
$?, 0 означает успех. /procи/sys— псевдофайловые системы: содержимое их файлов формирует ядро при чтении./procописывает процессы и состояние системы,/sys— устройства.
В отчётСнимок с /proc/uptime и его копией.