Нет доступа к fifo файлу tmp fly wm 0 astra linux
Новые пользователи довольно часто сталкиваются с такой ошибкой, как ошибка отказано в доступе Linux. Если вы только что перешли с Windows, то можете еще не знать всех особенностей операционной системы Linux и почему возникает такая проблема.
В этой статье мы рассмотрим причины ошибки access denied linux, а также как ее обойти.
Ошибка отказано в доступе Linux
Наиболее часто такая ошибка встречается, в таких случаях:
- Вы пытаетесь выполнить команду в терминале;
- Вы пытаетесь примонтировать внешний носитель с помощью файлового менеджера;
- Вы пытаетесь запустить системный сервис и находите такую ошибку в логе.
В операционной системе Linux действует сложная система полномочий. Настройки доступа для каждого файла настраиваются тремя параметрами - чтение, запись и выполнение. Эти параметры устанавливаются для трех категорий - владелец файла, группа файла и все остальные пользователи.
Если вы попытаетесь получить доступ, например, открыть для чтения файл, к которому вам доступ не разрешен, то вы получите такую ошибку. А учитывая что все устройства, сокеты, и другие системные объекты - это тоже файлы, то вы будете получать такую ошибку всегда, когда попытаетесь сделать то, что вам не позволено. Самый простой способ обойти такой запрет - это выполнять нужную команду от имени суперпользователя.
Многие программы проверяют после запуска от какого пользователя они запущены и говорят, что их нужно запускать от имени суперпользователя, но так ведут себя не все. Например, команда ls вернет ошибку отказано в доступе linux если вы попытаетесь посмотреть содержимое каталога суперпользователя:
Но эта же команда нормально отработает нормально при использовании команды sudo:
Другой случай, это если вы обнаруживаете проблему в логах какого-либо системного сервиса, например, веб-сервера Apache. Казалось бы, должно было быть все верно, потому что запуск и так выполняется от имени суперпользователя.
Но нет, сервисы не только запускаются от имени суперпользователя, но потом, для увеличения безопасности они меняют пользователя на обычного, не привелигированного. Например, Apache работает от имени пользователя apache или www-data. Уже от имени этого пользователя программа пытается получить доступ к файловой системе.
Если нужная папка не доступна этому пользователю для чтения то вы получите ошибку access denied linux. Обычно, в логе программа сообщает какая папка или файл нужен когда происходит ошибка.
Вам просто нужно поменять на него права с помощью утилиты chmod или изменить владельца chown. Причем, нужно чтобы ко всем подкаталогам на пути к целевому каталогу был доступ у программы. Например, нельзя так чтобы права на чтение /home/ не было, а на /home/user/ было. Так не пройдет.
Права разрешающие чтение и запись владельцу и только чтение для группы и остальных вставляются командой:
sudo chmod 755 /путь/к/файлу
Или для смены прав для всех файлов в каталоге и самого каталога:
sudo chmod -R 755 /путь/к/каталогу
Или вы можете изменить владельца, обычно, это более безопасная и распространенная практика:
sudo chown пользователь /путь/к/файлу
$ sudo chown -R пользователь /путь/к/каталогу
Имя пользователя, от имени которого работает сервис вы можете посмотреть с помощью команды:
sudo ps aux | grep имя_сервиса
После того как вы установите правильные права, ошибка отказано в доступе linux больше не будет встречаться.
Выводы
В этой статье мы рассмотрели что делать если случается ошибка нет доступа linux, а также почему она возникает. Надеюсь, эта информация была полезной для вас. Если остались вопросы, спрашивайте в комментариях!
Как из консольного интерфейса можно очистить все каталоги (диски), если даже под рутом пишет «операция не разрешена»?
Стояла astra ce «орел», поставил se «смоленск» и на данный момент система не загружается: ни ce, ни se. Ни с диска (cdrom), ни с sdd
Роман,Это какой-то глюк. Было один раз. Логин - это ваше имя пользователя. Вы конечно можете это всё ввести, но иксы не стартанут. Помогает просто перезагрузка.
Виктор, у Вас получилось решить проблему? У нас такая же ситуация, ничего не помогает вообще
Шурик, вроде бы все установленно, но вот с пере установкой проблема
Андрей, попробуйте еще раз запустить dist-upgrade, по крайней мере посторное обновление помогает в 9-м апдейте вылечить ошибку с файлом fifo
Шурик,тоже самое выдает , чтение списка пакетов готово
чтение информации о состоянии готово
расчет обновлений готово
следующие пакеты устанавливались автоматически и больше не требуются
Шурик,да , под рутом, или нужно под установленным пользователем (который при установке создан)
Андрей, да, именно под ним, рут ограничен в правах. нужно под админом с высоким уровнем целостности. повышение прав для установки обновления через sudo -s и дальше монтируете всё, сто нужно и обновляете
Шурик,Спасибо , сейчас буду пробовать , да вроде бы проверка целосности проходит , пишет все хорошо
Андрей, если терминал не запускается, значит, не всё, возможно, он не обновился
Добрый день. Я работаю в школе, к нам поступили ноутбуки с Astra Linux. До этого поступила цифровая лаборатория, которая рассчитана на ОС Windows. При подключении датчиков по usb в Windows драйвера устанавливаются автоматически, возможно ли как-то их подключить в Astra Linux?
Евгений, думаю, что вам нужно связаться с производителем этой лаборатории
2. Теперь попытайтесь записать в FIFO. Вам придется использовать другой терминал, поскольку первая команда в данный момент "зависла" в ожидании появления каких-нибудь данных в FIFO:
$ echo "Hello World" > /tmp/my_fifo
Вы увидите вывод команды cat . Если не посылать никаких данных в канал FIFO, команда cat будет ждать до тех пор, пока вы не прервете ее выполнение, традиционно комбинацией клавиш <Ctrl>+<C>.
3. Можно выполнить обе команды одновременно, переведя первую в фоновый режим:
$ cat < /tmp/my_fifo &
$ echo "Hello World" > /tmp/my_fifo
[1]+ Done cat </tmp/my_fifo
Как это работает
Поскольку в канале FIFO не было данных, обе команды, cat и echo , приостанавливают выполнение, ожидая, соответственно, поступления каких-нибудь данных и какого-либо процесса для их чтения.
На третьем шаге процесс cat с самого начала заблокирован в фоновом режиме. Когда echo делает доступными некоторые данные, команда cat читает их и выводит в стандартный вывод. Обратите внимание на то, что она затем завершается, не дожидаясь дополнительных данных. Программа cat не блокируется, т.к. канал уже закрылся, когда завершилась вторая команда, поместившая данные в FIFO, поэтому вызовы read в программе cat вернут 0 байтов, обозначая этим конец файла.
Теперь, когда вы посмотрели, как ведут себя каналы FIFO при обращении к ним с помощью программ командной строки, давайте рассмотрим более подробно программный интерфейс, предоставляющий больше возможностей управления операциями чтения и записи при организации доступа к FIFO.
В отличие от канала, созданного вызовом pipe , FIFO существует как именованный файл, но не как открытый файловый дескриптор, и должен быть открыт перед тем, как можно будет из него читать данные или в него записывать их. Открывается и закрывается канал FIFO с помощью функций open и close , которые вы ранее применяли к файлам, но с дополнительными функциональными возможностями. Вызову open передается полное имя FIFO вместо полного имени обычного файла.
Открытие FIFO с помощью open
Основное ограничение при открытии канала FIFO состоит в том, что программа не может открыть FIFO для чтения и записи с режимом O_RDWR . Если программа нарушит это ограничение, результат будет непредсказуемым. Это очень разумное ограничение, т.к., обычно канал FIFO применяется для передачи данных в одном направлении, поэтому нет нужды в режиме O_RDWR . Процесс стал бы считывать обратно свой вывод, если бы канал был открыт для чтения/записи.
Если вы действительно хотите передавать данные между программами в обоих направлениях, гораздо лучше использовать пару FIFO или неименованных каналов, по одному для каждого направления передачи, или (что нетипично) явно изменить направление потока данных, закрыв и снова открыв канал FIFO. Мы вернемся к двунаправленному обмену данными с помощью каналов FIFO чуть позже в этой главе.
Другое различие между открытием канала FIFO и обычного файла заключается в использовании флага open_flag (второй параметр функции open ) со значением O_NONBLOCK . Применение этого режима open изменяет способ обработки не только вызова open , но и запросов read и write для возвращаемого файлового дескриптора.
Существует четыре допустимых комбинации значений O_RDONLY , O_WRONLY и O_NONBLOCK флага. Рассмотрим их все по очереди.
open(const char *path, O_RDONLY);
В этом случае вызов open блокируется, он не вернет управление программе до тех пор, пока процесс не откроет этот FIFO для записи. Это похоже на первый пример с командой cat .
open(const char *path, O_RDONLY | O_NONBLOCK);
Теперь вызов open завершится успешно и вернет управление сразу, даже если канал FIFO не был открыт для записи каким-либо процессом.
open(const char *path, O_WRONLY);
В данном случае вызов open будет заблокирован до тех пор, пока процесс не откроет тот же канал FIFO для чтения.
open(const char *path, O_WRONLY | O_NONBLOCK);
Этот вариант вызова всегда будет возвращать управление немедленно, но если ни один процесс не открыл этот канал FIFO для чтения, open вернет ошибку, -1, и FIFO не будет открыт. Если есть процесс, открывший FIFO для чтения, возвращенный файловый дескриптор может использоваться для записи в канал FIFO.
Обратите внимание на асимметрию в использовании O_NONBLOCK с O_RDONLY и O_WRONLY , заключающуюся в том, что неблокирующий вызов open для записи завершается аварийно, если ни один процесс не открыл канал для чтения, а неблокирующий вызов open для чтения не возвращает ошибку. На поведение вызова close флаг O_NONBLOCK влияния не оказывает.
Выполните упражнение 13.11.
Упражнение 13.11. Открытие файлов FIFO
Теперь рассмотрим, как можно использовать поведение вызова open с флагом, содержащим O_NONBLOCK , для синхронизации двух процессов. Вместо применения нескольких программ-примеров вы напишите одну тестовую программу fifo2.c, которая позволит исследовать поведение каналов FIFO при передаче ей разных параметров.
int main(int argc, char *argv[])
int open_mode = 0;
fprintf(stderr, "Usage: %s <some combination of\
O_RDONLY O_WRONLY O_NONBLOCK>\n", *argv);
2. Полагая, что программа передает тестовые данные, вы задаете параметр open_mode из следующих аргументов:
for(i = 1; i <argc; i++)
if (strncmp(*++argv, "O_RDONLY", 8) == 0) open_mode |= O_RDONLY;
if (strncmp(*argv, "O_WRONLY", 8) == 0) open_mode |= O_WRONLY;
if (strncmp(*argv, "O_NONBLOCK", 10) == 0) open_mode |= O_NONBLOCK;
3. Далее проверьте, существует ли канал FIFO, и при необходимости создайте его. Затем FIFO открывается, и пока программа засыпает на короткое время, выполняется результирующий вывод. В заключение FIFO закрывается.
if (access(FIFO_NAME, F_OK) == -1)
res = mkfifo(FIFO_NAME, 0777);
fprintf(stderr, "Gould not create fifo %s\n", FIFO_NAME);
printf("Process %d opening FIF0\n", getpid());
res = open(FIFO_NAME, open_mode);
printf("Process %d result %d\n", getpid(), res);
if (res != -1) (void)close(res);
printf("Process %d finished\n", getpid());
Как это работает
Эта программа позволяет задать в командной строке комбинации значений O_RDONLY , O_WRONLY и O_NONBLOCK , которые вы хотите применить. Делается это сравнением известных строк с параметрами командной строки и установкой (с помощью |= ) соответствующего флага при совпадении строки. В программе используется функция access , проверяющая, существует ли уже файл FIFO, и создающая его при необходимости.
Никогда не уничтожайте FIFO, т.к. у вас нет способа узнать, не использует ли FIFO другая программа.
O_RDONLY и O_WRONLY без O_NONBLOCK
Теперь у вас есть тестовая программа, и вы можете проверить комбинации пар. Обратите внимание на то, что первая программа, считыватель, помещена в фоновый режим.
$ ./fifo2 O_RDONLY &
Process 152 opening FIFO
$ ./fifo2 O_WRONLY
Process 153 opening FIFO
Process 152 result 3
Process 153 result 3
Process 152 finished
Process 153 finished
Это, наверное, самое распространенное применение именованных каналов. Оно позволяет читающему процессу стартовать и ждать в вызове open , а затем разрешает обеим программам продолжить выполнение, когда вторая программа откроет канал FIFO. Обратите внимание на то, что и читающий, и пишущий процессы были синхронизированы вызовом open .
Когда процесс в ОС Linux заблокирован, он не потребляет ресурсы ЦП, поэтому этот метод синхронизации очень эффективен с точки зрения использования ЦП.
введение:Безымянная трубаОсновное ограничение заключается в том, что у него нет имени, а объем общения ограничен процессами, которые связаны кровью. Хорошо известный канал существует в файловой системе как файл FIFO. Таким образом, даже процесс, не связанный с процессом создания FIFO, может обмениваться данными через FIFO, пока он обращается к пути. Эта заметка включает введение в FIFO, примеры кода и реализацию ядра.
1. Введение в FIFO
1.1. «Знаменитый» трубопровод:
FIFO относится к принципу «первым пришел - первым ушел» (first in, first out), FIFO в Unix похож на канал. Это односторонний (полудуплексный поток данных). В отличие от конвейеров, каждый FIFO имеет связанное с ним имя пути, что позволяет несвязанным процессам обращаться к одному и тому же FIFO для связи. FIFO также называется именованным каналом.
1.2. Создать:
FIFO создается функцией mkfifo (), прототип функции:
int mkfifo(const char *pathname, mode_t mode)
- const char *pathname:Это общее имя пути unix, это имя FIFO.
- ** mode: ** параметр режима указывает бит разрешения FIFO, это S_IRUSER (чтение владельца), S_IWUSR (запись владельца), S_IRGRP (чтение члена группы), S_IWGRP (запись члена группы), S_IROTH (чтение другого пользователя), S_IWOTH (написано другими пользователями) - это побитовое ИЛИ, составленное из этих шести констант.
Функция mkfifo неявно указала O_CREAT | O_EXCL, то есть она либо создает новый FIFO, либо возвращает ошибку EEXIST (FIFO с указанным именем уже существует). Если вы не хотите создавать новый FIFO, вызовите open вместо mkfifo. Чтобы открыть существующий FIFO или создать новый FIFO, вы должны сначала вызвать mkfifo, а затем проверить, возвращает ли он ошибку EEXIST. Если возвращается, вызовите вместо этого open.
1.3. Правила открытия FIFO:
1), еслиТекущая открытая операция предназначена для чтенияПри открытии FIFO, если уже естьСоответствующий процесс - записьКогда FIFO открыт, текущая операция открытия будет успешно возвращена; в противном случае она может заблокироваться до тех пор, пока соответствующий процесс не откроет FIFO для записи (текущая операция открытия установила флаг блокировки); или он успешно возвращается (текущая операция открытия не устанавливает флаг блокировки) .
2), еслиТекущая открытая операция предназначена для записиПри открытии FIFO, если уже естьСоответствующий процесс читаетсяКогда FIFO открыт, текущая операция открытия будет успешно завершена; в противном случае он может заблокироваться, пока соответствующий процесс не откроет FIFO для чтения (текущая операция открытия установила флаг блокировки); или он вернет ошибку ENXIO (текущая операция открытия не устанавливает флаг блокировки) ).
Короче говоря, как только установлен флаг блокировки и установлен вызов mkfifo, оба конца конвейера должны быть открыты для чтения и записи.Если какая-либо сторона не открыта, она будет заблокирована при вызове open. Запись в каналы или FIFO всегда добавляет данные в конец, чтение в них всегда возвращает данные с начала и вызывает lseek в каналах или FIFO, чтобы вернуть ошибку ESPIPE.
1.4. Чтение данных в FIFO:
Если процесс блокирует открытие FIFO для чтения данных из FIFO, то операция чтения в процессе называется операцией чтения с установленным флагом блокировки. И есть процесс записи, чтобы открыть FIFO, и в текущем FIFO нет данных,То есть в это время установлены оба конца конвейера, но конец записи еще не записал данные.。
1) Для операции чтения с установленным флагом блокировки она всегда будет заблокирована (то есть блок активен и ожидает данных. Он не потребляет ресурсы ЦП, и этот метод синхронизации процессов очень эффективен для ЦП. )
2). Для операций чтения без установленного флага блокировки возвращается -1, текущее значение errno - EAGAIN, напомните, чтобы повторить попытку позже.
Для операций чтения с установленным флагом блокировки:Есть две причины блокировки:
1) В FIFO есть данные, но эти данные читают другие процессы (для каждого процесса чтения этот знаменитый канал является критическим ресурсом, и все должны быть скромными друг к другу и не могут использоваться вместе).
2) В FIFO нет данных. Причина разблокировки заключается в том, что новые данные записываются в FIFO, и операция чтения не будет заблокирована, потому что количество байтов в FIFO меньше количества байтов, запрошенных для чтения. В это время операция чтения вернет количество данных, которые в настоящее время находятся в FIFO. .
Следует отметить следующее:Считать открытый флаг блокировкиВлияет только на первую операцию чтения этого процессаЕсли в этом процессе есть несколько последовательностей операций чтения, после пробуждения первой операции чтения и завершения операции чтения другие выполняемые операции чтения больше не будут блокироваться, даже если в FIFO нет данных при выполнении операции чтения. Точно так же в это время операция чтения возвращает 0.
1.5. Записать данные в FIFO:
Если процесс блокирует открытие FIFO для записи данных в FIFO, тогда операция записи в процессе называется операцией записи с установленным флагом блокировки. Для операций с установленными флагами блокировки записи:
1), когдаКогда объем записываемых данных не превышает PIPE_BUF,Linux гарантирует атомарность написания. Если свободного буфера конвейера недостаточно для хранения количества байтов, которые должны быть записаны в это время, он переходит в спящий режим, и операция однократной записи начинается, когда буфер может удерживать количество байтов для записи.
2), когда захотитеКогда объем записанных данных больше PIPE_BUF,Linux больше не гарантирует атомарность записи. Как только в буфере FIFO появится свободная область, процесс записи попытается записать данные в канал, и операция записи вернется после записи всех запрошенных данных.
Для операций записи без флага блокировки:
1), при необходимостиКогда объем записываемых данных превышает PIPE_BUF, Linux больше не будет гарантировать атомарность записи.. После заполнения всех свободных буферов FIFO операция записи возвращается.
2)、Когда объем записываемых данных меньше PIPE_BUF, Linux гарантирует атомарность записи.. Если текущий свободный буфер FIFO может вместить количество байтов, запрошенных для записи, он будет успешно возвращен после записи; если текущий свободный буфер FIFO не может вместить количество байтов, запрошенных для записи, будет возвращена ошибка EAGAIN, чтобы напомнить вам о записи позже;
2. Пример кода:
2.1. Связь между несвязанным сервером и клиентом:
Основной процесс:
1). Сервер создает известные каналы FIFO1 и FIFO2 и устанавливает FIFO1 только для чтения, FIFO2 для записи
2). Клиент открывает известные каналы FIFO1 и FIFO2 и устанавливает для FIFO1 только запись и FIFO2 только для чтения.
3), отправка и получение данных
4), внимательно читать и писать, отключать
Программный код на стороне сервера:
Код клиентской программы:
Явление 1: Когда клиент не подключен, сервер находится в состоянии блокировки:
Феномен 2: Когда клиент подключен, состояние выполнения:
3. Реализация в ядре именованных каналов FIFO:
Поскольку конвейер может использоваться только в двух связанных друг с другом процессах, например в родительско-дочернем процессе; если вы хотите использовать каналы для связи между двумя несвязанными процессами, тогда конвейер бесполезен. Как позволить двум несвязанным процессам найти индексный дескриптор с атрибутом pipe? Естественно подумайте об использовании файлов на диске.
Когда два процесса в Linux обращаются к одному и тому же файлу, хотя их соответствующие файлы различаются, все они указывают на один и тот же узел Inode, поэтому канал и файл на диске объединяются для получения имени трубопровод.
Можно видеть, что две функции операций идентичны, что указывает на то, что операции чтения и записи в FIFO также читаются и записываются в буфер канала, поэтому файл, созданный с помощью fifo, позволяет процессу чтения и записи только найти один и тот же индексный дескриптор, а затем использовать один и тот же буфер канала.
Справочные материалы:
1. Сетевое программирование в Unix, том II
2、Linux знаменитый канал FIFO)
3、Поговорим о реализации pipe из кода ядра
Читайте также: