Команда mknod

Команда mknod позволяет задействовать одноименную утилиту, предназначенную для создания файлов устройств и именованных каналов. Вообще, данная команда практически не используется в наше время ввиду того, что файлы устройств создаются автоматически средствами подсистемы Udev, а файлы именованных каналов — средствами команды mkfifo, которая проще в использовании. Тем не менее, он не утратила своих свойств и может использоваться даже сейчас при определенных обстоятельствах.

Вообще говоря, файлы устройств являются специальными файлами, расположенными в виртуальной файловой системе /dev и используемыми главным образом для взаимодействия с аппаратным обеспечением. Каждый из таких файлов идентифицируется с помощью двух идентификаторов: основного идентификатора (major number) и вспомогательного идентификатора (minor number). Список доступных идентификаторов приведен в данном файле, а сами идентификаторы объявлены в коде ядра Linux. Что касается файлов именованных каналов, то это специальные файлы, которые могут быть расположены в любых точках файловой системы, предназначены для обмена данными между приложениями (или в рамках одного приложения) и представляют собой буферы в памяти, поддерживающие операции чтения и записи с блокировками. Разумеется, каждому из файлов устройств и именованных каналов соответствует структура inode, содержащая, в том числе, права доступа к нему. В случае работы с файлами устройств утилита потребует от пользователя прав root.

Базовый синтаксис команды выглядит следующим образом:

# mknod [параметры] имя-файла тип-файла [основной-идентификатор] [вспомогательный-идентифкатор]

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

Утилита поддерживает следующие типы файлов:

Тип Описание
b Файл блочного устройства (с поддержкой произвольного доступа к данным)
c Файл символьного устройства (позволяющего осуществлять лишь последовательное чтение или запись данных)
p Файл именованного канала

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

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

Вообще, создание файла устройства — абсолютно нетипичная задача в наше время. Тем не менее, в качестве примера можно рассмотреть процесс создания дополнительного файла loop-устройства для монтирования ISO-файла в ручном режиме. Данные файлы используются, в том числе, для монтирования файлов Snap-пакетов в дистрибутиве Ubuntu (для Snap-пакетов используется файловая система squashfs со сжатием).

Для начала следует получить список доступных в системе файлов loop-устройств:

$ ls -al /dev | grep loop
brw-rw----   1 root disk        7,   0 мар 22 14:09 loop0
brw-rw----   1 root disk        7,   1 мар 22 14:09 loop1
brw-rw----   1 root disk        7,  10 мар 22 14:09 loop10
brw-rw----   1 root disk        7,  11 мар 22 14:09 loop11
brw-rw----   1 root disk        7,  12 мар 22 14:09 loop12
brw-rw----   1 root disk        7,  13 мар 22 14:09 loop13
brw-rw----   1 root disk        7,  14 мар 22 14:09 loop14
brw-rw----   1 root disk        7,  15 мар 22 14:09 loop15
brw-rw----   1 root disk        7,  16 мар 22 14:09 loop16
brw-rw----   1 root disk        7,   2 мар 22 14:09 loop2
brw-rw----   1 root disk        7,   3 мар 22 14:09 loop3
brw-rw----   1 root disk        7,   4 мар 22 14:09 loop4
brw-rw----   1 root disk        7,   5 мар 22 14:09 loop5
brw-rw----   1 root disk        7,   6 мар 22 14:09 loop6
brw-rw----   1 root disk        7,   7 мар 22 14:09 loop7
brw-rw----   1 root disk        7,   8 мар 22 14:09 loop8
brw-rw----   1 root disk        7,   9 мар 22 14:09 loop9
crw-rw----   1 root disk       10, 237 мар 22 14:09 loop-control

Очевидно, что в системе существует семнадцать файлов loop-устройств (от loop0 до loop16). Исходя из этого, следует создать восемнадцатый файл с именем loop17. Для этого нужно использовать основной идентификатор 7 (фиксирован для всех файлов loop-устройств) и вспомогательный идентификатор 17 (указывающий на номер файла loop-устройства — loop17). Каждое loop-устройство должно поддерживать произвольный доступ к данным образа файловой системы, то есть, являться блочным, поэтому в качестве типа файла должен использоваться символ b. Как все уже догадались, в качестве имени файла следует использовать /dev/loop17, а в качестве прав доступа — любое корректное значение (в нашем случае будет использоваться 0777). Итак, команда для создания файла устройства будет выглядеть следующим образом:

# mknod -m 0777 /dev/loop17 b 7 17

Для проверки корректности создания файла loop-устройства следует снова использовать команду ls:

$ ls -al /dev | grep loop
brw-rw----   1 root disk        7,   0 мар 22 14:09 loop0
brw-rw----   1 root disk        7,   1 мар 22 14:09 loop1
brw-rw----   1 root disk        7,  10 мар 22 14:09 loop10
brw-rw----   1 root disk        7,  11 мар 22 14:09 loop11
brw-rw----   1 root disk        7,  12 мар 22 14:09 loop12
brw-rw----   1 root disk        7,  13 мар 22 14:09 loop13
brw-rw----   1 root disk        7,  14 мар 22 14:09 loop14
brw-rw----   1 root disk        7,  15 мар 22 14:09 loop15
brw-rw----   1 root disk        7,  16 мар 22 14:09 loop16
brwxrwxrwx   1 root root        7,  17 мар 22 14:55 loop17
brw-rw----   1 root disk        7,   2 мар 22 14:09 loop2
brw-rw----   1 root disk        7,   3 мар 22 14:09 loop3
brw-rw----   1 root disk        7,   4 мар 22 14:09 loop4
brw-rw----   1 root disk        7,   5 мар 22 14:09 loop5
brw-rw----   1 root disk        7,   6 мар 22 14:09 loop6
brw-rw----   1 root disk        7,   7 мар 22 14:09 loop7
brw-rw----   1 root disk        7,   8 мар 22 14:09 loop8
brw-rw----   1 root disk        7,   9 мар 22 14:09 loop9
crw-rw----   1 root disk       10, 237 мар 22 14:09 loop-control

Новый файл устройства loop17 несложно заметить, ведь он имеет права доступа 777 (brwxrwxrwx). Первый символ b указывает на то, что файл является специальным файлом блочного устройства (в случае файла символьного устройства будет использоваться символ c).

Теперь следует создать директорию, которая будет выступать в качестве точки монтирования, и смонтировать ISO-файл с использованием нашего файла loop-устройства:

$ mkdir /home/alex/freedos
# mount -t iso9660 /home/alex/FD13LIVE.iso /home/alex/freedos/ -o loop=/dev/loop17
mount: /home/alex/freedos: WARNING: source write-protected, mounted read-only.

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

$ ls /home/alex/freedos/
COMMAND.COM  fdauto.bat    FDOS-x86  games     KERNEL.SYS  packages   util
devel        fdconfig.sys  freedos   isolinux  net         setup.bat
$ cat /home/alex/freedos/setup.bat
@echo off

REM FreeDOS 1.2+ Installer, version 2021-12-01
rem GNU General Public License, (any version)
REM Copyright 2016-2021 Jerome Shidel.

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

Для прекращения работы с файлом loop-устройства следует использовать команду losetup с параметром -d:

# losetup -d /dev/loop17

Создание файла именованного канала

Для создания файла именованного канала достаточно использовать утилиту mknod с параметром -p без каких-либо идентификаторов:

$ mknod -m 777 /home/alex/fifo p
$ ls -al | grep fifo
prwxrwxrwx  1 alex alex          0 мар 22 16:04 fifo

Именованный канал был успешно создан (об этом говорит символ p в списке прав доступа файла). Обратите внимание на то, что права суперпользователя в данном случае не понадобились.

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

$ rm /home/alex/fifo
$ ls -al | grep fifo

Файл успешно удален. Подробнее о работе с файлами именованных каналов рассказано в статье, посвященной утилите mkfifo.