systemd merges support for Rust programs
systemd에 Rust 프로그램 빌드·통합 지원 추가
systemd가 Rust로 작성한 프로그램을 기존 C 프로그램과 함께 빌드하고 실행하는 기반을 추가합니다. Rust 코드는 no_std와 C 링크를 사용하며, Meson 설정과 bindgen 생성 바인딩, 테스트를 통해 기존 systemd 프로그램과의 호환성을 확인합니다.
- 주제
에디터 노트
이번 변경의 범위는 systemd 프로그램을 Rust로 다시 쓰는 일이 아니라 새 Rust 구성요소를 기존 C 빌드와 실행 체계에 편입하는 일입니다. Cargo와 std를 배제하고 C 링크를 경계로 삼으며 기존 명령행 동작과 출력을 테스트하는 설계가 그 범위를 분명히 합니다. 댓글에서도 기반 작업이라는 해석과 Cargo 배제에 대한 반응이 나옵니다. 다만 한 댓글은 이런 제약이 핵심 개발자의 기존 우려를 해결한다고 보지만, 원문은 그 우려가 무엇인지 밝히지 않습니다. 현재 제약과 호환성 검증은 구체적이지만 교차 컴파일은 아직 지원하지 않으며 Rust 코드가 실제 systemd 구성요소에 얼마나 쓰일지는 이 변경만으로 판단할 수 없습니다.
AI 요약
systemd에 Rust 프로그램을 추가하는 빌드·통합 기반이 들어갑니다. 기존 C 코드나 라이브러리를 Rust로 옮기지는 않습니다. Rust 프로그램은 systemd의 C 코드와 같은 libsystemd-shared를 동적으로 링크하고, Cargo나 외부 크레이트를 사용하지 않습니다.
빌드 조건과 지원 범위
Rust 지원은 Meson의 기능 옵션이며 기본값은 auto입니다. rustc 1.85 이상, bindgen 0.71.1 이상이 필요합니다. Meson 1.4.0의 bindgen 통합도 필요하지만 프로젝트 전체의 최소 Meson 버전은 올리지 않습니다. Meson이 오래되었거나 도구를 찾지 못하면 auto 설정에서 Rust 지원을 끄고, rust=enabled를 명시하면 필요한 도구가 없을 때 설정이 실패합니다. bindgen 0.72.0은 생성 코드가 컴파일되지 않아 거부합니다. libclang은 bindgen 실행 파일과 별도로 런타임에 로드하므로, 설정 단계에서 probe 헤더를 실제로 처리해 호환성을 확인합니다. 현재 교차 컴파일은 지원하지 않습니다.
Rust 프로그램은 core만 사용하며 std, alloc, 외부 크레이트를 포함하지 않습니다. systemd는 할당 실패를 오류로 돌려주는 Box와 Vec, C의 메모리 할당기를 사용하는 타입과 출력 매크로, 패닉 처리기 등을 제공합니다. 할당은 C와 같은 힙을 사용합니다. 보안 민감한 버퍼에는 해제 전 내용을 지우는 Erasing 할당기를 쓸 수 있습니다. 이 할당기는 이전 메모리에 비밀이 남을 수 있어 realloc()을 사용하지 않고, 크기를 늘릴 때 새 메모리에 복사한 뒤 기존 영역을 지웁니다.
C 코드와의 연결 및 안전 규칙
bindgen은 libsystemd-shared가 내보내는 함수와 타입, 상수뿐 아니라 systemd가 사용하는 일부 libc·커널 인터페이스도 빌드 시 생성합니다. C 라이브러리와 동일한 컴파일 옵션과 헤더 경로를 적용하고, 레이아웃 검증을 통해 구조체 불일치를 컴파일 오류로 처리합니다. 헤더의 정적 인라인 함수는 C 트램펄린으로 연결합니다. 생성 바인딩은 Rust 컴파일러 버전 차이로 린트가 실패하지 않도록 별도 처리합니다.
Rust 프로그램은 C 프로그램과 같은 실행 파일 목록과 명령행 프레임워크를 사용합니다. 명령, 옵션, 도움말, 버전, JSON 출력 처리도 기존 C 구현에 연결합니다. 메인 함수와 테스트 역시 C 쪽 실행 구조에 맞춥니다. Rust 코드는 모든 unsafe 블록에 SAFETY 주석을 달고 unsafe 함수에는 Safety 문서를 작성해야 합니다. 공개 항목에는 문서가 필요하고 포인터 변환도 명시적으로 다룹니다. 오버플로 검사는 모든 빌드에서 켜며 패닉은 중단 처리합니다. Rust 크레이트의 심볼은 프로그램 밖으로 내보내지 않습니다.
검증과 배포
Rust 테스트는 C 테스트 실행기에서 실행되며 메모리 할당과 실패 처리, 파일 디스크립터, 로깅, FFI 호출 등을 검사합니다. C와 Rust로 같은 명령행 프로그램을 각각 구현해 도움말, 옵션 오류, 서브명령과 종료 상태를 바이트 단위로 비교하는 패리티 테스트도 추가합니다. rustfmt, clippy, 바인딩 헤더 검사도 배포 테스트와 린터에 포함합니다. Debian 13은 최소 지원 도구 버전을 확인하는 이미지로 사용하고, Rust 도구 버전이 충분한 여러 배포판에서는 빌드 이미지에서 기능을 필수로 설정합니다.
Reddit 반응
- @anh0516 — /u/anh0516이 제출했습니다.
- @AiwendilH — 처음에는 조금 헷갈렸는데, Rust 도구를 systemd의 일부로 더 쉽게 빌드하도록 하는 기반 작업으로 보입니다. Rust 도구의 작성·통합 규칙을 정하고, Rust 프로그램에서 쓸 기본 도구도 제공합니다. Cargo 없이 C 링크만 사용하는 방식입니다.
- @30porn87 — Cargo 없이 C 링크만 사용한다니 정말 다행입니다.
- @scheimong — FSM이 무엇인가요?
- @30porn87 — 플라잉 스파게티 몬스터(Flying Spaghetti Monster)입니다. 플라잉 스파게티 몬스터 교회의 신이자 파스타파리안주의의 신입니다.
- @scheimong — 어디서부터든 시작해야죠.
- @marcthe12 — 일부 핵심 개발자의 논리를 생각하면 의외입니다. 하지만 표준 라이브러리 대부분과 Cargo를 금지하고, extern C 관련 규칙을 둬서 그 문제를 우회한 것 같습니다. 그렇게 하면 해결되겠네요.
원문: GitHub Pull Request / 번역·요약: Trawling