Проблемы с драйвером символьного устройства в Linux

Ни один из этих каталогов не имеет разрешения на выполнение. Согласно предоставленной вами информации, вы пытались смонтировать каталог как rwи ro. Вам нужно будет смонтировать файловую систему как rwx. Однако ваша проблема может быть связана с тем, как права доступа к файловой системе были искажены при восстановлении данных.

Похоже, что другие люди, столкнувшиеся с вашей проблемой, используют QNAP в среде Windows Active Directory. Это сообщение на форуме посвящено этой проблеме и может пролить немного света, если ваша среда привязана к Windows Active Directory. Это еще один пост , связанный с Windows. Я также нашел этот пост . Не уверен, что они применимы, но они появляются при поиске по вашей проблеме.

Я ссылаюсь на Arch Linux Wiki по ecryptfs и Arch Linux Wiki по монтированию NTFS. Вот ссылки на QNAP Wiki о правах доступа к подпапкам и о категориях восстановления данных . Они также должны помочь предоставить дополнительную информацию о том, как устранить проблему.

Повторно -смонтировать файловую систему и исправить разрешения

Я бы начал все сначала. Перезагрузите и перемонтируйте свои системы. Если команда mount работала раньше, чтобы позволить вам успешно расшифровать вашу файловую систему и смонтировать, вам необходимо изменить права доступа к каталогу как root (sudo )на:

chmod go= [root directory name]

Вы также можете попробовать смонтировать ecryptfs вручную с помощью обёртки:

ecryptfs-mount-private Path/To/File/System

Опять же chmodможет помочь и после этого шага, если разрешения по-прежнему отсутствуют. Вам будет предложено ввести пароль монтирования для ваших ecryptfs с помощью приведенной выше команды.

Если вы можете прокомментировать какие-либо дополнительные проблемы, которые у вас есть, я могу обновить ответ с более подходящими решениями. Я полагаю, что ваша проблема может быть связана с восстановлением искаженных данных (. Чтобы решить ее, вам нужно будет следовать руководству о том, как QNAP рекомендует выполнять восстановление данных ), или она может быть связана с настройками списка контроля доступа NFS или NTFS, предотвращающими надлежащие разрешения. Это должно быть связано только в том случае, если ваша среда также привязана к Windows. Если у кого-то есть какие-либо исправления, чтобы добавить, я был бы очень признателен. Удачи!

0
22.11.2019, 05:27
3 ответа

Я думаю, Проблема 1 может быть связана с тем, что headне видит конца -символа строки -(, например. перевод строки, '\n'), или он использует системные вызовы seek, и вы игнорируете аргумент offsetв своих функциях dev_read()и dev_write()(, что означает, что поиск не будет работать, если я правильно понимаю )... проверьте этот из -заголовок пытается оптимизировать вещи с помощью поиска, но не уверен, что это применимо в вашем случае.

Также не уверен, что ваш ответ о проблеме 2 , вызванной рассинхронизацией времени, верен (, если только он не имеет никакого отношения к msleep())... я предполагаю, что это проблемы с распределением памяти. или состояние гонки, но вы не показываете нам исходный код для push()и pop(), поэтому мы не можем сказать.

Похоже, вы просто сохраняете аргументы bufferи lenиз dev_write(), а затем используете их в dev_read()для передачи в copy_to_user()... данные в этом буфере по-прежнему будут находиться в пользовательском пространстве., поэтому вы можете пытаться скопировать из пространства пользователя в пространство пользователя. Чтение этого может помочь.

Вы должны обновить свой вопрос, указав код push()и pop()... но как минимум push()потребуется выделить память как для элемента связанного списка, который будет вставлен в список, так и для буфера. для хранения данных записи, затем используйте copy_from_user(), чтобы получить данные из пользовательского пространства и в буфер ядра... и затем, после того, как вы закончите с msgв dev_read(), вам нужно будет освободить ядро буфер, содержащийся в msg, а затем освободить сам msg.

Я знаю, что здесь происходит много копирования, но чтобы избежать этого, вы должны очень усердно работать с системой виртуальной памяти и дизайном вашего кода (, то есть с реализацией Zero Copy )].

Еще одна маленькая, но очень важная вещь, в dev_read()вы не проверяете, что message_lengthравно <= len, т.е. достаточно ли места для сообщения в буфере. Например, в соответствии с вашим кодомваш драйвер потенциально может попытаться скопировать сообщение, размер которого превышает доступное место. copy_to_user()должен поймать это, но опять же, возможно, это источник вашей Проблемы 2 .

2
28.01.2020, 02:29

Я решил Задачу 2 . Это происходило из-за того, что виртуальный бокс не синхронизировался с хост-машиной.

Решение найдено здесьhttps://stackoverflow.com/questions/5308492/virtualbox-synchronisation-problems

Это:

VBoxManage guestproperty set "/VirtualBox/GuestAdd/VBoxService/--timesync-set-threshold" 1000

0
28.01.2020, 02:29

Задача 1

Я просмотрел свою историю коммитов и нашел сообщение коммита, в котором говорилось: «Работает test.sh», что означает, что запись проходила с echoи чтение с head -n 1

.

В этом коммите моя функция чтения _разработчика возвращает длину сообщения.

Кажется, это работает как для head -n 1, так и для catи для буферизованного чтения из упомянутой программы C.

Я нашел ответ здесь :https://www.tldp.org/LDP/lkmpg/2.4/html/c577.htm

0
28.01.2020, 02:29

Теги

Похожие вопросы