Pts linux что это

Обновлено: 04.07.2024

Даже так называемые уровни выполнения системы (runlevels . и здесь), представляют собой удобный способ определения группы выполняющихся процессов и, соответственно, функциональности системы.

Модель процесса

В многозадачной системе процессор переключается между программами, предоставляя каждой от десятков до сотен миллисекунд. При этом в каждый конкретный момент времени процессор занят только одной программой, но за секунду он успевает поработать с несколькими программами,
создавая у пользователей иллюзию параллельной работы со всеми программами. Иногда в этом контексте говорят о псевдопараллелизме, в отличие от настоящего параллелизма в многопроцессорных системах (в которых установлено два и более процессора, разделяющих между собой общую физическую память). Следить за работой параллельно идущих процессов достаточно трудно, поэтому со временем разработчики операционных систем разработали концептуальную модель последовательных процессов, упрощающую эту работу. В этой модели все функционирующее на компьютере программное обеспечение, иногда включая собственно операционную систему, организовано в виде набора последовательных процессов, или, для краткости, просто процессов.
Процессом является выполняемая программа, включая текущие значения счетчика команд,
регистров и переменных. Процесс основная еденица работы для операционной системы в машинах третьего поколения С позиций данной абстрактной модели, у каждого процесса есть собственный виртуальный центральный процессор. На самом деле, разумеется, реальный процессор переключается с процесса на процесс, но для лучшего понимания системы значительно проще рассматривать набор процессов, идущих параллельно (псевдопараллельно), чем пытаться представить себе процессор, переключающийся от программы к программе, это переключение и называется многозадачностью или мультипрограммированием.
В условиях многозадачности каждый процесс имеет свою управляющую логику (то есть логический счетчик команд) идущую (идущие) не зависимо друг от друга.Разумеется, на самом деле существует только один физический счетчик команд, в который загружается логический счетчик команд текущего процесса. Когда время, отведенное текущему процессу, заканчивается, физический счетчик команд сохраняется в логическом счетчике команд процесса в памяти.

Программы и процессы

Обычно программой называют совокупность файлов, будь то набор исходных текстов, объектных файлов или собственно выполняемый файл. Для того чтобы программа могла быть запущена на выполнение, операционная система сначала должна создать окружение или среду выполнения задачи , куда относятся ресурсы памяти, возможность доступа к устройствам ввода/вывода и различным системным ресурсам, включая услуги ядра. Это окружение (среда выполнения задачи) получило название процесса . Мы можем представить процесс как совокупность данных ядра системы, необходимых для описания образа программы в памяти и управления ее выполнением . Мы можем также представить процесс как программу в стадии ее выполнения, поскольку все выполняющиеся программы представлены в UNIX в виде процессов . Процесс состоит из инструкций (

команд) , выполняемых процессором ( совокупность отдельных операций процессора, определенных единой системой команд ) , данных и информации о выполняемой задаче , такой как размещенная память, открытые файлы и статус процесса.

С каждым процессом связывается его адресное пространство — список адресов в памяти от некоторого минимума (обычно нуля) до некоторого максимума, которые процесс может прочесть и в которые он может писать. Адресное пространство содержит саму программу, данные к ней и ее стек. Со всяким процессом связывается некий набор регистров, включая счетчик команд, указатель стека и другие аппаратные регистры, плюс вся остальная информация, необходимая для запуска программы.

В то же время не следует отождествлять процесс с программой хотя бы потому, что программа может породить более одного процесса. (Программа — согласно ГОСТ 19781­90 — данные, предназначенные для управления конкретными компонентами системы обработки информации в целях реализации определённого алгоритма.) Простейшие программы, например, команда who или cat , при выполнении представлены только одним процессом. Сложные задачи, например системные серверы (печати, FTP, Telnet), порождают в системе несколько одновременно выполняющихся процессов. Операционная система UNIX является многозадачной. Это значит, что одновременно может выполняться несколько процессов, причем часть процессов могут являться образцами одной программы. Различие между процессом и программой трудноуловимо и тем не менее имеет принципиальное значение.
Выполнение процесса заключается в точном следовании набору инструкций, который никогда не передает управление набору инструкций другого процесса. Процесс считывает и записывает информацию в раздел данных и в стек, но ему недоступны данные и стеки других процессов.

В то же время процессы имеют возможность обмениваться друг с другом данными с помощью предоставляемой UNIX системой межпроцессного взаимодействия. В UNIX существует набор средств взаимодействия между процессами, таких как:

Типы процессов

Системные процессы

Системные процессы являются частью ядра и всегда расположены в оперативной памяти. Системные процессы не имеют соответствующих им программ в виде исполняемых файлов и запускаются особым образом при инициализации ядра системы. Выполняемые инструкции и данные этих процессов находятся в ядре системы, таким образом они могут вызывать функции и обращаться к данным, недоступным для остальных процессов. Системными процессами являются:
  • shed (диспетчер свопинга),
  • vhand (диспетчер страничного замещения),
  • bdfflush (диспетчер буферного кэша)
  • kmadaemon (диспетчер памяти ядра).
К системным процессам следует отнести init, являющийся прародителем всех остальных процессов в UNIX. Хотя init не является частью ядра, и его запуск происходит из исполняемого файла (/etc/init), его работа жизненно важна для функционирования всей системы в целом.

Демоны

Прикладные процессы

К прикладным процессам относятся все остальные процессы, выполняющиеся в системе. Как правило, это процессы, порожденные в рамках пользовательского сеанса работы. С такими процессами мы сталкиваемся чаще всего. Например, запуск команды ls породит соответствующий процесс этого типа. Важнейшим пользовательским процессом является основной командный интерпретатор login shell , который обеспечивает нашу работу в UNIX. Он запускается сразу же после регистрации в системе, а
завершение работы login shell приводит к отключению от системы. Инициатором login является программа getty (сокращение от get teletype) .Программа выводит приглашение и ожидает активности пользователя, который может захотеть работать именно на этом терминале. Введённое входное имя getty передаёт программе login , которая вводит пароль и определяет, разрешено ли работать в системе с этим входным именем и этим паролем. Если login приходит к выводу, что работать можно, он запускает стартовый командный интерпретатор, посредством которого пользователь и командует системой.

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

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

Вы сможете работать с другими приложениями, если в функции интерактивного процесса входит запуск на выполнение других программ. Примером такой задачи является командный интерпретатор shell , который считывает пользовательский ввод и запускает соответствующие задачи. Более типичным в данном контексте является процесс, порожденный командой ps . Пока ps не завершит работу, вы не сможете вводить команды shell .

Атрибуты процесса

Процесс в UNIX имеет несколько атрибутов, позволяющих операционной системе эффективно управлять его работой, важнейшие из которых рассмотрены ниже.

Идентификатор процесса Process ID (PID)

Каждый процесс имеет уникальный идентификатор PID, позволяющий ядру системы различать процессы. Когда создается новый процесс, ядро присваивает ему следующий свободный (т. е. не ассоциированный ни с каким процессом) идентификатор. Присвоение идентификаторов происходит по возрастающий, т. е. идентификатор нового процесса больше, чем идентификатор процесса, созданного перед ним. Если идентификатор достиг максимального значения, следующий процесс получит минимальный свободный PID и цикл повторяется. Когда процесс завершает свою работу, ядро освобождает занятый им идентификатор.

Идентификатор родительского процесса Parent Process ID (PPID)

Идентификатор процесса, породившего данный процесс.

Приоритет процесса (Nice Number)

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

Терминальная линия (TTY)

Терминал или псевдотерминал, ассоциированный с процессом, если такой существует. Процессы-демоны не имеют ассоциированного терминала.

Реальный (RID) и эффективный (EUID) идентификаторы пользователя

  • RID Реальным идентификатором пользователя данного процесса является идентификатор пользователя, запустившего процесс.
  • EUID Эффективный идентификатор служит для определения прав доступа процесса к системным ресурсам (в первую очередь к ресурсам файловой системы).

Реальный (RGID) и эффективный (EGID) идентификаторы группы

  • RGID Реальный идентификатор группы равен идентификатору первичной или текущей группы пользователя, запустившего процесс.
  • EGID Эффективный идентификатор служит для определения прав доступа к системным ресурсам по классу доступа группы.

Жизненный путь процесса

Процесс в UNIX создается системным вызовом fork . Процесс, сделавший вызов fork называется родительским, а вновь созданный процесс — дочерним. Новый процесс является точной копией породившего его процесса . Как это ни удивительно, но новый процесс имеет те же инструкции и данные, что и его родитель. Более того, выполнение родительского и дочернего процесса начнется с одной и той же инструкции, следующей за вызовом fork . Единственно, чем они различаются — это идентификатором процесса PID (не совсем это так --->> [3]) . Каждый процесс имеет одного родителя, но может иметь несколько дочерних процессов.

В UNIX запуск на выполнение новой программы часто связан с порождением нового процесса, таким образом сначала процесс выполняет вызов fork , порождая дочерний процесс, который затем
выполняет ехес, полностью замещаясь новой программой. Важно понимать разницу между системными вызовами fork и exec Системный вызов fork создает новый процесс, у которого пользовательский контекст совпадает с пользовательским контекстом процесса-родителя.
Системный вызов exec изменяет пользовательский контекст текущего процесса, не создавая новый процесс, можно понимать это как наложение образа программы на выполняемый процесс.

Рассмотрим эту схему на примере.

Допустим, пользователь, работая в командном режиме (в командном интерпретаторе shell) запускает команду ls .Текущий процесс ( shell ) делает вызов fork , порождая вторую копию shell . В свою очередь, порожденный shell вызывает ехес , указывая в качестве параметра имя исполняемого файла, образ которого необходимо загрузить в память вместо кода shell . Код ls замещает код порожденного shell , и утилита ls начинает выполняться. По завершении работы ls созданный процесс "умирает". Пользователь вновь возвращается в командный режим.

До того, как компьютер вышел, люди уже использовали устройство, называемое телетайп, для передачи информации между собой, которая выглядит следующим образом:

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

1.2 После появления компьютеров, поддерживающих многозадачность

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

Есть две основные причины использования телетайпа (личное мнение):

На самом деле уже существует большое количество телетайпов разных производителей, которые могут в полной мере использовать имеющиеся ресурсы

Сеть телетайпа является относительно зрелой, и ее удобно подключать.

Таким образом, связь развивается так:

Терминал слева - это множество телетайпов

Модем используется по обе стороны от физической линии, что мы часто называем «кошкой», потому что сеть постепенно развивается, и каждый может разделить соединение. (Предположительно, это может быть неправильно)

UART можно понимать как устройство, которое преобразует сигнал телетайпа в сигнал, распознаваемый компьютером.

1.3 Подсистема ядра TTY

Для поддержки этих телетайпов компьютер спроектировал подсистему с именем TTY со следующей внутренней структурой:

Интерфейс драйвера UART с внешним устройством UART

Линейная дисциплина в основном заключается в некоторой обработке входных и выходных данных, можно понять, что она является частью драйвера TTY

Драйвер TTY используется для обработки различных оконечных устройств

Процессы в пользовательском пространстве взаимодействуют с терминалом через драйвер TTY

Для простоты драйвер UART и дисциплина Line не перечислены отдельно в следующем введении, их можно рассматривать как часть драйвера TTY

1.4 TTY оборудование

Для каждого терминала драйвер TTY создаст соответствующее ему устройство TTY. Если подключено несколько терминалов, это выглядит так:

Когда драйвер получает терминальное соединение, он создаст соответствующее tty-устройство в соответствии с моделью и параметрами терминала (имя устройства на рисунке выше называется ttyS0, потому что большинство терминальных соединений являются последовательными соединениями), потому что каждый терминал может Не то же самое, с их собственными специальными командами и привычками использования, поэтому конфигурация каждого устройства tty может быть разной. Например, когда вы нажимаете клавишу удаления, некоторые могут удалить предыдущий символ, а некоторые могут удалить задний символ. Если вы не сконфигурируете права, это приведет к тому, что некоторые клавиши не будут соответствовать вашему желанию. Это также, когда мы используем аналоговый терминал. Если конфигурация по умолчанию не соответствует нашим привычкам, вам необходимо выполнить некоторые личные настройки.

Позже, с непрерывным развитием компьютеров, эти типы оборудования телетайпа постепенно исчезли. Нам больше не нужно специальное оконечное оборудование. У каждой машины есть своя клавиатура и дисплей. Каждая машина может быть терминалом других машин. ssh для достижения, но архитектура драйвера TTY ядра не изменилась. Мы хотим взаимодействовать с процессами в системе через ввод-вывод, или нам нужно пропустить устройство TTY, поэтому появилось различное программное обеспечение эмуляции терминала, и эмуляция также распространена. Несколько терминалов, таких как VT100, VT220, XTerm и др.

Вы можете получить список всех типов терминалов, поддерживаемых системой, с помощью команды toe -a

Вы можете использовать команду infocmp для сравнения различий между двумя терминалами, например, infocmp vt100 vt220 выведет разницу между vt100 и vt220.

Прежде чем обсуждать, как создаются и настраиваются устройства TTY, давайте посмотрим, как TTY используется процессами:

Сначала используйте команду tty, чтобы увидеть, с каким tty связан текущий bash

Посмотрите, какие процессы открыты tty

$ echo aaa > /dev/pts/8
aaa

Оч тоже tty устройство, и их отношения будут представлены позже

Как видно из вышеприведенного lsof, stdin (0u), stdout (1u) и stderr (2u) текущих процессов bash и lsof связаны с этим TTY.

Ниже приведена структурная схема взаимодействия между tty и процессом и устройством ввода-вывода:

Tty можно понимать как канал, а содержимое, записанное на одном конце, может быть прочитано с другого конца, и наоборот.

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

В tty есть очень важный атрибут, называемый группой процессов Foreground, который записывает текущую интерфейсную группу процессов. Концепция группы процессов будет представлена ​​в следующей статье, где мы можем просто подумать, что в группе процессов есть только один процесс.

Когда pts / 1 получает входные данные от входа, он проверяет, какая из них является текущей внешней группой процессов, а затем помещает входные данные во входной буфер лидера группы процессов, чтобы соответствующий процесс лидера мог получить ввод пользователя через функцию чтения.

Когда процессы в группе внешних процессов записывают данные на tty-устройство, tty выводит данные на устройство вывода

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

Сначала киньте два вопроса (ответ есть позже):

  • Что происходит, когда процесс (фоновый процесс) в группе внешних процессоров записывает данные на tty-устройство? Будет ли вывод на outpu?
  • Что происходит, когда процесс (фоновый процесс) в группе внешних процессоров считывает данные с tty-устройства? Будет ли процесс блокироваться?

Далее описывается, как создать tty-устройство в нескольких распространенных ситуациях, и каковы устройства ввода и вывода.

Монитор клавиатуры подключен напрямую (терминал)
Посмотрите на картинку, прежде чем говорить:

Клавиатура и монитор подключены к эмулятору терминала в ядре. Эмулятор определяет количество создаваемых ttys. Например, когда вы набираете ctrl + alt + F1 на клавиатуре, эмулятор сначала захватывает ввод, а затем активирует tty1, чтобы ввод с клавиатуры Он будет перенаправлен на tty1, а вывод tty1 будет перенаправлен на дисплей.Так же, используйте ctrl + alt + F2 для переключения на tty2.

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

При переключении на tty2, где будет выводиться вывод в tty1? Вывод tty1 по-прежнему будет выводиться в эмулятор. В эмуляторе будет кэш каждого tty. Однако из-за ограниченного пространства кэш-памяти эмулятора, когда вы в следующий раз вернетесь к tty1, вы сможете увидеть только самый последний вывод, предыдущий вывод Ушел

Не уверен, какому конкретному модулю в ядре соответствует эмулятор терминала, но должна быть такая вещь

Терминал здесь может быть программой из любой точки мира, например, замазкой в ​​Windows, поэтому я не буду обсуждать, как клиентская программа терминала взаимодействует с клавиатурой и дисплеем. Так как Терминал должен иметь дело с сервером ssh, он должен реализовать клиентскую функцию ssh.

Здесь установление соединения, а также отправка и получение данных объясняются в двух строках.Для краткого описания вместо программы ssh-сервера используется sshd:

4.1 Установление связи

Терминал просит установить соединение с sshd

Если проверка пройдена, sshd создаст новый сеанс

Вызовите API (posix_openpt ()), чтобы запросить ptmx для создания pts. После успешного создания sshd получит fd, связанный с ptmx, и свяжет fd с сеансом.

  1. В то же время sshd создает процесс оболочки и связывает вновь созданные очки с оболочкой.

Терминал получает ввод с клавиатуры, а Терминал отправляет данные в sshd по протоколу ssh.

После получения данных от клиента sshd находит соответствующий fd на ptmx, соответствующий клиенту, в соответствии с сеансом, которым он управляет.

Запишите данные, отправленные клиентом в найденный файл

После получения данных ptmx находит соответствующие точки в соответствии с fd (соответствующая взаимосвязь автоматически поддерживается ptmx) и перенаправляет пакет данных в соответствующие точки

После получения пакета данных pts проверяет текущую группу внешних процессов, связанную с ним, и отправляет пакет данных руководителю группы процессов.

Поскольку на pts есть только оболочка, функция чтения оболочки получает пакет

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

Оболочка записывает результат в pts через функцию записи

pts пересылает результат в ptmx

ptmx находит соответствующий fd согласно pts и записывает результат в fd

После получения результата fd sshd находит соответствующий сеанс и отправляет результат соответствующему клиенту.

Из вышеприведенного процесса должно быть видно, что для программ пользовательского пространства они ничем не отличаются, они одинаковы: из ядра другой конец pts подключен к ptmx, а другой конец tty подключен Это эмулятор терминала ядра. Как ptmx, так и эмулятор терминала отвечают только за поддержание сеансов и пересылку пакетов данных, посмотрите на другой конец ptmx и эмулятор терминала ядра. Другой конец ptmx подключен к приложениям пользовательского пространства, таким как sshd Tmux и т. Д., А другой конец эмулятора терминала ядра подключен к определенному оборудованию, например клавиатуре и монитору.

7.1 rows 51; columns 204;

Эта конфигурация обычно контролируется терминалом. Когда размер окна терминала изменяется, конфигурация должна быть изменена определенными средствами. Например, есть параметр для изменения размера окна в протоколе ssh. После получения запроса клиента sshd изменит tty через API Этот параметр затем сообщается tty внешней программе (такой как shell или vim) через сигнал SIGWINCH.После получения сигнала внешняя программа считывает этот параметр tty и затем знает, как отрегулировать свою схему вывода.

7.2 intr = ^C

В дополнение к пересылке данных между терминалом и внешним процессом tty также поддерживает множество команд управления. Например, если терминал вводит CTRL + C, tty не пересылает входную строку во внешний процесс, но преобразует ее в сигнал SIGINT и отправляет ее. Дай фронтэнд процесс. Это используется для настройки входной комбинации, соответствующей команде управления. Например, мы можем настроить «intr = ^ E» для использования CTRL + E вместо CTRL + C.

Он pts/0 сообщает вам, на каком «псевдо-терминале» вошел пользователь. В данном случае это терминал № 0. «(: 0.0)» говорит вам, какое имя хоста и дисплей вы используете.

who am i это псевдоним команды who -m . Смотрите man-страницу для кого . Вы также можете прочитать о who команде здесь .

Вывод может определенно запутать новичка в Unix.

Примеры

шоу -m такое же как am i

подключен к некоторой удаленной системе

локально на моем ноутбуке

Последний бит, который все еще может сбить вас с толку, это :0.0 . Вот как X Windows представляет «дисплей», на котором находится пользователь. Первое «0» указывает, на каком мониторе / устройстве вы находитесь, второе «0» указывает, на каком виртуальном дисплее вы находитесь.

Это восходит к тем дням, когда компьютеры были дорогими, и поэтому несколько человек могли работать на одном компьютере одновременно. Я бы не беспокоился об этом, просто помните, что это будет либо «: 0.0», либо, возможно, «: 0». Переменная окружения «DISPLAY» и команда xhost используют значение «: 0.0».

Подробнее об удаленном отображении в Unix вы можете прочитать здесь .

whoami против who am i

Разве они не одна и та же команда? Нет, они разные

Также их вывод совершенно другой; whoami просто показывает ваш эффективный идентификатор пользователя, а who am i показывает информацию о соединении вашего терминала:

Смотрите whoami страницу руководства здесь .

Другое важное отличие состоит в том, что sudo whoami выходные данные не будут совпадать sudo who am i .

pts обозначает псевдотерминал раб. Терминал (или консоль) традиционно представляет собой комбинацию клавиатуры и экрана, на которой вы сидите и печатаете. В старых коробках UNIX десятки из них висели сзади, и все они были связаны с милями кабеля. Псевдотерминал предоставляет точно такое же средство только без аппаратного обеспечения. Другими словами, это окно xterm или окно консоли, или любая другая утилита, которую вы используете. Они всплывают в жизни, когда вы их просите и получаете последовательные числа: pts / 0 , затем pts / 1 и так далее. Физическая консоль - это аппаратное обеспечение, которое фактически подключено к вашему устройству - у вас, вероятно, есть только одно. Это помечено " : 0 " и называется фактической "консолью".

вы найдете pts / 0 в списке, who если есть удаленное соединение с ssh :

Я один и единственный на моей машине:

Я подключен с другого компьютера к серверу ssh, поэтому я открыл удаленный терминал:

Вроде бы, pts - это вкладки эмулятора терминала, типа konsole или gnome-terminal, может и screen.

Да это понятно, но почему who -la показывает PID 35362 для pts/19 а top этого не показывает. Нету такого PID и убить его стало быть нельзя

В вывод top -а точно влезают все текущие процессы?
Попробуйте ps -A -f

CСкорее всего это осиротевшие процессы, процессы зомби "Процесс при завершении освобождает все свои ресурсы (за исключением PID — идентификатора процесса) и становится «зомби» — пустой записью в таблице процессов, хранящей код завершения для родительского процесса." Я посмотрел и на Сентосе команда who -la тоже показывает осиротевшие процессы

who показывает и завершённые сессии, если на их месте не было открыто новых. Для таких сессий не показывается имя (первая колонка), но показывается информация о выходе (последняя колонка). И нет, процессы-зомби тут ни при чём.

Мудрость приходит с возрастом.
Иногда возраст приходит один.
Linux это просто

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

Здесь я смотрю уже пытались убить зомби без перезагрузки
Zombi процессы

В общем чтобы не морочить голову я перегрузился и эти процессы pts и tty пропали а остались реальные удаленный терминал и экран

Я же вам писал, это не зомби-процессы, это закрытые сессии.

who показывает и завершённые сессии, если на их месте не было открыто новых.

Только непонятно, новых сессий или любых других процессов с таким же PID?

Только непонятно, новых сессий или любых других процессов с таким же PID?

Новых сессий на том же tty/pty. В случае той сессии, которую ТС пытался убить - на /dev/pts/19.

А на FreeBSD who -a вообще не показывает завершенные процессы а только реальные

А как оно вообще до №19 дошло, где предыдущие? Пусть даже он открывал ещё 18, на месте старых должны быть новые незавершённые? ИНкремент ведь по порядку чисел, по возрастающей идёт, не вразброс же?

А как оно вообще до №19 дошло, где предыдущие? Пусть даже он открывал ещё 18, на месте старых должны быть новые незавершённые? ИНкремент ведь по порядку чисел, по возрастающей идёт, не вразброс же?

Добавление записи в файл сессий, из которого читает who, производится по усмотрению программы, открывающей эту сессию. Многие эмуляторы терминалов этим не заморачиваются, а псевдотерминал создают. tmux, например. Или gnome-terminal. Это наиболее вероятное объяснение.

Работа с устройствами в Linux очень сильно отличается от Windows. Главная концепция Linux в том, что все есть файл, не только пользовательские файлы с информацией, но и различные настройки ядра, подключенные устройства, память, сетевые соединения, все это представлено в виде файлов, которые размещены в специальных файловых системах.

С помощью этих файлов система работает с устройствами, и вы можете ими управлять с помощью различных утилит. В этой статье мы рассмотрим как выполняется работа с устройствами Linux, что из себя представляют устройства Linux, а также рассмотрим несколько примеров создания файлов устройств и обращения к ним. Это довольно интересная тема.

Файлы устройств Linux

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

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

dboth-dev-dir_0

На схеме приведена схема передачи данных для команды cat /etc/resolv.conf. Вы выполняете команду из терминала, утилита отправляет запрос файла драйверу, который ищет файл на диске и читает его содержимое. Данные передаются через файл устройства, а затем опять же, через файл устройства псевдо-терминала передаются в эмулятор терминала 6, где они будут отображены.

Если мы перенаправим вывод команды в файл, например, cat /etc/resolv.conf > /etc/resolv.bak, то левая часть схемы останется неизменной, а правая сторона будет вести к файлу устройства /dev/sda2. Эти устройства делают очень простым использование стандартных потоков ввода/вывода для доступа к каждому устройству. Простое перенаправление потока данных в файл устройства приведет к записи данных на устройство.

Классификация файлов устройств

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

Если вы еще этого не делали, то перейдите в папку /dev/ и посмотрите список находящихся там файлов с помощью команды ls. Вы увидите очень длинный список файлов с их правами доступа, владельцами и группами - это список устройств linux. Обратите внимание на самый первый символ в каждой строке. Он указывает тип устройства. Символом "b" - обозначаются блочные устройства linux (block), а символом "c" - символьные (character).

device

Более точно можно идентифицировать устройства по их младшему и старшему номеру. Например, жесткие диски имеют старший номер 8, что обозначает их как блочные устройства SCSI. Обратите внимание, что все жесткие диски PATA и SATA находятся под управлением SCSI. Раньше использовалась подсистема ATA, но она уже устарела, поэтому диски, которые раньше обозначались как hd[a-z] теперь обозначаются sd[a-z].

Младший номер диска означает раздел устройства, например, номера 8/0 - это весь диск /dev/sda, а 8/1 уже файл первого раздела на диске, 8/6 - /dev/sda6. Файлы TTY именуются немного по-другому, от tty0 до tty63. Все значения старших номеров устройств Linux вы можете найти на официальном сайте ядра.

Работа с устройствами в Linux

Давайте проведем несколько экспериментов, которые помогут вам понять как работают устройства Linux и как ими управлять в этой операционной системе. Большинство дистрибутивов Linux имеют несколько виртуальных консолей, обычно от 1 до 7, которые могут использоваться для входа в сеанс командной оболочки. К этим виртуальным консолям можно получить доступ с помощью сочетаний клавиш Ctrl+Alt+Fn, например, Ctrl+Alt+F1 для первой консоли, Ctrl+Alt+F2 для второй и так далее.

Сейчас нажмите Ctrl+Alt+F2 для перехода во вторую консоль, в некоторых дистрибутивах, кроме запроса логина и пароля, будет выведена информация про активную TTY связанную с этой консолью. Но этой информации может и не быть. В данном случае консоль будет связана с устройством tty2.

Войдите от имени обычного пользователя, затем наберите такую команду, чтобы посмотреть номер устройства tty:

device4

У меня вы видите устройство /dev/pts/0, это виртуальное устройство эмулятора терминала, но если вы будете выполнять задачу в tty2, то отобразиться именно она. Теперь давайте посмотрим список tty устройств с помощью команды ls:

device1

Нас будут интересовать не все устройства, а только первые три. В этих устройствах нет ничего особенного, это обычные устройства символьного типа. Устройство tty2 подключено к консоли 2, устройство tty3 подключено к консоли 3.

Нажмите сочетание клавиш Ctrl+Alt+F3, чтобы переключиться в третью консоль, затем выполните команду:

echo "Hello world" > /dev/tty2

device6

Затем вернитесь во вторую консоль. Здесь вы увидите отправленную строку, Hello World. Все это можно повторить с помощью эмуляторов терминала в графическом интерфейсе, только здесь будут использоваться псевдо-терминальные устройства /dev/pts/*. Теперь попробуем отобразить содержимое файла fstab с помощью cat в другом терминале:

cat /etc/fstab > /dev/tty2

device5

cat test.pdf > /dev/usb/lp0

Каталог /dev/ содержит много интересных файлов устройств. Это интерфейсы доступа к аппаратному обеспечению и вам не нужно думать, что это, жесткий диск или экран. Например, вся оперативная память компьютера доступна в виде устройства /dev/mem. С помощью него вы можете иметь прямой доступ к памяти. Мы можем вывести содержимое памяти в терминал:

dd if=/dev/mem bs=2048 count=100

device2

Утилита dd, в отличие от cat дает больше контроля над процессом и позволяет указать сколько данных нужно прочитать. Но не ко всей памяти вы можете получить доступ. В ядре встроена защита, поэтому обычно, вы можете читать память, только для своего процесса.

Также тут есть файлы, которые несвязанны ни с какими реальными устройствами, это null, zero, random и urandom. Устройство /dev/null может использоваться для перенаправления вывода команд, чтобы данные никуда не выводились. Устройство /dev/zero используется для получения строки, заполненной нулями.

Вы можете использовать ту же команду dd, чтобы попытаться вывести ряд символов с устройства /dev/null:

dd if=/dev/null bs=512 count=500 | od -c

device7

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

Устройства /dev/random и /dev/urandom позволяют получить случайные комбинации чисел или байт. Вы можете использовать такую команду, чтобы получить случайные байты информации:

device3

Для остановки нажмите Ctrl+C. Устройство urandom позволяет генерировать случайные последовательности независимые от предыдущего числа, в качестве источника энтропии используется нажатия клавиш и движения мыши.

Устройство /dev/zero позволяет получить строку, заполненную нулями. Для проверки используйте такую команду:

dd if=/dev/zero bs=512 count=500 | od -c

device8

Обратите внимание, что восьмеричные нули и нули ASCII это не одно и то же.

Создание устройств в Linux

В прошлом все устройства из каталога /dev создавались во время установки системы, а это означало, что каталог содержал все возможные поддерживаемые устройства, даже если они не использовались. Если вам нужно было создавать или переинициализировать файлы устройств, использовалась утилита mknod. Но для работы с ней вам нужно знать старший и младший номер устройства.

Сейчас ситуация изменилась и все файлы устройств linux создаются во время загрузки только для нужных устройств. Менеджер устройств следит за подключаемыми и отключаемыми устройствами и добавляет или удаляет соответствующие файлы. Вы можете убедиться, что устройства были созданы сейчас просмотрев дату создания в с помощью команды ls.

Команда mknod все еще есть, но уже существует более новая разработка - makedev. Она предоставляет очень простой интерфейс для создания устройств.

Выводы

В этой статье мы рассмотрели подключенные устройства linux, а также как выполняется работа с устройствами в Linux. Конечно, в одной статье невозможно полностью охватить такую огромную тему, но я надеюсь что у вас появились некоторые базовые навыки работы использования файлов устройств и эта статья была вам полезной.

Читайте также: