Ни один из этих каталогов не имеет разрешения на выполнение. Согласно предоставленной вами информации, вы пытались смонтировать каталог как 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. Если у кого-то есть какие-либо исправления, чтобы добавить, я был бы очень признателен. Удачи!
Я думаю, Проблема 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 . Это происходило из-за того, что виртуальный бокс не синхронизировался с хост-машиной.
Решение найдено здесьhttps://stackoverflow.com/questions/5308492/virtualbox-synchronisation-problems
Это:
VBoxManage guestproperty set "/VirtualBox/GuestAdd/VBoxService/--timesync-set-threshold" 1000
Задача 1
Я просмотрел свою историю коммитов и нашел сообщение коммита, в котором говорилось: «Работает test.sh», что означает, что запись проходила с echo
и чтение с head -n 1
В этом коммите моя функция чтения _разработчика возвращает длину сообщения.
Кажется, это работает как для head -n 1
, так и для cat
и для буферизованного чтения из упомянутой программы C.
Я нашел ответ здесь :https://www.tldp.org/LDP/lkmpg/2.4/html/c577.htm