ArchLinux: pacman 오류. (: failed to commit transaction (conflicting files), Errors occurred, no packages were upgraded).

2023년 설 연휴 첫 날. kime 팀이 새 판 소식을 알렸다. 내가 보고했던 버그도 해결된 3.0.2 판. 즐거운 맘에 설치를 해보려했는데..

cargo(rust 용 프로그램)가 없다며 투정을 부린다. 흠??
rust 는 설치돼 있었다. cargo 라고 명령을 내리면 틀림없이 동작을 한다. 그런데 꾸러미로는 없다고 나오나보다. 그러니 makepkg 에서 오류가 났겠지.

뭔가 꼬였나보다.. 생각하고 rust 를 재설치하려 했다. 우분투의 apt 와 달리, pacman -S 는 꾸러미가 이미 설치돼 있을 경우 자동으로 재설치로 방향을 바꿔준다.
아무튼 그랬더니?? (또는, 삭제를 먼저하고 설치를 했었는지도 모르겠다. 이것 저것 막 해봤기 때문에..)

이런 불쾌한 문구를 내뱉는다.

resolving dependencies...
looking for conflicting packages...

Packages (1) rust-1:1.66.1-2

Total Installed Size:  531.98 MiB

:: Proceed with installation? [Y/n] 
(1/1) checking keys in keyring                                                                            [##############################################################] 100%
(1/1) checking package integrity                                                                          [##############################################################] 100%
(1/1) loading package files                                                                               [##############################################################] 100%
(1/1) checking for file conflicts                                                                         [##############################################################] 100%
error: failed to commit transaction (conflicting files)
rust: /usr/bin/cargo exists in filesystem
rust: /usr/bin/cargo-clippy exists in filesystem
rust: /usr/bin/cargo-fmt exists in filesystem
rust: /usr/bin/clippy-driver exists in filesystem
rust: /usr/bin/rust-demangler exists in filesystem
rust: /usr/bin/rust-gdb exists in filesystem
rust: /usr/bin/rust-gdbgui exists in filesystem
rust: /usr/bin/rust-lldb exists in filesystem
rust: /usr/bin/rustc exists in filesystem
rust: /usr/bin/rustdoc exists in filesystem
rust: /usr/bin/rustfmt exists in filesystem
rust: /usr/lib/cargo-credential-1password exists in filesystem
rust: /usr/lib/librustc_driver-16cbdf77defe646b.so exists in filesystem
rust: /usr/lib/libstd-b8b91f2b1db9cbe6.so exists in filesystem
rust: /usr/lib/libtest-752eb30c40700df8.so exists in filesystem
rust: /usr/lib/rust-analyzer-proc-macro-srv exists in filesystem
rust: /usr/lib/rustlib/etc/gdb_load_rust_pretty_printers.py exists in filesystem
rust: /usr/lib/rustlib/etc/gdb_lookup.py exists in filesystem
rust: /usr/lib/rustlib/etc/gdb_providers.py exists in filesystem
rust: /usr/lib/rustlib/etc/lldb_commands exists in filesystem
rust: /usr/lib/rustlib/etc/lldb_lookup.py exists in filesystem
rust: /usr/lib/rustlib/etc/lldb_providers.py exists in filesystem
rust: /usr/lib/rustlib/etc/rust_types.py exists in filesystem
rust: /usr/lib/rustlib/x86_64-unknown-linux-gnu/analysis/libaddr2line-891d2a09ac7760d7.json exists in filesystem
rust: /usr/lib/rustlib/x86_64-unknown-linux-gnu/analysis/libadler-557164521f933ede.json exists in filesystem
rust: /usr/lib/rustlib/x86_64-unknown-linux-gnu/analysis/liballoc-dc56a79755115f7a.json exists in filesystem
rust: /usr/lib/rustlib/x86_64-unknown-linux-gnu/analysis/libcfg_if-170ee0e8a0f15429.json exists in filesystem
rust: /usr/lib/rustlib/x86_64-unknown-linux-gnu/analysis/libcfg_if-2cc898f9c85684e4.json exists in filesystem
rust: /usr/lib/rustlib/x86_64-unknown-linux-gnu/analysis/libcompiler_builtins-4ed90f65a9d1f725.json exists in filesystem
rust: /usr/lib/rustlib/x86_64-unknown-linux-gnu/analysis/libcore-d72567485ed1c754.json exists in filesystem
rust: /usr/lib/rustlib/x86_64-unknown-linux-gnu/analysis/libgetopts-9c4355d22782c5c4.json exists in filesystem
rust: /usr/lib/rustlib/x86_64-unknown-linux-gnu/analysis/libgimli-ef5dd97fe64e1302.json exists in filesystem
rust: /usr/lib/rustlib/x86_64-unknown-linux-gnu/analysis/libhashbrown-57e9d108d57ca0ef.json exists in filesystem
rust: /usr/lib/rustlib/x86_64-unknown-linux-gnu/analysis/liblibc-89aa0c238282627b.json exists in filesystem
rust: /usr/lib/rustlib/x86_64-unknown-linux-gnu/analysis/libmemchr-a557d5a797a9154a.json exists in filesystem
rust: /usr/lib/rustlib/x86_64-unknown-linux-gnu/analysis/libminiz_oxide-0678e4060c73f010.json exists in filesystem
rust: /usr/lib/rustlib/x86_64-unknown-linux-gnu/analysis/libobject-abfc95df5e7f2150.json exists in filesystem
rust: /usr/lib/rustlib/x86_64-unknown-linux-gnu/analysis/libpanic_abort-976e802d24942f2e.json exists in filesystem
rust: /usr/lib/rustlib/x86_64-unknown-linux-gnu/analysis/libpanic_unwind-5d676c61a1beb116.json exists in filesystem
rust: /usr/lib/rustlib/x86_64-unknown-linux-gnu/analysis/libproc_macro-9aae0e05dd5cbae9.json exists in filesystem
rust: /usr/lib/rustlib/x86_64-unknown-linux-gnu/analysis/libprofiler_builtins-625321b282abcc12.json exists in filesystem
rust: /usr/lib/rustlib/x86_64-unknown-linux-gnu/analysis/librustc_demangle-5dd17baee73b9ecd.json exists in filesystem
rust: /usr/lib/rustlib/x86_64-unknown-linux-gnu/analysis/librustc_std_workspace_alloc-3eece670ff221d60.json exists in filesystem
rust: /usr/lib/rustlib/x86_64-unknown-linux-gnu/analysis/librustc_std_workspace_core-f91ae436138fa45c.json exists in filesystem
rust: /usr/lib/rustlib/x86_64-unknown-linux-gnu/analysis/librustc_std_workspace_std-19637ff8679d67a6.json exists in filesystem
rust: /usr/lib/rustlib/x86_64-unknown-linux-gnu/analysis/libstd-b8b91f2b1db9cbe6.json exists in filesystem
rust: /usr/lib/rustlib/x86_64-unknown-linux-gnu/analysis/libstd_detect-f71186579508f7ac.json exists in filesystem
rust: /usr/lib/rustlib/x86_64-unknown-linux-gnu/analysis/libtest-752eb30c40700df8.json exists in filesystem
rust: /usr/lib/rustlib/x86_64-unknown-linux-gnu/analysis/libunicode_width-d2f8cb27f73d47bd.json exists in filesystem
rust: /usr/lib/rustlib/x86_64-unknown-linux-gnu/analysis/libunwind-b288d979493a7f7f.json exists in filesystem
rust: /usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/libaddr2line-891d2a09ac7760d7.rlib exists in filesystem
rust: /usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/libadler-557164521f933ede.rlib exists in filesystem
rust: /usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/liballoc-dc56a79755115f7a.rlib exists in filesystem
rust: /usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcfg_if-170ee0e8a0f15429.rlib exists in filesystem
rust: /usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcfg_if-2cc898f9c85684e4.rlib exists in filesystem
rust: /usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcompiler_builtins-4ed90f65a9d1f725.rlib exists in filesystem
rust: /usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcore-d72567485ed1c754.rlib exists in filesystem
rust: /usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/libgetopts-9c4355d22782c5c4.rlib exists in filesystem
rust: /usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/libgimli-ef5dd97fe64e1302.rlib exists in filesystem
rust: /usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/libhashbrown-57e9d108d57ca0ef.rlib exists in filesystem
rust: /usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/liblibc-89aa0c238282627b.rlib exists in filesystem
rust: /usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/libmemchr-a557d5a797a9154a.rlib exists in filesystem
rust: /usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/libminiz_oxide-0678e4060c73f010.rlib exists in filesystem
rust: /usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/libobject-abfc95df5e7f2150.rlib exists in filesystem
rust: /usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/libpanic_abort-976e802d24942f2e.rlib exists in filesystem
rust: /usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/libpanic_unwind-5d676c61a1beb116.rlib exists in filesystem
rust: /usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/libproc_macro-9aae0e05dd5cbae9.rlib exists in filesystem
rust: /usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/libprofiler_builtins-625321b282abcc12.rlib exists in filesystem
rust: /usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/librustc-stable_rt.asan.a exists in filesystem
rust: /usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/librustc-stable_rt.lsan.a exists in filesystem
rust: /usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/librustc-stable_rt.msan.a exists in filesystem
rust: /usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/librustc-stable_rt.tsan.a exists in filesystem
rust: /usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/librustc_demangle-5dd17baee73b9ecd.rlib exists in filesystem
rust: /usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/librustc_std_workspace_alloc-3eece670ff221d60.rlib exists in filesystem
rust: /usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/librustc_std_workspace_core-f91ae436138fa45c.rlib exists in filesystem
rust: /usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/librustc_std_workspace_std-19637ff8679d67a6.rlib exists in filesystem
rust: /usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/libstd-b8b91f2b1db9cbe6.rlib exists in filesystem
rust: /usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/libstd-b8b91f2b1db9cbe6.so exists in filesystem
rust: /usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/libstd_detect-f71186579508f7ac.rlib exists in filesystem
rust: /usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/libtest-752eb30c40700df8.rlib exists in filesystem
rust: /usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/libtest-752eb30c40700df8.so exists in filesystem
rust: /usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/libunicode_width-d2f8cb27f73d47bd.rlib exists in filesystem
rust: /usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/libunwind-b288d979493a7f7f.rlib exists in filesystem
rust: /usr/share/bash-completion/completions/cargo exists in filesystem
rust: /usr/share/doc/rust/README.md exists in filesystem
rust: /usr/share/doc/rust/README.md.old exists in filesystem
rust: /usr/share/licenses/rust/COPYRIGHT exists in filesystem
rust: /usr/share/licenses/rust/LICENSE-APACHE exists in filesystem
rust: /usr/share/licenses/rust/LICENSE-APACHE.old exists in filesystem
rust: /usr/share/licenses/rust/LICENSE-MIT exists in filesystem
rust: /usr/share/licenses/rust/LICENSE-MIT.old exists in filesystem
rust: /usr/share/licenses/rust/LICENSE-THIRD-PARTY exists in filesystem
rust: /usr/share/man/man1/cargo-add.1.gz exists in filesystem
rust: /usr/share/man/man1/cargo-bench.1.gz exists in filesystem
rust: /usr/share/man/man1/cargo-build.1.gz exists in filesystem
rust: /usr/share/man/man1/cargo-check.1.gz exists in filesystem
rust: /usr/share/man/man1/cargo-clean.1.gz exists in filesystem
rust: /usr/share/man/man1/cargo-doc.1.gz exists in filesystem
rust: /usr/share/man/man1/cargo-fetch.1.gz exists in filesystem
rust: /usr/share/man/man1/cargo-fix.1.gz exists in filesystem
rust: /usr/share/man/man1/cargo-generate-lockfile.1.gz exists in filesystem
rust: /usr/share/man/man1/cargo-help.1.gz exists in filesystem
rust: /usr/share/man/man1/cargo-init.1.gz exists in filesystem
rust: /usr/share/man/man1/cargo-install.1.gz exists in filesystem
rust: /usr/share/man/man1/cargo-locate-project.1.gz exists in filesystem
rust: /usr/share/man/man1/cargo-login.1.gz exists in filesystem
rust: /usr/share/man/man1/cargo-metadata.1.gz exists in filesystem
rust: /usr/share/man/man1/cargo-new.1.gz exists in filesystem
rust: /usr/share/man/man1/cargo-owner.1.gz exists in filesystem
rust: /usr/share/man/man1/cargo-package.1.gz exists in filesystem
rust: /usr/share/man/man1/cargo-pkgid.1.gz exists in filesystem
rust: /usr/share/man/man1/cargo-publish.1.gz exists in filesystem
rust: /usr/share/man/man1/cargo-remove.1.gz exists in filesystem
rust: /usr/share/man/man1/cargo-report.1.gz exists in filesystem
rust: /usr/share/man/man1/cargo-run.1.gz exists in filesystem
rust: /usr/share/man/man1/cargo-rustc.1.gz exists in filesystem
rust: /usr/share/man/man1/cargo-rustdoc.1.gz exists in filesystem
rust: /usr/share/man/man1/cargo-search.1.gz exists in filesystem
rust: /usr/share/man/man1/cargo-test.1.gz exists in filesystem
rust: /usr/share/man/man1/cargo-tree.1.gz exists in filesystem
rust: /usr/share/man/man1/cargo-uninstall.1.gz exists in filesystem
rust: /usr/share/man/man1/cargo-update.1.gz exists in filesystem
rust: /usr/share/man/man1/cargo-vendor.1.gz exists in filesystem
rust: /usr/share/man/man1/cargo-verify-project.1.gz exists in filesystem
rust: /usr/share/man/man1/cargo-version.1.gz exists in filesystem
rust: /usr/share/man/man1/cargo-yank.1.gz exists in filesystem
rust: /usr/share/man/man1/cargo.1.gz exists in filesystem
rust: /usr/share/man/man1/rustc.1.gz exists in filesystem
rust: /usr/share/man/man1/rustdoc.1.gz exists in filesystem
rust: /usr/share/zsh/site-functions/_cargo exists in filesystem
Errors occurred, no packages were upgraded.

종합하면 이렇다.

“rust 꾸러미를 설치하려 했으나, 이미 /usr/bin/cargo 등이 설치돼 있기에, 그걸 무시하고 그냥 덮어쓸 순 없다!”

이 문제를 해결하기까지.. 한 한시간쯤 또 인터넷을 뒤져야했다.


역시 모든 답은 ArchLinux 문서에 있었다. 여기에 해법은 있었는데, 늘 그렇듯 해당 지식과 경험이 없으면 읽어도 뭔 얘긴지 잘 알 수가 없다.
아무튼, 여기서 제안하는 바는 이렇다.

  • 충돌이 발생한 파일을 다른 꾸러미가 점유하고 있는지 확인.
  • /var/lib/pacman/local/package-version/files 이 존재하는지 확인.

꾸러미 점유 여부는 pacman -Qo /path/to/file 로 가능하다. 내 경우는 pacman -Qo /usr/bin/cargo 였다. 소유한 꾸러미가 없다고 나왔다.
이런 경우, /var/lib/pacman/local/package-version/files 을 봐야 하는데, 여기가 손상되었거나 삭제되었을 경우 위와 같은 오류가 발생할 수 있다고 한다. 나한텐 이 디렉토리/파일은 없었다. 어쩌면 pacman -Rns rust 로 삭제됐는지도 모르겠다. (그러나 실제로 꾸러미파일은 지워지지 않은 상태!)

그렇다면 해결책은?

아치 문서에선, 존재하는 파일의 이름을 바꿔주고 다시 설치 작업을 하라고 한다. 예를 들어, /usr/bin/cargo 가 있다고 나오니, 이걸 /usr/bin/cargo-old 등으로 바꾸고 다시 해보라는 의미인데.. 파일이 한 두개가 아닌데..??

이를 위해 -S --overwrite 가 제공된다. 단, 이 선택사항은 남용(?)되어선 안된다는 경고가 붙어있다.
문제는 사용법인데..

# pacman -S --overwrite glob package
' 즉, rust 라면
# pacman -S --overwrite glob rust

아무 생각없이 저렇게 쳤더니 작동을 안한다. (당연하지…)
glob 의 의미를 알고는 있었지만, 용례가 나와있지 않아서 실 사용법을 알지 못했다.
그 뒤에 있었던 삽질은 과감히 생략하고, 간단히 줄여보면 이렇다.
rust 꾸러미는 모두 /usr 디렉토리 밑에 설치된다. 따라서 이런 식으로 해주면 되겠다.

sudo pacman -S --overwrite 'usr/*' rust

성공! (당연히 kime makepkg 도 성공!)
어떤 글에서 맨 앞 / 는 빼라고 하여 그렇게 했다. 넣어도 잘 된다.
또, rust 는 /usr/* 로 되지만, 만약 전혀 다른 디렉토리(/etc/, /usr/)가 있는 꾸러미라면??? 이럴 땐 /* 로 하는 수 밖에.


** ArchLinux 를 1년 쯤 쓰다보니..

아치리눅스엔 여러 자잘한 문제가 많다. 이건 아마도 최신판을 사용하는 구조(Rolling Release)이기에 더욱 그런 듯 하다. 다만, 아치에는 그런 문제들을 해결할 수 있는, 정말 방대한 양을 자랑하는 위키가 있다. 물론, 그 문서를 해독(?)하는 능력이 필요한게 현실이긴 하지만.

** 23.1.23. 이 글을 쓰고 며칠 지나지 않았는데!

이번엔 openshadinglanguage 꾸러미에서 동일한 오류가 발생했다.
바로 overwrite 를 주고 잘 마무리하긴 했는데.. 왜 자꾸 이런 일이 생기는걸까??
한가지 의심이 가는 게 있긴 한데.. 얼마전부터 Discover 를 이용해서 판올림을 가끔 하기 시작했다. 혹시 그게 문제가 되었을까??

Author: 아무도안

안녕하세요. 글 남겨주셔서 고맙습니다.