AS/400 × Gemini 재도전: Rust는 작동했지만, SDK는 불가능했다
요약
본 기사는 AS/400 (IBM i) 환경에서 Google Gen AI SDK를 사용하려는 시도와 그 기술적 어려움을 다룹니다. 작성자는 IBM Open SDK for Rust를 활용하여 Rust 코드 자체는 성공적으로 컴파일하고 실행하는 데까지 도달했으나, Python 생태계의 `pip install`을 통해 의존성 관리(예: pydantic-core)가 필요한 경우 발생하는 빌드 시스템 문제에 직면했습니다. 결국, 복잡한 파이썬 패키지의 모든 의존성을 수동으로 수정하는 것은 비현실적이라 결론 내리고, IBM i 환경에서 Gemini를 사용하려면 REST API 직접 호출이나 Rust의 표준화까지 기다리는 것이 최선이라고 정리합니다.
핵심 포인트
- IBM i (AS/400) 환경에서 Google Gen AI SDK 사용을 위해 IBM Open SDK for Rust를 활용하는 방법을 시도함.
- Rust 컴파일러(rustc)와 Cargo는 AIX 7.3의 기본 PASE 라이브러리 대신, 별도로 확보한 IBM Open XL C/C++ Runtime 및 OpenSSL 3.x 버전을 사용하여 성공적으로 빌드 환경을 구축함.
- Python 패키지 관리자(`pip install`)를 통한 의존성 설치 과정에서 발생하는 `build.rs` 관련 오류(특히 `anyhow` 크레이트의 정리 실패)는 수많은 의존성을 수동으로 수정해야 하는 난관에 부딪힘.
- 결론적으로, Rust 단독 실행은 가능했으나 Python SDK 사용은 불가능하여, IBM i 환경에서는 REST API 직접 호출이 가장 현실적인 대안임을 제시함.
지난번, IBM i (AS/400)에서 Google Gen AI SDK를 pip install하려고 했으나 pydantic-core의 Rust 빌드를 할 수 없어서, 결국 REST API를 직접 호출하여 IBM i에서 Gemini를 사용하도록 했습니다.
그 후 IBM Open SDK for Rust on AIX 1.92.0을 발견했으므로, IBM i 7.6 PASE에서 다시 한번 Google Gen AI SDK를 시도해 보고자 합니다.
BASE=https://public.dhe.ibm.com/aix/freeSoftware/aixtoolbox/RPMS/ppc-7.3/rust
mkdir -p /tmp/rustrpm
cd /tmp/rustrpm
...
공식 절차는 Fix Central + rustndi이지만, Fix Pack 단독으로는 완결되지 않으며 GA tarball이 필요합니다. 하지만 Fix Pack 1 출시 이후에는 Fix Central에서 GA 링크가 사라져 입수가 불가능합니다. 그래서 AIX Toolbox에 rpm이 그대로 올라와 있어 이쪽에서 취득했습니다.
cd /tmp/xl
zcat IBM_OPEN_XL_CPP_RUNTIME_17.1.4.0_AIX.tar.Z | tar -xvf -
restore -xqf libunwind.rte
...
rustc / cargo는 libunwind.a(libunwind.so.1)와 libc++.a(shr2_64.o)를 요구하지만, AIX 7.3에서는 IBM Open XL C/C++ Runtime을 통해 설치되어 있는 이 패키지가 IBM i 7.6 PASE의 기본값으로는 들어있지 않기 때문에, 입수한 파일에서 전개했습니다.
PASE 표준의 libc++.a를 덮어쓰고 싶지 않으므로 별도 디렉토리에 전개하고 있습니다.
mkdir -p /tmp/ssl-extract && cd /tmp/ssl-extract
ar -X64 -x /QOpenSys/pkgs/lib/libssl.so.3
mv shr_64.o libssl.so.3
...
cargo가 기대하는 것은 libssl.a 아카이브 안의 libssl.so.3 (OpenSSL 3.x) 멤버이지만, PASE 표준의 libssl.a에는 1.0 계열까지만 들어있었습니다.
그렇기 때문에 yum으로 도입된 /QOpenSys/pkgs/lib/libssl.so.3가 3.x이므로, 이것을 libssl.a로서 재아카이브했습니다. crypto에서도 동일한 작업을 수행했습니다.
for f in rustc rustdoc cargo; do
cp /opt/freeware/lib/RustSDK/1.92/bin/$f /opt/freeware/lib/RustSDK/1.92/bin/$f.bak
sed 's|export LIBPATH=/usr/lpp/xlC/lib|export LIBPATH=/opt/freeware/lib/openxl:/usr/lpp/xlC/lib|' \
...
방금 생성한 /opt/freeware/lib/openxl/에 둔 새로운 libc++ / libssl / libcrypto를 PASE 표준보다 우선하여 읽게 하고 싶으므로, LIBPATH의 선두에 추가합니다.
$ rustc --version
rustc 1.92.0 (e74881c9b 2026-03-10) (IBM Open SDK for Rust on AIX 1.92.0.1)
$ cargo new hello && cd hello && cargo build && ./target/debug/hello
...
여기까지 해서 겨우 Rust 단독으로 작동하게 되었습니다.
pip install pydantic
여기서 pydantic-core의 Rust 빌드가 시작되어 build.rs 단계에 도달했으나, 다음과 같이 실패합니다.
error: failed to run custom build command for `anyhow v1.0.102`
Failed to clean up /.../out/probe: Not a directory (os error 20)
probe디렉토리를 생성한다rustc를 실행한다fs::remove_dir_all로 정리한다
라는 흐름이지만, 이 3번의 remove_dir_all이 PASE에서는 AIX와 동작이 달라 ENOTDIR을 반환하며 실패합니다.
anyhow 하나뿐이라면 build.rs를 오버라이트 패치(overwrite patch)로 돌파할 수 있습니다.
ANYHOW=~/.cargo/registry/src/github.com-*/anyhow-1.0.102
cat > $ANYHOW/build.rs <<'EOF'
fn main() { println!("cargo:rerun-if-changed=src/nightly.rs"); }
...
하지만 pydantic-core의 의존 크레이트(dependency crate)는 수십 개에 달하며, 각각이 build.rs를 가지고 있습니다. 모든 곳에 계속 패치를 적용하는 것은 현실적이지 않기에 여기서 포기했습니다😢
Rust 단독으로는 동작하게 되었습니다. 하지만 Python SDK 계열의 pip install은 불가능했습니다. 따라서 IBM i에서 Gemini를 사용할 경우에는 REST API를 직접 호출하거나, Rust가 IBM i의 표준이 될 때까지 기다리는 것이 정답이라고 생각했습니다. 아쉽습니다
AI 자동 생성 콘텐츠
본 콘텐츠는 Qiita AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기