There was an issue accessing a TrueNAS device over the VPN. The VPN was assigning an Ip Address outside the network available to the TrueNAS host. In my case:
VPN assigned IP address is in range 172.16.0.0/24
Network for TrueNAS is in range 10.0.0.0/16
Since the VPN address is outside the range of the CIDR block for the TrueNAS ip address subnet, TrueNAS can’t respond to the incoming request. To fix this, add a Static Route for TrueNAS. To add a Static Route, expand the Network tab in the left hand menu and select Static Routes in the menu.
The left main menu in TrueNAS core with the Network tab expanded and the Static Routes tab within Network selected
From the Static Routes screen, click Add in the top right of the new screen. After that the following form will appear:
Setting
Value
Description
Destination
integer
Use the format A.B.C.D/E where E is the CIDR mask. In the example above it would be 172.16.0.0/24
Gateway
integer
Enter the IP address of the gateway. In the example above it would be 10.0.0.150 (150 is my gateway)
Description
string
Notes or identifiers describing the route.
The form fields for adding a static route in TrueNAS
After the fields are populated correctly, click “Submit” and the VPN connections should now be able to reach the TrueNAS core device.
Since March of 2020 I’ve been working on building out a homelab. Something about being inside a little more drove me to want to work with the computers at home. Normally that free time would be spent at community events or with presentations. Something had to fill the void and a homelab was it.
At first, the goal was simple; learn about different server technologies and edge computing by building a “data center” in a closet. The “data center” part of it is where most at home sysadmins fall into a bottomless pit of self-hosted technologies and I am no different. First it is a home media server, then a dashboard, then a database, then a data system, then a clustered set of systems, then there is suddenly a need for documentation for a lab you built yourself as it becomes too much to handle at once.
This will, hopefully, be the first of many posts about home labs that is written from personal and professional experience. Throughout the series there should be a showcase of how to use home labs for:
Home Media
Automation
Edge Computing
Archiving
Game Servers
Development Servers
Access and Control
Dynamic Public Cloud Integration
Redundancy and Disaster Recovery
and… more
The first and foremost discussion to have is price control. Enterprise server contracts can start at seven figures. If this is what you are looking for, then this is not the blog you seek. What this blog will focus on is how to keep a relatively low budget. Lets see how far we can make the homelab budget go!
At this point, you may be wondering why the title is “Home Lab – a lie I tell myself”. When this journey started, this was a 1-2 tower server adventure. Over time this has exploded, both in scope and in price. At this point, the name “homelab” no longer describes the system I’ve built. Not just in size but also due to the fact that it is no longer at my home. Hopefully, this series can serve as both enablement and deterrent to an ever expanding homelab.
Using the KVM terraform provider, I ran into the following error – Error: mkisofs not found in $PATH. After hours of trying to install it on a Debian based server, the realization that the executable was missing from the CLIENT and not the SERVER dawned on me.
If this error is currently blocking progress, be sure to INSTALL MKISOFS ON THE CLIENT and don’t worry about the server!
If you are looking for a guide on creating an Open CV module in Python, check out a guide here. This guide will focus on creating an Azure IoT Edge module in C++. To accomplish this we need to take the following steps:
This article assumes that you use a computer or virtual machine running Windows or Linux as your development machine. And you simulate your IoT Edge device on your development machine.
Take these steps to create an IoT Edge module based on Azure IoT C SDK using Visual Studio Code and the Azure IoT Edge extension. First you create a solution, and then you generate the first module in that solution. Each solution can contain more than one module.
In Visual Studio Code, select View > Integrated Terminal.
Select View > Command Palette.
In the command palette, enter and run the command Azure IoT Edge: New IoT Edge Solution.
Browse to the folder where you want to create the new solution. Choose Select folder.
Enter a name for your solution.
Select C Module as the template for the first module in the solution.
Enter a name for your module. Choose a name that’s unique within your container registry.
Provide the name of the module’s image repository. VS Code autopopulates the module name with localhost:5000. Replace it with your own registry information. If you use a local Docker registry for testing, then localhost is fine. If you use Azure Container Registry, then use the login server from your registry’s settings. The login server looks like .azurecr.io.
VS Code takes the information you provided, creates an IoT Edge solution, and then loads it in a new window.
There are four items within the solution:
A .vscode folder contains debug configurations.
A modules folder has subfolders for each module. At this point, you only have one. But you can add more in the command palette with the command Azure IoT Edge: Add IoT Edge Module.
An .env file lists your environment variables. If Azure Container Registry is your registry, you’ll have an Azure Container Registry username and password in it.
Note
The environment file is only created if you provide an image repository for the module. If you accepted the localhost defaults to test and debug locally, then you don’t need to declare environment variables.
The default C module code that comes with the solution is located at modules > > main.c. The module and the deployment.template.json file are set up so that you can build the solution, push it to your container registry, and deploy it to a device to start testing without touching any code. The module is built to simply take input from a source (in this case, the tempSensor module that simulates data) and pipe it to IoT Hub.
When you’re ready to customize the C template with your own code, use the Azure IoT Hub SDKs to build modules that address the key needs for IoT solutions such as security, device management, and reliability.
Build and deploy your module for debugging
In each module folder, there are several Docker files for different container types. Use any of these files that end with the extension .debug to build your module for testing. Currently, C modules support debugging only in Linux amd64 containers.
In VS Code, navigate to the deployment.template.json file. Update your module image URL by adding .debug to the end.
Replace the Node.js module createOptions in deployment.template.json with below content and save this file:
In the VS Code command palette, enter and run the command Edge: Build IoT Edge solution.
Select the deployment.template.json file for your solution from the command palette.
In Azure IoT Hub Device Explorer, right-click an IoT Edge device ID. Then select Create deployment for IoT Edge device.
Open your solution’s config folder. Then select the deployment.json file. Choose Select Edge Deployment Manifest.
You’ll see the deployment successfully created with a deployment ID in a VS Code-integrated terminal.
Check your container status in the VS Code Docker explorer or by running the docker ps command in the terminal.
Start debugging C module in VS Code
VS Code keeps debugging configuration information in a launch.json file located in a .vscode folder in your workspace. This launch.json file was generated when you created a new IoT Edge solution. It updates each time you add a new module that supports debugging.
Navigate to the VS Code debug view. Select the debug configuration file for your module. The debug option name should be similar to ModuleName Remote Debug (C).
Navigate to main.c. Add a breakpoint in this file.
Select Start Debugging or select F5. Select the process to attach to.
In VS Code Debug view, you’ll see the variables in the left panel.
The preceding example shows how to debug C IoT Edge modules on containers. It added exposed ports in your module container createOptions. After you finish debugging your Node.js modules, we recommend you remove these exposed ports for production-ready IoT Edge modules.
Create a working Open CV Build
The working environment is an Ubuntu 18.04 64 bit Desktop OS running Clion using an embedded version of CMake 3.10. Open CV is added via source as a submodule to the project and added as a package in the CMakeLists.txt with the following line:
FIND_PACKAGE (OpenCV REQUIRED)
Once that was added to the CMakeLists.txt, the main.cpp file was changed to the following code:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
Once you create IoT Edge modules with your business logic, you want to deploy them to your devices to operate at the edge. If you have multiple modules that work together to collect and process data, you can deploy them all at once and declare the routing rules that connect them.
This article shows how to create a JSON deployment manifest, then use that file to push the deployment to an IoT Edge device. For information about creating a deployment that targets multiple devices based on their shared tags, see Deploy and monitor IoT Edge modules at scale
A deployment manifest is a JSON document that describes which modules to deploy, how data flows between the modules, and desired properties of the module twins. For more information about how deployment manifests work and how to create them, see Understand how IoT Edge modules can be used, configured, and reused.
To deploy modules using Visual Studio Code, save the deployment manifest locally as a .JSON file. You will use the file path in the next section when you run the command to apply the configuration to your device.
Here’s a basic deployment manifest with one module as an example:
You can use the Azure IoT extensions for Visual Studio Code to perform operations with your IoT hub. For these operations to work, you need to sign in to your Azure account and select the IoT hub that you are working on.
In Visual Studio Code, open the Explorer view.
At the bottom of the Explorer, expand the Azure IoT Hub Devices section.
Click on the … in the Azure IoT Hub Devices section header. If you don’t see the ellipsis, hover over the header.
Choose Select IoT Hub.
If you are not signed in to your Azure account, follow the prompts to do so.
Select your Azure subscription.
Select your IoT hub.
Deploy to your device
You deploy modules to your device by applying the deployment manifest that you configured with the module information.
In the Visual Studio Code explorer view, expand the Azure IoT Hub Devices section.
Right-click on the device that you want to configure with the deployment manifest.
Select Create Deployment for IoT Edge Device.
Navigate to the deployment manifest JSON file that you want to use, and click Select Edge Deployment Manifest.
The results of your deployment are printed in the VS Code output. Successful deployments are applied within a few minutes if the target device is running and connected to the internet.
View modules on your device
Once you’ve deployed modules to your device, you can view all of them in the Azure IoT Hub Devices section. Select the arrow next to your IoT Edge device to expand it. All the currently running modules are displayed.
If you recently deployed new modules to a device, hover over the Azure IoT Hub Devices section header and select the refresh icon to update the view.
Right-click the name of a module to view and edit the module twin.
The Azure IoT Edge getting started guide currently utilizes VS Code and Docker to create modules. If you receive “docker.sock connect: permission denied” after trying to build, run the following two commands in the terminal:
sudo usermod -aG docker $USER
newgrp docker
If you still have the error, restart your machine and try again.