Additional Linux Details¶
The tutorial gives most information required for getting started on a Linux machine. Some additional information is given here.
Detailed dependency installation info¶
You need to have cmake version at least 3.14 installed. It is available in Ubuntu 19.04 and later.
To install on Ubuntu 16.04 or 18.04, follow the instructions here: https://blog.kitware.com/ubuntu-cmake-repository-now-available/
It is also possible to install it via snap:
sudo snap install cmake --classic
When using it, you might need to replace
snap run cmake.
If uninstalling the default
cmake, the snap-installed version should be
used by default after reboot.
Optional dependencies (for development and documentation of the p-net stack):
sudo apt install -y \ clang-tools \ clang-format-10 \ doxygen \ graphviz
Run tests and generate documentation¶
Run tests (if you told cmake to configure it):
cmake --build build --target check
Run a single test file:
Create Doxygen documentation:
cmake --build build --target docs
The Doxygen documentation ends up in
See the “Writing documentation” page if you would like to install the toolchain to build the entire Sphinx documentation.
The clang static analyzer can also be used if installed. Create a new build directory by running:
scan-build cmake -B build.scan-build -S p-net scan-build cmake --build build
Setting Linux ephemeral port range¶
This is the range of random source ports used when sending UDP messages. Profinet requires that the UDP source port should be >= 0xC000, which is 49152 in decimal numbers.
To change the ephemeral port range:
echo "49152 60999" > /proc/sys/net/ipv4/ip_local_port_range
This should typically be done at system start up.
File size and memory usage on Linux¶
The resulting file size of the sample application binary is heavily dependent on the compile time options, for example whether to include debug information. In this example we use:
BUILD_SHARED_LIBS ON CMAKE_BUILD_TYPE Release LOG_LEVEL Warning PNET_MAX_AR 2 PNET_MAX_SLOTS 5 PNET_MAX_SUBSLOTS 3
To get an estimate of the binary size, partially link it (use release, without standard libraries):
p-net/build$ make all p-net/build$ /usr/bin/cc -O3 -DNDEBUG CMakeFiles/pn_dev.dir/sample_app/sampleapp_common.o CMakeFiles/pn_dev.dir/src/ports/linux/sampleapp_main.o -o pn_dev libprofinet.a -nostdlib -r
p-net/build$ size pn_dev text data bss dec hex filename 244481 72 8 244561 3bb51 pn_dev
See https://linux.die.net/man/1/size for information on how to use the command. Also the rt-kernel page in this documentation has some description on how to interpret the output.
The size of the p-net stack can be estimated from the size of libprofinet, built with the options given above:
p-net/build$ size libprofinet.so text data bss dec hex filename 230888 3304 8 234200 392d8 libprofinet.so
An estimate of the p-net RAM usage can be made from the size of the pnet_t struct. The sample application has a command line option to show this value, for the used compile time options (for example the maximum number of modules allowed).
Debug intermittent segmentation faults during tests on Linux¶
Enable core dumps:
ulimit -c unlimited
Run a test case until the problem occurs (in the build directory):
while ./pf_test --gtest_filter=DiagTest.DiagRunTest; do :; done
Study the resulting core:
gdb pf_test core
SNMP (Conformance class B)¶
Conformance class B requires SNMP support. Linux uses net-snmp as agent, see http://www.net-snmp.org/. P-Net for Linux implements a Net-SNMP subagent that handles the Profinet mandatory MIB:s. Also see Network topology detection for information regarding SNMP.
Enable SNMP by setting
ON. Net-SNMP also needs to
be installed. On Ubuntu you can install the required packages using:
sudo apt install -y snmpd libsnmp-dev
The p-net SNMP subagent will handle the system objects so the default
SNMP system module should be disabled by adding the snmpd argument
-I -system_mib. On Ubuntu Linux you should change
/lib/systemd/system/snmpd.service to read:
[Unit] Description=Simple Network Management Protocol (SNMP) Daemon. After=network.target ConditionPathExists=/etc/snmp/snmpd.conf [Service] Type=simple ExecStartPre=/bin/mkdir -p /var/run/agentx ExecStart=/usr/sbin/snmpd -LOw -u Debian-snmp -g Debian-snmp -I -system_mib,smux,mteTrigger,mteTriggerConf -f -p /run/snmpd.pid ExecReload=/bin/kill -HUP $MAINPID [Install] WantedBy=multi-user.target
To see the status of the service:
systemctl status snmpd.service journalctl -u snmpd.service -f
To restart the service after modification:
sudo systemctl daemon-reload sudo systemctl restart snmpd.service
snmpd.conf controls access to the snmp agent. It should be
set to listen on all interfaces and allow read-write access to the
Profinet MIB:s. On Ubuntu Linux you should change
/etc/snmp/snmpd.conf to read:
master agentx agentaddress 0.0.0.0,[::1] view systemonly included .22.214.171.124.2.1.1 view systemonly included .126.96.36.199.188.8.131.52 view systemonly included .1.0.8802.1.1.2 rocommunity public default -V systemonly rwcommunity private default -V systemonly
If your Linux distribution does give a long description for
ifDesc you can
override it by adding a line to the
snmpd.conf file. Adapt the interface
index (last digit in OID) and the interface name:
override 184.108.40.206.220.127.116.11.1.2.3 octet_str "enp0s31f6"
See Network topology detection for more details on SNMP and how to verify the SNMP communication to the p-net stack.
snmpd in a Yocto build¶
In an embedded Linux Yocto build, you would include the
snmpd daemon by
To make the journalctl logs persistent between restarts:
sudo mkdir -p /var/log/journal sudo systemd-tmpfiles --create --prefix /var/log/journal
Remove all contents of the journalctl logs:
sudo journalctl --rotate sudo journalctl --vacuum-time=1s
Boot time optimization¶
The boot time should be less than approximately 15 seconds, for the “missing peer” alarm to be sent within 30 s after the power on.
To improve the startup time of your Linux device, it is useful to study what is delaying the start. If you use the “systemd” init system, you can use these commands to analyze the startup:
systemd-analyze systemd-analyze blame systemd-analyze critical-chain pnet-sampleapp.service