
리눅스 시스템·서비스 관리자 systemd의 개발자 크리스티안 브라우너와 레나트 푀터링이 3일 Amutable 공식 블로그를 통해 Rust 도입 범위와 설계 원칙을 설명했다. 새로 만드는 개별 실행 프로그램에는 Rust를 쓸 수 있지만, 다른 구성 요소가 의존하는 공통 기반은 당분간 C로 유지한다는 내용이다.
Rust 프로그램을 지원하는 변경은 systemd 공식 저장소의 풀 리퀘스트(PR) #44324를 통해 10월 24일 병합됐다. 이번 글은 이 변경을 바탕으로 개발자들이 정한 제약과 배경을 풀어낸 것으로, 기존 systemd 코드를 모두 Rust로 다시 작성한다는 발표는 아니다.
적용 대상은 다른 구성 요소가 의존하지 않는 말단 실행 프로그램, 이른바 '리프 컴포넌트'다. 공식 코딩 지침은 기존 C 코드의 이식을 당분간 하지 않으며, libsystemd-shared와 libsystemd, NSS·PAM 모듈 등은 C로 남긴다고 명시한다.
빌드 체계도 기존 방식을 따른다. Rust의 패키지·빌드 도구인 Cargo를 도입하지 않고 Meson으로만 빌드한다. 공식 지침상 허용되는 크레이트는 core와 libc로 제한되며, std와 alloc 및 그 밖의 크레이트는 사용하지 않는다. 필요한 공통 기능은 저장소 내부의 systemd_shared 크레이트로 제공한다.
이 구조에서 Rust 프로그램은 C 프로그램처럼 공통 공유 라이브러리에 동적으로 연결된다. 명령행 옵션 처리, 도움말, 로그와 오류 처리도 기존 규약을 따른다. 프로젝트는 같은 명령을 정의한 C·Rust 프로그램의 명령행 동작을 비교하는 테스트를 두고, 사용자가 구현 언어에 따라 다른 동작을 겪지 않도록 했다.
메모리 부족을 다루는 방식 역시 통일했다. systemd는 메모리 할당 실패를 프로그램 중단으로 처리하지 않도록 자체 Box와 Vec 자료구조를 제공한다. 할당 결과는 오류로 반환할 수 있으며, 비밀 데이터를 담는 자료구조에는 메모리를 지운 뒤 해제하거나 이동하도록 하는 Erasing 할당자를 사용한다.
공유 라이브러리까지 Rust로 바꾸지 않는 배경에는 연결 방식의 제약이 있다. 글쓴이들은 Rust의 안정적인 ABI와 공유 라이브러리 지원 문제를 지적하며, 현재 방식으로 공통 기반에 Rust를 넣으면 여러 라이브러리와 실행 파일에 코드가 중복될 수 있다고 설명했다. 따라서 Rust 도입과 공통 라이브러리 전환을 별개의 과제로 다룬다.
Rust 지원은 선택 사항이다. 개발자들은 Rust를 쓰지 않는 systemd도 계속 사용할 수 있고 지원받을 수 있으며, 기존 사용자에게 제공하던 기능을 줄이지 않겠다고 밝혔다. 이번 원칙의 초점은 언어의 전면 교체보다 기존 시스템의 동작과 배포 구조를 유지하면서 새 구성 요소에 Rust를 적용하는 데 있다.
출처: Amutable 공식 블로그 'systemd ❤️ Rust' https://amutable.com/blog/systemd-loves-rust · systemd 공식 저장소 PR #44324 https://github.com/systemd/systemd/pull/44324 · systemd 공식 코딩 지침(Rust) https://github.com/systemd/systemd/blob/main/docs/CODING_STYLE.md#rust









