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 cmake
with 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:
build/pf_test --gtest_filter=CmrpcTest.CmrpcConnectReleaseTest
Create Doxygen documentation:
cmake --build build --target docs
The Doxygen documentation ends up in build/html/index.html
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
Resulting size:
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 PNET_OPTION_SNMP
to 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
The file 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 .1.3.6.1.2.1.1
view systemonly included .1.3.6.1.2.1.2.2
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 1.3.6.1.2.1.2.2.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
using the net-snmp
recipe.
Persistent logs¶
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