Команда 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.