linuxptp v4.4 · Linux 6.18.37 timestamping 문서

ptp4l과 phc2sys는 서로 다른 시계를 맞춥니다

ptp4l은 네트워크의 PTP 메시지로 포트의 시계를 맞추고, phc2sys는 같은 시스템 안의 시계끼리 값을 옮깁니다. 하드웨어 타임스탬프를 쓰면 ptp4l이 맞추는 대상은 NIC의 PTP hardware clock(PHC)이고, 시스템 시계는 phc2sys가 따로 맞춰야 합니다.

두 프로그램의 역할

ptp4l은 IEEE 1588 PTP의 Linux 구현이며 Boundary Clock, Ordinary Clock, Transparent Clock을 구현합니다. phc2sys는 시스템 안의 둘 이상의 시계를 맞추는 프로그램이고, 보통은 ptp4l이 맞춘 PHC를 기준으로 시스템 시계를 맞춥니다. 커널은 등록된 PHC마다 character device(/dev/ptpN)를 만들고, 사용자 공간은 그 fd를 POSIX clock id로 써서 clock_gettime, clock_settime, clock_adjtime을 호출합니다. ptp4l.8 DESCRIPTION phc2sys.8 DESCRIPTION PHC 사용자 공간 API

프로그램입력맞추는 시계
ptp4l네트워크의 PTP 메시지와 그 타임스탬프하드웨어 모드에서는 포트의 PHC
phc2sys같은 시스템의 source 시계수동 모드의 -c로 정한 sink. 기본은 CLOCK_REALTIME

타임스탬프가 찍히는 위치

플래그Linux 6.18.37 문서의 정의
SOF_TIMESTAMPING_RX_HARDWARE네트워크 어댑터가 만든 수신 타임스탬프를 요청합니다.
SOF_TIMESTAMPING_RX_SOFTWARE드라이버가 패킷을 커널 수신 스택에 넘긴 직후에 만들어집니다.
SOF_TIMESTAMPING_TX_HARDWARE네트워크 어댑터가 만든 송신 타임스탬프를 요청합니다.
SOF_TIMESTAMPING_TX_SOFTWARE드라이버 안에서 패킷을 인터페이스로 넘기기 전에 만들어집니다. 드라이버 지원이 필요하므로 모든 장치에 있지는 않습니다.
SOF_TIMESTAMPING_SOFTWARE, RAW_HARDWARE생성된 소프트웨어·하드웨어 타임스탬프를 보고하게 합니다.

수신 시 recvmsg()의 SCM_TIMESTAMPING에서 ts[0]은 소프트웨어, ts[2]는 하드웨어 타임스탬프입니다. 하드웨어 타임스탬프는 장치마다 따로 켜야 하며, ETHTOOL_MSG_TSCONFIG_SET의 ETHTOOL_A_TSCONFIG_TX_TYPES·RX_FILTERS·HWTSTAMP_FLAGS netlink 속성으로 커널의 hwtstamp_config 필드를 설정합니다. 드라이버는 요청보다 넓은 필터로 올려 잡을 수 있고(예: PTP_V2_EVENT), 실제 적용한 값으로 구조체를 갱신합니다. 요청한 패킷을 찍을 수 없으면 ERANGE를 돌려주고, 변경은 관리자 권한이 필요합니다. 예전 방식인 SIOCSHWTSTAMP ioctl도 문서에 남아 있습니다. 수신·송신 타임스탬프 플래그 recvmsg의 ts 배열 하드웨어 타임스탬프 설정

ptp4l의 타임스탬프 모드

v4.4 ptp4l의 기본은 하드웨어 타임스탬프입니다. -H가 기본값이고, 설정 파일의 time_stamping도 기본이 hardware입니다. 허용 값은 hardware, software, legacy, onestep, p2p1step이며 one-step 모드는 하드웨어 타임스탬프에서만 쓸 수 있습니다. -S는 software, -L은 legacy hardware를 고릅니다. 하드웨어 모드에서는 -i와 설정 파일로 지정한 모든 포트가 같은 PHC에 붙어 있어야 합니다. 서로 다른 PHC로 boundary clock을 구성하려면 boundary_clock_jbod을 켜고 그 PHC들을 phc2sys 같은 외부 프로그램으로 맞춰야 합니다. -H, -S, -L time_stamping, twoStepFlag boundary_clock_jbod

client로만 동작하게 하는 옵션 이름도 바뀌었습니다. -s는 clientOnly 모드를 켜고, 설정 항목 slaveOnly는 deprecated이며 clientOnly를 쓰라고 적혀 있습니다. 기본 설정 파일 default.cfg의 clientOnly는 0입니다. -s slaveOnly default.cfg clientOnly

ptp4l -i eth0 -m                            # time_stamping hardware (default)
ptp4l -i eth0 -S -m                         # software time stamping
phc2sys -a -r -m                            # follow ptp4l port states, also CLOCK_REALTIME
phc2sys -s eth0 -c CLOCK_REALTIME -w -m     # fixed direction: PHC of eth0 -> system clock

위 명령은 서로 다른 옵션 조합의 예이며 모두 동시에 실행하는 절차가 아닙니다. eth0은 자리표시 이름이고 실제 인터페이스 이름과 PHC 지원 여부는 장비마다 다릅니다. 실행하면 시계가 조정될 수 있으므로 운영 중인 시간 동기화 서비스와의 충돌을 먼저 확인합니다. 이 글에서 장비 실행 검증을 마쳤다는 뜻은 아닙니다.

phc2sys의 방향 정하기

옵션v4.4 man page의 의미
-a실행 중인 ptp4l에서 맞출 시계를 읽고, 포트 상태가 바뀌면 동기화 방향도 자동으로 바꿉니다. -r이 없으면 CLOCK_REALTIME은 맞추지 않습니다.
-r, -rr-a와 함께만 쓰며 시스템 시계도 맞춥니다. 두 번 주면 시스템 시계가 source가 될 수도 있습니다.
-ssource 시계를 장치(/dev/ptp0), 인터페이스(eth0), 이름(CLOCK_REALTIME)으로 지정합니다. -a와 함께 쓸 수 없습니다.
-i-s와 같은 기능이며 deprecated입니다.
-csink 시계를 지정합니다. 기본은 CLOCK_REALTIME이고 -a와 함께 쓸 수 없습니다.
-wptp4l이 동기화될 때까지 기다리고, -O가 없으면 ptp4l의 currentUtcOffset으로 offset을 유지합니다. -a와 함께 쓸 수 없습니다.

man page는 -a를 권장 모드라고 적지 않습니다. -a는 포트 상태에 따라 방향을 바꾸는 방식이고, -s·-c·-w는 방향을 고정하는 방식입니다. 장비가 항상 client이거나 항상 server인지, 시스템 시계가 source가 되어도 되는지에 따라 고릅니다. -a, -r -s, -i, -c -w

PTP 시간 척도와 UTC

PTP 시간 척도는 윤초를 적용하지 않으므로 UTC와 수십 초 차이가 납니다. 하드웨어 모드의 ptp4l은 PTP 시간 척도를 알리고 PHC로 타임스탬프를 찍으므로 PHC는 PTP 시간, 시스템 시계는 UTC를 따릅니다. 이 둘의 차이는 phc2sys가 유지하며, -a나 -w일 때는 ptp4l에서 읽고 -O를 주면 명령줄 값을 씁니다. 이 offset을 잘못 유지하면 client에서는 시스템 시계가 정수 초만큼 어긋나고, server에서는 네트워크에 잘못된 PTP 시간을 알리게 됩니다. software·legacy 모드의 ptp4l은 server일 때 Arbitrary 시간 척도를 알리며, man page는 이것이 사실상 UTC라고 적습니다. phc2sys TIME SCALE USAGE ptp4l TIME SCALE USAGE

이 글은 v4.4 man page를 기준으로 합니다. 배포판 패키지는 다른 버전일 수 있으므로 옵션은 설치된 man page로 다시 확인합니다. linuxptp 공식 다운로드

공식 근거