3.8 KiB
Prereqs
Here I assume that your NIC is called enp4s0d1
Then check if the client supports hardware-transmit and hardware-receive.
ethtool -T enp4s0d1
If the client does support these two, continue on
Prepare PTP configs
First, install the linuxptp package.
Then make sure that no other time synchronization services, like chrony or ntpd or systemd-timesynced, are running.
sudo systemctl stop ntpd
sudo systemctl stop chrony
sudo systemctl stop systemd-timesyncd
sudo systemctl disable ntpd
sudo systemctl disable chrony
sudo systemctl disable systemd-timesyncd
Create PTP config file
sudo vim /etc/linuxptp/ptp4l-client.conf
[global]
verbose 1
# Hardware timestamping using the NIC PHC
time_stamping hardware
# Must match your grandmaster
domainNumber 0
network_transport UDPv4
delay_mechanism E2E
# Force this machine to be a PTP client, never grandmaster
clientOnly 1
# Useful while tuning
summary_interval 1
# Repeat these square brackets for each interface
[enp4s0]
Make PTP persistent
sudo vim /etc/systemd/system/ptp4l-client.service
[Unit]
Description=PTP client on enp4s0
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
ExecStart=/usr/sbin/ptp4l -i enp4s0 -f /etc/linuxptp/ptp4l-client.conf -m
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target
sudo vim /etc/systemd/system/phc2sys-client.service
[Unit]
Description=Sync system clock from enp4s0 PHC
After=ptp4l-client.service
Requires=ptp4l-client.service
[Service]
Type=simple
ExecStart=/usr/sbin/phc2sys -s enp4s0 -c CLOCK_REALTIME -w -m
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target
Then reload daemon and activate both PTP client and phc2sys
sudo systemctl daemon-reload
sudo systemctl enable --now ptp4l-client.service
sudo systemctl enable --now phc2sys-client.service
Verification
Verify if PTP and phc2sys works with these commands
journalctl -u ptp4l-client -f
journalctl -u phc2sys-client -f
and also verify the status of PTP with these commands
pmc -u -b 0 'GET PORT_DATA_SET'
pmc -u -b 0 'GET TIME_STATUS_NP'
pmc -u -b 0 'GET CURRENT_DATA_SET'
Boundary clock server
First, create a ptp4l-boundary-server.conf
sudo vim /etc/linuxptp/ptp4l-boundary-server.conf
[global]
time_stamping hardware
domainNumber 0
network_transport UDPv4
delay_mechanism E2E
# boundary_clock_jbod 1
# Let BMCA decide:
# upstream-facing port should become SLAVE/client
# downstream-facing port should become MASTER/server
priority1 200
priority2 128
summary_interval 1
[eno1]
# toward RPi5 grandmaster
[ens1f0]
# toward Nexus
Here's systemd service configs for a boundary clock server
sudo vim /etc/systemd/system/ptp4l-boundary-server.service
[Unit]
Description=PTP client on <NIC1>, <NIC2>
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
ExecStart=/usr/sbin/ptp4l -i <NIC1> -i <NIC2> -f /etc/linuxptp/ptp4l-boundary-server.conf -m
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target
sudo vim /etc/systemd/system/phc2sys-boundary-server.service
[Unit]
Description=Sync system clock from enp4s0 PHC
After=ptp4l-boundary-server.service
Requires=ptp4l-boundary-server.service
[Service]
Type=simple
ExecStart=/usr/sbin/phc2sys -a -rr -m
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target
Then reload daemon and activate both PTP client and phc2sys
sudo systemctl daemon-reload
sudo systemctl enable --now ptp4l-boundary-server.service
sudo systemctl enable --now phc2sys-boundary-server.service