파일의 존재 여부, 이것이 문제입니다

오늘 나는 흥미로운 문제에 부딪쳤다. 바이너리를 다운로드했고 Linux를 실행하려고 할 때 놀랐습니다: No such file or directory .

기다리다! 이런 젠장?

echo $?
127


What does it mean ?

물론 파일이 존재하고 실행 가능하며 소유권은 정상입니다.

ls -la ./ignite-cntr
-rwxr-xr-x 1 mhmxs users 43785128 May 16 08:43 ./ignite-cntr


내 호스트와 동일한 ELF 바이너리입니다.

file ./ignite-cntr
./ignite-cntr: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, Go BuildID=2ysLdCmI_2jEgu-V5h1c/SP9Ydh3EJWttepF73BdP/89qBX7R3MEzeLn0NZARQ/PDW1WPguwGiACmtUAl2M, BuildID[sha1]=1954e0539099fce0e813bc5ce5017ab0e8128468, not stripped


동적 종속성은 어떻습니까?

ldd ./ignite-cntr
        linux-vdso.so.1 (0x00007ffcbd5ca000)
        libpthread.so.0 => /nix/store/qjgj2642srlbr59wwdihnn66sw97ming-glibc-2.33-123/lib/libpthread.so.0 (0x00007fc896577000)
        libdl.so.2 => /nix/store/qjgj2642srlbr59wwdihnn66sw97ming-glibc-2.33-123/lib/libdl.so.2 (0x00007fc896572000)
        libc.so.6 => /nix/store/qjgj2642srlbr59wwdihnn66sw97ming-glibc-2.33-123/lib/libc.so.6 (0x00007fc89639d000)
        /lib64/ld-linux-x86-64.so.2 => /nix/store/qjgj2642srlbr59wwdihnn66sw97ming-glibc-2.33-123/lib64/ld-linux-x86-64.so.2 (0x00007fc896599000)


모든 것이 괜찮은 것 같습니다. 어떻게든 문제를 디버깅해 봅시다.

strace ./ignite-cntr
execve("./ignite-cntr", ["./ignite-cntr"], 0x7ffcb65d4f30 /* 133 vars */) = -1 ENOENT (No such file or directory)
strace: exec: No such file or directory
+++ exited with 1 +++


새로운 것은 없다 :)

ltrace ./ignite-cntr
Can't execute `./ignite-cntr': No such file or directory
failed to initialize process 3885: No such file or directory
couldn't open program './ignite-cntr': No such file or directory


???

gdb -q ./ignite-cntr
(gdb) run
Starting program: ./ignite-cntr
/nix/store/gqicc6kxah7f8j54hp80qxpk16898lj9-bash-interactive-5.1-p8/bin/bash: line 1: ./ignite-cntr: No such file or directory


알겠습니다. 잘 모르겠습니다. Google에서 검색해 보겠습니다.
https://github.com/NixOS/nixpkgs/issues/107375

내가 NixOS 사용자라는 것을 눈치채셨나요?

nix-shell -p patchelf --run "patchelf --print-interpreter ./ignite-cntr"
/lib64/ld-linux-x86-64.so.2


따라서 NixOS에는 자체 패키지 관리자가 있으며 시스템을 구축합니다. 이 패키지 관리자를 사용하면 바이너리를 git 해시에 의한 종속성과 바인딩하는 것이 상대적으로 쉽습니다. 이를 통해 동일한 시스템에서 각 바이너리에 대해 서로 다른 버전을 사용할 수 있습니다.

하지만 이 바이너리는 NixOS 외부에서 빌드되었으며 인터프리터는 내 컴퓨터에 존재하지 않는 인터프리터를 가리키고 있습니다. 심볼릭 링크를 사용하는 대신 다운로드한 ELF 바이너리를 동일한patchelf 명령으로 간단히 패치했습니다.

nix-shell -p glibc patchelf --run "patchelf --set-interpreter $(find /nix/store -name ld-linux-x86-64.so.2 | head -1) ./ignite-cntr"


마지막으로 다음과 같이 작동합니다.

./ignite-cntr
ignite-cntr is an ignite VM image creation and container application
running tool. The VM images are built to support running container applications.


알게되어 반갑습니다. NixOS에게 이것을 가르쳐 주셔서 감사합니다!

좋은 웹페이지 즐겨찾기