2020/06/16

一個適用於Linux的Windows子系統的應用情境–時間同步

摘要

本文概要介紹適用於Linux的Windows子系統(Windows Subsystem for Linux)上的一個應用情境–PTP(Precision Time Protocol)時間同步


本文

適用於Linux的Windows子系統(Windows Subsystem for Linux)是一個為了在Windows 10上面能夠原生地運行ELF格式之二進制可執行檔案的兼容層(compatibility layer)。
文章隨後是參照這裡進行安裝與測試PTPv2(IEEE 1588-2008)的master與slave,用以展示時間同步,其中,運行PTPv2的master為WSL上的Ubuntu、而PTPv2的slave則改用運行於Raspberry Pi 4上的Raspbian。

PTPv2 OC master

首先前往Windows市集安裝一個Ubuntu 20.04至Windows 10的WSL上。

安裝完畢後,便依照指示在Ubuntu 20.04上安裝ptpd2此一PTPv2常駐程式,接著再以這裡提供的範本為基礎,設定常駐程式的組態設定檔;其中,組態設定檔裡的interface被設為wifi0、而unicast_destinations僅設定了192.168.0.15。
ptpengine:interface = wifi0
ptpengine:unicast_destinations = 192.168.0.15

設定完畢後,便依照指示執行常駐程式。
sudo ptpd -c /mnt/c/temp/PTPd/PTPdUnicast.conf

至此,PTPv2的OC master已設定完畢。

PTPv2 OC slave

首先前往這裡下載一份Raspbian(或稱Raspberry Pi OS)、並且將其寫入SD卡;例如2020-05-27-raspios-buster-full-armhf.zip

將SD卡插入Raspberry Pi 4開機後,在shell上安裝linuxptp,內含ptp4l常駐程式。

由於目前預設的Raspbian的核心未包含PTPv2所需要的能力,所以需要參考這裡這裡來更換核心;其實就是對建構Raspberry Pi 4預設組態設定make bcm2711_defconfig後的.config檔案啟用CONFIG_NETWORK_PHY_TIMESTAMPINGCONFIG_PTP_1588_CLOCK編譯選項。編譯完畢後便將核心與device tree一併覆寫至SD卡對應的目錄。

倘若Raspberry Pi 4是以板子上的Ethernet網路卡進行連接,則linuxptp的ptp4l無法運行在啟用了CONFIG_NETWORK_PHY_TIMESTAMPINGCONFIG_PTP_1588_CLOCK編譯選項的核心上面;透過ethtool工具查詢將會發現該網路卡,也就是eth0介面,欠缺著SOF_TIMESTAMPING_TX_SOFTWARE能力。為了克服這個問題,需要參考這裡修正bcmgenet.c驅動程式,接著再重新編譯並更新核心至SD卡。

啟動linuxptp的ptp4l前需要調整組態設定檔,除了這裡提到的time_stamping要調整成software之外,還需要把slaveOnly設為1、assume_two_step設為1、以及hybrid_e2e設為1。

設定完畢後,便依照指示執行常駐程式。
sudo ptp4l -f /etc/linuxptp/ptp4l.conf -i eth0 -m -S -s

至此,PTPv2的OC slave已設定完畢。

Packet Capture

啟動Wireshark,可以觀察到Ubuntu 20.04上的ptpd2會以unicast形式發送Sync和Announce給Raspbian上的ptp4l,ptp4l也會以unicast形式發送Delay_Req要求予ptpd2、並取得對應的Delay_Resp回覆。其中,ptpd2的來源位址為192.168.0.11/24、而ptp4l的來源位址為192.168.0.15/24,兩者溝通方式為IPv4 UDP(非802.1AS)。



參考文獻

https://engineer-leo.blogspot.com/2016/11/windowsubuntubash.html
https://en.wikipedia.org/wiki/Windows_Subsystem_for_Linux
https://techcommunity.microsoft.com/t5/networking-blog/windows-subsystem-for-linux-for-testing-windows-10-ptp-client/ba-p/389181
https://github.com/microsoft/W32Time/tree/master/Precision%20Time%20Protocol
https://www.raspberrypi.org/downloads/raspberry-pi-os/
https://github.com/twteamware/raspberrypi-ptp
https://lore.kernel.org/lkml/20190831.235140.41717819509316735.davem@davemloft.net/T/


沒有留言:

張貼留言