세 가지 작은 Rust 크레이트와, systemd 소켓 활성화·pidfd·name_to_handle_at가 어떻게 서로 연결되는지에 대한 글입니다.
2026년 3월 27일 — Sebastian Wick 작성
태그:
저는 Rust 크레이트 세 개를 공개했습니다:
name_to_handle_at 및 open_by_handle_at 시스템 호출을 위한 안전한 저수준 Rust 바인딩이것들은 꽤 임의적이고 서로 관련 없는 것들처럼 보일 수도 있습니다. 하지만 연결고리가 있습니다!
systemd 소켓 활성화는 파일 디스크립터와 약간의 메타데이터를 환경 변수로 활성화된 프로세스에 전달합니다. 활성화된 프로세스가 다른 프로그램을 exec하면, 파일 디스크립터는 CLOEXEC가 아니기 때문에 그대로 전달됩니다. 그러고 나서 그 프로세스가 그것들을 집어 들면, 상황이 매우 잘못될 수 있습니다. 그래서 활성화된 프로세스는 파일 디스크립터를 CLOEXEC로 표시하고, 소켓 활성화 환경 변수를 unset해야 합니다. 하지만 어떤 이유로든 프로세스가 이것을 하지 않으면 같은 문제가 발생할 수 있습니다. 그래서 이를 방지하는 데 도움이 되는 또 다른 메커니즘이 있습니다. 또 다른 메타데이터 조각에는 대상의 PID가 들어 있습니다. 프로세스는 이것을 자신의 PID와 비교해 자신이 활성화의 대상이었는지 확인할 수 있으며, 이를 위해 다른 모든 프로세스가 올바르게 동작한다는 가정에 의존할 필요가 없습니다.
하지만 PID는 꽤 빠르게 순환하기 때문에 경쟁 상태에 취약합니다. 그래서 오늘날에는 pidfd가 있습니다. 이것은 프로세스에 대한 안정적인 핸들 역할을 하는 파일 디스크립터이며, ID 순환 문제를 피할 수 있게 해줍니다. 오늘날 systemd의 소켓 활성화는 pidfd ID도 전달합니다. 하지만 pidfd ID는 pidfd 파일 디스크립터와 같은 것이 아닙니다! 이것은 pidfd 파일 시스템에 있는 pidfd 파일 디스크립터의 64비트 inode입니다. 이것의 장점은 systemd가 닫히지 않을 수도 있는 또 다른 파일 디스크립터를 대상 프로세스에 설치할 필요가 없다는 점입니다. 대신 단지 pidfd ID 숫자를 $LISTEN_PIDFDID 환경 변수에 넣으면 됩니다.
파일 디스크립터의 inode를 얻는 일은 어렵지 않아 보입니다. fstat(2)는 st_ino 필드를 가진 struct stat를 채웁니다. 문제는 그것의 타입이 ino_t라는 점인데, 어떤 시스템에서는 이것이 32비트이므로 다시 꽤 빠르게 순환하는 프로세스 식별자를 얻게 될 수도 있습니다.
하지만 pidfd에 대해 name_to_handle 시스템 호출을 사용하면 f_handle 필드를 가진 struct file_handle를 얻을 수 있습니다. 매뉴얼 페이지는 친절하게도 “호출자는 file_handle 구조체를 불투명한 데이터 타입으로 취급해야 한다”고 말합니다. 하지만 우리는 그것을 무시할 것입니다. 적어도 pidfd 파일 시스템에서는 첫 64비트가 64비트 inode이기 때문입니다. systemd가 이미 이것에 의존하고 있고, 커널의 “사용자 공간을 깨뜨리지 말라”는 규칙도 있으니, 이제 이것은 API입니다. 매뉴얼 페이지가 뭐라고 하든 상관없습니다.
자, 그래서 보시다시피 전부 연결되어 있습니다.
물론 pidfd와 name_to_handle 둘 다 더 흥미로운 용도가 있으며, 그중 많은 것은 저의 더 큰 목표인 Varlink 서비스를 일급 시민으로 만드는 일에 기여합니다. 이에 대해서는 다음에 더 이야기하겠습니다.
댓글이 있으신가요?
mastodon에서 툿을 보내시거나 메일을 보내 주세요!
2026년 3월 27일
태그: * pidfd * rust * name_to_handle_at * systemd * varlink
2026년 3월 10일
2026년 1월 21일
태그: * GNOME * glib * libdex * async * fibers
2026년 1월 6일
2025년 12월 13일
태그: * flatpak * system integration
2025년 11월 4일
태그: * flatpak * portals * dbus * varlink
2025년 10월 10일
태그: * flatpak * wayland * dbus * pidfd * cgroup * portals
2025년 9월 24일
태그: * xdg-specs * glib * GNOME
2025년 9월 18일
태그: * GNOME * glib * libdex * dbus * async
2025년 8월 21일
태그: * portals * flatpak * testing
2025년 8월 15일
태그: * color management * HDR * display
2025년 8월 8일
태그: * GNOME * color management * HDR * backlight
2025년 7월 13일
태그: * HDR * color management * wayland * blender * vulkan
2024년 1월 30일
태그: * silverblue * toolbox * podman * ostree
2023년 9월 21일
태그: * flatpak * wayland * dbus * pidfd * portals
2023년 8월 31일
태그: * silverblue * podman * ostree
2023년 8월 22일
태그: * silverblue * gnome-shell * mutter * systemd * podman
2023년 8월 17일
태그: * server * podman * hetzner * docker-compose * coreos
© 2026 Sebastian Wick, CC BY-ND 4.0