Модуль EdgeHub в Ubuntu IoT Edge не работает с ошибкой (139) Доступ к пути '/ tmp / edgeHub / edgeHub' запрещен

Я развертываю производственную версию рабочего модуля OPCPublisher для IoT Edge, что означает, что у меня есть полностью работающее решение в разработке.

Однако, когда я пытаюсь развернуть то же самое на производственном сервере, я получаю сообщение об ошибке от модуля edgeHub.

Сервер - это Ubuntu Server 18.04, и я использовал официальный документ для установки Edge: https://docs.microsoft.com/en-us/azure/iot-edge/how-to-install-iot-edge-linux#uninstall-iot-edge

Теперь в процессе установки возникло множество проблем из-за очень ограниченных прав доступа к Интернету, но все они были решены, Edge был успешно установлен, а затем подключен к модулю OPCPublisher, работающему в MS azure IoT hub.

На этом этапе Edge в Linux загрузил образы докеров для OPCPublisher, edgeAgent и edgeHub. Publihser и агент прошли без сучка и задоринки (после того, как я боролся с большим количеством прав доступа к репозиториям образов докеров), но edgeHub не работает с кодом 139:

введите описание изображения здесь

и если я смотрю логи для хаба, они говорят:

Unhandled Exception: System.AggregateException: One or more errors occurred. (Access to the path '/tmp/edgeHub/edgeHub' is denied.) ---> System.UnauthorizedAccessException: Access to the path '/tmp/edgeHub/edgeHub' is denied. ---> System.IO.IOException: Permission denied
   --- End of inner exception stack trace ---
   at System.IO.FileSystem.CreateDirectory(String fullPath)
   at System.IO.Directory.CreateDirectory(String path)
   at Microsoft.Azure.Devices.Edge.Hub.Service.DependencyManager.GetStoragePath() in /home/vsts/work/1/s/edge-hub/src/Microsoft.Azure.Devices.Edge.Hub.Service/DependencyManager.cs:line 282
   at Microsoft.Azure.Devices.Edge.Hub.Service.DependencyManager.GetStoreAndForwardConfiguration() in /home/vsts/work/1/s/edge-hub/src/Microsoft.Azure.Devices.Edge.Hub.Service/DependencyManager.cs:line 245
   at Microsoft.Azure.Devices.Edge.Hub.Service.DependencyManager.Register(ContainerBuilder builder) in /home/vsts/work/1/s/edge-hub/src/Microsoft.Azure.Devices.Edge.Hub.Service/DependencyManager.cs:line 79
   at Microsoft.Azure.Devices.Edge.Hub.Service.Startup.BuildContainer(IServiceCollection services) in /home/vsts/work/1/s/edge-hub/src/Microsoft.Azure.Devices.Edge.Hub.Service/Startup.cs:line 85
   at Microsoft.Azure.Devices.Edge.Hub.Service.Startup.ConfigureServices(IServiceCollection services) in /home/vsts/work/1/s/edge-hub/src/Microsoft.Azure.Devices.Edge.Hub.Service/Startup.cs:line 39
   at Microsoft.AspNetCore.Hosting.Internal.WebHost.EnsureApplicationServices()
   at Microsoft.AspNetCore.Hosting.Internal.WebHost.Initialize()
   at Microsoft.AspNetCore.Hosting.WebHostBuilder.Build()
   at Microsoft.Azure.Devices.Edge.Hub.Service.Hosting.Initialize(IConfigurationRoot configuration, X509Certificate2 serverCertificate, IDependencyManager dependencyManager, Boolean clientCertAuthEnabled) in /home/vsts/work/1/s/edge-hub/src/Microsoft.Azure.Devices.Edge.Hub.Service/Hosting.cs:line 34
   at Microsoft.Azure.Devices.Edge.Hub.Service.Program.MainAsync(IConfigurationRoot configuration) in /home/vsts/work/1/s/edge-hub/src/Microsoft.Azure.Devices.Edge.Hub.Service/Program.cs:line 53
   --- End of inner exception stack trace ---
   at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification)
   at Microsoft.Azure.Devices.Edge.Hub.Service.Program.Main() in /home/vsts/work/1/s/edge-hub/src/Microsoft.Azure.Devices.Edge.Hub.Service/Program.cs:line 30
2020-09-15 14:48:09  Starting Edge Hub
2020-09-15 14:48:09.764 +00:00 Edge Hub Main()
<7> 2020-09-15 14:48:10.014 +00:00 [DBG] [Microsoft.Azure.Devices.Edge.Util.Edged.WorkloadClient] - Making a Http call to unix:///var/run/iotedge/workload.sock to CreateServerCertificateAsync
<7> 2020-09-15 14:48:10.243 +00:00 [DBG] [Microsoft.Azure.Devices.Edge.Util.Uds.HttpUdsMessageHandler] - Connecting socket /var/run/iotedge/workload.sock
<7> 2020-09-15 14:48:10.247 +00:00 [DBG] [Microsoft.Azure.Devices.Edge.Util.Uds.HttpUdsMessageHandler] - Connected socket /var/run/iotedge/workload.sock
<7> 2020-09-15 14:48:10.252 +00:00 [DBG] [Microsoft.Azure.Devices.Edge.Util.Uds.HttpUdsMessageHandler] - Sending request http://workload.sock/modules/%24edgeHub/genid/637352543162943819/certificate/server?api-version=2019-01-30
<7> 2020-09-15 14:48:10.362 +00:00 [DBG] [Microsoft.Azure.Devices.Edge.Util.Uds.HttpUdsMessageHandler] - Response received Created
<7> 2020-09-15 14:48:10.444 +00:00 [DBG] [Microsoft.Azure.Devices.Edge.Util.Edged.WorkloadClient] - Received a valid Http response from unix:///var/run/iotedge/workload.sock for CreateServerCertificateAsync
<7> 2020-09-15 14:48:10.717 +00:00 [DBG] [Microsoft.Azure.Devices.Edge.Util.Edged.WorkloadClient] - Making a Http call to unix:///var/run/iotedge/workload.sock to TrustBundleAsync
<7> 2020-09-15 14:48:10.726 +00:00 [DBG] [Microsoft.Azure.Devices.Edge.Util.Uds.HttpUdsMessageHandler] - Connecting socket /var/run/iotedge/workload.sock
<7> 2020-09-15 14:48:10.726 +00:00 [DBG] [Microsoft.Azure.Devices.Edge.Util.Uds.HttpUdsMessageHandler] - Connected socket /var/run/iotedge/workload.sock
<7> 2020-09-15 14:48:10.726 +00:00 [DBG] [Microsoft.Azure.Devices.Edge.Util.Uds.HttpUdsMessageHandler] - Sending request http://workload.sock/trust-bundle?api-version=2019-01-30
<7> 2020-09-15 14:48:10.738 +00:00 [DBG] [Microsoft.Azure.Devices.Edge.Util.Uds.HttpUdsMessageHandler] - Response received OK
<7> 2020-09-15 14:48:10.741 +00:00 [DBG] [Microsoft.Azure.Devices.Edge.Util.Edged.WorkloadClient] - Received a valid Http response from unix:///var/run/iotedge/workload.sock for TrustBundleAsync
<6> 2020-09-15 14:48:10.750 +00:00 [INF] [EdgeHub] - Installing certificates [CN=iotedged workload ca:12/02/2020 11:35:15],[CN=Test Edge Device CA:12/02/2020 11:35:15],[CN=Test Edge Owner CA:12/02/2020 11:35:15] to Root
<6> 2020-09-15 14:48:10.764 +00:00 [INF] [EdgeHub] - Installing certificates [CN=Test Edge Owner CA:12/02/2020 11:35:15] to Root

На самом деле я не так уж много знаю о linux / ubuntu, но, по-видимому, у edgeHub нет доступа на запись из коробки, что объясняет, почему другие модули прошли. Я попытался предоставить групповой доступ к папке / tmp / (chmod g + w / tmp /), но это не помогло. Фактическая папка в ошибке (/ tmp / edgeHub / edgeHub) не существует, и я предполагаю, что это потому, что это просто временная установочная папка или что-то в этом роде, поэтому я попытался сделать ее сам и предоставить ей те же права доступа на уровне группы , но это тоже не помогло.

Я также попытался удалить Edge и переустановить (думая, что все предыдущие проблемы во время установки заставили что-то работать), но это привело к той же проблеме.

При просмотре журналов edgeAgent видно только, что он постоянно пытается запустить edgeHub.

Я также выполнил проверку iotEdge, но она не показывает ошибок (хотя 8 предупреждений).

*** edit *** Я думаю, что сузил его до докера, у которого нет доступа для записи в папку пограничного хранилища, но до сих пор все мои попытки предоставить докеру этот доступ не удались. Я могу найти массу статей, в которых рассказывается, как это сделать, если я создаю свой собственный образ докера, но пока что нет той, в которой рассказывается, как работать с существующим доступом к файлам.


person Arch Stalker    schedule 15.09.2020    source источник


Ответы (1)


Оказывается, установочный документ MS не совсем исчерпывающий. Проблема заключалась, как и предполагалось, в правах доступа пользователя edgeHub. В инструкциях по установке об этом вообще не упоминается, вместо этого я нашел это в лаборатории IoT Edge: https://microsoftlearning.github.io/AZ-220-Microsoft-Azure-IoT-Developer/Instructions/Labs/LAB_AK_14-iot-edge-device-in-limited-network.html

Однако команды в этой лаборатории не работают (или, по крайней мере, они не работают для меня)

Короче говоря, после установки и настройки IoT edge вы должны выполнить команды

sudo chown -R 1000:1000 [your local storageFolder]
sudo chmod -R 700 [your local storageFolder]

UID 1000 = пользователь edgeHub и storageFolder можно найти в манифесте модуля lazure IoTHub - ›edge. Это предоставит докеру edgeHub необходимый доступ к настроенной папке хранилища, где он будет сохранять любые автономные данные.

person Arch Stalker    schedule 18.09.2020